You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2016/05/13 18:14:19 UTC

[37/50] [abbrv] isis git commit: ISIS-1370: @Property#publishing= and also @Property#command=...

ISIS-1370: @Property#publishing= and also @Property#command=...

Also deprecated Command.ACTION_IDENTIFIER_FOR_EDIT, since no longer used (and removed stale code in ObjectMemberAbstract).


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/7dab5d61
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/7dab5d61
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/7dab5d61

Branch: refs/heads/master
Commit: 7dab5d61b4bed132b7202a3cc7a95dd443f3c015
Parents: c2e9df8
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon May 9 20:19:01 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue May 10 05:39:04 2016 +0100

----------------------------------------------------------------------
 .../src/main/asciidoc/schema/cmd/cmd-1.0.xsd    | 10 +--
 .../src/main/asciidoc/schema/ixn/ixn-1.0.xsd    | 20 ++---
 .../apache/isis/applib/annotation/Action.java   |  4 +-
 .../apache/isis/applib/annotation/Property.java | 37 ++++++++++
 .../isis/applib/services/command/Command.java   | 13 ++--
 ...PublishedActionFacetForActionAnnotation.java |  2 +-
 .../PropertyAnnotationFacetFactory.java         | 56 ++++++++++++++
 .../CommandFacetForPropertyAnnotation.java      | 77 ++++++++++++++++++++
 ...dFacetForPropertyAnnotationAsConfigured.java | 36 +++++++++
 .../command/CommandPropertiesConfiguration.java | 37 ++++++++++
 ...etterOrClearFacetForDomainEventAbstract.java | 20 +++--
 .../PublishPropertiesConfiguration.java         | 39 ++++++++++
 ...ishedPropertyFacetForPropertyAnnotation.java | 61 ++++++++++++++++
 ...yFacetForPropertyAnnotationAsConfigured.java |  9 +++
 ...PublishedPropertyFacetFromConfiguration.java | 31 ++++++++
 .../publish/PublishedPropertyFacet.java         | 29 ++++++++
 .../publish/PublishedPropertyFacetAbstract.java | 37 ++++++++++
 .../publishing/PublishingServiceInternal.java   |  6 +-
 .../specimpl/ObjectMemberAbstract.java          |  5 --
 .../PublishingServiceInternalDefault.java       | 36 +++++++--
 .../org/apache/isis/schema/cmd/cmd-1.0.xsd      | 10 +--
 .../org/apache/isis/schema/ixn/ixn-1.0.xsd      | 20 ++---
 22 files changed, 539 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/adocs/documentation/src/main/asciidoc/schema/cmd/cmd-1.0.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/cmd/cmd-1.0.xsd b/adocs/documentation/src/main/asciidoc/schema/cmd/cmd-1.0.xsd
index 53bc0fb..8f34661 100644
--- a/adocs/documentation/src/main/asciidoc/schema/cmd/cmd-1.0.xsd
+++ b/adocs/documentation/src/main/asciidoc/schema/cmd/cmd-1.0.xsd
@@ -21,7 +21,7 @@
            elementFormDefault="qualified"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns="http://isis.apache.org/schema/cmd"
-           xmlns:common="http://isis.apache.org/schema/common">
+           xmlns:com="http://isis.apache.org/schema/common">
 
     <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.0.xsd"/>
 
@@ -50,7 +50,7 @@
                         </xs:documentation>
                     </xs:annotation>
                 </xs:element>
-                <xs:element name="targets" type="common:oidsDto">
+                <xs:element name="targets" type="com:oidsDto">
                     <xs:annotation>
                         <xs:documentation>For regular actions, represents the entity/entities or view model(s) upon which the action is to be invoked.  For mixin actions, is the object(s) being mixed-into (the constructor arg to the mixin).  For contributed actions, is the domain service (the contributee object will be one of the action arguments within the payload).  Note that this means that bulk contributed actions cannot be reified as a memento (for this use case, implement as a mixin action instead).
                         </xs:documentation>
@@ -84,7 +84,7 @@
                 </xs:annotation>
             </xs:element>
         </xs:sequence>
-        <xs:attribute  name="interactionType" type="common:interactionType">
+        <xs:attribute  name="interactionType" type="com:interactionType">
             <xs:annotation>
                 <xs:documentation>Indicates whether this is an intention to invoke an action, or edit a property.
                 </xs:documentation>
@@ -119,7 +119,7 @@
         <xs:complexContent>
             <xs:extension base="memberDto">
                 <xs:sequence>
