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

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

commit 883eacefcd55f5267367a4ded30cd440cbd0ea61
Author: danhaywood <[email protected]>
AuthorDate: Mon Aug 17 08:40:28 2020 +0100

    ISIS-2222: wip @Property#publishing, @Action#publishing, 
@DomainObject#publishing
---
 .../demoapp/dom/annotDomain/Action/ActionMenu.java | 20 ++++-
 .../ActionDomainEventVm-description.adoc           |  4 +-
 .../demoapp/dom/annotDomain/Action/hidden/.gitkeep |  0
 .../dom/annotDomain/Action/publishing/.gitkeep     |  0
 .../publishing/ActionDisabledMetaAnnotation.java   | 22 ++++++
 .../publishing/ActionEnabledMetaAnnotation.java    | 22 ++++++
 .../ActionPublishingJdo-description.adoc           | 74 ++++++++++++++++++
 .../Action/publishing/ActionPublishingJdo.java     | 88 +++++++++++++++++++++
 .../publishing/ActionPublishingJdo.layout.xml      | 57 ++++++++++++++
 .../publishing/ActionPublishingJdoEntities.java    | 31 ++++++++
 .../publishing/ActionPublishingJdoSeedService.java | 39 ++++++++++
 ...onPublishingJdo_clearInteractionExecutions.java | 32 ++++++++
 .../ActionPublishingJdo_interactionExecutions.java | 30 ++++++++
 .../spiimpl/PublisherServiceSpiForActions.java     | 41 ++++++++++
 .../annotDomain/DomainObject/DomainObjectMenu.java | 16 +++-
 .../annotDomain/DomainObject/publishing/.gitkeep   |  0
 .../DomainObjectDisabledMetaAnnotation.java        | 23 ++++++
 .../DomainObjectEnabledMetaAnnotation.java         | 23 ++++++
 .../DomainObjectPublishingJdo-description.adoc     | 74 ++++++++++++++++++
 .../publishing/DomainObjectPublishingJdo.java      | 89 ++++++++++++++++++++++
 .../DomainObjectPublishingJdo.layout.xml           | 53 +++++++++++++
 .../DomainObjectPublishingJdoEntities.java         | 31 ++++++++
 .../DomainObjectPublishingJdoSeedService.java      | 39 ++++++++++
 ...nObjectPublishingJdo_clearPublishedObjects.java | 30 ++++++++
 ...DomainObjectPublishingJdo_publishedObjects.java | 29 +++++++
 .../PublisherServiceSpiForDomainObject.java        | 39 ++++++++++
 .../dom/annotDomain/Property/PropertyMenu.java     | 10 +++
 .../dom/annotDomain/Property/publishing/.gitkeep   |  0
 ...tyPublishingJdo_clearInteractionExecutions.java | 34 +++++++++
 .../src/main/java/demoapp/dom/menubars.layout.xml  |  8 +-
 .../strings/jdo/JavaLangStringJdoEntities.java     |  3 +-
 31 files changed, 953 insertions(+), 8 deletions(-)

diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
index b3884aa..e64750a 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java
@@ -36,8 +36,12 @@ import demoapp.dom._infra.samples.NameSamples;
 import demoapp.dom.annotDomain.Action.associateWith.ActionAssociateWithVm;
 import 
demoapp.dom.annotDomain.Action.associateWith.child.ActionAssociateWithChildVm;
 import demoapp.dom.annotDomain.Action.domainEvent.ActionDomainEventVm;
+import demoapp.dom.annotDomain.Action.hidden.ActionHiddenVm;
+import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo;
+import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdoEntities;
 import demoapp.dom.annotDomain.Action.typeOf.ActionTypeOfVm;
 import demoapp.dom.annotDomain.Action.typeOf.child.ActionTypeOfChildVm;
+import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo;
 import demoapp.dom.types.Samples;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = "demo.ActionMenu")
