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 acaa9dc14ce4a3e9fa43001196c6426581733633
Author: danhaywood <[email protected]>
AuthorDate: Sat Aug 15 10:30:21 2020 +0100

    ISIS-2222: wip Property#command
---
 .../core/metamodel/IsisModuleCoreMetamodel.java    |   6 +-
 .../facets/schema/InteractionDtoValueFacet.java    |  30 ++++++
 ...DtoValueFacetUsingSemanticsProviderFactory.java |  41 ++++++++
 .../InteractionDtoValueSemanticsProvider.java      | 107 ++++++++++++++++++++
 .../facets/schema/IsisSchemaMetaModelRefiner.java  |  38 +++++++
 .../facets/schema/IsisSchemaValueTypeProvider.java |  42 ++++++++
 .../dom/annotDomain/Property/PropertyMenu.java     |  10 ++
 .../dom/annotDomain/Property/publishing/.gitkeep   |   0
 .../PropertyPublishingJdo-description.adoc         |  74 ++++++++++++++
 .../Property/publishing/PropertyPublishingJdo.java | 111 +++++++++++++++++++++
 .../publishing/PropertyPublishingJdo.layout.xml    |  57 +++++++++++
 .../publishing/PropertyPublishingJdoEntities.java  |  31 ++++++
 .../PropertyPublishingJdoSeedService.java          |  39 ++++++++
 .../PublishingDisabledMetaAnnotation.java          |  22 ++++
 .../PublishingEnabledMetaAnnotation.java           |  23 +++++
 ...ropertyPublishingJdo_interactionExecutions.java |  30 ++++++
 .../PropertyPublishingJdo_publishedObjects.java    |  32 ++++++
 .../spiimpl/PublisherServiceSpiForProperties.java  |  49 +++++++++
 .../src/main/java/demoapp/dom/menubars.layout.xml  |   3 +-
 .../strings/jdo/JavaLangStringJdoEntities.java     |   3 +-
 20 files changed, 745 insertions(+), 3 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
index 3b34bde..1e2b3af 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
@@ -24,6 +24,8 @@ import org.springframework.context.annotation.Import;
 import org.apache.isis.applib.IsisModuleApplib;
 import org.apache.isis.core.config.IsisModuleCoreConfig;
 import org.apache.isis.core.metamodel.context.MetaModelContexts;
+import org.apache.isis.core.metamodel.facets.schema.IsisSchemaMetaModelRefiner;
+import 
org.apache.isis.core.metamodel.facets.schema.IsisSchemaValueTypeProvider;
 import 
org.apache.isis.core.metamodel.inspect.IsisModuleCoreMetamodelInspection;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManagerDefault;
 import 
org.apache.isis.core.metamodel.progmodel.ProgrammingModelInitFilterDefault;
@@ -99,7 +101,9 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
 
         // @Repository's
         ApplicationFeatureRepositoryDefault.class,