-                    <xs:element name="newValue" type="common:valueWithTypeDto"/>
+                    <xs:element name="newValue" type="com:valueWithTypeDto"/>
                 </xs:sequence>
             </xs:extension>
         </xs:complexContent>
@@ -141,7 +141,7 @@
             </xs:documentation>
         </xs:annotation>
         <xs:complexContent>
-            <xs:extension base="common:valueWithTypeDto">
+            <xs:extension base="com:valueWithTypeDto">
                 <xs:attribute name="name" use="required" type="xs:string"/>
             </xs:extension>
         </xs:complexContent>

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/adocs/documentation/src/main/asciidoc/schema/ixn/ixn-1.0.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/schema/ixn/ixn-1.0.xsd b/adocs/documentation/src/main/asciidoc/schema/ixn/ixn-1.0.xsd
index eec8114..86e64e7 100644
--- a/adocs/documentation/src/main/asciidoc/schema/ixn/ixn-1.0.xsd
+++ b/adocs/documentation/src/main/asciidoc/schema/ixn/ixn-1.0.xsd
@@ -22,7 +22,7 @@
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns="http://isis.apache.org/schema/ixn"
            xmlns:cmd="http://isis.apache.org/schema/cmd"
-           xmlns:common="http://isis.apache.org/schema/common"
+           xmlns:com="http://isis.apache.org/schema/common"
 >
 
     <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.0.xsd"/>
@@ -77,7 +77,7 @@
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>
-            <xs:element name="target" type="common:oidDto" minOccurs="1" maxOccurs="1">
+            <xs:element name="target" type="com:oidDto" minOccurs="1" maxOccurs="1">
                 <xs:annotation>
                     <xs:documentation>For target domain object being interacted with.  For regular actions/properties, represents the entity or view model upon which the action is to be invoked/property edited.  For mixin actions/properties, is the object being mixed-into (the constructor arg to the mixin).  For contributed actions/properties, is the domain service (the contributee object will be one of the action arguments within the payload).
                     </xs:documentation>
@@ -126,7 +126,7 @@
                 </xs:complexType>
             </xs:element>
         </xs:sequence>
-        <xs:attribute  name="interactionType" type="common:interactionType">
+        <xs:attribute  name="interactionType" type="com:interactionType">
             <xs:annotation>
                 <xs:documentation>Indicates whether this is an intention to invoke an action, or edit a property.
                 </xs:documentation>
@@ -144,7 +144,7 @@
                             </xs:documentation>
                         </xs:annotation>
                     </xs:element>
-                    <xs:element name="returned" type="common:valueWithTypeDto" minOccurs="0" maxOccurs="1">
+                    <xs:element name="returned" type="com:valueWithTypeDto" minOccurs="0" maxOccurs="1">
                         <xs:annotation>
                             <xs:documentation>The value returned by this action (including the type of that returned value).  Either the 'returned' or the 'threw' element (from 'memberExecutionDto') will be populated.
                             </xs:documentation>
@@ -159,7 +159,7 @@
         <xs:complexContent>
             <xs:extension base="memberExecutionDto">
                 <xs:sequence>
-                    <xs:element name="newValue" type="common:valueWithTypeDto"/>
+                    <xs:element name="newValue" type="com:valueWithTypeDto"/>
                 </xs:sequence>
             </xs:extension>
         </xs:complexContent>
@@ -167,7 +167,7 @@
 
     <xs:complexType name="metricsDto">
         <xs:sequence>
-            <xs:element name="timings" type="common:periodDto">
+            <xs:element name="timings" type="com:periodDto">
                 <xs:annotation>
                     <xs:documentation>The time taken to perform the member interaction (invoke the action, or edit the property).
                     </xs:documentation>
@@ -185,21 +185,21 @@
 
     <xs:complexType name="objectCountsDto">
         <xs:sequence>
-            <xs:element name="numberObjectsLoaded" type="common:differenceDto">
+            <xs:element name="loaded" type="com:differenceDto">
                 <xs:annotation>
                     <xs:documentation>The number of objects loaded.
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>
-            <xs:element name="numberObjectsDirtied" type="common:differenceDto">
+            <xs:element name="dirtied" type="com:differenceDto">
                 <xs:annotation>
                     <xs:documentation>The number of objects dirtied (ie updated).
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>
-            <xs:element name="numberObjectPropertiesModified" type="common:differenceDto">
+            <xs:element name="propertiesModified" type="com:differenceDto">
                 <xs:annotation>
