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 <[email protected]> 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"/>
