This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch ISIS-2222 in repository https://gitbox.apache.org/repos/asf/isis.git
commit 883eacefcd55f5267367a4ded30cd440cbd0ea61 Author: danhaywood <[email protected]> AuthorDate: Mon Aug 17 08:40:28 2020 +0100 ISIS-2222: wip @Property#publishing, @Action#publishing, @DomainObject#publishing --- .../demoapp/dom/annotDomain/Action/ActionMenu.java | 20 ++++- .../ActionDomainEventVm-description.adoc | 4 +- .../demoapp/dom/annotDomain/Action/hidden/.gitkeep | 0 .../dom/annotDomain/Action/publishing/.gitkeep | 0 .../publishing/ActionDisabledMetaAnnotation.java | 22 ++++++ .../publishing/ActionEnabledMetaAnnotation.java | 22 ++++++ .../ActionPublishingJdo-description.adoc | 74 ++++++++++++++++++ .../Action/publishing/ActionPublishingJdo.java | 88 +++++++++++++++++++++ .../publishing/ActionPublishingJdo.layout.xml | 57 ++++++++++++++ .../publishing/ActionPublishingJdoEntities.java | 31 ++++++++ .../publishing/ActionPublishingJdoSeedService.java | 39 ++++++++++ ...onPublishingJdo_clearInteractionExecutions.java | 32 ++++++++ .../ActionPublishingJdo_interactionExecutions.java | 30 ++++++++ .../spiimpl/PublisherServiceSpiForActions.java | 41 ++++++++++ .../annotDomain/DomainObject/DomainObjectMenu.java | 16 +++- .../annotDomain/DomainObject/publishing/.gitkeep | 0 .../DomainObjectDisabledMetaAnnotation.java | 23 ++++++ .../DomainObjectEnabledMetaAnnotation.java | 23 ++++++ .../DomainObjectPublishingJdo-description.adoc | 74 ++++++++++++++++++ .../publishing/DomainObjectPublishingJdo.java | 89 ++++++++++++++++++++++ .../DomainObjectPublishingJdo.layout.xml | 53 +++++++++++++ .../DomainObjectPublishingJdoEntities.java | 31 ++++++++ .../DomainObjectPublishingJdoSeedService.java | 39 ++++++++++ ...nObjectPublishingJdo_clearPublishedObjects.java | 30 ++++++++ ...DomainObjectPublishingJdo_publishedObjects.java | 29 +++++++ .../PublisherServiceSpiForDomainObject.java | 39 ++++++++++ .../dom/annotDomain/Property/PropertyMenu.java | 10 +++ .../dom/annotDomain/Property/publishing/.gitkeep | 0 ...tyPublishingJdo_clearInteractionExecutions.java | 34 +++++++++ .../src/main/java/demoapp/dom/menubars.layout.xml | 8 +- .../strings/jdo/JavaLangStringJdoEntities.java | 3 +- 31 files changed, 953 insertions(+), 8 deletions(-) diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java index b3884aa..e64750a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/ActionMenu.java @@ -36,8 +36,12 @@ import demoapp.dom._infra.samples.NameSamples; import demoapp.dom.annotDomain.Action.associateWith.ActionAssociateWithVm; import demoapp.dom.annotDomain.Action.associateWith.child.ActionAssociateWithChildVm; import demoapp.dom.annotDomain.Action.domainEvent.ActionDomainEventVm; +import demoapp.dom.annotDomain.Action.hidden.ActionHiddenVm; +import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo; +import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdoEntities; import demoapp.dom.annotDomain.Action.typeOf.ActionTypeOfVm; import demoapp.dom.annotDomain.Action.typeOf.child.ActionTypeOfChildVm; +import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo; import demoapp.dom.types.Samples; @DomainService(nature=NatureOfService.VIEW, objectType = "demo.ActionMenu") @@ -65,7 +69,19 @@ public class ActionMenu { @Action(semantics = SemanticsOf.SAFE) @ActionLayout(cssClassFa="fa-asterisk", describedAs = "Decouples interaction of actions") public ActionDomainEventVm domainEvent(){ - return new ActionDomainEventVm("change me"); + return new ActionDomainEventVm("value"); + } + + @Action(semantics = SemanticsOf.SAFE) + @ActionLayout(cssClassFa="fa-glasses", describedAs = "Visibility of actions") + public ActionHiddenVm hidden(){ + return new ActionHiddenVm("value"); + } + + @Action(semantics = SemanticsOf.SAFE) + @ActionLayout(cssClassFa="fa-book", describedAs = "Property changed events as XML") + public ActionPublishingJdo publishing(){ + return actionPublishingJdoEntities.first(); } @Action(semantics = SemanticsOf.SAFE) @@ -81,6 +97,8 @@ public class ActionMenu { return typeOfVm; } + @Inject + ActionPublishingJdoEntities actionPublishingJdoEntities; @Inject NameSamples samples; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/domainEvent/ActionDomainEventVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/domainEvent/ActionDomainEventVm-description.adoc index 380ac57..71bb7cd 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/domainEvent/ActionDomainEventVm-description.adoc +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/domainEvent/ActionDomainEventVm-description.adoc @@ -22,7 +22,7 @@ The fallback domain event can be suppressed using the `isis.applib.annotation.ac The demo defines two actions that are annotated using `domainEvent` semantic: -* in the `ActionDomainEventVm` is a regular action, "updateText": +* in the `ActionHiddenVm` is a regular action, "updateText": + [source,java] ---- @@ -31,7 +31,7 @@ include::ActionDomainEventVm.java[tags=class] <.> the event class to emit; genericised by the target type <.> indicates that the framework should emit this type -* The `ActionDomainEventVm_mixinUpdateText` defines a mixin action, also annotated: +* The `ActionHiddenVm_mixinUpdateTextNoAnnotation` defines a mixin action, also annotated: + [source,java] ---- diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/hidden/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/hidden/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionDisabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionDisabledMetaAnnotation.java new file mode 100644 index 0000000..4dc3e93 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionDisabledMetaAnnotation.java @@ -0,0 +1,22 @@ +package demoapp.dom.annotDomain.Action.publishing; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.Publishing; + +//tag::class[] +@Property(publishing = Publishing.DISABLED) // <.> +@Inherited +@Target({ + ElementType.METHOD, ElementType.FIELD // <.> +}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ActionDisabledMetaAnnotation { + +} +//end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionEnabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionEnabledMetaAnnotation.java new file mode 100644 index 0000000..230a7de --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionEnabledMetaAnnotation.java @@ -0,0 +1,22 @@ +package demoapp.dom.annotDomain.Action.publishing; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.Publishing; + +//tag::class[] +@Property(publishing = Publishing.ENABLED) // <.> +@Inherited +@Target({ + ElementType.METHOD, ElementType.FIELD // <.> +}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ActionEnabledMetaAnnotation { + +} +//end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo-description.adoc new file mode 100644 index 0000000..c62d177 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo-description.adoc @@ -0,0 +1,74 @@ +CAUTION: todo - to update. + +//The `editing` semantic specifies that a property's value can be changed through the UI: +// +//* for properties, the semantic can be specified using either the `@Property` annotation, or a meta-annotation +// +//There is no corresponding semantic for parameters, parameters are implicitly editable. +// +//== Class Level +// +//Usually editing of properties is discouraged; it is usually better to modify state through an explicit action instead. +//For that reason, editing of properties is disabled by default (though that can be changed globally if necessary using the `isis.applib.annotation.domain-object.editing` configuration property). +// +//Editing can also be specified at the class level. +//This will override any configured defaults, but just for the properties of that class: +// +//[source,java,indent=0] +//---- +//include::PropertyEditingVm.java[tags=class] +//---- +// +//The property-level semantic can, in turn, overrides the configured or class-level default. +// +// +//== Annotated +// +//The `editing` semantic can be specified explicitly using an annotation: +// +//* for properties, using `@Property#editing()`: +//+ +//[source,java,indent=0] +//---- +//include::PropertyEditingVm.java[tags=annotation] +//---- +//<.> explicitly specifies the maximum length that can be entered for the property +// +//The annotation could also be applied to a mixin, but would have little effect because mixin properties are always read-only. +// +//== Meta-annotated +// +//The `editing` semantic can also be specified using a custom meta-annotation: +// +//* the meta-annotation is defined as: +//+ +//[source,java] +//---- +//include::EditingEnabledMetaAnnotation.java[tags=class] +//---- +//<.> annotated for a property +//<.> annotation can be applied to a property (either its getter or the field directly) +// +//* and can be applied to a property: +//+ +//[source,java,indent=0] +//---- +//include::PropertyEditingVm.java[tags=meta-annotated] +//---- +//<.> semantic is inherited from the meta-annotation +// +// +// +//=== Meta-annotated Overridden +// +//The meta-annotation can itself be overridden: +// +//* in a property: +//+ +//[source,java,indent=0] +//---- +//include::PropertyEditingVm.java[tags=meta-annotated-overridden] +//---- +//<.> semantic from meta-annotation ... +//<.> \... is overridden by the `@Property` annotation +// diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java new file mode 100644 index 0000000..0e7f3ea --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package demoapp.dom.annotDomain.Action.publishing; + +import javax.jdo.annotations.DatastoreIdentity; +import javax.jdo.annotations.IdGeneratorStrategy; +import javax.jdo.annotations.IdentityType; +import javax.jdo.annotations.PersistenceCapable; +import javax.xml.bind.annotation.XmlElement; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.Nature; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.PropertyLayout; +import org.apache.isis.applib.annotation.Publishing; +import org.apache.isis.applib.annotation.SemanticsOf; + +import lombok.Getter; +import lombok.Setter; + +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; + +//tag::class[] +@PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") +@DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@DomainObject( + nature=Nature.JDO_ENTITY + , objectType = "demo.ActionPublishingJdo" + , editing = Editing.DISABLED +) +public class ActionPublishingJdo implements HasAsciiDocDescription { + // ... +//end::class[] + + public ActionPublishingJdo(String initialValue) { + this.property = initialValue; + } + + public String title() { + return "Action#publishing"; + } + +//tag::property[] + @Property() + @MemberOrder(name = "annotation", sequence = "1") + @Getter @Setter + private String property; +//end::property[] + + @Action( + publishing = Publishing.ENABLED // <.> + , semantics = SemanticsOf.IDEMPOTENT + , associateWith = "property" + , associateWithSequence = "1" + ) + @ActionLayout( + describedAs = "@Action(publishing = ENABLED)" + ) + @MemberOrder(name = "annotation", sequence = "1") + public ActionPublishingJdo updatePropertyUsingAnnotation(final String value) { + setProperty(value); + return this; + } + + +//tag::class[] +} +//end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.layout.xml new file mode 100644 index 0000000..f3edfb0 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdo.layout.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<bs3:grid + xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd" + xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3" + xmlns:cpt="http://isis.apache.org/applib/layout/component" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <bs3:row> + <bs3:col span="10" unreferencedActions="true"> + <cpt:domainObject /> + <cpt:action id="rebuildMetamodel"/> + </bs3:col> + <bs3:col span="2"> + <cpt:fieldSet name="" id="sources" /> + </bs3:col> + </bs3:row> + + <bs3:row> + <bs3:col span="6"> + <bs3:row> + <bs3:col span="12"> + <cpt:fieldSet name="Annotated" id="annotation"/> + <cpt:fieldSet name="Contributed" id="contributed"/> + <cpt:fieldSet name="Meta-annotated" id="meta-annotated"/> + <cpt:fieldSet name="Meta-annotated Overridden" id="meta-annotated-overridden"/> + </bs3:col> + </bs3:row> + <bs3:row> + <bs3:col span="12"> + <cpt:collection id="interactionExecutions"/> + <cpt:collection id="publishedObjects"/> + </bs3:col> + </bs3:row> + <bs3:row> + <bs3:col span="12"> + <cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/> + </bs3:col> + </bs3:row> + </bs3:col> + <bs3:col span="6"> + <cpt:fieldSet name="Description" id="description" > + <cpt:action id="clearHints" position="PANEL" /> + <cpt:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/> + <cpt:action id="rebuildMetamodel" position="PANEL_DROPDOWN"/> + <cpt:action id="downloadMetamodelXml" position="PANEL_DROPDOWN"/> + <cpt:action id="inspectMetamodel" position="PANEL_DROPDOWN"/> + <cpt:action id="downloadJdoMetadata" position="PANEL_DROPDOWN"/> + <cpt:action id="openRestApi" position="PANEL_DROPDOWN" /> + <cpt:property id="description"/> + </cpt:fieldSet> + </bs3:col> + </bs3:row> + <bs3:row> + <bs3:col span="12" unreferencedCollections="true"/> + </bs3:row> + +</bs3:grid> diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoEntities.java new file mode 100644 index 0000000..5648337 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoEntities.java @@ -0,0 +1,31 @@ +package demoapp.dom.annotDomain.Action.publishing; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import javax.inject.Inject; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.services.repository.RepositoryService; + +@Service +public class ActionPublishingJdoEntities { + + public Optional<ActionPublishingJdo> find(final String value) { + return repositoryService.firstMatch(ActionPublishingJdo.class, x -> Objects.equals(x.getProperty(), value)); + } + + public List<ActionPublishingJdo> all() { + return repositoryService.allInstances(ActionPublishingJdo.class); + } + + public ActionPublishingJdo first() { + return all().stream().findFirst().get(); + } + + @Inject + RepositoryService repositoryService; + +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoSeedService.java new file mode 100644 index 0000000..1e015e5 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/ActionPublishingJdoSeedService.java @@ -0,0 +1,39 @@ +package demoapp.dom.annotDomain.Action.publishing; + +import javax.inject.Inject; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.services.repository.RepositoryService; +import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript; + +import demoapp.dom._infra.seed.SeedServiceAbstract; +import demoapp.dom.types.Samples; + +@Service +public class ActionPublishingJdoSeedService extends SeedServiceAbstract { + + public ActionPublishingJdoSeedService() { + super(PropertyPublishingJdoEntityFixture::new); + } + + static class PropertyPublishingJdoEntityFixture extends FixtureScript { + + @Override + protected void execute(ExecutionContext executionContext) { + samples.stream() + .map(ActionPublishingJdo::new) + .forEach(domainObject -> { + repositoryService.persist(domainObject); + executionContext.addResult(this, domainObject); + }); + + } + + @Inject + RepositoryService repositoryService; + + @Inject + Samples<String> samples; + } +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_clearInteractionExecutions.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_clearInteractionExecutions.java new file mode 100644 index 0000000..071785b --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_clearInteractionExecutions.java @@ -0,0 +1,32 @@ +package demoapp.dom.annotDomain.Action.publishing.spiimpl; + +import java.util.List; + +import javax.inject.Inject; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.schema.ixn.v2.InteractionDto; + +import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo; + +@Action( + semantics = SemanticsOf.IDEMPOTENT + , associateWith = "interactionExecutions" +) +public class ActionPublishingJdo_clearInteractionExecutions { + + private final ActionPublishingJdo actionPublishingJdo; + + public ActionPublishingJdo_clearInteractionExecutions(ActionPublishingJdo actionPublishingJdo) { + this.actionPublishingJdo = actionPublishingJdo; + } + + public List<InteractionDto> act() { + publisherServiceSpiForActions.clear(); + return (List<InteractionDto>) actionPublishingJdo; + } + + @Inject + private PublisherServiceSpiForActions publisherServiceSpiForActions; +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_interactionExecutions.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_interactionExecutions.java new file mode 100644 index 0000000..b39ccba --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/ActionPublishingJdo_interactionExecutions.java @@ -0,0 +1,30 @@ +package demoapp.dom.annotDomain.Action.publishing.spiimpl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.apache.isis.applib.annotation.Collection; +import org.apache.isis.schema.ixn.v2.InteractionDto; + +import demoapp.dom.annotDomain.Action.publishing.ActionPublishingJdo; + +@Collection +public class ActionPublishingJdo_interactionExecutions { + + private final ActionPublishingJdo actionPublishingJdo; + + public ActionPublishingJdo_interactionExecutions(ActionPublishingJdo actionPublishingJdo) { + this.actionPublishingJdo = actionPublishingJdo; + } + + public List<InteractionDto> coll() { + return publisherServiceSpiForActions + .streamInteractionDtos() + .collect(Collectors.toList()); + } + + @Inject + private PublisherServiceSpiForActions publisherServiceSpiForActions; +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/PublisherServiceSpiForActions.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/PublisherServiceSpiForActions.java new file mode 100644 index 0000000..5b08b64 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Action/publishing/spiimpl/PublisherServiceSpiForActions.java @@ -0,0 +1,41 @@ +package demoapp.dom.annotDomain.Action.publishing.spiimpl; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.services.iactn.Interaction; +import org.apache.isis.applib.services.publish.PublishedObjects; +import org.apache.isis.applib.services.publish.PublisherService; +import org.apache.isis.applib.util.schema.InteractionDtoUtils; +import org.apache.isis.schema.ixn.v2.InteractionDto; + +@Service +public class PublisherServiceSpiForActions implements PublisherService { + + private final List<InteractionDto> executions = new ArrayList<>(); + + @Override + public void publish(Interaction.Execution<?, ?> execution) { + + final InteractionDto dto = + InteractionDtoUtils.newInteractionDto(execution, InteractionDtoUtils.Strategy.DEEP); + + executions.add(dto); + } + + @Override + public void publish(PublishedObjects publishedObjects) { + } + + public Stream<InteractionDto> streamInteractionDtos() { + return executions.stream(); + } + + public void clear() { + executions.clear(); + } + +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java index 0008dd0..8df34bc 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/DomainObjectMenu.java @@ -20,18 +20,28 @@ package demoapp.dom.annotDomain.DomainObject; import javax.inject.Inject; +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; import org.apache.isis.applib.annotation.DomainService; import org.apache.isis.applib.annotation.NatureOfService; -import org.apache.isis.applib.services.clock.ClockService; -import org.apache.isis.applib.value.Blob; +import org.apache.isis.applib.annotation.SemanticsOf; import lombok.extern.log4j.Log4j2; -import demoapp.dom.types.Samples; +import demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdo; +import demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdoEntities; @DomainService(nature=NatureOfService.VIEW, objectType = "demo.DomainObjectMenu") @Log4j2 public class DomainObjectMenu { + @Action(semantics = SemanticsOf.SAFE) + @ActionLayout(cssClassFa="fa-book", describedAs = "Object changed events as XML") + public DomainObjectPublishingJdo publishing(){ + return domainObjectPublishingJdoEntities.first(); + } + + @Inject + DomainObjectPublishingJdoEntities domainObjectPublishingJdoEntities; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectDisabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectDisabledMetaAnnotation.java new file mode 100644 index 0000000..7b15570 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectDisabledMetaAnnotation.java @@ -0,0 +1,23 @@ +package demoapp.dom.annotDomain.DomainObject.publishing; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.Publishing; + +//tag::class[] +@DomainObject(publishing = Publishing.DISABLED) // <.> +@Inherited +@Target({ + ElementType.TYPE // <.> +}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DomainObjectDisabledMetaAnnotation { + +} +//end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectEnabledMetaAnnotation.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectEnabledMetaAnnotation.java new file mode 100644 index 0000000..8f438ee --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectEnabledMetaAnnotation.java @@ -0,0 +1,23 @@ +package demoapp.dom.annotDomain.DomainObject.publishing; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.Publishing; + +//tag::class[] +@DomainObject(publishing = Publishing.ENABLED) // <.> +@Inherited +@Target({ + ElementType.TYPE // <.> +}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DomainObjectEnabledMetaAnnotation { + +} +//end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo-description.adoc new file mode 100644 index 0000000..c62d177 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo-description.adoc @@ -0,0 +1,74 @@ +CAUTION: todo - to update. + +//The `editing` semantic specifies that a property's value can be changed through the UI: +// +//* for properties, the semantic can be specified using either the `@Property` annotation, or a meta-annotation +// +//There is no corresponding semantic for parameters, parameters are implicitly editable. +// +//== Class Level +// +//Usually editing of properties is discouraged; it is usually better to modify state through an explicit action instead. +//For that reason, editing of properties is disabled by default (though that can be changed globally if necessary using the `isis.applib.annotation.domain-object.editing` configuration property). +// +//Editing can also be specified at the class level. +//This will override any configured defaults, but just for the properties of that class: +// +//[source,java,indent=0] +//---- +//include::PropertyEditingVm.java[tags=class] +//---- +// +//The property-level semantic can, in turn, overrides the configured or class-level default. +// +// +//== Annotated +// +//The `editing` semantic can be specified explicitly using an annotation: +// +//* for properties, using `@Property#editing()`: +//+ +//[source,java,indent=0] +//---- +//include::PropertyEditingVm.java[tags=annotation] +//---- +//<.> explicitly specifies the maximum length that can be entered for the property +// +//The annotation could also be applied to a mixin, but would have little effect because mixin properties are always read-only. +// +//== Meta-annotated +// +//The `editing` semantic can also be specified using a custom meta-annotation: +// +//* the meta-annotation is defined as: +//+ +//[source,java] +//---- +//include::EditingEnabledMetaAnnotation.java[tags=class] +//---- +//<.> annotated for a property +//<.> annotation can be applied to a property (either its getter or the field directly) +// +//* and can be applied to a property: +//+ +//[source,java,indent=0] +//---- +//include::PropertyEditingVm.java[tags=meta-annotated] +//---- +//<.> semantic is inherited from the meta-annotation +// +// +// +//=== Meta-annotated Overridden +// +//The meta-annotation can itself be overridden: +// +//* in a property: +//+ +//[source,java,indent=0] +//---- +//include::PropertyEditingVm.java[tags=meta-annotated-overridden] +//---- +//<.> semantic from meta-annotation ... +//<.> \... is overridden by the `@Property` annotation +// diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.java new file mode 100644 index 0000000..e2726cb --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package demoapp.dom.annotDomain.DomainObject.publishing; + +import javax.jdo.annotations.DatastoreIdentity; +import javax.jdo.annotations.IdGeneratorStrategy; +import javax.jdo.annotations.IdentityType; +import javax.jdo.annotations.PersistenceCapable; +import javax.xml.bind.annotation.XmlElement; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainObjectLayout; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.Nature; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.PropertyLayout; +import org.apache.isis.applib.annotation.Publishing; +import org.apache.isis.applib.annotation.SemanticsOf; + +import lombok.Getter; +import lombok.Setter; + +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; + +//tag::class[] +@PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") +@DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@DomainObject( + nature=Nature.JDO_ENTITY + , objectType = "demo.DomainObjectPublishingJdo" + , editing = Editing.ENABLED + , publishing = Publishing.ENABLED // <.> +) +@DomainObjectLayout( + describedAs = + "@DomainObject(publishing=ENABLED)" +) +public class DomainObjectPublishingJdo implements HasAsciiDocDescription { + // ... +//end::class[] + + public DomainObjectPublishingJdo(String initialValue) { + this.property = initialValue; + } + + public String title() { + return "DomainObject#publishing"; + } + +//tag::property[] + @Property() + @MemberOrder(name = "general", sequence = "1") + @Getter @Setter + private String property; +//end::property[] + +//tag::action[] + @Action( + semantics = SemanticsOf.IDEMPOTENT + , associateWith = "property" + ) + @MemberOrder(name = "annotation", sequence = "1") + public DomainObjectPublishingJdo updateProperty(final String value) { + setProperty(value); + return this; + } +//end::action[] + +//tag::class[] +} +//end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.layout.xml new file mode 100644 index 0000000..cc21592 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdo.layout.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<bs3:grid + xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd" + xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3" + xmlns:cpt="http://isis.apache.org/applib/layout/component" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <bs3:row> + <bs3:col span="10" unreferencedActions="true"> + <cpt:domainObject /> + <cpt:action id="rebuildMetamodel"/> + </bs3:col> + <bs3:col span="2"> + <cpt:fieldSet name="" id="sources" /> + </bs3:col> + </bs3:row> + + <bs3:row> + <bs3:col span="6"> + <bs3:row> + <bs3:col span="12"> + <cpt:fieldSet name="General" id="general"/> + </bs3:col> + </bs3:row> + <bs3:row> + <bs3:col span="12"> + <cpt:collection id="publishedObjects"/> + </bs3:col> + </bs3:row> + <bs3:row> + <bs3:col span="12"> + <cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/> + </bs3:col> + </bs3:row> + </bs3:col> + <bs3:col span="6"> + <cpt:fieldSet name="Description" id="description" > + <cpt:action id="clearHints" position="PANEL" /> + <cpt:action id="downloadLayoutXml" position="PANEL_DROPDOWN"/> + <cpt:action id="rebuildMetamodel" position="PANEL_DROPDOWN"/> + <cpt:action id="downloadMetamodelXml" position="PANEL_DROPDOWN"/> + <cpt:action id="inspectMetamodel" position="PANEL_DROPDOWN"/> + <cpt:action id="downloadJdoMetadata" position="PANEL_DROPDOWN"/> + <cpt:action id="openRestApi" position="PANEL_DROPDOWN" /> + <cpt:property id="description"/> + </cpt:fieldSet> + </bs3:col> + </bs3:row> + <bs3:row> + <bs3:col span="12" unreferencedCollections="true"/> + </bs3:row> + +</bs3:grid> diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoEntities.java new file mode 100644 index 0000000..f0194b1 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoEntities.java @@ -0,0 +1,31 @@ +package demoapp.dom.annotDomain.DomainObject.publishing; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import javax.inject.Inject; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.services.repository.RepositoryService; + +@Service +public class DomainObjectPublishingJdoEntities { + + public Optional<DomainObjectPublishingJdo> find(final String value) { + return repositoryService.firstMatch(DomainObjectPublishingJdo.class, x -> Objects.equals(x.getProperty(), value)); + } + + public List<DomainObjectPublishingJdo> all() { + return repositoryService.allInstances(DomainObjectPublishingJdo.class); + } + + public DomainObjectPublishingJdo first() { + return all().stream().findFirst().get(); + } + + @Inject + RepositoryService repositoryService; + +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoSeedService.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoSeedService.java new file mode 100644 index 0000000..27ef179 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/DomainObjectPublishingJdoSeedService.java @@ -0,0 +1,39 @@ +package demoapp.dom.annotDomain.DomainObject.publishing; + +import javax.inject.Inject; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.services.repository.RepositoryService; +import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript; + +import demoapp.dom._infra.seed.SeedServiceAbstract; +import demoapp.dom.types.Samples; + +@Service +public class DomainObjectPublishingJdoSeedService extends SeedServiceAbstract { + + public DomainObjectPublishingJdoSeedService() { + super(PropertyPublishingJdoEntityFixture::new); + } + + static class PropertyPublishingJdoEntityFixture extends FixtureScript { + + @Override + protected void execute(ExecutionContext executionContext) { + samples.stream() + .map(DomainObjectPublishingJdo::new) + .forEach(domainObject -> { + repositoryService.persist(domainObject); + executionContext.addResult(this, domainObject); + }); + + } + + @Inject + RepositoryService repositoryService; + + @Inject + Samples<String> samples; + } +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_clearPublishedObjects.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_clearPublishedObjects.java new file mode 100644 index 0000000..6e8f888 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_clearPublishedObjects.java @@ -0,0 +1,30 @@ +package demoapp.dom.annotDomain.DomainObject.publishing.spiimpl; + +import javax.inject.Inject; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.SemanticsOf; + +import demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdo; +import demoapp.dom.annotDomain.Property.publishing.spiimpl.PublisherServiceSpiForProperties; + +@Action( + semantics = SemanticsOf.IDEMPOTENT + , associateWith = "publishedObjects" +) +public class DomainObjectPublishingJdo_clearPublishedObjects { + + private final DomainObjectPublishingJdo domainObjectPublishingJdo; + + public DomainObjectPublishingJdo_clearPublishedObjects(DomainObjectPublishingJdo domainObjectPublishingJdo) { + this.domainObjectPublishingJdo = domainObjectPublishingJdo; + } + + public DomainObjectPublishingJdo act() { + publisherServiceSpiForDomainObject.clear(); + return domainObjectPublishingJdo; + } + + @Inject + private PublisherServiceSpiForDomainObject publisherServiceSpiForDomainObject; +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_publishedObjects.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_publishedObjects.java new file mode 100644 index 0000000..1c2500e --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/DomainObjectPublishingJdo_publishedObjects.java @@ -0,0 +1,29 @@ +package demoapp.dom.annotDomain.DomainObject.publishing.spiimpl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.apache.isis.applib.annotation.Collection; +import org.apache.isis.schema.chg.v2.ChangesDto; + +import demoapp.dom.annotDomain.DomainObject.publishing.DomainObjectPublishingJdo; + +@Collection +public class DomainObjectPublishingJdo_publishedObjects { + + private final DomainObjectPublishingJdo domainObjectPublishingJdo; + public DomainObjectPublishingJdo_publishedObjects(DomainObjectPublishingJdo domainObjectPublishingJdo) { + this.domainObjectPublishingJdo = domainObjectPublishingJdo; + } + + public List<ChangesDto> coll() { + return publisherServiceSpiForDomainObject + .streamPublishedObjects() + .collect(Collectors.toList()); + } + + @Inject + private PublisherServiceSpiForDomainObject publisherServiceSpiForDomainObject; +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/PublisherServiceSpiForDomainObject.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/PublisherServiceSpiForDomainObject.java new file mode 100644 index 0000000..9873f45 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/DomainObject/publishing/spiimpl/PublisherServiceSpiForDomainObject.java @@ -0,0 +1,39 @@ +package demoapp.dom.annotDomain.DomainObject.publishing.spiimpl; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.services.iactn.Interaction; +import org.apache.isis.applib.services.publish.PublishedObjects; +import org.apache.isis.applib.services.publish.PublisherService; +import org.apache.isis.applib.util.schema.InteractionDtoUtils; +import org.apache.isis.schema.chg.v2.ChangesDto; +import org.apache.isis.schema.ixn.v2.InteractionDto; + +@Service +public class PublisherServiceSpiForDomainObject implements PublisherService { + + private final List<ChangesDto> publishedObjects = new ArrayList<ChangesDto>(); + + @Override + public void publish(Interaction.Execution<?, ?> execution) { + } + + @Override + public void publish(PublishedObjects publishedObjects) { + final ChangesDto dto = publishedObjects.getDto(); + this.publishedObjects.add(dto); + } + + public Stream<ChangesDto> streamPublishedObjects() { + return publishedObjects.stream(); + } + + public void clear() { + publishedObjects.clear(); + } + +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java index 814f1d3..b97d5c3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/PropertyMenu.java @@ -41,6 +41,8 @@ import demoapp.dom.annotDomain.Property.hidden.child.PropertyHiddenChildVm; import demoapp.dom.annotDomain.Property.maxLength.PropertyMaxLengthVm; import demoapp.dom.annotDomain.Property.mustSatisfy.PropertyMustSatisfyVm; import demoapp.dom.annotDomain.Property.optionality.PropertyOptionalityVm; +import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo; +import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdoEntities; import demoapp.dom.annotDomain.Property.regexPattern.PropertyRegexPatternVm; import demoapp.dom.types.Samples; @@ -127,6 +129,12 @@ public class PropertyMenu { } @Action(semantics = SemanticsOf.SAFE) + @ActionLayout(cssClassFa="fa-book", describedAs = "Property changed events as XML") + public PropertyPublishingJdo publishing(){ + return propertyPublishingJdoEntities.first(); + } + + @Action(semantics = SemanticsOf.SAFE) @ActionLayout(cssClassFa="fa-equals", describedAs = "Regular expressions, such as email") public PropertyRegexPatternVm regexPattern(){ val vm = new PropertyRegexPatternVm(); @@ -154,5 +162,7 @@ public class PropertyMenu { Samples<Blob> blobSamples; @Inject Samples<Clob> clobSamples; + @Inject + PropertyPublishingJdoEntities propertyPublishingJdoEntities; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/.gitkeep b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java new file mode 100644 index 0000000..0762216 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/annotDomain/Property/publishing/spiimpl/PropertyPublishingJdo_clearInteractionExecutions.java @@ -0,0 +1,34 @@ +package demoapp.dom.annotDomain.Property.publishing.spiimpl; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.Collection; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.schema.ixn.v2.InteractionDto; + +import demoapp.dom.annotDomain.Property.publishing.PropertyPublishingJdo; + +@Action( + semantics = SemanticsOf.IDEMPOTENT + , associateWith = "interactionExecutions" +) +public class PropertyPublishingJdo_clearInteractionExecutions { + + private final PropertyPublishingJdo propertyPublishingJdo; + + public PropertyPublishingJdo_clearInteractionExecutions(PropertyPublishingJdo propertyPublishingJdo) { + this.propertyPublishingJdo = propertyPublishingJdo; + } + + public List<InteractionDto> act() { + publisherServiceSpiForProperties.clear(); + return (List<InteractionDto>) propertyPublishingJdo; + } + + @Inject + private PublisherServiceSpiForProperties publisherServiceSpiForProperties; +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml index d041e7f..984efc2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml +++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml @@ -15,10 +15,10 @@ as a replacement for <mb3:named>Basic Types</mb3:named> <mb3:section> <mb3:named>Primitives</mb3:named> - <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" id="bytes"/> <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" id="shorts"/> <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" id="ints"/> <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" id="longs"/> + <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" id="bytes"/> <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" id="floats"/> <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" id="doubles"/> <mb3:serviceAction objectType="demo.PrimitiveTypesMenu" id="chars"/> @@ -107,9 +107,14 @@ as a replacement for <mb3:menu> <mb3:named>Domain Annotations</mb3:named> <mb3:section> + <mb3:named>@DomainObject</mb3:named> + <mb3:serviceAction objectType="demo.DomainObjectMenu" id="publishing"/> + </mb3:section> + <mb3:section> <mb3:named>@Action</mb3:named> <mb3:serviceAction objectType="demo.ActionMenu" id="associateWith"/> <mb3:serviceAction objectType="demo.ActionMenu" id="domainEvent"/> + <mb3:serviceAction objectType="demo.ActionMenu" id="hidden"/> <mb3:serviceAction objectType="demo.ActionMenu" id="typeOf"/> </mb3:section> <mb3:section> @@ -121,6 +126,7 @@ as a replacement for <mb3:serviceAction objectType="demo.PropertyMenu" id="maxLength"/> <mb3:serviceAction objectType="demo.PropertyMenu" id="mustSatisfy"/> <mb3:serviceAction objectType="demo.PropertyMenu" id="optionality"/> + <mb3:serviceAction objectType="demo.PropertyMenu" id="publishing"/> <mb3:serviceAction objectType="demo.PropertyMenu" id="regexPattern"/> </mb3:section> </mb3:menu> diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java index 01e63f5..a3769d7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdoEntities.java @@ -1,6 +1,7 @@ package demoapp.dom.types.javalang.strings.jdo; import java.util.List; +import java.util.Objects; import java.util.Optional; import javax.inject.Inject; @@ -13,7 +14,7 @@ import org.apache.isis.applib.services.repository.RepositoryService; public class JavaLangStringJdoEntities { public Optional<JavaLangStringJdo> find(final String readOnlyProperty) { - return repositoryService.firstMatch(JavaLangStringJdo.class, x -> x.getReadOnlyProperty() == readOnlyProperty); + return repositoryService.firstMatch(JavaLangStringJdo.class, x -> Objects.equals(x.getReadOnlyProperty(), readOnlyProperty)); } public List<JavaLangStringJdo> all() {