@@ -65,7 +69,19 @@ public class ActionMenu {
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Decouples 
interaction of actions")
     public ActionDomainEventVm domainEvent(){
-        return new ActionDomainEventVm("change me");
+        return new ActionDomainEventVm("value");
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-glasses", describedAs = "Visibility of 
actions")
+    public ActionHiddenVm hidden(){
+        return new ActionHiddenVm("value");
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-book", describedAs = "Property changed events 
as XML")
+    public ActionPublishingJdo publishing(){
+        return actionPublishingJdoEntities.first();
     }
 
     @Action(semantics = SemanticsOf.SAFE)
@@ -81,6 +97,8 @@ public class ActionMenu {
         return typeOfVm;
     }
 
+    @Inject
+    ActionPublishingJdoEntities actionPublishingJdoEntities;
 
     @Inject
     NameSamples samples;
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/domainEvent/ActionDomainEventVm-description.adoc
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/domainEvent/ActionDomainEventVm-description.adoc
index 380ac57..71bb7cd 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/domainEvent/ActionDomainEventVm-description.adoc
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/domainEvent/ActionDomainEventVm-description.adoc
@@ -22,7 +22,7 @@ The fallback domain event can be suppressed using the 
`isis.applib.annotation.ac
 
 The demo defines two actions that are annotated using `domainEvent` semantic:
 
-* in the `ActionDomainEventVm` is a regular action, "updateText":
+* in the `ActionHiddenVm` is a regular action, "updateText":
 +
 [source,java]
 ----
@@ -31,7 +31,7 @@ include::ActionDomainEventVm.java[tags=class]
 <.> the event class to emit; genericised by the target type
 <.> indicates that the framework should emit this type
 
-* The `ActionDomainEventVm_mixinUpdateText` defines a mixin action, also 
annotated:
+* The `ActionHiddenVm_mixinUpdateTextNoAnnotation` defines a mixin action, 
also annotated:
 +
 [source,java]
 ----
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/hidden/.gitkeep
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/hidden/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/.gitkeep
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionDisabledMetaAnnotation.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionDisabledMetaAnnotation.java
new file mode 100644
index 0000000..4dc3e93
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionDisabledMetaAnnotation.java
@@ -0,0 +1,22 @@
+package demoapp.dom.annotDomain.Action.publishing;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Publishing;
+
+//tag::class[]
+@Property(publishing = Publishing.DISABLED)         // <.>
+@Inherited
+@Target({
+        ElementType.METHOD, ElementType.FIELD       // <.>
+})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ActionDisabledMetaAnnotation {
+
+}
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionEnabledMetaAnnotation.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionEnabledMetaAnnotation.java
new file mode 100644
index 0000000..230a7de
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionEnabledMetaAnnotation.java
@@ -0,0 +1,22 @@
+package demoapp.dom.annotDomain.Action.publishing;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Publishing;
+
+//tag::class[]
+@Property(publishing = Publishing.ENABLED)          // <.>
+@Inherited
+@Target({
+        ElementType.METHOD, ElementType.FIELD       // <.>
+})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ActionEnabledMetaAnnotation {
+
+}
+//end::class[]
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
new file mode 100644
index 0000000..c62d177
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo-description.adoc
@@ -0,0 +1,74 @@
+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
+//
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
new file mode 100644
index 0000000..0e7f3ea
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
@@ -0,0 +1,88 @@
+/*
+ *  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 demoapp.dom.annotDomain.Action.publishing;
+
+import javax.jdo.annotations.DatastoreIdentity;
+import javax.jdo.annotations.IdGeneratorStrategy;
+import javax.jdo.annotations.IdentityType;
+import javax.jdo.annotations.PersistenceCapable;
+import javax.xml.bind.annotation.XmlElement;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.annotation.Publishing;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo")
+@DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id")
+@DomainObject(
+        nature=Nature.JDO_ENTITY
+        , objectType = "demo.ActionPublishingJdo"
+        , editing = Editing.DISABLED
+)
+public class ActionPublishingJdo implements HasAsciiDocDescription {
+    // ...
+//end::class[]
+
+    public ActionPublishingJdo(String initialValue) {
+        this.property = initialValue;
+    }
+
+    public String title() {
+        return "Action#publishing";
+    }
+
+//tag::property[]
+    @Property()
+    @MemberOrder(name = "annotation", sequence = "1")
+    @Getter @Setter
+    private String property;
+//end::property[]
+
+    @Action(
+        publishing = Publishing.ENABLED         // <.>
+        , semantics = SemanticsOf.IDEMPOTENT
+        , associateWith = "property"
+        , associateWithSequence = "1"
+    )
+    @ActionLayout(
+            describedAs = "@Action(publishing = ENABLED)"
+    )
+    @MemberOrder(name = "annotation", sequence = "1")
+    public ActionPublishingJdo updatePropertyUsingAnnotation(final String 
value) {
+        setProperty(value);
+        return this;
+    }
+
+
+//tag::class[]
+}
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.layout.xml
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.layout.xml
new file mode 100644
index 0000000..f3edfb0
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.layout.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:grid
+        xsi:schemaLocation="http://isis.apache.org/applib/layout/component 
http://isis.apache.org/applib/layout/component/component.xsd   
http://isis.apache.org/applib/layout/grid/bootstrap3 
http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd";
+        xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3";
+        xmlns:cpt="http://isis.apache.org/applib/layout/component";
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
+
+       <bs3:row>
+               <bs3:col span="10" unreferencedActions="true">
+                       <cpt:domainObject />
+                       <cpt:action id="rebuildMetamodel"/>
+               </bs3:col>
+               <bs3:col span="2">
+                       <cpt:fieldSet name="" id="sources" />
+               </bs3:col>
+       </bs3:row>
+
+       <bs3:row>
+               <bs3:col span="6">
+                       <bs3:row>
+                               <bs3:col span="12">
+                                       <cpt:fieldSet name="Annotated" 
id="annotation"/>
+                                       <cpt:fieldSet name="Contributed" 
id="contributed"/>
+                                       <cpt:fieldSet name="Meta-annotated" 
id="meta-annotated"/>
+                                       <cpt:fieldSet name="Meta-annotated 
Overridden" id="meta-annotated-overridden"/>
+                               </bs3:col>
+                       </bs3:row>
+                       <bs3:row>
+                               <bs3:col span="12">
+                                       <cpt:collection 
id="interactionExecutions"/>
+                                       <cpt:collection id="publishedObjects"/>
+                               </bs3:col>
+                       </bs3:row>
+                       <bs3:row>
+                               <bs3:col span="12">
+                                       <cpt:fieldSet name="Other" id="other" 
unreferencedProperties="true"/>
+                               </bs3:col>
+                       </bs3:row>
+               </bs3:col>
+               <bs3:col span="6">
+                       <cpt:fieldSet name="Description" id="description" >
+                               <cpt:action id="clearHints" position="PANEL" />
+                               <cpt:action id="downloadLayoutXml"  
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="rebuildMetamodel" 
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="downloadMetamodelXml"  
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="inspectMetamodel"  
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="downloadJdoMetadata"  
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="openRestApi" 
position="PANEL_DROPDOWN" />
+                               <cpt:property id="description"/>
+                       </cpt:fieldSet>
+               </bs3:col>
+       </bs3:row>
+       <bs3:row>
+               <bs3:col span="12" unreferencedCollections="true"/>
+       </bs3:row>
+
+</bs3:grid>
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoEntities.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoEntities.java
new file mode 100644
index 0000000..5648337
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoEntities.java
@@ -0,0 +1,31 @@
+package demoapp.dom.annotDomain.Action.publishing;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+
+@Service
+public class ActionPublishingJdoEntities {
+
+    public Optional<ActionPublishingJdo> find(final String value) {
+        return repositoryService.firstMatch(ActionPublishingJdo.class, x -> 
Objects.equals(x.getProperty(), value));
+    }
+
+    public List<ActionPublishingJdo> all() {
+        return repositoryService.allInstances(ActionPublishingJdo.class);
+    }
+
+    public ActionPublishingJdo first() {
+        return all().stream().findFirst().get();
+    }
+
+    @Inject
+    RepositoryService repositoryService;
+
+}
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoSeedService.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoSeedService.java
new file mode 100644
index 0000000..1e015e5
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoSeedService.java
@@ -0,0 +1,39 @@
+package demoapp.dom.annotDomain.Action.publishing;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
+
+import demoapp.dom._infra.seed.SeedServiceAbstract;
+import demoapp.dom.types.Samples;
+
+@Service
+public class ActionPublishingJdoSeedService extends SeedServiceAbstract {
+
+    public ActionPublishingJdoSeedService() {
+        super(PropertyPublishingJdoEntityFixture::new);
+    }
+
+    static class PropertyPublishingJdoEntityFixture extends FixtureScript {
+
+        @Override
+        protected void execute(ExecutionContext executionContext) {
+            samples.stream()
+                    .map(ActionPublishingJdo::new)
+                    .forEach(domainObject -> {
+                        repositoryService.persist(domainObject);
+                        executionContext.addResult(this, domainObject);
+                    });
+
+        }
+
+        @Inject
+        RepositoryService repositoryService;
+
+        @Inject
+        Samples<String> samples;
+    }
+}
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
new file mode 100644
index 0000000..071785b
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_clearInteractionExecutions.java
@@ -0,0 +1,32 @@
+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;
+
+@Action(
+    semantics = SemanticsOf.IDEMPOTENT
+    , associateWith = "interactionExecutions"
+)
+public class ActionPublishingJdo_clearInteractionExecutions {
+
+    private final ActionPublishingJdo actionPublishingJdo;
+
+    public ActionPublishingJdo_clearInteractionExecutions(ActionPublishingJdo 
actionPublishingJdo) {
+        this.actionPublishingJdo = actionPublishingJdo;
+    }
+
+    public List<InteractionDto> act() {
+        publisherServiceSpiForActions.clear();
+        return (List<InteractionDto>) actionPublishingJdo;
+    }
+
+    @Inject
+    private PublisherServiceSpiForActions publisherServiceSpiForActions;
+}
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
new file mode 100644
index 0000000..b39ccba
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_interactionExecutions.java
@@ -0,0 +1,30 @@
+package demoapp.dom.annotDomain.Action.publishing.spiimpl;
+
+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 demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo;
+
+@Collection
+public class ActionPublishingJdo_interactionExecutions {
+
+    private final ActionPublishingJdo actionPublishingJdo;
+
+    public ActionPublishingJdo_interactionExecutions(ActionPublishingJdo 
actionPublishingJdo) {
+        this.actionPublishingJdo = actionPublishingJdo;
+    }
+
+    public List<InteractionDto> coll() {
+        return publisherServiceSpiForActions
+                .streamInteractionDtos()
+                .collect(Collectors.toList());
+    }
+
+    @Inject
+    private PublisherServiceSpiForActions publisherServiceSpiForActions;
+}
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
new file mode 100644
index 0000000..5b08b64
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/PublisherServiceSpiForActions.java
@@ -0,0 +1,41 @@
+package demoapp.dom.annotDomain.Action.publishing.spiimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+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.ixn.v2.InteractionDto;
+
+@Service
+public class PublisherServiceSpiForActions implements PublisherService {
+
+    private final List<InteractionDto> executions = new ArrayList<>();
+
+    @Override
+    public void publish(Interaction.Execution<?, ?> execution) {
+
+        final InteractionDto dto =
+                InteractionDtoUtils.newInteractionDto(execution, 
InteractionDtoUtils.Strategy.DEEP);
+
+        executions.add(dto);
+    }
+
+    @Override
+    public void publish(PublishedObjects publishedObjects) {
+    }
+
+    public Stream<InteractionDto> streamInteractionDtos() {
+        return executions.stream();
+    }
+
+    public void clear() {
+        executions.clear();
+    }
+
+}
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
index 0008dd0..8df34bc 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java
@@ -20,18 +20,28 @@ package demoapp.dom.annotDomain.DomainObject;
 
 import javax.inject.Inject;
 
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.applib.value.Blob;
+import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.extern.log4j.Log4j2;
 
-import demoapp.dom.types.Samples;
+import 
demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdo;
+import 
demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdoEntities;
 
 @DomainService(nature=NatureOfService.VIEW, objectType = 
"demo.DomainObjectMenu")
 @Log4j2
 public class DomainObjectMenu {
 
+    @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-book", describedAs = "Object changed events 
as XML")
+    public DomainObjectPublishingJdo publishing(){
+        return domainObjectPublishingJdoEntities.first();
+    }
+
+    @Inject
+    DomainObjectPublishingJdoEntities domainObjectPublishingJdoEntities;
 
 }
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/.gitkeep
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectDisabledMetaAnnotation.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectDisabledMetaAnnotation.java
new file mode 100644
index 0000000..7b15570
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectDisabledMetaAnnotation.java
@@ -0,0 +1,23 @@
+package demoapp.dom.annotDomain.DomainObject.publishing;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Publishing;
+
+//tag::class[]
+@DomainObject(publishing = Publishing.DISABLED)     // <.>
+@Inherited
+@Target({
+        ElementType.TYPE                            // <.>
+})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DomainObjectDisabledMetaAnnotation {
+
+}
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectEnabledMetaAnnotation.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectEnabledMetaAnnotation.java
new file mode 100644
index 0000000..8f438ee
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectEnabledMetaAnnotation.java
@@ -0,0 +1,23 @@
+package demoapp.dom.annotDomain.DomainObject.publishing;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Publishing;
+
+//tag::class[]
+@DomainObject(publishing = Publishing.ENABLED)      // <.>
+@Inherited
+@Target({
+        ElementType.TYPE                            // <.>
+})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DomainObjectEnabledMetaAnnotation {
+
+}
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo-description.adoc
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo-description.adoc
new file mode 100644
index 0000000..c62d177
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo-description.adoc
@@ -0,0 +1,74 @@
+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
+//
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.java
new file mode 100644
index 0000000..e2726cb
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.java
@@ -0,0 +1,89 @@
+/*
+ *  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 demoapp.dom.annotDomain.DomainObject.publishing;
+
+import javax.jdo.annotations.DatastoreIdentity;
+import javax.jdo.annotations.IdGeneratorStrategy;
+import javax.jdo.annotations.IdentityType;
+import javax.jdo.annotations.PersistenceCapable;
+import javax.xml.bind.annotation.XmlElement;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.annotation.Publishing;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
+
+//tag::class[]
+@PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo")
+@DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id")
+@DomainObject(
+        nature=Nature.JDO_ENTITY
+        , objectType = "demo.DomainObjectPublishingJdo"
+        , editing = Editing.ENABLED
+        , publishing = Publishing.ENABLED          // <.>
+)
+@DomainObjectLayout(
+        describedAs =
+                "@DomainObject(publishing=ENABLED)"
+)
+public class DomainObjectPublishingJdo implements HasAsciiDocDescription {
+    // ...
+//end::class[]
+
+    public DomainObjectPublishingJdo(String initialValue) {
+        this.property = initialValue;
+    }
+
+    public String title() {
+        return "DomainObject#publishing";
+    }
+
+//tag::property[]
+    @Property()
+    @MemberOrder(name = "general", sequence = "1")
+    @Getter @Setter
+    private String property;
+//end::property[]
+
+//tag::action[]
+    @Action(
+        semantics = SemanticsOf.IDEMPOTENT
+        , associateWith = "property"
+    )
+    @MemberOrder(name = "annotation", sequence = "1")
+    public DomainObjectPublishingJdo updateProperty(final String value) {
+        setProperty(value);
+        return this;
+    }
+//end::action[]
+
+//tag::class[]
+}
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.layout.xml
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.layout.xml
new file mode 100644
index 0000000..cc21592
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.layout.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<bs3:grid
+        xsi:schemaLocation="http://isis.apache.org/applib/layout/component 
http://isis.apache.org/applib/layout/component/component.xsd   
http://isis.apache.org/applib/layout/grid/bootstrap3 
http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd";
+        xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3";
+        xmlns:cpt="http://isis.apache.org/applib/layout/component";
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
+
+       <bs3:row>
+               <bs3:col span="10" unreferencedActions="true">
+                       <cpt:domainObject />
+                       <cpt:action id="rebuildMetamodel"/>
+               </bs3:col>
+               <bs3:col span="2">
+                       <cpt:fieldSet name="" id="sources" />
+               </bs3:col>
+       </bs3:row>
+
+       <bs3:row>
+               <bs3:col span="6">
+                       <bs3:row>
+                               <bs3:col span="12">
+                                       <cpt:fieldSet name="General" 
id="general"/>
+                               </bs3:col>
+                       </bs3:row>
+                       <bs3:row>
+                               <bs3:col span="12">
+                                       <cpt:collection id="publishedObjects"/>
+                               </bs3:col>
+                       </bs3:row>
+                       <bs3:row>
+                               <bs3:col span="12">
+                                       <cpt:fieldSet name="Other" id="other" 
unreferencedProperties="true"/>
+                               </bs3:col>
+                       </bs3:row>
+               </bs3:col>
+               <bs3:col span="6">
+                       <cpt:fieldSet name="Description" id="description" >
+                               <cpt:action id="clearHints" position="PANEL" />
+                               <cpt:action id="downloadLayoutXml"  
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="rebuildMetamodel" 
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="downloadMetamodelXml"  
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="inspectMetamodel"  
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="downloadJdoMetadata"  
position="PANEL_DROPDOWN"/>
+                               <cpt:action id="openRestApi" 
position="PANEL_DROPDOWN" />
+                               <cpt:property id="description"/>
+                       </cpt:fieldSet>
+               </bs3:col>
+       </bs3:row>
+       <bs3:row>
+               <bs3:col span="12" unreferencedCollections="true"/>
+       </bs3:row>
+
+</bs3:grid>
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoEntities.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoEntities.java
new file mode 100644
index 0000000..f0194b1
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoEntities.java
@@ -0,0 +1,31 @@
+package demoapp.dom.annotDomain.DomainObject.publishing;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+
+@Service
+public class DomainObjectPublishingJdoEntities {
+
+    public Optional<DomainObjectPublishingJdo> find(final String value) {
+        return repositoryService.firstMatch(DomainObjectPublishingJdo.class, x 
-> Objects.equals(x.getProperty(), value));
+    }
+
+    public List<DomainObjectPublishingJdo> all() {
+        return repositoryService.allInstances(DomainObjectPublishingJdo.class);
+    }
+
+    public DomainObjectPublishingJdo first() {
+        return all().stream().findFirst().get();
+    }
+
+    @Inject
+    RepositoryService repositoryService;
+
+}
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoSeedService.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoSeedService.java
new file mode 100644
index 0000000..27ef179
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoSeedService.java
@@ -0,0 +1,39 @@
+package demoapp.dom.annotDomain.DomainObject.publishing;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
+
+import demoapp.dom._infra.seed.SeedServiceAbstract;
+import demoapp.dom.types.Samples;
+
+@Service
+public class DomainObjectPublishingJdoSeedService extends SeedServiceAbstract {
+
+    public DomainObjectPublishingJdoSeedService() {
+        super(PropertyPublishingJdoEntityFixture::new);
+    }
+
+    static class PropertyPublishingJdoEntityFixture extends FixtureScript {
+
+        @Override
+        protected void execute(ExecutionContext executionContext) {
+            samples.stream()
+                    .map(DomainObjectPublishingJdo::new)
+                    .forEach(domainObject -> {
+                        repositoryService.persist(domainObject);
+                        executionContext.addResult(this, domainObject);
+                    });
+
+        }
+
+        @Inject
+        RepositoryService repositoryService;
+
+        @Inject
+        Samples<String> samples;
+    }
+}
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
new file mode 100644
index 0000000..6e8f888
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_clearPublishedObjects.java
@@ -0,0 +1,30 @@
+package demoapp.dom.annotDomain.DomainObject.publishing.spiimpl;
+
+import javax.inject.Inject;
+
+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;
+
+@Action(
+    semantics = SemanticsOf.IDEMPOTENT
+    , associateWith = "publishedObjects"
+)
+public class DomainObjectPublishingJdo_clearPublishedObjects {
+
+    private final DomainObjectPublishingJdo domainObjectPublishingJdo;
+
+    public 
DomainObjectPublishingJdo_clearPublishedObjects(DomainObjectPublishingJdo 
domainObjectPublishingJdo) {
+        this.domainObjectPublishingJdo = domainObjectPublishingJdo;
+    }
+
+    public DomainObjectPublishingJdo act() {
+        publisherServiceSpiForDomainObject.clear();
+        return domainObjectPublishingJdo;
+    }
+
+    @Inject
+    private PublisherServiceSpiForDomainObject 
publisherServiceSpiForDomainObject;
+}
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
new file mode 100644
index 0000000..1c2500e
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_publishedObjects.java
@@ -0,0 +1,29 @@
+package demoapp.dom.annotDomain.DomainObject.publishing.spiimpl;
+
+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 
demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdo;
+
+@Collection
+public class DomainObjectPublishingJdo_publishedObjects {
+
+    private final DomainObjectPublishingJdo domainObjectPublishingJdo;
+    public 
DomainObjectPublishingJdo_publishedObjects(DomainObjectPublishingJdo 
domainObjectPublishingJdo) {
+        this.domainObjectPublishingJdo = domainObjectPublishingJdo;
+    }
+
+    public List<ChangesDto> coll() {
+        return publisherServiceSpiForDomainObject
+                .streamPublishedObjects()
+                .collect(Collectors.toList());
+    }
+
+    @Inject
+    private PublisherServiceSpiForDomainObject 
publisherServiceSpiForDomainObject;
+}
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
new file mode 100644
index 0000000..9873f45
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/PublisherServiceSpiForDomainObject.java
@@ -0,0 +1,39 @@
+package demoapp.dom.annotDomain.DomainObject.publishing.spiimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+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;
+
+@Service
+public class PublisherServiceSpiForDomainObject implements PublisherService {
+
+    private final List<ChangesDto> publishedObjects = new 
ArrayList<ChangesDto>();
+
+    @Override
+    public void publish(Interaction.Execution<?, ?> execution) {
+    }
+
+    @Override
+    public void publish(PublishedObjects publishedObjects) {
+        final ChangesDto dto = publishedObjects.getDto();
+        this.publishedObjects.add(dto);
+    }
+
+    public Stream<ChangesDto> streamPublishedObjects() {
+        return publishedObjects.stream();
+    }
+
+    public void clear() {
+        publishedObjects.clear();
+    }
+
+}
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
index 814f1d3..b97d5c3 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java
@@ -41,6 +41,8 @@ import 
demoapp.dom.annotDomain.Property.hidden.child.PropertyHiddenChildVm;
 import demoapp.dom.annotDomain.Property.maxLength.PropertyMaxLengthVm;
 import demoapp.dom.annotDomain.Property.mustSatisfy.PropertyMustSatisfyVm;
 import demoapp.dom.annotDomain.Property.optionality.PropertyOptionalityVm;
+import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo;
+import 
demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdoEntities;
 import demoapp.dom.annotDomain.Property.regexPattern.PropertyRegexPatternVm;
 import demoapp.dom.types.Samples;
 
@@ -127,6 +129,12 @@ public class PropertyMenu {
     }
 
     @Action(semantics = SemanticsOf.SAFE)
+    @ActionLayout(cssClassFa="fa-book", describedAs = "Property changed events 
as XML")
+    public PropertyPublishingJdo publishing(){
+        return propertyPublishingJdoEntities.first();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(cssClassFa="fa-equals", describedAs = "Regular expressions, 
such as email")
     public PropertyRegexPatternVm regexPattern(){
         val vm = new PropertyRegexPatternVm();
@@ -154,5 +162,7 @@ public class PropertyMenu {
     Samples<Blob> blobSamples;
     @Inject
     Samples<Clob> clobSamples;
+    @Inject
+    PropertyPublishingJdoEntities propertyPublishingJdoEntities;
 
 }
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/.gitkeep
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/.gitkeep
deleted file mode 100644
index e69de29..0000000
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
new file mode 100644
index 0000000..0762216
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java
@@ -0,0 +1,34 @@
+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;
+
+@Action(
+    semantics = SemanticsOf.IDEMPOTENT
+    , associateWith = "interactionExecutions"
+)
+public class PropertyPublishingJdo_clearInteractionExecutions {
+
+    private final PropertyPublishingJdo propertyPublishingJdo;
+
+    public 
PropertyPublishingJdo_clearInteractionExecutions(PropertyPublishingJdo 
propertyPublishingJdo) {
+        this.propertyPublishingJdo = propertyPublishingJdo;
+    }
+
+    public List<InteractionDto> act() {
+        publisherServiceSpiForProperties.clear();
+        return (List<InteractionDto>) propertyPublishingJdo;
+    }
+
+    @Inject
+    private PublisherServiceSpiForProperties publisherServiceSpiForProperties;
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml 
b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
index d041e7f..984efc2 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
@@ -15,10 +15,10 @@ as a replacement for
             <mb3:named>Basic Types</mb3:named>
             <mb3:section>
                <mb3:named>Primitives</mb3:named>
-                <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" 
id="bytes"/>
                 <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" 
id="shorts"/>
                 <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" 
id="ints"/>
                 <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" 
id="longs"/>
+                <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" 
id="bytes"/>
                 <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" 
id="floats"/>
                 <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" 
id="doubles"/>
                 <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" 
id="chars"/>
@@ -107,9 +107,14 @@ as a replacement for
         <mb3:menu>
             <mb3:named>Domain Annotations</mb3:named>
             <mb3:section>
+                <mb3:named>@DomainObject</mb3:named>
+                <mb3:serviceAction objectType="demo.DomainObjectMenu" 
id="publishing"/>
+            </mb3:section>
+            <mb3:section>
                 <mb3:named>@Action</mb3:named>
                 <mb3:serviceAction objectType="demo.ActionMenu" 
id="associateWith"/>
                 <mb3:serviceAction objectType="demo.ActionMenu" 
id="domainEvent"/>
+                <mb3:serviceAction objectType="demo.ActionMenu" id="hidden"/>
                 <mb3:serviceAction objectType="demo.ActionMenu" id="typeOf"/>
             </mb3:section>
             <mb3:section>
@@ -121,6 +126,7 @@ as a replacement for
                 <mb3:serviceAction objectType="demo.PropertyMenu" 
id="maxLength"/>
                 <mb3:serviceAction objectType="demo.PropertyMenu" 
id="mustSatisfy"/>
                 <mb3:serviceAction objectType="demo.PropertyMenu" 
id="optionality"/>
+                <mb3:serviceAction objectType="demo.PropertyMenu" 
id="publishing"/>
                 <mb3:serviceAction objectType="demo.PropertyMenu" 
id="regexPattern"/>
             </mb3:section>
         </mb3:menu>
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
index 01e63f5..a3769d7 100644
--- 
a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java
@@ -1,6 +1,7 @@
 package demoapp.dom.types.javalang.strings.jdo;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -13,7 +14,7 @@ import 
org.apache.isis.applib.services.repository.RepositoryService;
 public class JavaLangStringJdoEntities {
 
     public Optional<JavaLangStringJdo> find(final String readOnlyProperty) {
-        return repositoryService.firstMatch(JavaLangStringJdo.class, x -> 
x.getReadOnlyProperty() == readOnlyProperty);
+        return repositoryService.firstMatch(JavaLangStringJdo.class, x -> 
Objects.equals(x.getReadOnlyProperty(), readOnlyProperty));
     }
 
     public List<JavaLangStringJdo> all() {

Reply via email to