-                    <xs:documentation>The number of individual properties of objects that were modified (eg as per individual calls to AuditingService).
+                    <xs:documentation>The number of individual properties of objects that were modified (each such change would correspond to a separate call to AuditingService if configured).
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
index b94926b..10347bc 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
@@ -150,8 +150,8 @@ public @interface Action {
      * Whether the action invocation should be published.
      *
      * <p>
-     * Requires that an implementation of the {@link org.apache.isis.applib.services.publish.PublishingService} is
-     * registered with the framework.
+     * Requires that an implementation of the {@link org.apache.isis.applib.services.publish.PublishingService}
+     * or {@link org.apache.isis.applib.services.publish.PublisherService} is registered with the framework.
      * </p>
      */
     Publishing publishing() default Publishing.AS_CONFIGURED;

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
index 1ccac50..f165460 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
@@ -94,6 +94,43 @@ public @interface Property {
 
     // //////////////////////////////////////
 
+    /**
+     * Whether the property edit should be reified into a {@link org.apache.isis.applib.services.command.Command} object.
+     */
+    CommandReification command() default CommandReification.AS_CONFIGURED;
+
+    /**
+     * How the {@link org.apache.isis.applib.services.command.Command Command} object provided by the
+     * {@link org.apache.isis.applib.services.command.CommandContext CommandContext} domain service should be persisted.
+     */
+    CommandPersistence commandPersistence() default CommandPersistence.PERSISTED;
+
+    /**
+     * How the command/property edit should be executed.
+     *
+     * <p>
+     * If the corresponding {@link org.apache.isis.applib.services.command.Command Command} object is persisted,
+     * then its {@link org.apache.isis.applib.services.command.Command#getExecuteIn() invocationType} property
+     * will be set to this value.
+     * </p>
+     */
+    CommandExecuteIn commandExecuteIn() default CommandExecuteIn.FOREGROUND;
+
+
+    // //////////////////////////////////////
+
+    /**
+     * Whether the property edit should be published.
+     *
+     * <p>
+     * Requires that an implementation of the {@link org.apache.isis.applib.services.publish.PublishingService}
+     * or {@link org.apache.isis.applib.services.publish.PublisherService} is registered with the framework.
+     * </p>
+     */
+    Publishing publishing() default Publishing.AS_CONFIGURED;
+
+    // //////////////////////////////////////
+
 
     /**
      * The maximum entry length of a field.

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index 48a45da..7f311ef 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -68,11 +68,13 @@ import org.apache.isis.schema.cmd.v1.CommandDto;
 public interface Command extends HasTransactionId {
 
     /**
-     * The value for {@link #getTargetAction()} if this command represents an edit of an object's property
-     * (rather than an action).
+     * @deprecated - in previous versions this was the value for {@link #getTargetAction()} if this command represents an edit of an object's property (rather than an action); now though the property's name is used (ie same as actions).
      */
+    @Deprecated
     String ACTION_IDENTIFIER_FOR_EDIT = "(edit)";
 
+
+
     //region > user (property)
     /**
      * The user that created the command.
@@ -162,10 +164,10 @@ public interface Command extends HasTransactionId {
     //region > targetAction (property)
 
     /**
-     * The human-friendly name of the action invoked on the target object.
+     * The human-friendly name of the action invoked/property edited on the target object.
      *
      * <p>
-     *     If the command represents an edit of a property, then holds the value &quot;{@value ACTION_IDENTIFIER_FOR_EDIT}&quot;.
+     *     NB: in earlier versions, if the command represented an edit of a property, then it held the special value &quot;{@value ACTION_IDENTIFIER_FOR_EDIT}&quot;.  This is NO LONGER the case; it simply holds the member.
      * </p>
      */
     String getTargetAction();
@@ -174,7 +176,8 @@ public interface Command extends HasTransactionId {
      * <b>NOT API</b>: intended to be called only by the framework.
      * 
      * <p>
-     * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</tt>).
+     * Implementation notes: set when the action is invoked (in the <tt>ActionInvocationFacet</tt>) or property edited
+     * (in the <tt>PropertySetterOrClearFacet</tt>).
      */
     void setTargetAction(String targetAction);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java
index 13809a2..d859846 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java
@@ -57,7 +57,7 @@ public class PublishedActionFacetForActionAnnotation extends PublishedActionFace
                     default:
                         final PublishingPayloadFactoryForAction publishingPayloadFactory = newPayloadFactory(action);
                         return action != null
-                                ? new PublishedActionFacetForActionAnnotation(publishingPayloadFactory, holder)
+                                ? new PublishedActionFacetForActionAnnotationAsConfigured(publishingPayloadFactory, holder)
                                 : new PublishedActionFacetFromConfiguration(publishingPayloadFactory, holder);
                 }
             case DISABLED:

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index 3053f08..dcfd486 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.annotation.PostsPropertyChangedEvent;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyInteraction;
 import org.apache.isis.applib.annotation.RegEx;
+import org.apache.isis.applib.services.HasTransactionId;
 import org.apache.isis.applib.services.eventbus.PropertyChangedEvent;
 import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -44,6 +45,7 @@ import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
@@ -52,6 +54,7 @@ import org.apache.isis.core.metamodel.facets.objectvalue.regex.RegExFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.regex.TitleFacetFormattedByRegex;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
+import org.apache.isis.core.metamodel.facets.properties.property.command.CommandFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.disabled.DisabledFacetForDisabledAnnotationOnProperty;
 import org.apache.isis.core.metamodel.facets.properties.property.disabled.DisabledFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.hidden.HiddenFacetForHiddenAnnotationOnProperty;
@@ -77,8 +80,10 @@ import org.apache.isis.core.metamodel.facets.properties.property.mustsatisfy.Mus
 import org.apache.isis.core.metamodel.facets.properties.property.mustsatisfy.MustSatisfySpecificationFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.notpersisted.NotPersistedFacetForNotPersistedAnnotationOnProperty;
 import org.apache.isis.core.metamodel.facets.properties.property.notpersisted.NotPersistedFacetForPropertyAnnotation;
+import org.apache.isis.core.metamodel.facets.properties.property.publishing.PublishedPropertyFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForRegExAnnotationOnProperty;
+import org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
@@ -112,6 +117,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         processModify(processMethodContext);
         processHidden(processMethodContext);
         processEditing(processMethodContext);
+        processCommand(processMethodContext);
+        processPublishing(processMethodContext);
         processMaxLength(processMethodContext);
         processMustSatisfy(processMethodContext);
         processNotPersisted(processMethodContext);
@@ -278,6 +285,55 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         FacetUtil.addFacet(facet);
     }
 
