You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2020/08/23 17:08:08 UTC
[isis] 02/02: ISIS-2222: wip Action#command
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit f537ae484bd66555f1bea826d4d63f6283a42d8b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Aug 23 17:49:54 2020 +0100
ISIS-2222: wip Action#command
---
.../demoapp/dom/annotDomain/Action/ActionMenu.java | 14 ++-
.../dom/annotDomain/Action/command/.gitkeep | 0
.../ActionCommandDisabledMetaAnnotation.java} | 8 +-
.../ActionCommandEnabledMetaAnnotation.java} | 8 +-
.../command/ActionCommandJdo-description.adoc | 140 +++++++++++++++++++++
.../ActionCommandJdo.java} | 61 ++++++---
.../ActionCommandJdo.layout.xml} | 5 +-
.../Action/command/ActionCommandJdoEntities.java | 31 +++++
.../command/ActionCommandJdoSeedService.java | 39 ++++++
.../ActionCommandJdo_mixinUpdateProperty.java | 38 ++++++
...mmandJdo_mixinUpdatePropertyMetaAnnotation.java | 37 ++++++
...ixinUpdatePropertyMetaAnnotationOverridden.java | 41 ++++++
.../ActionCommandJdo_backgroundCommands.java | 39 ++++++
.../ActionCommandJdo_clearBackgroundCommands.java | 38 ++++++
.../ActionCommandJdo_clearForegroundCommands.java | 38 ++++++
...ActionCommandJdo_executeBackgroundCommands.java | 39 ++++++
.../ActionCommandJdo_foregroundCommands.java | 39 ++++++
.../spiimpl/CommandServiceSpiForActions.java | 95 ++++++++++++++
.../ActionPublishingDisabledMetaAnnotation.java | 3 +-
.../Action/publishing/ActionPublishingJdo.java | 6 +-
.../publishing/ActionPublishingJdo.layout.xml | 1 -
.../Property/publishing/PropertyPublishingJdo.java | 4 +-
.../publishing/PropertyPublishingJdo.layout.xml | 1 -
.../annotLayout/ActionLayout/ActionLayoutMenu.java | 2 +-
.../src/main/java/demoapp/dom/menubars.layout.xml | 1 +
25 files changed, 693 insertions(+), 35 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 e64750a..14c7cde 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
@@ -35,6 +35,8 @@ import lombok.extern.log4j.Log4j2;
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.command.ActionCommandJdo;
+import demoapp.dom.annotDomain.Action.command.ActionCommandJdoEntities;
import demoapp.dom.annotDomain.Action.domainEvent.ActionDomainEventVm;
import demoapp.dom.annotDomain.Action.hidden.ActionHiddenVm;
import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo;
@@ -67,6 +69,13 @@ public class ActionMenu {
}
@Action(semantics = SemanticsOf.SAFE)
+ @ActionLayout(cssClassFa="fa-terminal", describedAs = "Action invocation intentions as XML")
+ public ActionCommandJdo command(){
+ return actionCommandJdoEntities.first();
+ }
+
+
+ @Action(semantics = SemanticsOf.SAFE)
@ActionLayout(cssClassFa="fa-asterisk", describedAs = "Decouples interaction of actions")
public ActionDomainEventVm domainEvent(){
return new ActionDomainEventVm("value");
@@ -79,7 +88,7 @@ public class ActionMenu {
}
@Action(semantics = SemanticsOf.SAFE)
- @ActionLayout(cssClassFa="fa-book", describedAs = "Property changed events as XML")
+ @ActionLayout(cssClassFa="fa-book", describedAs = "Action invocation events as XML")
public ActionPublishingJdo publishing(){
return actionPublishingJdoEntities.first();
}
@@ -101,6 +110,9 @@ public class ActionMenu {
ActionPublishingJdoEntities actionPublishingJdoEntities;
@Inject
+ ActionCommandJdoEntities actionCommandJdoEntities;
+
+ @Inject
NameSamples samples;
}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java
similarity index 62%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java
index 542c723..5cf894b 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandDisabledMetaAnnotation.java
@@ -1,4 +1,4 @@
-package demoapp.dom.annotDomain.Action.publishing;
+package demoapp.dom.annotDomain.Action.command;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
@@ -6,17 +6,19 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.CommandReification;
import org.apache.isis.applib.annotation.Property;
import org.apache.isis.applib.annotation.Publishing;
//tag::class[]
-@Property(publishing = Publishing.DISABLED) // <.>
+@Action(command = CommandReification.DISABLED) // <.>
@Inherited
@Target({
ElementType.TYPE, ElementType.METHOD // <.>
})
@Retention(RetentionPolicy.RUNTIME)
-public @interface ActionPublishingDisabledMetaAnnotation {
+public @interface ActionCommandDisabledMetaAnnotation {
}
//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java
similarity index 65%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java
index 542c723..62e0d52 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandEnabledMetaAnnotation.java
@@ -1,4 +1,4 @@
-package demoapp.dom.annotDomain.Action.publishing;
+package demoapp.dom.annotDomain.Action.command;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
@@ -6,17 +6,17 @@ 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.Action;
import org.apache.isis.applib.annotation.Publishing;
//tag::class[]
-@Property(publishing = Publishing.DISABLED) // <.>
+@Action(publishing = Publishing.ENABLED) // <.>
@Inherited
@Target({
ElementType.TYPE, ElementType.METHOD // <.>
})
@Retention(RetentionPolicy.RUNTIME)
-public @interface ActionPublishingDisabledMetaAnnotation {
+public @interface ActionCommandEnabledMetaAnnotation {
}
//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc
new file mode 100644
index 0000000..673c469
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo-description.adoc
@@ -0,0 +1,140 @@
+CAUTION: TODO - to document
+
+//The `publishing` semantic specifies that the invocation of an object action should be published to registered implementation(s) of link:https://isis.apache.org/refguide/2.0.0-M3/applib-svc/PublisherService.html#spi[`PublisherService` SPI].
+//This is performed _after_ the action has been invoked.
+//
+//The publishing from the framework to the SPI is in-memory.
+//A typical SPI implementation would then publish over the network, or perhaps store in a database.
+//(Note that the framework provides an link:https://isis.apache.org/mappings/2.0.0-M3/outbox-publisher/about.html[out-of-the-box implementation] of the link:https://microservices.io/patterns/data/transactional-outbox.html[outbox pattern]).
+//
+//The semantic can be specified using either the `@Action` annotation, or through a meta-annotation.
+//
+//NOTE: The demo shows publishing of entities, as this is much more common use case than publishing a view model.
+//
+//== Annotated
+//
+//The `publisher` semantic can be specified explicitly using an annotation through `@Action#publishing()`:
+//
+//* it can be applied to an action:
+//+
+//[source,java,indent=0]
+//----
+//include::ActionPublishingJdo.java[tags=annotation]
+//----
+//<.> explicitly specifies that invoking the action should be published.
+//
+//* or to a mixin:
+//+
+//[source,java,indent=0]
+//----
+//include::ActionPublishingJdo_mixinUpdateProperty.java[tags=class]
+//----
+//<.> explicitly specifies that invoking the mixin action should be published.
+//
+//
+//== Meta-annotated
+//
+//The `publishing` semantic can also be specified using a custom meta-annotation:
+//
+//* the meta-annotation is defined as:
+//+
+//[source,java,indent=0]
+//----
+//include::ActionPublishingEnabledMetaAnnotation.java[tags=class]
+//----
+//<.> annotated for an action
+//<.> annotation can be applied to an action method or to a mixin
+//
+//* and can be applied to an action:
+//+
+//[source,java,indent=0]
+//----
+//include::ActionPublishingJdo.java[tags=meta-annotation]
+//----
+//<.> semantic is inherited from the meta-annotation
+//
+//* or to a mixin:
+//+
+//[source,java,indent=0]
+//----
+//include::ActionPublishingJdo_mixinUpdatePropertyMetaAnnotation.java[tags=class]
+//----
+//<.> semantic is inherited from the meta-annotation
+//
+//
+//=== Meta-annotated Overridden
+//
+//The meta-annotation can itself be overridden:
+//
+//* for an action:
+//+
+//[source,java,indent=0]
+//----
+//include::ActionPublishingJdo.java[tags=meta-annotation-overridden]
+//----
+//<.> semantic from meta-annotation ...
+//<.> \... is overridden by the `@Action` annotation
+//
+//* or on a mixin:
+//+
+//[source,java,indent=0]
+//----
+//include::ActionPublishingJdo_mixinUpdatePropertyMetaAnnotationOverridden.java[tags=class]
+//----
+//<.> semantic from meta-annotation ...
+//<.> \... is overridden by the `@Action` annotation
+//
+//
+//== PublisherService
+//
+//The demo provides a simple implementation of `PublisherService` that just stores the DTOs in memory:
+//
+//[source,java]
+//----
+//include::spiimpl/PublisherServiceSpiForActions.java[tags=class]
+//----
+//<.> serializes to `InteractionDto`, as defined by the link:https://isis.apache.org/refguide/2.0.0-M3/schema/ixn.html[Apache Isis schema].
+//
+//The demo implementation also provides a way to query these executions:
+//
+//[source,java,indent=0]
+//----
+//include::spiimpl/PublisherServiceSpiForActions.java[tags=demo]
+//----
+//
+//Supporting mixins surface this list as contributions on the object:
+//
+//* `interactionExecutions` collection:
+//+
+//[source,java,indent=0]
+//----
+//include::spiimpl/ActionPublishingJdo_interactionExecutions.java[tags=class]
+//----
+//
+//* `clearInteractionExecutions` action:
+//+
+//[source,java,indent=0]
+//----
+//include::spiimpl/ActionPublishingJdo_clearInteractionExecutions.java[tags=class]
+//----
+//
+//
+//== Configuration
+//
+//By default, publishing of action invocations is disabled.
+//This can be configured globally:
+//
+//[source,yaml]
+//.application.yml
+//----
+//isis:
+// applib:
+// annotation:
+// action:
+// publishing: none
+//----
+//
+//In addition to globally enabling or disabling action publishing, it is also possible to specify `ignore_safe`.
+//
+//This enables publishing for all actions except those that have safe (that is, query-only) semantics.
+//In other words actions are published except for those that don't change (aren't declared as changing) the state of the system.
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/command/ActionCommandJdo.java
similarity index 66%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.java
index 1556229..3d1745d 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package demoapp.dom.annotDomain.Action.publishing;
+package demoapp.dom.annotDomain.Action.command;
import javax.jdo.annotations.DatastoreIdentity;
import javax.jdo.annotations.IdGeneratorStrategy;
@@ -25,6 +25,9 @@ import javax.jdo.annotations.PersistenceCapable;
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.CommandExecuteIn;
+import org.apache.isis.applib.annotation.CommandPersistence;
+import org.apache.isis.applib.annotation.CommandReification;
import org.apache.isis.applib.annotation.DomainObject;
import org.apache.isis.applib.annotation.Editing;
import org.apache.isis.applib.annotation.MemberOrder;
@@ -43,21 +46,22 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
@DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id")
@DomainObject(
nature=Nature.JDO_ENTITY
- , objectType = "demo.ActionPublishingJdo"
+ , objectType = "demo.ActionCommandJdo"
, editing = Editing.DISABLED
)
-public class ActionPublishingJdo implements HasAsciiDocDescription {
+public class ActionCommandJdo implements HasAsciiDocDescription {
// ...
//end::class[]
- public ActionPublishingJdo(String initialValue) {
+ public ActionCommandJdo(String initialValue) {
this.property = initialValue;
this.propertyMetaAnnotated = initialValue;
this.propertyMetaAnnotatedOverridden = initialValue;
+ this.propertyUpdateInBackground = initialValue;
}
public String title() {
- return "Action#publishing";
+ return "Action#command";
}
//tag::property[]
@@ -75,31 +79,35 @@ public class ActionPublishingJdo implements HasAsciiDocDescription {
@MemberOrder(name = "meta-annotated-overridden", sequence = "1")
@Getter @Setter
private String propertyMetaAnnotatedOverridden;
+
+ @Property()
+ @MemberOrder(name = "background", sequence = "1")
+ @Getter @Setter
+ private String propertyUpdateInBackground;
//end::property[]
//tag::annotation[]
@Action(
- publishing = Publishing.ENABLED // <.>
+ command = CommandReification.ENABLED // <.>
, semantics = SemanticsOf.IDEMPOTENT
, associateWith = "property"
, associateWithSequence = "1"
)
@ActionLayout(
named = "Update Property"
- , describedAs = "@Action(publishing = ENABLED)"
+ , describedAs = "@Action(command = ENABLED)"
)
- public ActionPublishingJdo updatePropertyUsingAnnotation(final String value) {
+ public ActionCommandJdo updatePropertyUsingAnnotation(final String value) {
setProperty(value);
return this;
}
public String default0UpdatePropertyUsingAnnotation() {
return getProperty();
}
-
//end::annotation[]
//tag::meta-annotation[]
- @ActionPublishingEnabledMetaAnnotation // <.>
+ @ActionCommandEnabledMetaAnnotation // <.>
@Action(
semantics = SemanticsOf.IDEMPOTENT
, associateWith = "propertyMetaAnnotated"
@@ -107,9 +115,9 @@ public class ActionPublishingJdo implements HasAsciiDocDescription {
)
@ActionLayout(
named = "Update Property"
- , describedAs = "@PublishingEnabledMetaAnnotation"
+ , describedAs = "@ActionCommandEnabledMetaAnnotation"
)
- public ActionPublishingJdo updatePropertyUsingMetaAnnotation(final String value) {
+ public ActionCommandJdo updatePropertyUsingMetaAnnotation(final String value) {
setPropertyMetaAnnotated(value);
return this;
}
@@ -119,9 +127,9 @@ public class ActionPublishingJdo implements HasAsciiDocDescription {
//end::meta-annotation[]
//tag::meta-annotation-overridden[]
- @ActionPublishingDisabledMetaAnnotation // <.>
+ @ActionCommandDisabledMetaAnnotation // <.>
@Action(
- publishing = Publishing.ENABLED // <.>
+ command = CommandReification.ENABLED // <.>
, semantics = SemanticsOf.IDEMPOTENT
, associateWith = "propertyMetaAnnotatedOverridden"
, associateWithSequence = "1"
@@ -129,9 +137,9 @@ public class ActionPublishingJdo implements HasAsciiDocDescription {
@ActionLayout(
named = "Update Property"
, describedAs =
- "@PublishingEnabledMetaAnnotation @Action(publishing = ENABLED)"
+ "@ActionCommandDisabledMetaAnnotation @Action(publishing = ENABLED)"
)
- public ActionPublishingJdo updatePropertyUsingMetaAnnotationButOverridden(final String value) {
+ public ActionCommandJdo updatePropertyUsingMetaAnnotationButOverridden(final String value) {
setPropertyMetaAnnotatedOverridden(value);
return this;
}
@@ -140,6 +148,27 @@ public class ActionPublishingJdo implements HasAsciiDocDescription {
}
//end::meta-annotation-overridden[]
+//tag::background[]
+ @Action(
+ command = CommandReification.ENABLED // <.>
+ , commandExecuteIn = CommandExecuteIn.BACKGROUND // <.>
+ , semantics = SemanticsOf.IDEMPOTENT
+ , associateWith = "propertyUpdateInBackground"
+ , associateWithSequence = "1"
+ )
+ @ActionLayout(
+ describedAs =
+ "@Action(command = ENABLED, commandExecuteIn = BACKGROUND)"
+ )
+ public ActionCommandJdo updatePropertyInBackground(final String value) {
+ setPropertyUpdateInBackground(value);
+ return this;
+ }
+ public String default0UpdatePropertyInBackground() {
+ return getPropertyUpdateInBackground();
+ }
+//end::background[]
+
//tag::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/command/ActionCommandJdo.layout.xml
similarity index 93%
copy from examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.layout.xml
copy to examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo.layout.xml
index f3edfb0..8b34302 100644
--- 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/command/ActionCommandJdo.layout.xml
@@ -23,12 +23,13 @@
<cpt:fieldSet name="Contributed" id="contributed"/>
<cpt:fieldSet name="Meta-annotated" id="meta-annotated"/>
<cpt:fieldSet name="Meta-annotated Overridden" id="meta-annotated-overridden"/>
+ <cpt:fieldSet name="Background" id="background"/>
</bs3:col>
</bs3:row>
<bs3:row>
<bs3:col span="12">
- <cpt:collection id="interactionExecutions"/>
- <cpt:collection id="publishedObjects"/>
+ <cpt:collection id="foregroundCommands"/>
+ <cpt:collection id="backgroundCommands"/>
</bs3:col>
</bs3:row>
<bs3:row>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdoEntities.java
new file mode 100644
index 0000000..19cf0a7
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdoEntities.java
@@ -0,0 +1,31 @@
+package demoapp.dom.annotDomain.Action.command;
+
+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 ActionCommandJdoEntities {
+
+ public Optional<ActionCommandJdo> find(final String value) {
+ return repositoryService.firstMatch(ActionCommandJdo.class, x -> Objects.equals(x.getProperty(), value));
+ }
+
+ public List<ActionCommandJdo> all() {
+ return repositoryService.allInstances(ActionCommandJdo.class);
+ }
+
+ public ActionCommandJdo first() {
+ return all().stream().findFirst().get();
+ }
+
+ @Inject
+ RepositoryService repositoryService;
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdoSeedService.java
new file mode 100644
index 0000000..0e704d8
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdoSeedService.java
@@ -0,0 +1,39 @@
+package demoapp.dom.annotDomain.Action.command;
+
+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 ActionCommandJdoSeedService extends SeedServiceAbstract {
+
+ public ActionCommandJdoSeedService() {
+ super(PropertyPublishingJdoEntityFixture::new);
+ }
+
+ static class PropertyPublishingJdoEntityFixture extends FixtureScript {
+
+ @Override
+ protected void execute(ExecutionContext executionContext) {
+ samples.stream()
+ .map(ActionCommandJdo::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/command/ActionCommandJdo_mixinUpdateProperty.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdateProperty.java
new file mode 100644
index 0000000..349b825
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdateProperty.java
@@ -0,0 +1,38 @@
+package demoapp.dom.annotDomain.Action.command;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Publishing;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+//tag::class[]
+@Action(
+ publishing = Publishing.ENABLED // <.>
+ , semantics = SemanticsOf.IDEMPOTENT
+ , associateWith = "property"
+ , associateWithSequence = "2"
+)
+@ActionLayout(
+ named = "Mixin Update Property"
+ , describedAs = "@Action(publishing = ENABLED)"
+)
+public class ActionCommandJdo_mixinUpdateProperty {
+ // ...
+//end::class[]
+
+ private final ActionCommandJdo actionCommandJdo;
+
+ public ActionCommandJdo_mixinUpdateProperty(ActionCommandJdo actionCommandJdo) {
+ this.actionCommandJdo = actionCommandJdo;
+ }
+
+//tag::class[]
+ public ActionCommandJdo act(final String value) {
+ actionCommandJdo.setProperty(value);
+ return actionCommandJdo;
+ }
+ public String default0Act() {
+ return actionCommandJdo.getProperty();
+ }
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdatePropertyMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdatePropertyMetaAnnotation.java
new file mode 100644
index 0000000..5d3e7e7
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdatePropertyMetaAnnotation.java
@@ -0,0 +1,37 @@
+package demoapp.dom.annotDomain.Action.command;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+//tag::class[]
+@ActionCommandEnabledMetaAnnotation // <.>
+@Action(
+ semantics = SemanticsOf.IDEMPOTENT
+ , associateWith = "propertyMetaAnnotated"
+ , associateWithSequence = "2"
+)
+@ActionLayout(
+ named = "Mixin Update Property"
+ , describedAs = "@ActionPublishingEnabledMetaAnnotation"
+)
+public class ActionCommandJdo_mixinUpdatePropertyMetaAnnotation {
+ // ...
+//end::class[]
+
+ private final ActionCommandJdo actionCommandJdo;
+
+ public ActionCommandJdo_mixinUpdatePropertyMetaAnnotation(ActionCommandJdo actionCommandJdo) {
+ this.actionCommandJdo = actionCommandJdo;
+ }
+
+//tag::class[]
+ public ActionCommandJdo act(final String value) {
+ actionCommandJdo.setPropertyMetaAnnotated(value);
+ return actionCommandJdo;
+ }
+ public String default0Act() {
+ return actionCommandJdo.getPropertyMetaAnnotated();
+ }
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdatePropertyMetaAnnotationOverridden.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
new file mode 100644
index 0000000..52f6ac7
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/ActionCommandJdo_mixinUpdatePropertyMetaAnnotationOverridden.java
@@ -0,0 +1,41 @@
+package demoapp.dom.annotDomain.Action.command;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Publishing;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+//tag::class[]
+@ActionCommandDisabledMetaAnnotation // <.>
+@Action(
+ publishing = Publishing.ENABLED // <.>
+ , semantics = SemanticsOf.IDEMPOTENT
+ , associateWith = "propertyMetaAnnotatedOverridden"
+ , associateWithSequence = "2"
+)
+@ActionLayout(
+ named = "Mixin Update Property"
+ , describedAs =
+ "@ActionPublishingDisabledMetaAnnotation " +
+ "@Action(publishing = ENABLED)"
+)
+public class ActionCommandJdo_mixinUpdatePropertyMetaAnnotationOverridden {
+ // ...
+//end::class[]
+
+ private final ActionCommandJdo actionCommandJdo;
+
+ public ActionCommandJdo_mixinUpdatePropertyMetaAnnotationOverridden(ActionCommandJdo actionCommandJdo) {
+ this.actionCommandJdo = actionCommandJdo;
+ }
+
+//tag::class[]
+ public ActionCommandJdo act(final String value) {
+ actionCommandJdo.setPropertyMetaAnnotatedOverridden(value);
+ return actionCommandJdo;
+ }
+ public String default0Act() {
+ return actionCommandJdo.getPropertyMetaAnnotatedOverridden();
+ }
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_backgroundCommands.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_backgroundCommands.java
new file mode 100644
index 0000000..ab695e5
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_backgroundCommands.java
@@ -0,0 +1,39 @@
+package demoapp.dom.annotDomain.Action.command.spiimpl;
+
+import java.util.LinkedList;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.services.command.CommandWithDto;
+import org.apache.isis.schema.cmd.v2.CommandDto;
+
+import lombok.val;
+
+import demoapp.dom.annotDomain.Action.command.ActionCommandJdo;
+
+//tag::class[]
+@Collection
+public class ActionCommandJdo_backgroundCommands {
+ // ...
+//end::class[]
+
+ private final ActionCommandJdo actionCommandJdo;
+ public ActionCommandJdo_backgroundCommands(ActionCommandJdo actionCommandJdo) {
+ this.actionCommandJdo = actionCommandJdo;
+ }
+
+ //tag::class[]
+ public LinkedList<CommandDto> coll() {
+ val list = new LinkedList<CommandDto>();
+ commandServiceSpiForActions
+ .streamBackgroundCommands()
+ .map(CommandWithDto::asDto)
+ .forEach(list::push); // reverse order
+ return list;
+ }
+
+ @Inject
+ private CommandServiceSpiForActions commandServiceSpiForActions;
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_clearBackgroundCommands.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_clearBackgroundCommands.java
new file mode 100644
index 0000000..410674f
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_clearBackgroundCommands.java
@@ -0,0 +1,38 @@
+package demoapp.dom.annotDomain.Action.command.spiimpl;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+import demoapp.dom.annotDomain.Action.command.ActionCommandJdo;
+
+//tag::class[]
+@Action(
+ semantics = SemanticsOf.IDEMPOTENT
+ , associateWith = "backgroundCommands"
+)
+@ActionLayout(
+ named = "Clear"
+)
+public class ActionCommandJdo_clearBackgroundCommands {
+ // ...
+//end::class[]
+
+ private final ActionCommandJdo actionCommandJdo;
+ public ActionCommandJdo_clearBackgroundCommands(ActionCommandJdo actionCommandJdo) {
+ this.actionCommandJdo = actionCommandJdo;
+ }
+
+
+ //tag::class[]
+ public ActionCommandJdo act() {
+ commandServiceSpiForActions.clearBackgroundCommands();
+ return actionCommandJdo;
+ }
+
+ @Inject
+ private CommandServiceSpiForActions commandServiceSpiForActions;
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_clearForegroundCommands.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_clearForegroundCommands.java
new file mode 100644
index 0000000..3485421
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_clearForegroundCommands.java
@@ -0,0 +1,38 @@
+package demoapp.dom.annotDomain.Action.command.spiimpl;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+import demoapp.dom.annotDomain.Action.command.ActionCommandJdo;
+
+//tag::class[]
+@Action(
+ semantics = SemanticsOf.IDEMPOTENT
+ , associateWith = "foregroundCommands"
+)
+@ActionLayout(
+ named = "Clear"
+)
+public class ActionCommandJdo_clearForegroundCommands {
+ // ...
+//end::class[]
+
+ private final ActionCommandJdo actionCommandJdo;
+ public ActionCommandJdo_clearForegroundCommands(ActionCommandJdo actionCommandJdo) {
+ this.actionCommandJdo = actionCommandJdo;
+ }
+
+
+ //tag::class[]
+ public ActionCommandJdo act() {
+ commandServiceSpiForActions.clearForegroundCommands();
+ return actionCommandJdo;
+ }
+
+ @Inject
+ private CommandServiceSpiForActions commandServiceSpiForActions;
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_executeBackgroundCommands.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_executeBackgroundCommands.java
new file mode 100644
index 0000000..43b0dbc
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_executeBackgroundCommands.java
@@ -0,0 +1,39 @@
+package demoapp.dom.annotDomain.Action.command.spiimpl;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+import demoapp.dom.annotDomain.Action.command.ActionCommandJdo;
+
+//tag::class[]
+@Action(
+ semantics = SemanticsOf.IDEMPOTENT
+ , associateWith = "backgroundCommands"
+ , associateWithSequence = "2"
+)
+@ActionLayout(
+ named = "Execute"
+)
+public class ActionCommandJdo_executeBackgroundCommands {
+ // ...
+//end::class[]
+
+ private final ActionCommandJdo actionCommandJdo;
+ public ActionCommandJdo_executeBackgroundCommands(ActionCommandJdo actionCommandJdo) {
+ this.actionCommandJdo = actionCommandJdo;
+ }
+
+
+ //tag::class[]
+ public ActionCommandJdo act() {
+ commandServiceSpiForActions.clearBackgroundCommands();
+ return actionCommandJdo;
+ }
+
+ @Inject
+ private CommandServiceSpiForActions commandServiceSpiForActions;
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_foregroundCommands.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_foregroundCommands.java
new file mode 100644
index 0000000..5c57292
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/ActionCommandJdo_foregroundCommands.java
@@ -0,0 +1,39 @@
+package demoapp.dom.annotDomain.Action.command.spiimpl;
+
+import java.util.LinkedList;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.services.command.CommandWithDto;
+import org.apache.isis.schema.cmd.v2.CommandDto;
+
+import lombok.val;
+
+import demoapp.dom.annotDomain.Action.command.ActionCommandJdo;
+
+//tag::class[]
+@Collection
+public class ActionCommandJdo_foregroundCommands {
+ // ...
+//end::class[]
+
+ private final ActionCommandJdo actionCommandJdo;
+ public ActionCommandJdo_foregroundCommands(ActionCommandJdo actionCommandJdo) {
+ this.actionCommandJdo = actionCommandJdo;
+ }
+
+ //tag::class[]
+ public LinkedList<CommandDto> coll() {
+ val list = new LinkedList<CommandDto>();
+ commandServiceSpiForActions
+ .streamForegroundCommands()
+ .map(CommandWithDto::asDto)
+ .forEach(list::push); // reverse order
+ return list;
+ }
+
+ @Inject
+ private CommandServiceSpiForActions commandServiceSpiForActions;
+}
+//end::class[]
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/CommandServiceSpiForActions.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/CommandServiceSpiForActions.java
new file mode 100644
index 0000000..af62cf8
--- /dev/null
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/command/spiimpl/CommandServiceSpiForActions.java
@@ -0,0 +1,95 @@
+package demoapp.dom.annotDomain.Action.command.spiimpl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Stream;
+
+import javax.inject.Inject;
+
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.annotation.CommandExecuteIn;
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.applib.services.background.BackgroundCommandService;
+import org.apache.isis.applib.services.clock.ClockService;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandDefault;
+import org.apache.isis.applib.services.command.CommandWithDto;
+import org.apache.isis.applib.services.command.spi.CommandService;
+import org.apache.isis.applib.util.schema.CommandDtoUtils;
+import org.apache.isis.core.runtimeservices.background.BackgroundCommandExecution;
+import org.apache.isis.core.security.authentication.standard.SimpleSession;
+import org.apache.isis.schema.cmd.v2.CommandDto;
+
+import lombok.val;
+
+@Service
+@Order(OrderPrecedence.EARLY) // <.>
+public class CommandServiceSpiForActions implements CommandService {
+
+ public static class CommandWithDtoDefault extends CommandDefault implements CommandWithDto {
+ @Override
+ public CommandDto asDto() {
+ return CommandDtoUtils.fromXml(getMemento());
+ }
+ }
+
+ private List<CommandWithDto> foregroundCommands = new ArrayList<>();
+ private List<CommandWithDto> backgroundCommands = new ArrayList<>();
+
+ @Override
+ public Command create() {
+ return new CommandWithDtoDefault();
+ }
+
+ @Override
+ public boolean persistIfPossible(Command command) {
+ return true;
+ }
+
+ @Override
+ public void complete(Command command) {
+ final CommandWithDtoDefault cwdd = (CommandWithDtoDefault) command;
+ if(command.isPersistHint()) {
+ final CommandExecuteIn executeIn = command.getExecuteIn();
+ switch (executeIn) {
+ case FOREGROUND:
+ foregroundCommands.add((CommandWithDto) command);
+ case BACKGROUND:
+ backgroundCommands.add((CommandWithDto) command);
+ }
+ }
+ }
+
+ public Stream<CommandWithDto> streamForegroundCommands() {
+ return foregroundCommands.stream();
+ }
+
+ public void clearForegroundCommands() {
+ foregroundCommands.clear();
+ }
+
+ public Stream<CommandWithDto> streamBackgroundCommands() {
+ return backgroundCommands.stream();
+ }
+
+ public void clearBackgroundCommands() {
+ backgroundCommands.clear();
+ }
+
+ public void executeBackgroundCommands() {
+ val execution = new BackgroundCommandExecution() {
+ @Override
+ protected List<? extends Command> findBackgroundCommandsToExecute() {
+ return backgroundCommands;
+ }
+ };
+ val simpleSession = new SimpleSession("sven", Collections.emptyList(), "");
+
+ execution.execute(simpleSession, null);
+ clearBackgroundCommands();
+ }
+
+}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java
index 542c723..1a7d8ef 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingDisabledMetaAnnotation.java
@@ -6,11 +6,12 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.Property;
import org.apache.isis.applib.annotation.Publishing;
//tag::class[]
-@Property(publishing = Publishing.DISABLED) // <.>
+@Action(publishing = Publishing.DISABLED) // <.>
@Inherited
@Target({
ElementType.TYPE, ElementType.METHOD // <.>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
index 1556229..526dbae 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java
@@ -107,7 +107,7 @@ public class ActionPublishingJdo implements HasAsciiDocDescription {
)
@ActionLayout(
named = "Update Property"
- , describedAs = "@PublishingEnabledMetaAnnotation"
+ , describedAs = "@ActionPublishingEnabledMetaAnnotation"
)
public ActionPublishingJdo updatePropertyUsingMetaAnnotation(final String value) {
setPropertyMetaAnnotated(value);
@@ -129,7 +129,8 @@ public class ActionPublishingJdo implements HasAsciiDocDescription {
@ActionLayout(
named = "Update Property"
, describedAs =
- "@PublishingEnabledMetaAnnotation @Action(publishing = ENABLED)"
+ "@ActionPublishingDisabledMetaAnnotation " +
+ "@Action(publishing = ENABLED)"
)
public ActionPublishingJdo updatePropertyUsingMetaAnnotationButOverridden(final String value) {
setPropertyMetaAnnotatedOverridden(value);
@@ -140,7 +141,6 @@ public class ActionPublishingJdo implements HasAsciiDocDescription {
}
//end::meta-annotation-overridden[]
-
//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
index f3edfb0..a9500e1 100644
--- 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
@@ -28,7 +28,6 @@
<bs3:row>
<bs3:col span="12">
<cpt:collection id="interactionExecutions"/>
- <cpt:collection id="publishedObjects"/>
</bs3:col>
</bs3:row>
<bs3:row>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
index 56b6481..5f0ebee 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/PropertyPublishingJdo.java
@@ -76,7 +76,7 @@ public class PropertyPublishingJdo implements HasAsciiDocDescription {
@PropertyPublishingEnabledMetaAnnotation // <.>
@Property()
@PropertyLayout(
- describedAs = "@PublishingEnabledMetaAnnotation"
+ describedAs = "@PropertyPublishingEnabledMetaAnnotation"
)
@MemberOrder(name = "meta-annotated", sequence = "1")
@XmlElement(required = true)
@@ -91,7 +91,7 @@ public class PropertyPublishingJdo implements HasAsciiDocDescription {
)
@PropertyLayout(
describedAs =
- "@PublishingDisabledMetaAnnotation " +
+ "@PropertyPublishingDisabledMetaAnnotation " +
"@Property(publishing = ENABLED)"
)
@MemberOrder(name = "meta-annotated-overridden", sequence = "1")
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
index f3edfb0..a9500e1 100644
--- 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
@@ -28,7 +28,6 @@
<bs3:row>
<bs3:col span="12">
<cpt:collection id="interactionExecutions"/>
- <cpt:collection id="publishedObjects"/>
</bs3:col>
</bs3:row>
<bs3:row>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/ActionLayoutMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/ActionLayoutMenu.java
index 8c0b93a..73c0282 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/ActionLayoutMenu.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/annotLayout/ActionLayout/ActionLayoutMenu.java
@@ -37,7 +37,7 @@ public class ActionLayoutMenu {
}
@Action(semantics = SemanticsOf.SAFE)
- @ActionLayout(cssClassFa="fa-terminal", describedAs = "Location and style of action's prompt dialog")
+ @ActionLayout(cssClassFa="fa-question-circle", describedAs = "Location and style of action's prompt dialog")
public demoapp.dom.annotLayout.ActionLayout.promptStyle.ActionLayoutPromptStyleVm promptStyle(){
return new demoapp.dom.annotLayout.ActionLayout.promptStyle.ActionLayoutPromptStyleVm();
}
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 b4b89e6..a306b18 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
@@ -113,6 +113,7 @@ as a replacement for
<mb3:section>
<mb3:named>@Action</mb3:named>
<mb3:serviceAction objectType="demo.ActionMenu" id="associateWith"/>
+ <mb3:serviceAction objectType="demo.ActionMenu" id="command"/>
<mb3:serviceAction objectType="demo.ActionMenu" id="domainEvent"/>
<mb3:serviceAction objectType="demo.ActionMenu" id="hidden"/>
<mb3:serviceAction objectType="demo.ActionMenu" id="publishing"/>