-        
+
+        IsisSchemaMetaModelRefiner.class,
+        IsisSchemaValueTypeProvider.class,
 
 })
 public class IsisModuleCoreMetamodel {
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueFacet.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueFacet.java
new file mode 100644
index 0000000..056a421
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueFacet.java
@@ -0,0 +1,30 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.schema;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+
+public interface InteractionDtoValueFacet extends Facet {
+    
+    String interactionDtoValue(ManagedObject object);
+    ManagedObject createValue(ManagedObject object, String xml);
+
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueFacetUsingSemanticsProviderFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueFacetUsingSemanticsProviderFactory.java
new file mode 100644
index 0000000..d7b76bf
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueFacetUsingSemanticsProviderFactory.java
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.schema;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import 
org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.schema.ixn.v2.InteractionDto;
+
+import lombok.val;
+
+public class InteractionDtoValueFacetUsingSemanticsProviderFactory extends 
ValueFacetUsingSemanticsProviderFactory<InteractionDto> {
+
+    @Override
+    public void process(final ProcessClassContext processClassContext) {
+        final Class<?> type = processClassContext.getCls();
+        final FacetHolder holder = processClassContext.getFacetHolder();
+
+        if (!(InteractionDto.class.isAssignableFrom(type))) {
+            return;
+        }
+        val provider = new InteractionDtoValueSemanticsProvider(holder);
+        addFacets(provider);
+    }
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueSemanticsProvider.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueSemanticsProvider.java
new file mode 100644
index 0000000..aae5938
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/InteractionDtoValueSemanticsProvider.java
@@ -0,0 +1,107 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.schema;
+
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.util.schema.InteractionDtoUtils;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import 
org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.schema.ixn.v2.InteractionDto;
+
+public class InteractionDtoValueSemanticsProvider
+extends ValueSemanticsProviderAndFacetAbstract<InteractionDto>
+implements InteractionDtoValueFacet {
+
+    private static final int TYPICAL_LENGTH = 0;
+
+    private static Class<? extends Facet> type() {
+        return InteractionDtoValueFacet.class;
+    }
+
+    private static final InteractionDto DEFAULT_VALUE = null;
+
+    /**
+     * Required because implementation of {@link Parser} and
+     * {@link EncoderDecoder}.
+     */
+    public InteractionDtoValueSemanticsProvider() {
+        this(null);
+    }
+
+    public InteractionDtoValueSemanticsProvider(final FacetHolder holder) {
+        super(type(), holder, InteractionDto.class, TYPICAL_LENGTH, -1, 
Immutability.IMMUTABLE, EqualByContent.NOT_HONOURED, DEFAULT_VALUE);
+    }
+
+
+    @Override
+    protected InteractionDto doParse(final Object context, final String str) {
+        return doRestore(str);
+    }
+
+    @Override
+    public String titleString(final Object object) {
+        if (object == null) return "[null]";
+        final InteractionDto interactionDto = (InteractionDto) object;
+        return InteractionDtoUtils.toXml(interactionDto);
+    }
+
+    @Override
+    public String titleStringWithMask(final Object value, final String 
usingMask) {
+        return titleString(value);
+    }
+
+
+    @Override
+    public String interactionDtoValue(final ManagedObject object) {
+        if (object == null) {
+            return "";
+        }
+        final InteractionDto interactionDto = (InteractionDto) 
object.getPojo();
+        return InteractionDtoUtils.toXml(interactionDto);
+    }
+
+    @Override
+    public ManagedObject createValue(final ManagedObject object, final String 
xml) {
+        final InteractionDto interactionDto = InteractionDtoUtils.fromXml(xml);
+        return getObjectManager().adapt(interactionDto);
+    }
+
+
+    @Override
+    protected String doEncode(final Object object) {
+        InteractionDto interactionDto = (InteractionDto) object;
+        return InteractionDtoUtils.toXml(interactionDto);
+    }
+
+    @Override
+    protected InteractionDto doRestore(final String xml) {
+        return InteractionDtoUtils.fromXml(xml);
+    }
+
+
+    @Override
+    public String toString() {
+        return "InteractionDtoValueSemanticsProvider";
+    }
+
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/IsisSchemaMetaModelRefiner.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/IsisSchemaMetaModelRefiner.java
new file mode 100644
index 0000000..dc97220
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/IsisSchemaMetaModelRefiner.java
@@ -0,0 +1,38 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.schema;
+
+import javax.inject.Named;
+
+import org.springframework.stereotype.Component;
+
+import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
+
+@Component
+@Named("isisMetaModel.isisSchema.MetaModelRefiner")
+public class IsisSchemaMetaModelRefiner implements MetaModelRefiner {
+    @Override
+    public void refineProgrammingModel(ProgrammingModel programmingModel) {
+        programmingModel.addFactory(
+                ProgrammingModel.FacetProcessingOrder.G1_VALUE_TYPES,
+                InteractionDtoValueFacetUsingSemanticsProviderFactory.class);
+    }
+}
+
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/IsisSchemaValueTypeProvider.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/IsisSchemaValueTypeProvider.java
new file mode 100644
index 0000000..b5f51bb
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/IsisSchemaValueTypeProvider.java
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.schema;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.inject.Named;
+
+import org.springframework.stereotype.Component;
+
+import org.apache.isis.core.metamodel.valuetypes.ValueTypeDefinition;
+import org.apache.isis.core.metamodel.valuetypes.ValueTypeProvider;
+import org.apache.isis.schema.common.v2.ValueType;
+import org.apache.isis.schema.ixn.v2.InteractionDto;
+import org.apache.isis.schema.ixn.v2.PropertyEditDto;
+
+@Component
+@Named("isisMetaModel.isisSchema.ValueTypeProvider")
+public class IsisSchemaValueTypeProvider implements ValueTypeProvider {
+    @Override
+    public Collection<ValueTypeDefinition> definitions() {
+        return Collections.singletonList(
+                ValueTypeDefinition.of(InteractionDto.class, 
ValueType.STRING));
+    }
+}
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/PropertyPublishingJdo-description.adoc
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo-description.adoc
new file mode 100644
index 0000000..c62d177
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo-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/Property/publishing/PropertyPublishingJdo.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
new file mode 100644
index 0000000..ae84079
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
@@ -0,0 +1,111 @@
+/*
+ *  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.Property.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.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+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 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.PropertyPublishingJdo"
+        , editing = Editing.ENABLED
+        , publishing = Publishing.DISABLED          // <.>
+)
+public class PropertyPublishingJdo implements HasAsciiDocDescription {
+    // ...
+//end::class[]
+
+    public PropertyPublishingJdo(String initialValue) {
+        this.propertyUsingAnnotation = initialValue;
+        this.propertyUsingMetaAnnotation = initialValue;
+        this.propertyUsingMetaAnnotationButOverridden = initialValue;
+    }
+
+    public String title() {
+        return "Property#publishing";
+    }
+
+//tag::annotation[]
+    @Property(
+        publishing = Publishing.ENABLED             // <.>
+    )
+    @PropertyLayout(
+        describedAs =
+            "@Property(publishing = ENABLED)"
+    )
+    @MemberOrder(name = "annotation", sequence = "1")
+    @XmlElement(required = true)
+    @Getter @Setter
+    private String propertyUsingAnnotation;
+//end::annotation[]
+
+//tag::meta-annotated[]
+    @Property()
+    @PublishingEnabledMetaAnnotation                // <.>
+    @PropertyLayout(
+        describedAs = "@PublishingEnabledMetaAnnotation"
+    )
+    @MemberOrder(name = "meta-annotated", sequence = "1")
+    @XmlElement(required = true)
+    @Getter @Setter
+    private String propertyUsingMetaAnnotation;
+//end::meta-annotated[]
+
+//tag::meta-annotated-overridden[]
+    @PublishingEnabledMetaAnnotation                // <.>
+    @Property(
+        publishing = Publishing.DISABLED            // <.>
+    )
+    @PropertyLayout(
+        describedAs =
+            "@PublishingEnabledMetaAnnotation " +
+            "@PropertyLayout(publishing = DISABLED)"
+    )
+    @MemberOrder(name = "meta-annotated-overridden", sequence = "1")
+    @XmlElement(required = false)
+    @Getter @Setter
+    private String propertyUsingMetaAnnotationButOverridden;
+//end::meta-annotated-overridden[]
+
+//tag::class[]
+}
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.layout.xml
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.layout.xml
new file mode 100644
index 0000000..f3edfb0
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.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/Property/publishing/PropertyPublishingJdoEntities.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoEntities.java
new file mode 100644
index 0000000..192c9d3
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoEntities.java
@@ -0,0 +1,31 @@
+package demoapp.dom.annotDomain.Property.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 PropertyPublishingJdoEntities {
+
+    public Optional<PropertyPublishingJdo> find(final String value) {
+        return repositoryService.firstMatch(PropertyPublishingJdo.class, x -> 
Objects.equals(x.getPropertyUsingAnnotation(), value));
+    }
+
+    public List<PropertyPublishingJdo> all() {
+        return repositoryService.allInstances(PropertyPublishingJdo.class);
+    }
+
+    public PropertyPublishingJdo first() {
+        return all().stream().findFirst().get();
+    }
+
+    @Inject
+    RepositoryService repositoryService;
+
+}
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoSeedService.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoSeedService.java
new file mode 100644
index 0000000..c45cd79
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdoSeedService.java
@@ -0,0 +1,39 @@
+package demoapp.dom.annotDomain.Property.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 PropertyPublishingJdoSeedService extends SeedServiceAbstract {
+
+    public PropertyPublishingJdoSeedService() {
+        super(PropertyPublishingJdoEntityFixture::new);
+    }
+
+    static class PropertyPublishingJdoEntityFixture extends FixtureScript {
+
+        @Override
+        protected void execute(ExecutionContext executionContext) {
+            samples.stream()
+                    .map(PropertyPublishingJdo::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/Property/publishing/PublishingDisabledMetaAnnotation.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PublishingDisabledMetaAnnotation.java
new file mode 100644
index 0000000..4b7705a
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PublishingDisabledMetaAnnotation.java
@@ -0,0 +1,22 @@
+package demoapp.dom.annotDomain.Property.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 PublishingDisabledMetaAnnotation {
+
+}
+//end::class[]
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PublishingEnabledMetaAnnotation.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PublishingEnabledMetaAnnotation.java
new file mode 100644
index 0000000..ce7c42a
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PublishingEnabledMetaAnnotation.java
@@ -0,0 +1,23 @@
+package demoapp.dom.annotDomain.Property.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.Editing;
+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 PublishingEnabledMetaAnnotation {
+
+}
+//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
new file mode 100644
index 0000000..98ad7f9
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_interactionExecutions.java
@@ -0,0 +1,30 @@
+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.Collection;
+import org.apache.isis.schema.ixn.v2.InteractionDto;
+
+import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo;
+
+@Collection
+public class PropertyPublishingJdo_interactionExecutions {
+
+    private final PropertyPublishingJdo propertyPublishingJdo;
+
+    public PropertyPublishingJdo_interactionExecutions(PropertyPublishingJdo 
propertyPublishingJdo) {
+        this.propertyPublishingJdo = propertyPublishingJdo;
+    }
+
+    public List<InteractionDto> coll() {
+        return publisherServiceSpiForProperties
+                .streamInteractionDtos()
+                .collect(Collectors.toList());
+    }
+
+    @Inject
+    private PublisherServiceSpiForProperties publisherServiceSpiForProperties;
+}
diff --git 
a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_publishedObjects.java
 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_publishedObjects.java
new file mode 100644
index 0000000..da19d5a
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_publishedObjects.java
@@ -0,0 +1,32 @@
+package demoapp.dom.annotDomain.Property.publishing.spiimpl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+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.Property.publishing.PropertyPublishingJdo;
+
+@Collection
+public class PropertyPublishingJdo_publishedObjects {
+
+    private final PropertyPublishingJdo propertyPublishingJdo;
+    public PropertyPublishingJdo_publishedObjects(PropertyPublishingJdo 
propertyPublishingJdo) {
+        this.propertyPublishingJdo = propertyPublishingJdo;
+    }
+
+    public List<String> coll() {
+        return new ArrayList<>();
+//        return publisherServiceSpiForProperties
+//                .streamPublishedObjects()
+//                .collect(Collectors.toList());
+    }
+
+    @Inject
+    private PublisherServiceSpiForProperties publisherServiceSpiForProperties;
+}
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
new file mode 100644
index 0000000..4f92964
--- /dev/null
+++ 
b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PublisherServiceSpiForProperties.java
@@ -0,0 +1,49 @@
+package demoapp.dom.annotDomain.Property.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 PublisherServiceSpiForProperties implements PublisherService {
+
+    private final List<InteractionDto> executions = new ArrayList<>();
+    private final List<ChangesDto> publishedObjects = new 
ArrayList<ChangesDto>();
+
+    @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) {
+        final ChangesDto dto = publishedObjects.getDto();
+        this.publishedObjects.add(dto);
+    }
+
+    public Stream<InteractionDto> streamInteractionDtos() {
+        return executions.stream();
+    }
+
+    public Stream<ChangesDto> streamPublishedObjects() {
+        return publishedObjects.stream();
+    }
+
+    public void clear() {
+        executions.clear();
+    }
+
+}
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 db3a222..a992119 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"/>
@@ -122,6 +122,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