This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 3eb22e8  ISIS-2222: docs completed for @Property#publishing, 
@Action#publishing
3eb22e8 is described below

commit 3eb22e86857bceb3ad619a9edb809503ddf8098a
Author: danhaywood <[email protected]>
AuthorDate: Tue Aug 18 13:48:03 2020 +0100

    ISIS-2222: docs completed for @Property#publishing, @Action#publishing
    
    still wip for @DomainObject#publishing
---
 .../ActionPublishingJdo-description.adoc           | 191 +++++++++++++--------
 .../Action/publishing/ActionPublishingJdo.java     |  50 +++++-
 .../ActionPublishingJdo_mixinUpdateProperty.java   |   7 +-
 ...hingJdo_mixinUpdatePropertyMetaAnnotation.java} |  22 ++-
 ...ixinUpdatePropertyMetaAnnotationOverridden.java |  11 +-
 ...onPublishingJdo_clearInteractionExecutions.java |  14 +-
 .../ActionPublishingJdo_interactionExecutions.java |  15 +-
 .../spiimpl/PublisherServiceSpiForActions.java     |  23 ++-
 ...nObjectPublishingJdo_clearPublishedObjects.java |   8 +-
 ...DomainObjectPublishingJdo_publishedObjects.java |  17 +-
 .../PublisherServiceSpiForDomainObject.java        |  23 ++-
 .../editing/PropertyEditingVm-description.adoc     |   2 +-
 .../PropertyPublishingJdo-description.adoc         | 166 ++++++++++--------
 .../Property/publishing/PropertyPublishingJdo.java |  10 +-
 ...tyPublishingJdo_clearInteractionExecutions.java |  16 +-
 ...ropertyPublishingJdo_interactionExecutions.java |  16 +-
 .../spiimpl/PublisherServiceSpiForProperties.java  |  24 ++-
 17 files changed, 383 insertions(+), 232 deletions(-)

diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo-description.adoc
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo-description.adoc
index c62d177..dfe075d 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo-description.adoc
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo-description.adoc
@@ -1,74 +1,117 @@
-CAUTION: todo - to update.
-
-//The `editing` semantic specifies that a property's value can be changed 
through the UI:
-//
-//* for properties, the semantic can be specified using either the `@Property` 
annotation, or a meta-annotation
-//
-//There is no corresponding semantic for parameters, parameters are implicitly 
editable.
-//
-//== Class Level
-//
-//Usually editing of properties is discouraged; it is usually better to modify 
state through an explicit action instead.
-//For that reason, editing of properties is disabled by default (though that 
can be changed globally if necessary using the 
`isis.applib.annotation.domain-object.editing` configuration property).
-//
-//Editing can also be specified at the class level.
-//This will override any configured defaults, but just for the properties of 
that class:
-//
-//[source,java,indent=0]
-//----
-//include::PropertyEditingVm.java[tags=class]
-//----
-//
-//The property-level semantic can, in turn, overrides the configured or 
class-level default.
-//
-//
-//== Annotated
-//
-//The `editing` semantic can be specified explicitly using an annotation:
-//
-//* for properties, using `@Property#editing()`:
-//+
-//[source,java,indent=0]
-//----
-//include::PropertyEditingVm.java[tags=annotation]
-//----
-//<.> explicitly specifies the maximum length that can be entered for the 
property
-//
-//The annotation could also be applied to a mixin, but would have little 
effect because mixin properties are always read-only.
-//
-//== Meta-annotated
-//
-//The `editing` semantic can also be specified using a custom meta-annotation:
-//
-//* the meta-annotation is defined as:
-//+
-//[source,java]
-//----
-//include::EditingEnabledMetaAnnotation.java[tags=class]
-//----
-//<.> annotated for a property
-//<.> annotation can be applied to a property (either its getter or the field 
directly)
-//
-//* and can be applied to a property:
-//+
-//[source,java,indent=0]
-//----
-//include::PropertyEditingVm.java[tags=meta-annotated]
-//----
-//<.> semantic is inherited from the meta-annotation
-//
-//
-//
-//=== Meta-annotated Overridden
-//
-//The meta-annotation can itself be overridden:
-//
-//* in a property:
-//+
-//[source,java,indent=0]
-//----
-//include::PropertyEditingVm.java[tags=meta-annotated-overridden]
-//----
-//<.> semantic from meta-annotation ...
-//<.> \... is overridden by the `@Property` annotation
-//
+The `publishing` semantic specifies that the invocation of an object action 
should be published to registered implementation(s) of 
link:https://isis.apache.org/refguide/2.0.0-M3/applib-svc/PublisherService.html#spi[`PublisherService`
 SPI].