+    void processCommand(final ProcessMethodContext processMethodContext) {
+
+        final Class<?> cls = processMethodContext.getCls();
+        final Method method = processMethodContext.getMethod();
+        final Property property = Annotations.getAnnotation(method, Property.class);
+        final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
+
+        final FacetHolder holder = facetHolder;
+
+        //
+        // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
+        //
+        if(HasTransactionId.class.isAssignableFrom(processMethodContext.getCls())) {
+            // do not install on any implementation of HasTransactionId
+            // (ie commands, audit entries, published events).
+            return;
+        }
+
+        // check for @Property(command=...)
+        final CommandFacet commandFacet = CommandFacetForPropertyAnnotation.create(property, configuration, holder);
+
+        FacetUtil.addFacet(commandFacet);
+    }
+
+    void processPublishing(final ProcessMethodContext processMethodContext) {
+
+        final Method method = processMethodContext.getMethod();
+        final Property property = Annotations.getAnnotation(method, Property.class);
+        final FacetHolder holder = processMethodContext.getFacetHolder();
+
+        //
+        // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
+        // and for commands, see above
+        //
+        if(HasTransactionId.class.isAssignableFrom(processMethodContext.getCls())) {
+            // do not install on any implementation of HasTransactionId
+            // (ie commands, audit entries, published events).
+            return;
+        }
+
+        // check for @Property(publishing=...)
+        final PublishedPropertyFacet facet = PublishedPropertyFacetForPropertyAnnotation
+                .create(property, configuration, holder);
+
+        FacetUtil.addFacet(facet);
+    }
+
+
+
     void processMaxLength(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
         final FacetHolder holder = processMethodContext.getFacetHolder();

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotation.java
new file mode 100644
index 0000000..99db398
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotation.java
@@ -0,0 +1,77 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.properties.property.command;
+
+import org.apache.isis.applib.annotation.Command.ExecuteIn;
+import org.apache.isis.applib.annotation.Command.Persistence;
+import org.apache.isis.applib.annotation.CommandExecuteIn;
+import org.apache.isis.applib.annotation.CommandPersistence;
+import org.apache.isis.applib.annotation.CommandReification;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract;
+
+public class CommandFacetForPropertyAnnotation extends CommandFacetAbstract {
+
+    public static CommandFacet create(
+            final Property property,
+            final IsisConfiguration configuration,
+            final FacetHolder holder) {
+
+        final CommandReification command = property != null ? property.command() : CommandReification.AS_CONFIGURED;
+        final CommandPersistence commandPersistence = property != null ? property.commandPersistence() : CommandPersistence.PERSISTED;
+        final CommandExecuteIn commandExecuteIn = property != null? property.commandExecuteIn() :  CommandExecuteIn.FOREGROUND;
+
+        final Persistence persistence = CommandPersistence.from(commandPersistence);
+        final ExecuteIn executeIn = CommandExecuteIn.from(commandExecuteIn);
+
+        switch (command) {
+            case AS_CONFIGURED:
+                final CommandPropertiesConfiguration setting = CommandPropertiesConfiguration.parse(configuration);
+                switch (setting) {
+                case NONE:
+                    return null;
+                default:
+                    return property != null
+                            ? new CommandFacetForPropertyAnnotationAsConfigured(persistence, executeIn, Enablement.ENABLED, holder)
+                            : CommandFacetFromConfiguration.create(holder);
+                }
+            case DISABLED:
+                return null;
+            case ENABLED:
+                return new CommandFacetForPropertyAnnotation(persistence, executeIn, Enablement.ENABLED, holder);
+        }
+
+        return null;
+    }
+
+
+    CommandFacetForPropertyAnnotation(
+            final Persistence persistence,
+            final ExecuteIn executeIn,
+            final Enablement enablement,
+            final FacetHolder holder) {
+        super(persistence, executeIn, enablement, holder);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotationAsConfigured.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotationAsConfigured.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotationAsConfigured.java
new file mode 100644
index 0000000..b048da1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandFacetForPropertyAnnotationAsConfigured.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.properties.property.command;
+
+import org.apache.isis.applib.annotation.Command.ExecuteIn;
+import org.apache.isis.applib.annotation.Command.Persistence;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public class CommandFacetForPropertyAnnotationAsConfigured extends CommandFacetForPropertyAnnotation {
+
+    CommandFacetForPropertyAnnotationAsConfigured(
+            final Persistence persistence,
+            final ExecuteIn executeIn,
+            final Enablement enablement,
+            final FacetHolder holder) {
+        super(persistence, executeIn, enablement, holder);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandPropertiesConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandPropertiesConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandPropertiesConfiguration.java
new file mode 100644
index 0000000..7683800
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/command/CommandPropertiesConfiguration.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.properties.property.command;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facets.object.domainobject.Util;
+
+public enum CommandPropertiesConfiguration {
+    ALL,
+    NONE;
+
+    private static final String  COMMAND_ACTIONS_KEY = "isis.services.command.properties";
+
+    public static CommandPropertiesConfiguration parse(final IsisConfiguration configuration) {
+        return parse(configuration.getString(COMMAND_ACTIONS_KEY));
+    }
+
+    private static CommandPropertiesConfiguration parse(final String value) {
+        return Util.parseYes(value)? ALL: NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index 4661cfc..c4899f8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -39,10 +39,12 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.services.ixn.InteractionDtoServiceInternal;
+import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.schema.ixn.v1.PropertyEditDto;
 
@@ -272,11 +274,14 @@ public abstract class PropertySetterOrClearFacetForDomainEventAbstract
                         : new RuntimeException(executionExceptionIfAny);
             }
 
-            //
-            // at this point in ActionInvocationFacetFDEA, the action is optionally published via the
-            // PublishingServiceInternal.  However, we currently do not support the concept of publishing simple
-            // property modifications.
-            //
+
+
+
+            final PublishedPropertyFacet publishedPropertyFacet = getIdentified().getFacet(PublishedPropertyFacet.class);
+            if (publishedPropertyFacet != null) {
+                getPublishingServiceInternal().publishProperty(priorExecution);
+            }
+
         }
 
     }
@@ -318,6 +323,10 @@ public abstract class PropertySetterOrClearFacetForDomainEventAbstract
         return lookupService(ClockService.class);
     }
 
+    private PublishingServiceInternal getPublishingServiceInternal() {
+        return lookupService(PublishingServiceInternal.class);
+    }
+
     private <T> T lookupService(final Class<T> serviceClass) {
         T service = lookupServiceIfAny(serviceClass);
         if(service == null) {
@@ -329,4 +338,5 @@ public abstract class PropertySetterOrClearFacetForDomainEventAbstract
         return getServicesInjector().lookupService(serviceClass);
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishPropertiesConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishPropertiesConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishPropertiesConfiguration.java
new file mode 100644
index 0000000..34e2742
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishPropertiesConfiguration.java
@@ -0,0 +1,39 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.properties.property.publishing;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facets.object.domainobject.Util;
+
+public enum PublishPropertiesConfiguration {
+    ALL,
+    NONE;
+
+    private static final String PUBLISH_PROPERTIES_KEY = "isis.services.publish.properties";
+
+    public static PublishPropertiesConfiguration parse(IsisConfiguration configuration) {
+        final String configuredValue = configuration.getString(PUBLISH_PROPERTIES_KEY);
+        return PublishPropertiesConfiguration.parse(configuredValue);
+    }
+
+    private static PublishPropertiesConfiguration parse(final String value) {
+        return Util.parseYes(value)? ALL: NONE;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotation.java
new file mode 100644
index 0000000..d8b19a7
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotation.java
@@ -0,0 +1,61 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.properties.property.publishing;
+
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Publishing;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacet;
+import org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacetAbstract;
+
+public class PublishedPropertyFacetForPropertyAnnotation extends PublishedPropertyFacetAbstract {
+
+    public static PublishedPropertyFacet create(
+            final Property property,
+            final IsisConfiguration configuration,
+            final FacetHolder holder) {
+
+        final Publishing publishing = property != null ? property.publishing() : Publishing.AS_CONFIGURED;
+
+        switch (publishing) {
+            case AS_CONFIGURED:
+                final PublishPropertiesConfiguration setting = PublishPropertiesConfiguration.parse(configuration);
+                switch (setting) {
+                case NONE:
+                    return null;
+                default:
+                    return property != null
+                            ? new PublishedPropertyFacetForPropertyAnnotationAsConfigured(holder)
+                            : new PublishedPropertyFacetFromConfiguration(holder);
+                }
+            case DISABLED:
+                return null;
+            case ENABLED:
+                return new PublishedPropertyFacetForPropertyAnnotation(holder);
+        }
+        return null;
+    }
+
+    public PublishedPropertyFacetForPropertyAnnotation(final FacetHolder holder) {
+        super(holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotationAsConfigured.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotationAsConfigured.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotationAsConfigured.java
new file mode 100644
index 0000000..3f59ec3
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetForPropertyAnnotationAsConfigured.java
@@ -0,0 +1,9 @@
+package org.apache.isis.core.metamodel.facets.properties.property.publishing;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public class PublishedPropertyFacetForPropertyAnnotationAsConfigured extends PublishedPropertyFacetForPropertyAnnotation {
+    public PublishedPropertyFacetForPropertyAnnotationAsConfigured(final FacetHolder holder) {
+        super(holder);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetFromConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetFromConfiguration.java
new file mode 100644
index 0000000..a8fdd97
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/publishing/PublishedPropertyFacetFromConfiguration.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.properties.property.publishing;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.properties.publish.PublishedPropertyFacetAbstract;
+
+public class PublishedPropertyFacetFromConfiguration extends PublishedPropertyFacetAbstract {
+
+    public PublishedPropertyFacetFromConfiguration(final FacetHolder holder) {
+        super(holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/publish/PublishedPropertyFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/publish/PublishedPropertyFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/publish/PublishedPropertyFacet.java
new file mode 100644
index 0000000..8308fda
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/publish/PublishedPropertyFacet.java
@@ -0,0 +1,29 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.properties.publish;
+
+import org.apache.isis.core.metamodel.facets.MarkerFacet;
+
+/**
+ * Indicates that the editing of the property should be published.
+ */
+public interface PublishedPropertyFacet extends MarkerFacet {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/publish/PublishedPropertyFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/publish/PublishedPropertyFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/publish/PublishedPropertyFacetAbstract.java
new file mode 100644
index 0000000..ef8f01b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/publish/PublishedPropertyFacetAbstract.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.properties.publish;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.MarkerFacetAbstract;
+
+public abstract class PublishedPropertyFacetAbstract extends MarkerFacetAbstract
+        implements PublishedPropertyFacet {
+
+    public static Class<? extends Facet> type() {
+        return PublishedPropertyFacet.class;
+    }
+
+    public PublishedPropertyFacetAbstract(final FacetHolder holder) {
+        super(  type(),
+                holder);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java
index e2f5237..c3bd614 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java
@@ -34,9 +34,11 @@ public interface PublishingServiceInternal {
     @Programmatic
     void publishAction(
             final Interaction.Execution execution,
-            final ObjectAction objectAction,
-            final IdentifiedHolder identifiedHolder,
+            final ObjectAction objectAction, final IdentifiedHolder identifiedHolder,
             final ObjectAdapter targetAdapter,
             final List<ObjectAdapter> parameterAdapters,
             final ObjectAdapter resultAdapter);
+
+    @Programmatic
+    void publishProperty(final Interaction.Execution execution);
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 57c0af7..f10a5ac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -460,11 +460,6 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
             return;
         }
 
-        if(Command.ACTION_IDENTIFIER_FOR_EDIT.equals(command.getMemberIdentifier())) {
-            // special case for edit properties, don't overwrite
-            return;
-        }
-
         if (command.getMemento() != null) {
             // guard here to prevent subsequent contributed/mixin actions from
             // trampling over the command's memento and execution context

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java
index d67ae44..4d9295f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publishing/PublishingServiceInternalDefault.java
@@ -113,11 +113,10 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
     @Override
     @Programmatic
     public void publishObjects() {
+        publishObjectsToPublishingService();
+    }
 
-        if(publishingServiceIfAny == null) {
-            return;
-        }
-
+    private void publishObjectsToPublishingService() {
         final Map<ObjectAdapter, ChangeKind> changeKindByEnlistedAdapter =
                 enlistedObjectsServiceInternal.getChangeKindByEnlistedAdapter();
 
@@ -149,6 +148,25 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
         if(publishedObjectFacet == null) {
             return;
         }
+
+        publishObjectToPublishingService(
+                enlistedAdapter, changeKind, currentUser, timestamp, stringifier);
+    }
+
+    private void publishObjectToPublishingService(
+            final ObjectAdapter enlistedAdapter,
+            final ChangeKind changeKind,
+            final String currentUser,
+            final Timestamp timestamp,
+            final ObjectStringifier stringifier) {
+
+        if(publishingServiceIfAny == null) {
+            return;
+        }
+
+        final PublishedObjectFacet publishedObjectFacet =
+                enlistedAdapter.getSpecification().getFacet(PublishedObjectFacet.class);
+
         final PublishedObject.PayloadFactory payloadFactory = publishedObjectFacet.value();
 
         final RootOid enlistedAdapterOid = (RootOid) enlistedAdapter.getOid();
@@ -178,8 +196,14 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
                 objectAction, identifiedHolder, targetAdapter, parameterAdapters, resultAdapter
         );
 
-        publishActionToPublisherServices(execution);
+        publishToPublisherServices(execution);
+    }
+
+    @Override
+    public void publishProperty(
+            final Interaction.Execution execution) {
 
+        publishToPublisherServices(execution);
     }
 
     private void publishActionToPublishingService(
@@ -308,7 +332,7 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
                 enlistedAdapterClass, null, enlistedTarget, null, null, null, null);
     }
 
-    private void publishActionToPublisherServices(final Interaction.Execution<?,?> execution) {
+    private void publishToPublisherServices(final Interaction.Execution<?,?> execution) {
 
         if(publisherServices == null || publisherServices.isEmpty()) {
             return;

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd b/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd
index 53bc0fb..8f34661 100644
--- a/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd
+++ b/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd
@@ -21,7 +21,7 @@
            elementFormDefault="qualified"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns="http://isis.apache.org/schema/cmd"
-           xmlns:common="http://isis.apache.org/schema/common">
+           xmlns:com="http://isis.apache.org/schema/common">
 
     <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.0.xsd"/>
 
@@ -50,7 +50,7 @@
                         </xs:documentation>
                     </xs:annotation>
                 </xs:element>
-                <xs:element name="targets" type="common:oidsDto">
+                <xs:element name="targets" type="com:oidsDto">
                     <xs:annotation>
                         <xs:documentation>For regular actions, represents the entity/entities or view model(s) upon which the action is to be invoked.  For mixin actions, is the object(s) being mixed-into (the constructor arg to the mixin).  For contributed actions, is the domain service (the contributee object will be one of the action arguments within the payload).  Note that this means that bulk contributed actions cannot be reified as a memento (for this use case, implement as a mixin action instead).
                         </xs:documentation>
@@ -84,7 +84,7 @@
                 </xs:annotation>
             </xs:element>
         </xs:sequence>
-        <xs:attribute  name="interactionType" type="common:interactionType">
+        <xs:attribute  name="interactionType" type="com:interactionType">
             <xs:annotation>
                 <xs:documentation>Indicates whether this is an intention to invoke an action, or edit a property.
                 </xs:documentation>
@@ -119,7 +119,7 @@
         <xs:complexContent>
             <xs:extension base="memberDto">
                 <xs:sequence>
-                    <xs:element name="newValue" type="common:valueWithTypeDto"/>
+                    <xs:element name="newValue" type="com:valueWithTypeDto"/>
                 </xs:sequence>
             </xs:extension>
         </xs:complexContent>
@@ -141,7 +141,7 @@
             </xs:documentation>
         </xs:annotation>
         <xs:complexContent>
-            <xs:extension base="common:valueWithTypeDto">
+            <xs:extension base="com:valueWithTypeDto">
                 <xs:attribute name="name" use="required" type="xs:string"/>
             </xs:extension>
         </xs:complexContent>

http://git-wip-us.apache.org/repos/asf/isis/blob/7dab5d61/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd b/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd
index 024d349..76443e0 100644
--- a/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd
+++ b/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd
@@ -22,7 +22,7 @@
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns="http://isis.apache.org/schema/ixn"
            xmlns:cmd="http://isis.apache.org/schema/cmd"
-           xmlns:common="http://isis.apache.org/schema/common"
+           xmlns:com="http://isis.apache.org/schema/common"
         >
 
     <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.0.xsd"/>
@@ -77,7 +77,7 @@
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>
-            <xs:element name="target" type="common:oidDto" minOccurs="1" maxOccurs="1">
+            <xs:element name="target" type="com:oidDto" minOccurs="1" maxOccurs="1">
                 <xs:annotation>
                     <xs:documentation>For target domain object being interacted with.  For regular actions/properties, represents the entity or view model upon which the action is to be invoked/property edited.  For mixin actions/properties, is the object being mixed-into (the constructor arg to the mixin).  For contributed actions/properties, is the domain service (the contributee object will be one of the action arguments within the payload).
                     </xs:documentation>
@@ -126,7 +126,7 @@
                 </xs:complexType>
             </xs:element>
         </xs:sequence>
-        <xs:attribute  name="interactionType" type="common:interactionType">
+        <xs:attribute  name="interactionType" type="com:interactionType">
             <xs:annotation>
                 <xs:documentation>Indicates whether this is an intention to invoke an action, or edit a property.
                 </xs:documentation>
@@ -144,7 +144,7 @@
                             </xs:documentation>
                         </xs:annotation>
                     </xs:element>
-                    <xs:element name="returned" type="common:valueWithTypeDto" minOccurs="0" maxOccurs="1">
+                    <xs:element name="returned" type="com:valueWithTypeDto" minOccurs="0" maxOccurs="1">
                         <xs:annotation>
                             <xs:documentation>The value returned by this action (including the type of that returned value).  Either the 'returned' or the 'threw' element (from 'memberExecutionDto') will be populated.
                             </xs:documentation>
@@ -159,7 +159,7 @@
         <xs:complexContent>
             <xs:extension base="memberExecutionDto">
                 <xs:sequence>
-                    <xs:element name="newValue" type="common:valueWithTypeDto"/>
+                    <xs:element name="newValue" type="com:valueWithTypeDto"/>
                 </xs:sequence>
             </xs:extension>
         </xs:complexContent>
@@ -167,7 +167,7 @@
 
     <xs:complexType name="metricsDto">
         <xs:sequence>
-            <xs:element name="timings" type="common:periodDto">
+            <xs:element name="timings" type="com:periodDto">
                 <xs:annotation>
                     <xs:documentation>The time taken to perform the member interaction (invoke the action, or edit the property).
                     </xs:documentation>
@@ -185,21 +185,21 @@
 
     <xs:complexType name="objectCountsDto">
         <xs:sequence>
-            <xs:element name="numberObjectsLoaded" type="common:differenceDto">
+            <xs:element name="loaded" type="com:differenceDto">
                 <xs:annotation>
                     <xs:documentation>The number of objects loaded.
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>
-            <xs:element name="numberObjectsDirtied" type="common:differenceDto">
+            <xs:element name="dirtied" type="com:differenceDto">
                 <xs:annotation>
                     <xs:documentation>The number of objects dirtied (ie updated).
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>
-            <xs:element name="numberObjectPropertiesModified" type="common:differenceDto">
+            <xs:element name="propertiesModified" type="com:differenceDto">
                 <xs:annotation>
-                    <xs:documentation>The number of individual properties of objects that were modified (eg as per individual calls to AuditingService).
+                    <xs:documentation>The number of individual properties of objects that were modified (each such change would correspond to a separate call to AuditingService if configured).
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>