+This is performed _after_ the action has been invoked.
+
+The publishing from the framework to the SPI is in-memory.
+A typical SPI implementation would then publish over the network, or perhaps 
store in a database as per the 
link:https://microservices.io/patterns/data/transactional-outbox.html[outbox 
pattern].
+
+TIP: The framework provides an 
link:https://isis.apache.org/mappings/2.0.0-M3/outbox-publisher/about.html[out-of-the-box
 implementation] of the outbox pattern.
+
+The semantic can be specified using either the `@Action` annotation, or 
through a meta-annotation.
+
+== Annotated
+
+The `publisher` semantic can be specified explicitly using an annotation 
through `@Action#publishing()`:
+
+* it can be applied to an action:
++
+[source,java,indent=0]
+----
+include::ActionPublishingJdo.java[tags=annotation]
+----
+<.> explicitly specifies that invoking the action should be published.
+
+* or to a mixin:
++
+[source,java,indent=0]
+----
+include::ActionPublishingJdo_mixinUpdateProperty.java[tags=class]
+----
+<.> explicitly specifies that invoking the mixin action should be published.
+
+
+== Meta-annotated
+
+The `publishing` semantic can also be specified using a custom meta-annotation:
+
+* the meta-annotation is defined as:
++
+[source,java,indent=0]
+----
+include::ActionPublishingEnabledMetaAnnotation.java[tags=class]
+----
+<.> annotated for an action
+<.> annotation can be applied to an action method or to a mixin
+
+* and can be applied to an action:
++
+[source,java,indent=0]
+----
+include::ActionPublishingJdo.java[tags=meta-annotation]
+----
+<.> semantic is inherited from the meta-annotation
+
+* or to a mixin:
++
+[source,java,indent=0]
+----
+include::ActionPublishingJdo_mixinUpdatePropertyMetaAnnotation.java[tags=class]
+----
+<.> semantic is inherited from the meta-annotation
+
+
+=== Meta-annotated Overridden
+
+The meta-annotation can itself be overridden:
+
+* for an action:
++
+[source,java,indent=0]
+----
+include::ActionPublishingJdo.java[tags=meta-annotation-overridden]
+----
+<.> semantic from meta-annotation ...
+<.> \... is overridden by the `@Action` annotation
+
+* or on a mixin:
++
+[source,java,indent=0]
+----
+include::ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java[tags=class]
+----
+<.> semantic from meta-annotation ...
+<.> \... is overridden by the `@Action` annotation
+
+
+== PublisherService
+
+The demo provides a simple implementation of `PublisherService` that just 
stores the DTOs in memory:
+
+[source,java]
+----
+include::spiimpl/PublisherServiceSpiForActions.java[tags=class]
+----
+<.> serializes to `InteractionDto`, as defined by the 
link:https://isis.apache.org/refguide/2.0.0-M3/schema/ixn.html[Apache Isis 
schema].
+
+The demo implementation also provides a way to query these executions:
+
+[source,java,indent=0]
+----
+include::spiimpl/PublisherServiceSpiForActions.java[tags=demo]
+----
+
+Supporting mixins surface this list as contributions on the object:
+
+* `interactionExecutions` collection:
++
+[source,java,indent=0]
+----
+include::spiimpl/ActionPublishingJdo_interactionExecutions.java[tags=class]
+----
+
+* `clearInteractionExecutions` action:
++
+[source,java,indent=0]
+----
+include::spiimpl/ActionPublishingJdo_clearInteractionExecutions.java[tags=class]
+----
+
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
index bdba6ae..1556229 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
@@ -52,6 +52,8 @@ public class ActionPublishingJdo implements 
HasAsciiDocDescription {
 
     public ActionPublishingJdo(String initialValue) {
         this.property = initialValue;
+        this.propertyMetaAnnotated = initialValue;
+        this.propertyMetaAnnotatedOverridden = initialValue;
     }
 
     public String title() {
@@ -63,6 +65,16 @@ public class ActionPublishingJdo implements 
HasAsciiDocDescription {
     @MemberOrder(name = "annotation", sequence = "1")
     @Getter @Setter
     private String property;
+
+    @Property()
+    @MemberOrder(name = "meta-annotated", sequence = "1")
+    @Getter @Setter
+    private String propertyMetaAnnotated;
+
+    @Property()
+    @MemberOrder(name = "meta-annotated-overridden", sequence = "1")
+    @Getter @Setter
+    private String propertyMetaAnnotatedOverridden;
 //end::property[]
 
 //tag::annotation[]
@@ -73,7 +85,8 @@ public class ActionPublishingJdo implements 
HasAsciiDocDescription {
         , associateWithSequence = "1"
     )
     @ActionLayout(
-        describedAs = "@Action(publishing = ENABLED)"
+        named = "Update Property"
+        , describedAs = "@Action(publishing = ENABLED)"
     )
     public ActionPublishingJdo updatePropertyUsingAnnotation(final String 
value) {
         setProperty(value);
@@ -86,24 +99,47 @@ public class ActionPublishingJdo implements 
HasAsciiDocDescription {
 //end::annotation[]
 
 //tag::meta-annotation[]
-    @ActionPublishingEnabledMetaAnnotation
+    @ActionPublishingEnabledMetaAnnotation      // <.>
     @Action(
         semantics = SemanticsOf.IDEMPOTENT
-        , associateWith = "property"
-        , associateWithSequence = "2"
+        , associateWith = "propertyMetaAnnotated"
+        , associateWithSequence = "1"
     )
     @ActionLayout(
-            describedAs = "@PublishingEnabledMetaAnnotation"
+        named = "Update Property"
+        , describedAs = "@PublishingEnabledMetaAnnotation"
     )
     public ActionPublishingJdo updatePropertyUsingMetaAnnotation(final String 
value) {
-        setProperty(value);
+        setPropertyMetaAnnotated(value);
         return this;
     }
     public String default0UpdatePropertyUsingMetaAnnotation() {
-        return getProperty();
+        return getPropertyMetaAnnotated();
     }
 //end::meta-annotation[]
 
+//tag::meta-annotation-overridden[]
+    @ActionPublishingDisabledMetaAnnotation     // <.>
+    @Action(
+        publishing = Publishing.ENABLED         // <.>
+        , semantics = SemanticsOf.IDEMPOTENT
+        , associateWith = "propertyMetaAnnotatedOverridden"
+        , associateWithSequence = "1"
+    )
+    @ActionLayout(
+        named = "Update Property"
+        , describedAs =
+            "@PublishingEnabledMetaAnnotation @Action(publishing = ENABLED)"
+    )
+    public ActionPublishingJdo 
updatePropertyUsingMetaAnnotationButOverridden(final String value) {
+        setPropertyMetaAnnotatedOverridden(value);
+        return this;
+    }
+    public String default0UpdatePropertyUsingMetaAnnotationButOverridden() {
+        return getPropertyMetaAnnotatedOverridden();
+    }
+//end::meta-annotation-overridden[]
+
 
 //tag::class[]
 }
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdateProperty.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdateProperty.java
index 055771f..e0b28c4 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdateProperty.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdateProperty.java
@@ -7,13 +7,14 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 
 //tag::class[]
 @Action(
-    publishing = Publishing.ENABLED
+    publishing = Publishing.ENABLED         // <.>
     , semantics = SemanticsOf.IDEMPOTENT
     , associateWith = "property"
-    , associateWithSequence = "3"
+    , associateWithSequence = "2"
 )
 @ActionLayout(
-    describedAs = "@Action(publishing = ENABLED)"
+    named = "Mixin Update Property"
+    , describedAs = "@Action(publishing = ENABLED)"
 )
 public class ActionPublishingJdo_mixinUpdateProperty {
     // ...
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotation.java
similarity index 60%
copy from 
examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
copy to 
examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotation.java
index dd0416d..575e2a1 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotation.java
@@ -6,35 +6,33 @@ import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 //tag::class[]
-@ActionPublishingDisabledMetaAnnotation     // <.>
+@ActionPublishingEnabledMetaAnnotation     // <.>
 @Action(
-    publishing = Publishing.ENABLED         // <.>
-    , semantics = SemanticsOf.IDEMPOTENT
-    , associateWith = "property"
-    , associateWithSequence = "4"
+    semantics = SemanticsOf.IDEMPOTENT
+    , associateWith = "propertyMetaAnnotated"
+    , associateWithSequence = "2"
 )
 @ActionLayout(
-    describedAs =
-        "@ActionPublishingDisabledMetaAnnotation " +
-        "@Action(publishing = ENABLED)"
+    named = "Mixin Update Property"
+    , describedAs = "@ActionPublishingEnabledMetaAnnotation"
 )
-public class ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden {
+public class ActionPublishingJdo_mixinUpdatePropertyMetaAnnotation {
     // ...
 //end::class[]
 
     private final ActionPublishingJdo actionPublishingJdo;
 
-    public 
ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden(ActionPublishingJdo
 actionPublishingJdo) {
+    public 
ActionPublishingJdo_mixinUpdatePropertyMetaAnnotation(ActionPublishingJdo 
actionPublishingJdo) {
         this.actionPublishingJdo = actionPublishingJdo;
     }
 
 //tag::class[]
     public ActionPublishingJdo act(final String value) {
-        actionPublishingJdo.setProperty(value);
+        actionPublishingJdo.setPropertyMetaAnnotated(value);
         return actionPublishingJdo;
     }
     public String default0Act() {
-        return actionPublishingJdo.getProperty();
+        return actionPublishingJdo.getPropertyMetaAnnotated();
     }
 }
 //end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
index dd0416d..d3e4ef1 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
@@ -10,11 +10,12 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 @Action(
     publishing = Publishing.ENABLED         // <.>
     , semantics = SemanticsOf.IDEMPOTENT
-    , associateWith = "property"
-    , associateWithSequence = "4"
+    , associateWith = "propertyMetaAnnotatedOverridden"
+    , associateWithSequence = "2"
 )
 @ActionLayout(
-    describedAs =
+    named = "Mixin Update Property"
+    , describedAs =
         "@ActionPublishingDisabledMetaAnnotation " +
         "@Action(publishing = ENABLED)"
 )
@@ -30,11 +31,11 @@ public class 
ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden {
 
 //tag::class[]
     public ActionPublishingJdo act(final String value) {
-        actionPublishingJdo.setProperty(value);
+        actionPublishingJdo.setPropertyMetaAnnotatedOverridden(value);
         return actionPublishingJdo;
     }
     public String default0Act() {
-        return actionPublishingJdo.getProperty();
+        return actionPublishingJdo.getPropertyMetaAnnotatedOverridden();
     }
 }
 //end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_clearInteractionExecutions.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_clearInteractionExecutions.java
index 071785b..cde9d30 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_clearInteractionExecutions.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_clearInteractionExecutions.java
@@ -1,20 +1,20 @@
 package demoapp.dom.annotDomain.Action.publishing.spiimpl;
 
-import java.util.List;
-
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.schema.ixn.v2.InteractionDto;
 
 import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo;
 
+//tag::class[]
 @Action(
     semantics = SemanticsOf.IDEMPOTENT
     , associateWith = "interactionExecutions"
 )
 public class ActionPublishingJdo_clearInteractionExecutions {
+    // ...
+//end::class[]
 
     private final ActionPublishingJdo actionPublishingJdo;
 
@@ -22,11 +22,13 @@ public class ActionPublishingJdo_clearInteractionExecutions 
{
         this.actionPublishingJdo = actionPublishingJdo;
     }
 
-    public List<InteractionDto> act() {
+//tag::class[]
+    public ActionPublishingJdo act() {
         publisherServiceSpiForActions.clear();
-        return (List<InteractionDto>) actionPublishingJdo;
+        return actionPublishingJdo;
     }
 
     @Inject
-    private PublisherServiceSpiForActions publisherServiceSpiForActions;
+    PublisherServiceSpiForActions publisherServiceSpiForActions;
 }
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_interactionExecutions.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_interactionExecutions.java
index b39ccba..e068dd9 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_interactionExecutions.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_interactionExecutions.java
@@ -1,17 +1,22 @@
 package demoapp.dom.annotDomain.Action.publishing.spiimpl;
 
+import java.util.LinkedList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.schema.ixn.v2.InteractionDto;
 
+import lombok.val;
+
 import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo;
 
+//tag::class[]
 @Collection
 public class ActionPublishingJdo_interactionExecutions {
+    // ...
+//end::class[]
 
     private final ActionPublishingJdo actionPublishingJdo;
 
@@ -19,12 +24,16 @@ public class ActionPublishingJdo_interactionExecutions {
         this.actionPublishingJdo = actionPublishingJdo;
     }
 
+//tag::class[]
     public List<InteractionDto> coll() {
-        return publisherServiceSpiForActions
+        val list = new LinkedList<InteractionDto>();
+        publisherServiceSpiForActions
                 .streamInteractionDtos()
-                .collect(Collectors.toList());
+                .forEach(list::push);   // reverse order
+        return list;
     }
 
     @Inject
     private PublisherServiceSpiForActions publisherServiceSpiForActions;
 }
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/PublisherServiceSpiForActions.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/PublisherServiceSpiForActions.java
index 5b08b64..79500ad 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/PublisherServiceSpiForActions.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/PublisherServiceSpiForActions.java
@@ -12,6 +12,9 @@ import 
org.apache.isis.applib.services.publish.PublisherService;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
 import org.apache.isis.schema.ixn.v2.InteractionDto;
 
+import lombok.val;
+
+//tag::class[]
 @Service
 public class PublisherServiceSpiForActions implements PublisherService {
 
@@ -19,17 +22,14 @@ public class PublisherServiceSpiForActions implements 
PublisherService {
 
     @Override
     public void publish(Interaction.Execution<?, ?> execution) {
-
-        final InteractionDto dto =
-                InteractionDtoUtils.newInteractionDto(execution, 
InteractionDtoUtils.Strategy.DEEP);
-
+        val dto = InteractionDtoUtils.newInteractionDto(            // <.>
+                    execution, InteractionDtoUtils.Strategy.DEEP);
         executions.add(dto);
     }
+    // ...
+//end::class[]
 
-    @Override
-    public void publish(PublishedObjects publishedObjects) {
-    }
-
+//tag::demo[]
     public Stream<InteractionDto> streamInteractionDtos() {
         return executions.stream();
     }
@@ -37,5 +37,12 @@ public class PublisherServiceSpiForActions implements 
PublisherService {
     public void clear() {
         executions.clear();
     }
+//end::demo[]
+
+    @Override
+    public void publish(PublishedObjects publishedObjects) {
+    }
 
+//tag::class[]
 }
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_clearPublishedObjects.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_clearPublishedObjects.java
index 6e8f888..05be0a8 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_clearPublishedObjects.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_clearPublishedObjects.java
@@ -6,13 +6,15 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.SemanticsOf;
 
 import 
demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdo;
-import 
demoapp.dom.annotDomain.Property.publishing.spiimpl.PublisherServiceSpiForProperties;
 
+//tag::class[]
 @Action(
     semantics = SemanticsOf.IDEMPOTENT
     , associateWith = "publishedObjects"
 )
 public class DomainObjectPublishingJdo_clearPublishedObjects {
+    // ...
+//end::class[]
 
     private final DomainObjectPublishingJdo domainObjectPublishingJdo;
 
@@ -20,11 +22,13 @@ public class 
DomainObjectPublishingJdo_clearPublishedObjects {
         this.domainObjectPublishingJdo = domainObjectPublishingJdo;
     }
 
+    //tag::class[]
     public DomainObjectPublishingJdo act() {
         publisherServiceSpiForDomainObject.clear();
         return domainObjectPublishingJdo;
     }
 
     @Inject
-    private PublisherServiceSpiForDomainObject 
publisherServiceSpiForDomainObject;
+    PublisherServiceSpiForDomainObject publisherServiceSpiForDomainObject;
 }
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_publishedObjects.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_publishedObjects.java
index 1c2500e..5dbe083 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_publishedObjects.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_publishedObjects.java
@@ -1,29 +1,38 @@
 package demoapp.dom.annotDomain.DomainObject.publishing.spiimpl;
 
+import java.util.LinkedList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 
+import lombok.val;
+
 import 
demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdo;
 
+//tag::class[]
 @Collection
 public class DomainObjectPublishingJdo_publishedObjects {
+    // ...
+//end::class[]
 
     private final DomainObjectPublishingJdo domainObjectPublishingJdo;
     public 
DomainObjectPublishingJdo_publishedObjects(DomainObjectPublishingJdo 
domainObjectPublishingJdo) {
         this.domainObjectPublishingJdo = domainObjectPublishingJdo;
     }
 
+//tag::class[]
     public List<ChangesDto> coll() {
-        return publisherServiceSpiForDomainObject
+        val list = new LinkedList<ChangesDto>();
+        publisherServiceSpiForDomainObject
                 .streamPublishedObjects()
-                .collect(Collectors.toList());
+                .forEach(list::push);   // reverse order
+        return list;
     }
 
     @Inject
-    private PublisherServiceSpiForDomainObject 
publisherServiceSpiForDomainObject;
+    PublisherServiceSpiForDomainObject publisherServiceSpiForDomainObject;
 }
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/PublisherServiceSpiForDomainObject.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/PublisherServiceSpiForDomainObject.java
index 9873f45..ccb27bf 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/PublisherServiceSpiForDomainObject.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/PublisherServiceSpiForDomainObject.java
@@ -9,25 +9,25 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.publish.PublishedObjects;
 import org.apache.isis.applib.services.publish.PublisherService;
-import org.apache.isis.applib.util.schema.InteractionDtoUtils;
 import org.apache.isis.schema.chg.v2.ChangesDto;
-import org.apache.isis.schema.ixn.v2.InteractionDto;
 
+import lombok.val;
+
+//tag::class[]
 @Service
 public class PublisherServiceSpiForDomainObject implements PublisherService {
 
-    private final List<ChangesDto> publishedObjects = new 
ArrayList<ChangesDto>();
-
-    @Override
-    public void publish(Interaction.Execution<?, ?> execution) {
-    }
+    private final List<ChangesDto> publishedObjects = new ArrayList<>();
 
     @Override
     public void publish(PublishedObjects publishedObjects) {
-        final ChangesDto dto = publishedObjects.getDto();
+        val dto = publishedObjects.getDto();
         this.publishedObjects.add(dto);
     }
+    // ...
+//end::class[]
 
+//tag::demo[]
     public Stream<ChangesDto> streamPublishedObjects() {
         return publishedObjects.stream();
     }
@@ -35,5 +35,12 @@ public class PublisherServiceSpiForDomainObject implements 
PublisherService {
     public void clear() {
         publishedObjects.clear();
     }
+//end::demo[]
+
+    @Override
+    public void publish(Interaction.Execution<?, ?> execution) {
+    }
 
+//tag::class[]
 }
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/editing/PropertyEditingVm-description.adoc
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/editing/PropertyEditingVm-description.adoc
index 8e2bf73..e395122 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/editing/PropertyEditingVm-description.adoc
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/editing/PropertyEditingVm-description.adoc
@@ -30,7 +30,7 @@ The `editing` semantic can be specified explicitly using an 
annotation:
 ----
 include::PropertyEditingVm.java[tags=annotation]
 ----
-<.> explicitly specifies the maximum length that can be entered for the 
property
+<.> explicitly specifies that the property is editable
 
 The annotation could also be applied to a mixin, but would have little effect 
because mixin properties are always read-only.
 
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo-description.adoc
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo-description.adoc
index c62d177..f12e92f 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo-description.adoc
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo-description.adoc
@@ -1,74 +1,92 @@
-CAUTION: todo - to update.
-
-//The `editing` semantic specifies that a property's value can be changed 
through the UI:
-//
-//* for properties, the semantic can be specified using either the `@Property` 
annotation, or a meta-annotation
-//
-//There is no corresponding semantic for parameters, parameters are implicitly 
editable.
-//
-//== Class Level
-//
-//Usually editing of properties is discouraged; it is usually better to modify 
state through an explicit action instead.
-//For that reason, editing of properties is disabled by default (though that 
can be changed globally if necessary using the 
`isis.applib.annotation.domain-object.editing` configuration property).
-//
-//Editing can also be specified at the class level.
-//This will override any configured defaults, but just for the properties of 
that class:
-//
-//[source,java,indent=0]
-//----
-//include::PropertyEditingVm.java[tags=class]
-//----
-//
-//The property-level semantic can, in turn, overrides the configured or 
class-level default.
-//
-//
-//== Annotated
-//
-//The `editing` semantic can be specified explicitly using an annotation:
-//
-//* for properties, using `@Property#editing()`:
-//+
-//[source,java,indent=0]
-//----
-//include::PropertyEditingVm.java[tags=annotation]
-//----
-//<.> explicitly specifies the maximum length that can be entered for the 
property
-//
-//The annotation could also be applied to a mixin, but would have little 
effect because mixin properties are always read-only.
-//
-//== Meta-annotated
-//
-//The `editing` semantic can also be specified using a custom meta-annotation:
-//
-//* the meta-annotation is defined as:
-//+
-//[source,java]
-//----
-//include::EditingEnabledMetaAnnotation.java[tags=class]
-//----
-//<.> annotated for a property
-//<.> annotation can be applied to a property (either its getter or the field 
directly)
-//
-//* and can be applied to a property:
-//+
-//[source,java,indent=0]
-//----
-//include::PropertyEditingVm.java[tags=meta-annotated]
-//----
-//<.> semantic is inherited from the meta-annotation
-//
-//
-//
-//=== Meta-annotated Overridden
-//
-//The meta-annotation can itself be overridden:
-//
-//* in a property:
-//+
-//[source,java,indent=0]
-//----
-//include::PropertyEditingVm.java[tags=meta-annotated-overridden]
-//----
-//<.> semantic from meta-annotation ...
-//<.> \... is overridden by the `@Property` annotation
-//
+The `publishing` semantic specifies that the editing of an object property 
should be published to registered implementation(s) of 
link:https://isis.apache.org/refguide/2.0.0-M3/applib-svc/PublisherService.html#spi[`PublisherService`
 SPI].
+This is performed _after_ the property has been changed.
+
+The publishing from the framework to the SPI is in-memory.
+A typical SPI implementation would then publish over the network, or perhaps 
store in a database as per the 
link:https://microservices.io/patterns/data/transactional-outbox.html[outbox 
pattern].
+
+TIP: The framework provides an 
link:https://isis.apache.org/mappings/2.0.0-M3/outbox-publisher/about.html[out-of-the-box
 implementation] of the outbox pattern.
+
+The semantic can be specified using either the `@Property` annotation, or 
through a meta-annotation.
+
+== Annotated
+
+The `publisher` semantic can be specified explicitly using an annotation 
through `@Property#publishing()`:
+
+[source,java,indent=0]
+----
+include::PropertyPublishingJdo.java[tags=annotation]
+----
+<.> explicitly specifies that modifying the property should be published.
+
+The annotation could also be applied to a mixin, but would have little effect 
because mixin properties are always read-only.
+
+== Meta-annotated
+
+The `publishing` semantic can also be specified using a custom meta-annotation:
+
+* the meta-annotation is defined as:
++
+[source,java]
+----
+include::PropertyPublishingEnabledMetaAnnotation.java[tags=class]
+----
+<.> annotated for a property
+<.> annotation can be applied to a property (either its getter or the field 
directly)
+
+* and can be applied to a property:
++
+[source,java,indent=0]
+----
+include::PropertyPublishingJdo.java[tags=meta-annotated]
+----
+<.> semantic is inherited from the meta-annotation
+
+
+
+=== Meta-annotated Overridden
+
+The meta-annotation can itself be overridden:
+
+* in a property:
++
+[source,java,indent=0]
+----
+include::PropertyPublishingJdo.java[tags=meta-annotated-overridden]
+----
+<.> semantic from meta-annotation ...
+<.> \... is overridden by the `@Property` annotation
+
+
+== PublisherService
+
+The demo provides a simple implementation of `PublisherService` that just 
stores the DTOs in memory:
+
+[source,java]
+----
+include::spiimpl/PublisherServiceSpiForProperties.java[tags=class]
+----
+<.> serializes to `InteractionDto`, as defined by the 
link:https://isis.apache.org/refguide/2.0.0-M3/schema/ixn.html[Apache Isis 
schema].
+
+The demo implementation also provides a way to query these executions:
+
+[source,java,indent=0]
+----
+include::spiimpl/PublisherServiceSpiForProperties.java[tags=demo]
+----
+
+Supporting mixins surface this list as contributions on the object:
+
+* `interactionExecutions` collection:
++
+[source,java,indent=0]
+----
+include::spiimpl/PropertyPublishingJdo_interactionExecutions.java[tags=class]
+----
+
+* `clearInteractionExecutions` action:
++
+[source,java,indent=0]
+----
+include::spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java[tags=class]
+----
+
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
index 7a6a0ef..56b6481 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
@@ -73,8 +73,8 @@ public class PropertyPublishingJdo implements 
HasAsciiDocDescription {
 //end::annotation[]
 
 //tag::meta-annotated[]
-    @Property()
     @PropertyPublishingEnabledMetaAnnotation                // <.>
+    @Property()
     @PropertyLayout(
         describedAs = "@PublishingEnabledMetaAnnotation"
     )
@@ -85,14 +85,14 @@ public class PropertyPublishingJdo implements 
HasAsciiDocDescription {
 //end::meta-annotated[]
 
 //tag::meta-annotated-overridden[]
-    @PropertyPublishingEnabledMetaAnnotation                // <.>
+    @PropertyPublishingDisabledMetaAnnotation   // <.>
     @Property(
-        publishing = Publishing.DISABLED            // <.>
+        publishing = Publishing.ENABLED         // <.>
     )
     @PropertyLayout(
         describedAs =
-            "@PublishingEnabledMetaAnnotation " +
-            "@Property(publishing = DISABLED)"
+            "@PublishingDisabledMetaAnnotation " +
+            "@Property(publishing = ENABLED)"
     )
     @MemberOrder(name = "meta-annotated-overridden", sequence = "1")
     @XmlElement(required = false)
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java
index 0762216..3454bbf 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java
@@ -1,22 +1,20 @@
 package demoapp.dom.annotDomain.Property.publishing.spiimpl;
 
-import java.util.List;
-import java.util.stream.Collectors;
-
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.schema.ixn.v2.InteractionDto;
 
 import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo;
 
+//tag::class[]
 @Action(
     semantics = SemanticsOf.IDEMPOTENT
     , associateWith = "interactionExecutions"
 )
 public class PropertyPublishingJdo_clearInteractionExecutions {
+    // ...
+//end::class[]
 
     private final PropertyPublishingJdo propertyPublishingJdo;
 
@@ -24,11 +22,13 @@ public class 
PropertyPublishingJdo_clearInteractionExecutions {
         this.propertyPublishingJdo = propertyPublishingJdo;
     }
 
-    public List<InteractionDto> act() {
+//tag::class[]
+    public PropertyPublishingJdo act() {
         publisherServiceSpiForProperties.clear();
-        return (List<InteractionDto>) propertyPublishingJdo;
+        return propertyPublishingJdo;
     }
 
     @Inject
-    private PublisherServiceSpiForProperties publisherServiceSpiForProperties;
+    PublisherServiceSpiForProperties publisherServiceSpiForProperties;
 }
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_interactionExecutions.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_interactionExecutions.java
index 98ad7f9..b1adbca 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_interactionExecutions.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_interactionExecutions.java
@@ -1,5 +1,6 @@
 package demoapp.dom.annotDomain.Property.publishing.spiimpl;
 
+import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -8,10 +9,15 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.schema.ixn.v2.InteractionDto;
 
+import lombok.val;
+
 import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo;
 
+//tag::class[]
 @Collection
 public class PropertyPublishingJdo_interactionExecutions {
+    // ...
+//end::class[]
 
     private final PropertyPublishingJdo propertyPublishingJdo;
 
@@ -19,12 +25,16 @@ public class PropertyPublishingJdo_interactionExecutions {
         this.propertyPublishingJdo = propertyPublishingJdo;
     }
 
+//tag::class[]
     public List<InteractionDto> coll() {
-        return publisherServiceSpiForProperties
+        val list = new LinkedList<InteractionDto>();
+        publisherServiceSpiForProperties
                 .streamInteractionDtos()
-                .collect(Collectors.toList());
+                .forEach(list::push);   // reverse order
+        return list;
     }
 
     @Inject
-    private PublisherServiceSpiForProperties publisherServiceSpiForProperties;
+    PublisherServiceSpiForProperties publisherServiceSpiForProperties;
 }
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PublisherServiceSpiForProperties.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PublisherServiceSpiForProperties.java
index 46320ee..b196435 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PublisherServiceSpiForProperties.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PublisherServiceSpiForProperties.java
@@ -10,9 +10,11 @@ import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.publish.PublishedObjects;
 import org.apache.isis.applib.services.publish.PublisherService;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
-import org.apache.isis.schema.chg.v2.ChangesDto;
 import org.apache.isis.schema.ixn.v2.InteractionDto;
 
+import lombok.val;
+
+//tag::class[]
 @Service
 public class PublisherServiceSpiForProperties implements PublisherService {
 
@@ -20,17 +22,14 @@ public class PublisherServiceSpiForProperties implements 
PublisherService {
 
     @Override
     public void publish(Interaction.Execution<?, ?> execution) {
-
-        final InteractionDto dto =
-                InteractionDtoUtils.newInteractionDto(execution, 
InteractionDtoUtils.Strategy.DEEP);
-
+        val dto = InteractionDtoUtils.newInteractionDto(            // <.>
+                    execution, InteractionDtoUtils.Strategy.DEEP);
         executions.add(dto);
     }
+    // ...
+//end::class[]
 
-    @Override
-    public void publish(PublishedObjects publishedObjects) {
-    }
-
+//tag::demo[]
     public Stream<InteractionDto> streamInteractionDtos() {
         return executions.stream();
     }
@@ -38,5 +37,12 @@ public class PublisherServiceSpiForProperties implements 
PublisherService {
     public void clear() {
         executions.clear();
     }
+//end::demo[]
+
+    @Override
+    public void publish(PublishedObjects publishedObjects) {
+    }
 
+//tag::class[]
 }
+//end::class[]

Reply via email to