This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch CAUSEWAY-2485 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit aaea0a0b3b2bc1f5332709e0e966e489f4ff35d3 Author: danhaywood <[email protected]> AuthorDate: Thu May 4 09:40:31 2023 +0100 CAUSEWAY-2485: wip on embedded types --- .../src/main/java/demoapp/dom/DemoModuleJpa.java | 2 +- .../embedded/{embedded => }/ComplexNumber.java | 2 +- .../samples => }/ComplexNumberSamples.java | 3 +- .../persistence => }/NumberConstantEntity.java | 3 +- .../persistence => }/NumberConstantSeeding.java | 3 +- .../{embedded => }/jdo/ComplexNumberJdo.java | 4 +- .../jdo/ComplexNumberJdoValueSemantics.java | 8 +-- .../EmbeddedTypeMenuJdo.java} | 17 ++--- .../EmbeddedTypePageJdo-description.adoc} | 22 +++--- .../EmbeddedTypePageJdo.java} | 9 +-- .../EmbeddedTypePageJdo.layout.xml} | 0 .../jdo/NumberConstantJdo-description.adoc | 0 .../{embedded => }/jdo/NumberConstantJdo.java | 8 +-- .../jdo/NumberConstantJdo.layout.xml | 0 .../{embedded => }/jdo/NumberConstantJdo.svg | 0 .../jdo/NumberConstantJdoRepository.java | 4 +- .../jdo/NumberConstantJdo_updateNumber.java | 2 +- .../{embedded => }/jpa/ComplexNumberJpa.java | 49 +++----------- .../jpa/ComplexNumberJpaValueSemantics.java | 78 +++++++++------------- .../embedded/jpa/ComplexNumberJpa_default.java | 37 ++++++++++ .../EmbeddedTypeMenuJpa.java} | 19 +++--- .../EmbeddedTypePageJpa-description.adoc} | 47 ++++++------- .../EmbeddedTypePageJpa.java} | 15 +++-- .../EmbeddedTypePageJpa.layout.xml} | 0 .../jpa/NumberConstantJpa-description.adoc | 0 .../{embedded => }/jpa/NumberConstantJpa.java | 10 +-- .../jpa/NumberConstantJpa.layout.xml | 0 .../{embedded => }/jpa/NumberConstantJpa.svg | 0 .../jpa/NumberConstantJpaRepository.java | 4 +- .../jpa/NumberConstantJpa_updateNumber.java | 2 +- .../mixins/mixins/CountHolder_explanation.java | 6 +- .../mixins/CountHolder_fibonacciSequence.java | 1 - .../mixins/mixins/CountHolder_updateCount.java | 8 +-- .../progmodel/objects/mixins/mixins/MixinMenu.java | 4 +- ...description.adoc => MixinPage-description.adoc} | 39 +++++++---- .../mixins/mixins/{MixinVm.java => MixinPage.java} | 13 ++-- .../{MixinVm.layout.xml => MixinPage.layout.xml} | 0 .../src/main/java/demoapp/dom/menubars.layout.xml | 37 +++++----- .../core/eventbusservice/EventLogEntryJpa.java | 5 ++ .../customvaluetypes/ComplexNumberJdo_Test.java | 2 +- 40 files changed, 225 insertions(+), 238 deletions(-) diff --git a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java index 428aa868d1..b34f301d87 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleJpa.java @@ -50,7 +50,7 @@ import demoapp.dom.domain.objects.DomainObjectLayout.named.jpa.DomainObjectLayou import demoapp.dom.domain.objects.DomainObjectLayout.paged.jpa.DomainObjectLayoutPagedJpa; import demoapp.dom.domain.objects.DomainObjectLayout.tabledec.jpa.DomainObjectLayoutTableDecoratorJpa; import demoapp.dom.domain.objects.DomainObjectLayout.xxxUiEvent.jpa.DomainObjectLayoutXxxUiEventJpa; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.jpa.NumberConstantJpa; +import demoapp.dom.domain.progmodel.objects.embedded.jpa.NumberConstantJpa; import demoapp.dom.domain.properties.Property.commandPublishing.jpa.PropertyCommandPublishingJpa; import demoapp.dom.domain.properties.Property.editing.jpa.PropertyEditingJpa; import demoapp.dom.domain.properties.Property.executionPublishing.jpa.PropertyExecutionPublishingJpa; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/ComplexNumber.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/ComplexNumber.java similarity index 95% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/ComplexNumber.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/ComplexNumber.java index b90163a1d6..7c0e560c92 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/ComplexNumber.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/ComplexNumber.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded; +package demoapp.dom.domain.progmodel.objects.embedded; import lombok.Value; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/samples/ComplexNumberSamples.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/ComplexNumberSamples.java similarity index 89% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/samples/ComplexNumberSamples.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/ComplexNumberSamples.java index e445f1bff6..523764edd4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/samples/ComplexNumberSamples.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/ComplexNumberSamples.java @@ -18,13 +18,12 @@ * */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.samples; +package demoapp.dom.domain.progmodel.objects.embedded; import java.util.stream.Stream; import org.springframework.stereotype.Service; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; import demoapp.dom.types.Samples; @Service diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/persistence/NumberConstantEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/NumberConstantEntity.java similarity index 90% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/persistence/NumberConstantEntity.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/NumberConstantEntity.java index af48e9e240..6aab9924e2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/persistence/NumberConstantEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/NumberConstantEntity.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.persistence; +package demoapp.dom.domain.progmodel.objects.embedded; import javax.inject.Named; @@ -25,7 +25,6 @@ import org.apache.causeway.applib.annotation.Property; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; @Named("demo.NumberConstantEntity") // shared permissions with concrete sub class @DomainObject diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/persistence/NumberConstantSeeding.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/NumberConstantSeeding.java similarity index 89% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/persistence/NumberConstantSeeding.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/NumberConstantSeeding.java index 7713845c91..df29b39e9f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/persistence/NumberConstantSeeding.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/NumberConstantSeeding.java @@ -18,7 +18,7 @@ * */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.persistence; +package demoapp.dom.domain.progmodel.objects.embedded; import javax.inject.Inject; @@ -26,7 +26,6 @@ import org.springframework.stereotype.Service; import demoapp.dom._infra.seed.SeedServiceAbstract; import demoapp.dom._infra.values.ValueHolderRepository; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; @Service public class NumberConstantSeeding diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/ComplexNumberJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/ComplexNumberJdo.java similarity index 95% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/ComplexNumberJdo.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/ComplexNumberJdo.java index 49d4a69664..726254e70e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/ComplexNumberJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/ComplexNumberJdo.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jdo; +package demoapp.dom.domain.progmodel.objects.embedded.jdo; import java.util.Optional; import java.util.regex.Matcher; @@ -28,7 +28,7 @@ import org.apache.causeway.applib.annotation.Value; import lombok.AccessLevel; import lombok.val; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; +import demoapp.dom.domain.progmodel.objects.embedded.ComplexNumber; // tag::class[] @javax.jdo.annotations.PersistenceCapable // <.> diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/ComplexNumberJdoValueSemantics.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/ComplexNumberJdoValueSemantics.java similarity index 95% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/ComplexNumberJdoValueSemantics.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/ComplexNumberJdoValueSemantics.java index e5b64d95d4..6974334a8b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/ComplexNumberJdoValueSemantics.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/ComplexNumberJdoValueSemantics.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jdo; +package demoapp.dom.domain.progmodel.objects.embedded.jdo; import org.springframework.stereotype.Component; @@ -49,9 +49,6 @@ public class ComplexNumberJdoValueSemantics // tag::getRenderer[] @Override public Renderer<ComplexNumberJdo> getRenderer() { - // end::getRenderer[] - // ... - // tag::getRenderer[] return new Renderer<ComplexNumberJdo>() { @Override public String titlePresentation(final ValueSemanticsProvider.Context context, final ComplexNumberJdo object) { @@ -63,9 +60,6 @@ public class ComplexNumberJdoValueSemantics // tag::getParser[] @Override public Parser<ComplexNumberJdo> getParser() { -// end::getParser[] - // ... -// tag::getParser[] return new Parser<ComplexNumberJdo>() { @Override public ComplexNumberJdo parseTextRepresentation(final ValueSemanticsProvider.Context context, final String entry) { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypeMenuJdo.java similarity index 81% copy from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeMenu.java copy to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypeMenuJdo.java index 8160ff87c6..c67f92041c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeMenu.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypeMenuJdo.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded; +package demoapp.dom.domain.progmodel.objects.embedded.jdo; import javax.inject.Inject; import javax.inject.Named; @@ -28,21 +28,22 @@ import org.apache.causeway.applib.annotation.NatureOfService; import org.apache.causeway.applib.annotation.PriorityPrecedence; import org.apache.causeway.applib.services.factory.FactoryService; +import org.springframework.context.annotation.Profile; + import lombok.RequiredArgsConstructor; -@Named("demo.EmbeddedTypeMenu") -@DomainService( - nature=NatureOfService.VIEW -) +@Profile("demo-jdo") +@Named("demo.EmbeddedTypeMenuJdo") +@DomainService(nature=NatureOfService.VIEW) @javax.annotation.Priority(PriorityPrecedence.EARLY) @RequiredArgsConstructor(onConstructor_ = {@Inject}) -public class EmbeddedTypeMenu { +public class EmbeddedTypeMenuJdo { private final FactoryService factoryService; @Action @ActionLayout(cssClassFa="fa-stop-circle", describedAs = "Experimental support for embedded types") - public EmbeddedTypeVm embeddedTypes(){ - return factoryService.viewModel(new EmbeddedTypeVm()); + public EmbeddedTypePageJdo embeddedTypes(){ + return factoryService.viewModel(new EmbeddedTypePageJdo()); } } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypePageJdo-description.adoc similarity index 85% copy from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm-description.adoc copy to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypePageJdo-description.adoc index a9a89e5efd..da065c18fa 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm-description.adoc +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypePageJdo-description.adoc @@ -5,19 +5,19 @@ These are somewhat similar to value types, in that they have no identity and are They can also have custom behaviour. However, they are not quite true value types as the ORM needs to update their fields directly. -Ensuring that The mutator method can be made `private` +To enable that, a mutator method is required, though it can be made `private` CAUTION: This is still work in progress, see link:https://issues.apache.org/jira/browse/CAUSEWAY-1695[CAUSEWAY-1695]. == View model and collection -The page shows the `EmbeddedTypeVm`. +The page shows the `EmbeddedTypePage`. This simply has a collection of `NumberConstantJdo` entities: [source,java] .EmbeddedTypeVm.java ---- -include::EmbeddedTypeVm.java[tags=class] +include::EmbeddedTypePageJdo.java[tags=class] ---- The `NumberConstantJdo` entity in turn declares a `name` property and a `complexNumber` property of type `ComplexNumberJdo`. @@ -55,14 +55,14 @@ This class defines some behaviour: + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdo.java[tags=title] +include::ComplexNumberJdo.java[tags=title] ---- * how to parse a string: + [source,java] ---- -include::jdo/ComplexNumberJdo.java[tags=parse,indent=0] +include::ComplexNumberJdo.java[tags=parse,indent=0] ---- + This is used by the "value semantics provider", discussed in the next section. @@ -73,7 +73,7 @@ The `NumberConstantJdo_updateNumber` mixin allows the value of the complex numbe [source,java] .NumberConstantJdo_updateNumber.java ---- -include::jdo/NumberConstantJdo_updateNumber.java[tags=class] +include::NumberConstantJdo_updateNumber.java[tags=class] ---- @@ -84,7 +84,7 @@ As mentioned in the previous section, the framework uses an implementation of `V [source,java] .ComplexNumberJdoValueSemantics.java ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=class] +include::ComplexNumberJdoValueSemantics.java[tags=class] ---- where: @@ -93,14 +93,14 @@ where: + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=getRenderer] +include::ComplexNumberJdoValueSemantics.java[tags=getRenderer] ---- * `getParser()` is responsible for parsing the entered string (for either an editable property or a parameter): + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=getParser] +include::ComplexNumberJdoValueSemantics.java[tags=getParser] ---- + In this case the implementation just delegates to the `ComplexNumberJdo` class itself. @@ -109,13 +109,13 @@ In this case the implementation just delegates to the `ComplexNumberJdo` class i + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=getEncoderDecoder] +include::ComplexNumberJdoValueSemantics.java[tags=getEncoderDecoder] ---- * `getDefaultsProvider()` returns the default value to be used for non-optional parameters and properties: + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=getDefaultsProvider] +include::ComplexNumberJdoValueSemantics.java[tags=getDefaultsProvider] ---- diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypePageJdo.java similarity index 84% copy from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.java copy to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypePageJdo.java index cc9c0e3918..30725b75fb 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypePageJdo.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded; +package demoapp.dom.domain.progmodel.objects.embedded.jdo; import java.util.List; @@ -30,12 +30,13 @@ import org.apache.causeway.applib.annotation.ObjectSupport; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolderRepository; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.persistence.NumberConstantEntity; +import demoapp.dom.domain.progmodel.objects.embedded.ComplexNumber; +import demoapp.dom.domain.progmodel.objects.embedded.NumberConstantEntity; // tag::class[] -@Named("demo.EmbeddedTypeVm") +@Named("demo.EmbeddedTypePageJdo") @DomainObject(nature=Nature.VIEW_MODEL) -public class EmbeddedTypeVm implements HasAsciiDocDescription { +public class EmbeddedTypePageJdo implements HasAsciiDocDescription { // ... // end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypePageJdo.layout.xml similarity index 100% copy from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.layout.xml copy to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/EmbeddedTypePageJdo.layout.xml diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo-description.adoc similarity index 100% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo-description.adoc rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo-description.adoc diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo.java similarity index 89% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo.java index 654c120042..08532419ba 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jdo; +package demoapp.dom.domain.progmodel.objects.embedded.jdo; import javax.inject.Named; import javax.jdo.annotations.Column; @@ -36,14 +36,14 @@ import org.apache.causeway.applib.annotation.Property; import lombok.Getter; import lombok.Setter; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.persistence.NumberConstantEntity; +import demoapp.dom.domain.progmodel.objects.embedded.ComplexNumber; +import demoapp.dom.domain.progmodel.objects.embedded.NumberConstantEntity; @Profile("demo-jdo") //tag::class[] +@Named("demo.NumberConstantEntityJdo") @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo" ) @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@Named("demo.NumberConstantEntity") @DomainObject public class NumberConstantJdo extends NumberConstantEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo.layout.xml similarity index 100% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo.layout.xml rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo.layout.xml diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo.svg b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo.svg similarity index 100% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo.svg rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo.svg diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdoRepository.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdoRepository.java similarity index 91% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdoRepository.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdoRepository.java index a6ed83096b..ab8089bd9e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdoRepository.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdoRepository.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jdo; +package demoapp.dom.domain.progmodel.objects.embedded.jdo; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; @@ -24,7 +24,7 @@ import org.springframework.stereotype.Service; import lombok.val; import demoapp.dom._infra.values.ValueHolderRepository; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; +import demoapp.dom.domain.progmodel.objects.embedded.ComplexNumber; @Profile("demo-jdo") @Service diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo_updateNumber.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo_updateNumber.java similarity index 96% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo_updateNumber.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo_updateNumber.java index 47f85737be..3edf5a2ce1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jdo/NumberConstantJdo_updateNumber.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jdo/NumberConstantJdo_updateNumber.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jdo; +package demoapp.dom.domain.progmodel.objects.embedded.jdo; import org.springframework.context.annotation.Profile; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/ComplexNumberJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpa.java similarity index 55% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/ComplexNumberJpa.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpa.java index 974fd582c4..846a03d395 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/ComplexNumberJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpa.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jpa; +package demoapp.dom.domain.progmodel.objects.embedded.jpa; import java.util.Optional; import java.util.regex.Matcher; @@ -24,62 +24,31 @@ import java.util.regex.Pattern; import org.apache.causeway.applib.annotation.ObjectSupport; import org.apache.causeway.applib.annotation.Value; +import org.apache.causeway.applib.annotation.ValueSemantics; import lombok.AccessLevel; import lombok.val; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; +import demoapp.dom.domain.progmodel.objects.embedded.ComplexNumber; // tag::class[] -//@Entity // <.> [email protected] // <.> -@Value // <.> [email protected] // <.> [email protected](AccessLevel.PRIVATE) // <.> [email protected] // <.> +@Value // <.> [email protected] // <.> [email protected](AccessLevel.PRIVATE) // <.> @lombok.AllArgsConstructor(staticName = "of") @lombok.NoArgsConstructor public class ComplexNumberJpa implements ComplexNumber { @javax.persistence.Column(nullable = false) - private double re; + private double re; // <.> @javax.persistence.Column(nullable = false) - private double im; + private double im; // <.> // end::class[] -// tag::title[] - @ObjectSupport public String title() { - return im >= 0 - ? "" + re + " + " + im + "i" - : "" + re + " - " + (-im) + "i"; - } -// end::title[] - -// tag::parse[] - private static final Pattern PATTERN = - Pattern.compile("^(?<re>\\S*)\\W*(?<sign>[+-])\\W*(?<im>\\S+)i$"); - - public static Optional<ComplexNumberJpa> parse(final String parse) { - val m = PATTERN.matcher(parse); - return m.matches() ? - Optional.of(ComplexNumberJpa.of( - realFrom(m), signFrom(m) * imaginaryFrom(m))) - : Optional.empty(); - } - - private static double realFrom(final Matcher m) { - return Double.parseDouble(m.group("re")); - } - private static double signFrom(final Matcher m) { - return m.group("sign").equals("-") ? -1.0d : +1.0d; - } - private static double imaginaryFrom(final Matcher m) { - return Double.parseDouble(m.group("im")); - } -// end::parse[] - // tag::class[] // ... } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/ComplexNumberJpaValueSemantics.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpaValueSemantics.java similarity index 64% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/ComplexNumberJpaValueSemantics.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpaValueSemantics.java index 2ae9d23269..465149cd5c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/ComplexNumberJpaValueSemantics.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpaValueSemantics.java @@ -16,26 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jpa; +package demoapp.dom.domain.progmodel.objects.embedded.jpa; +import javax.inject.Named; + +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import org.apache.causeway.applib.util.schema.CommonDtoUtils; import org.apache.causeway.applib.value.semantics.DefaultsProvider; -import org.apache.causeway.applib.value.semantics.Parser; import org.apache.causeway.applib.value.semantics.Renderer; import org.apache.causeway.applib.value.semantics.ValueDecomposition; import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract; -import org.apache.causeway.applib.value.semantics.ValueSemanticsProvider; import org.apache.causeway.schema.common.v2.ValueType; @Profile("demo-jpa") // tag::class[] +@Named("demo.ComplexNumberJpaValueSemantics") @Component +@Import({ + ComplexNumberJpa_default.class // <.> +}) public class ComplexNumberJpaValueSemantics - extends ValueSemanticsAbstract<ComplexNumberJpa>{ - + extends ValueSemanticsAbstract<ComplexNumberJpa> { // end::class[] @Override @@ -48,44 +52,14 @@ public class ComplexNumberJpaValueSemantics return ValueType.COMPOSITE; } -// tag::getRenderer[] - @Override - public Renderer<ComplexNumberJpa> getRenderer() { -// end::getRenderer[] - // ... -// tag::getRenderer[] - return new Renderer<ComplexNumberJpa>() { - @Override - public String titlePresentation(final ValueSemanticsProvider.Context context, final ComplexNumberJpa object) { - return object!=null ? object.title() : "NaN"; - } - }; - } -// end::getRenderer[] -// tag::getParser[] +// tag::getDefaultsProvider[] @Override - public Parser<ComplexNumberJpa> getParser() { -// end::getParser[] - // ... -// tag::getParser[] - return new Parser<ComplexNumberJpa>() { - @Override - public ComplexNumberJpa parseTextRepresentation(final ValueSemanticsProvider.Context context, final String entry) { - return ComplexNumberJpa.parse(entry).orElse(null); - } - @Override - public int typicalLength() { - return 30; - } - @Override - public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final ComplexNumberJpa existing) { - return existing!=null ? existing.title() : null; - } - }; + public DefaultsProvider<ComplexNumberJpa> getDefaultsProvider() { + return ()-> ComplexNumberJpa.of(0, 0); } -// end::getParser[] +// end::getDefaultsProvider[] -// tag::getEncoderDecoder[] +// tag::compose[] @Override public ValueDecomposition decompose(final ComplexNumberJpa value) { return CommonDtoUtils.typedTupleBuilder(value) @@ -103,17 +77,25 @@ public class ComplexNumberJpaValueSemantics (Double)map.get("im"))) .orElse(null); } -// end::getEncoderDecoder[] +// end::compose[] -// tag::getDefaultsProvider[] +// tag::getRenderer[] @Override - public DefaultsProvider<ComplexNumberJpa> getDefaultsProvider() { -// end::getDefaultsProvider[] - // ... -// tag::getDefaultsProvider[] - return ()-> ComplexNumberJpa.of(0, 0); + public Renderer<ComplexNumberJpa> getRenderer() { + return (context, object) -> title(object, "NaN"); } -// end::getDefaultsProvider[] + + private static String title(ComplexNumberJpa complexNumber, final String fallbackIfNull) { + if (complexNumber == null) return fallbackIfNull; + return complexNumber.getRe() + + (complexNumber.getIm() >= 0 + ? (" + " + complexNumber.getIm()) + : (" - " + (-complexNumber.getIm()))) + + "i"; + } + +// end::getRenderer[] + // tag::class[] } // end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpa_default.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpa_default.java new file mode 100644 index 0000000000..ed642ebb77 --- /dev/null +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/ComplexNumberJpa_default.java @@ -0,0 +1,37 @@ +package demoapp.dom.domain.progmodel.objects.embedded.jpa; + +import lombok.RequiredArgsConstructor; + +import org.apache.causeway.applib.annotation.Action; +import org.apache.causeway.applib.annotation.ActionLayout; +import org.apache.causeway.applib.annotation.MemberSupport; +import org.apache.causeway.applib.annotation.PromptStyle; +import org.apache.causeway.applib.annotation.SemanticsOf; + +// tag::default-mixin[] +// ... +@Action(semantics = SemanticsOf.SAFE) +@ActionLayout(promptStyle = PromptStyle.INLINE_AS_IF_EDIT) +@RequiredArgsConstructor +public class ComplexNumberJpa_default { + + private final ComplexNumberJpa mixee; + + @MemberSupport + public ComplexNumberJpa act( + final double re, + final double im + ) { + return ComplexNumberJpa.of(re, im); + } + + @MemberSupport + public double defaultRe() { + return mixee.getRe(); + } + + @MemberSupport + public double defaultIm() { + return mixee.getIm(); + } +} diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypeMenuJpa.java similarity index 77% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeMenu.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypeMenuJpa.java index 8160ff87c6..59204c5a16 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeMenu.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypeMenuJpa.java @@ -16,11 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded; +package demoapp.dom.domain.progmodel.objects.embedded.jpa; import javax.inject.Inject; import javax.inject.Named; +import org.springframework.context.annotation.Profile; + import org.apache.causeway.applib.annotation.Action; import org.apache.causeway.applib.annotation.ActionLayout; import org.apache.causeway.applib.annotation.DomainService; @@ -30,19 +32,20 @@ import org.apache.causeway.applib.services.factory.FactoryService; import lombok.RequiredArgsConstructor; -@Named("demo.EmbeddedTypeMenu") -@DomainService( - nature=NatureOfService.VIEW -) +import demoapp.dom.domain.progmodel.objects.embedded.jdo.EmbeddedTypePageJdo; + +@Profile("demo-jpa") +@Named("demo.EmbeddedTypeMenuJpa") +@DomainService(nature=NatureOfService.VIEW) @javax.annotation.Priority(PriorityPrecedence.EARLY) @RequiredArgsConstructor(onConstructor_ = {@Inject}) -public class EmbeddedTypeMenu { +public class EmbeddedTypeMenuJpa { private final FactoryService factoryService; @Action @ActionLayout(cssClassFa="fa-stop-circle", describedAs = "Experimental support for embedded types") - public EmbeddedTypeVm embeddedTypes(){ - return factoryService.viewModel(new EmbeddedTypeVm()); + public EmbeddedTypePageJpa embeddedTypes(){ + return factoryService.viewModel(new EmbeddedTypePageJpa()); } } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypePageJpa-description.adoc similarity index 69% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm-description.adoc rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypePageJpa-description.adoc index a9a89e5efd..78aac4a6cc 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm-description.adoc +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypePageJpa-description.adoc @@ -5,42 +5,33 @@ These are somewhat similar to value types, in that they have no identity and are They can also have custom behaviour. However, they are not quite true value types as the ORM needs to update their fields directly. -Ensuring that The mutator method can be made `private` +To enable that, a mutator method is required, though it can be made `private` CAUTION: This is still work in progress, see link:https://issues.apache.org/jira/browse/CAUSEWAY-1695[CAUSEWAY-1695]. -== View model and collection +== How this demo works -The page shows the `EmbeddedTypeVm`. -This simply has a collection of `NumberConstantJdo` entities: +This page object has a collection `allConstants` that just returns a set of `NumberConstantJpa` entities. +The `NumberConstantJpa` entity defines a `name` property (of type `String) and a `numberConstant` property (of type `ComplexNumberJpa`). +It is this second property that we are interested in: [source,java] -.EmbeddedTypeVm.java +.NumberConstantJpa.java ---- -include::EmbeddedTypeVm.java[tags=class] +include::NumberConstantJpa.java[tags=class] ---- +<.> JPA `@Embedded` annotation indicates that the constituent parts of the embedded type should be stored as columns of the owning entity -The `NumberConstantJdo` entity in turn declares a `name` property and a `complexNumber` property of type `ComplexNumberJdo`. -This latter property is an embedded type: -[source,java] -.NumberConstantJdo.java ----- -include::NumberConstantJdo.java[tags=class] ----- -<.> JDO `@Embedded` annotation inlines the constituent parts of the value type as columns of the owning entity -<.> maps the 'ComplexNumber.re' property to column `number_re` -<.> maps the 'ComplexNumber.im' property to column `number_im` - -== Embedded (value) type +== Embedded type -The `ComplexNumberJdo` type must also be annotated as embedded. +The `ComplexNumberJpa` type must also be annotated as embedded. We also annotate it with `@Value`; this instructs the framework how to interact with the type: [source,java] .ComplexNumberJdo.java ---- -include::ComplexNumberJdo.java[tags=class] +include::ComplexNumberJpa.java[tags=class] ---- <.> Indicates to the ORM that this _is_ persisted data ... <.> \... but can only be embedded. @@ -55,14 +46,14 @@ This class defines some behaviour: + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdo.java[tags=title] +include::ComplexNumberJpa.java[tags=title] ---- * how to parse a string: + [source,java] ---- -include::jdo/ComplexNumberJdo.java[tags=parse,indent=0] +include::ComplexNumberJpa.java[tags=parse,indent=0] ---- + This is used by the "value semantics provider", discussed in the next section. @@ -73,7 +64,7 @@ The `NumberConstantJdo_updateNumber` mixin allows the value of the complex numbe [source,java] .NumberConstantJdo_updateNumber.java ---- -include::jdo/NumberConstantJdo_updateNumber.java[tags=class] +include::NumberConstantJpa_updateNumber.java[tags=class] ---- @@ -84,7 +75,7 @@ As mentioned in the previous section, the framework uses an implementation of `V [source,java] .ComplexNumberJdoValueSemantics.java ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=class] +include::ComplexNumberJpaValueSemantics.java[tags=class] ---- where: @@ -93,14 +84,14 @@ where: + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=getRenderer] +include::ComplexNumberJpaValueSemantics.java[tags=getRenderer] ---- * `getParser()` is responsible for parsing the entered string (for either an editable property or a parameter): + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=getParser] +include::ComplexNumberJpaValueSemantics.java[tags=getParser] ---- + In this case the implementation just delegates to the `ComplexNumberJdo` class itself. @@ -109,13 +100,13 @@ In this case the implementation just delegates to the `ComplexNumberJdo` class i + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=getEncoderDecoder] +include::ComplexNumberJpaValueSemantics.java[tags=getEncoderDecoder] ---- * `getDefaultsProvider()` returns the default value to be used for non-optional parameters and properties: + [source,java,indent=0] ---- -include::jdo/ComplexNumberJdoValueSemantics.java[tags=getDefaultsProvider] +include::ComplexNumberJpaValueSemantics.java[tags=getDefaultsProvider] ---- diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypePageJpa.java similarity index 84% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypePageJpa.java index cc9c0e3918..7b5d301e06 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypePageJpa.java @@ -16,7 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded; +package demoapp.dom.domain.progmodel.objects.embedded.jpa; + +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; +import demoapp.dom._infra.values.ValueHolderRepository; +import demoapp.dom.domain.progmodel.objects.embedded.ComplexNumber; +import demoapp.dom.domain.progmodel.objects.embedded.NumberConstantEntity; import java.util.List; @@ -28,14 +33,10 @@ import org.apache.causeway.applib.annotation.DomainObject; import org.apache.causeway.applib.annotation.Nature; import org.apache.causeway.applib.annotation.ObjectSupport; -import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -import demoapp.dom._infra.values.ValueHolderRepository; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.persistence.NumberConstantEntity; - // tag::class[] -@Named("demo.EmbeddedTypeVm") +@Named("demo.EmbeddedTypePageJpa") @DomainObject(nature=Nature.VIEW_MODEL) -public class EmbeddedTypeVm implements HasAsciiDocDescription { +public class EmbeddedTypePageJpa implements HasAsciiDocDescription { // ... // end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypePageJpa.layout.xml similarity index 100% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/EmbeddedTypeVm.layout.xml rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/EmbeddedTypePageJpa.layout.xml diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa-description.adoc similarity index 100% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa-description.adoc rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa-description.adoc diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa.java similarity index 87% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa.java index 8e52c9d03b..71e38545ee 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jpa; +package demoapp.dom.domain.progmodel.objects.embedded.jpa; import javax.inject.Named; import javax.persistence.Entity; @@ -37,8 +37,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.persistence.NumberConstantEntity; +import demoapp.dom.domain.progmodel.objects.embedded.ComplexNumber; +import demoapp.dom.domain.progmodel.objects.embedded.NumberConstantEntity; @Profile("demo-jpa") //tag::class[] @@ -48,7 +48,7 @@ import demoapp.dom.domain.progmodel.objects.embedded.embedded.persistence.Number name = "NumberConstantJpa" ) @EntityListeners(CausewayEntityListener.class) -@Named("demo.NumberConstantEntity") +@Named("demo.NumberConstantEntityJpa") @DomainObject @NoArgsConstructor public class NumberConstantJpa @@ -76,7 +76,7 @@ public class NumberConstantJpa @Getter @Setter private String name; - @javax.persistence.Embedded + @javax.persistence.Embedded // <.> @Property(editing = Editing.ENABLED) @Getter @Setter private ComplexNumberJpa number; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa.layout.xml similarity index 100% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa.layout.xml rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa.layout.xml diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa.svg b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa.svg similarity index 100% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa.svg rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa.svg diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpaRepository.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpaRepository.java similarity index 91% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpaRepository.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpaRepository.java index aea658d0a4..182cd8fab5 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpaRepository.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpaRepository.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jpa; +package demoapp.dom.domain.progmodel.objects.embedded.jpa; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; @@ -24,7 +24,7 @@ import org.springframework.stereotype.Service; import lombok.val; import demoapp.dom._infra.values.ValueHolderRepository; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.ComplexNumber; +import demoapp.dom.domain.progmodel.objects.embedded.ComplexNumber; @Profile("demo-jpa") @Service diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa_updateNumber.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa_updateNumber.java similarity index 96% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa_updateNumber.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa_updateNumber.java index 1172016a94..e7e90b7604 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/embedded/jpa/NumberConstantJpa_updateNumber.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/embedded/jpa/NumberConstantJpa_updateNumber.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package demoapp.dom.domain.progmodel.objects.embedded.embedded.jpa; +package demoapp.dom.domain.progmodel.objects.embedded.jpa; import org.springframework.context.annotation.Profile; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_explanation.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_explanation.java index 980b2bab2e..60a3dec7eb 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_explanation.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_explanation.java @@ -24,12 +24,12 @@ import org.apache.causeway.applib.annotation.PropertyLayout; import lombok.RequiredArgsConstructor; //tag::class[] -@Property // <.> +@Property // <.> @PropertyLayout(fieldSetId = "properties", sequence = "1") -@RequiredArgsConstructor // <.> +@RequiredArgsConstructor // <.> public class CountHolder_explanation { - private final CountHolder holder; // <.> + private final CountHolder holder; // <.> public String prop() { return String.format( diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_fibonacciSequence.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_fibonacciSequence.java index 6d40d38928..f2c413b38c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_fibonacciSequence.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_fibonacciSequence.java @@ -46,7 +46,6 @@ public class CountHolder_fibonacciSequence { return collection; } - private static int fibonacciFor(int n) { // ... // end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_updateCount.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_updateCount.java index eeb98febe8..6d6ccc2355 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_updateCount.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/CountHolder_updateCount.java @@ -25,10 +25,8 @@ import org.apache.causeway.applib.annotation.MemberSupport; import lombok.RequiredArgsConstructor; //tag::class[] -@Action -@ActionLayout( - associateWith = "count") // <.> - +@Action // <.> +@ActionLayout(associateWith = "count") @RequiredArgsConstructor // <.> public class CountHolder_updateCount { @@ -38,11 +36,9 @@ public class CountHolder_updateCount { holder.setCount(count); return holder; } - @MemberSupport public int default0Act() { return holder.getCount(); } - @MemberSupport public String validate0Act(final int proposedCount) { return proposedCount >= 0 && proposedCount <= 46 ? null diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinMenu.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinMenu.java index 8ea74f96fd..78f75bea7d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinMenu.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinMenu.java @@ -37,8 +37,8 @@ public class MixinMenu { @Action @ActionLayout(cssClassFa="fa-mortar-pestle", describedAs="Contribute behaviour to domain objects") - public MixinVm mixins(){ - val vm = new MixinVm(); + public MixinPage mixins(){ + val vm = new MixinPage(); vm.setCount(10); return vm; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinPage-description.adoc similarity index 59% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinVm-description.adoc rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinPage-description.adoc index ac1e190fe1..e57c7a092b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinVm-description.adoc +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinPage-description.adoc @@ -4,24 +4,29 @@ Mixins allow domain object behaviour to be encapsulated as a separate class. This behaviour is then contributed to a target object as an action, property or collection. -Mixins only contribute behaviour, not state. -In the case of a contributed property or collection, these are in effect _derived_. -Behind the scenes a query is run against the contributing object. +Mixins contribute only behaviour, not state. +In the case of a contributed property or collection (that seemingly show state), these are in effect _derived_. +Behind the scenes a query is run against the contributee (or mixee) object. -The contributee object is injected into the mixin through its (1-arg) constructor. -Note that any type can be used, including interfaces. +The framework instantiates the mixin by injecting the contributee/mixee object into the mixin through its (1-arg) constructor. +All mixins that declare a constructor compatible with the mixee's type contribute to that mixee's metamodel; this includes interfaces. -The examples contribute to the following class, which holds a simple non-editable "count" integer property: +== How this demo works + +This page object shows examples of all three types of mixins: a mixin action, a mixin property and a mixin collection. + +=== Mixin action + +The page object itself has a single read-only property, `count`: [source,java] -.MixinVm.java +.MixinPage.java ---- -include::MixinVm.java[tags=class] +include::MixinPage.java[tags=class] ---- <.> editing disabled; it will be modified through a mixin -The mixins contribute behaviour to list the first N fibonacci numbers. -They don't contribute directly to the concrete `MixinVm` class, however; since all they require is a count value, they instead contribute to the `CountHolder` interface that the `MixinVm` class implements: +It also implements an interface, `CountHolder`. [source,java] .CountHolder.java @@ -29,9 +34,10 @@ They don't contribute directly to the concrete `MixinVm` class, however; since a include::CountHolder.java[tags=class] ---- -=== Contributed action +A mixin action allows this to be modified. +The examples contribute to the following class, which holds a simple non-editable "count" integer property: -The `CountHolder_updateCount` mixin allows the count to be updated within a certain range: +The `CountHolder_updateCount` mixin action contributes by way of this `CountHolder` interface: [source,java] .CountHolder_updateCount.java @@ -42,9 +48,13 @@ include::CountHolder_updateCount.java[tags=class] <.> useful lombok annotation to generate the 1-arg constructor <.> the contributee +The mixin class's name comes in two parts. +The convention is for the first part (before the "_") to be the type name, while the action id is the second part (after the "_", in other words "updateCount"). + + === Contributed collection -The `CountHolder_fibonacciSequence` mixin dynamically computes the first N number of fibonacci numbers: +The `CountHolder_fibonacciSequence` mixin collection dynamically computes the first N number of fibonacci numbers: [source,java] .CountHolder_fibonacciSequence.java @@ -55,9 +65,10 @@ include::CountHolder_fibonacciSequence.java[tags=class] <.> useful lombok annotation to generate the 1-arg constructor <.> the contributee + === Contributed property -The `CountHolder_explanation` mixin simply provides a property that explains what's going on: +The `CountHolder_explanation` mixin property simply provides an explanat what's going on: [source,java] .CountHolder_explanation.java diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinPage.java similarity index 90% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinVm.java rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinPage.java index 074900b948..ccf306fbfc 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinPage.java @@ -35,18 +35,21 @@ import lombok.Setter; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -//tag::class[] -@XmlRootElement(name = "Demo") +@Named("demo.MixinPage") +@XmlRootElement(name = "demo.MixinPage") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@Named("demo.MixinVm") @DomainObject(nature=Nature.VIEW_MODEL) -public class MixinVm implements HasAsciiDocDescription, CountHolder { - +//tag::class[] +// ... +public class MixinPage implements HasAsciiDocDescription, CountHolder { + // ... +//end::class[] @ObjectSupport public String title() { return "Mixins"; } +//tag::class[] @Property(editing = Editing.DISABLED) // <.> @Getter @Setter private int count; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinVm.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinPage.layout.xml similarity index 100% rename from examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinVm.layout.xml rename to examples/demo/domain/src/main/java/demoapp/dom/domain/progmodel/objects/mixins/mixins/MixinPage.layout.xml 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 56b8e29b78..23c0850535 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 @@ -23,7 +23,7 @@ For latest we use: https://raw.githubusercontent.com/apache/causeway/master/anto <mb3:primary> <mb3:menu> - <mb3:named>@DomainObject</mb3:named> + <mb3:named>Domain Objects</mb3:named> <mb3:section> <mb3:named>@DomainObject</mb3:named> <mb3:serviceAction objectType="demo.DomainObjectMenu" id="aliased"/> @@ -48,10 +48,16 @@ For latest we use: https://raw.githubusercontent.com/apache/causeway/master/anto <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="tableDecorator"/> <mb3:serviceAction objectType="demo.DomainObjectLayoutMenu" id="uiEvents"/> </mb3:section> + <mb3:section> + <mb3:named>Prog Model</mb3:named> + <mb3:serviceAction objectType="demo.MixinMenu" id="mixins"/> + <mb3:serviceAction objectType="demo.EmbeddedTypeMenuJpa" id="embeddedTypes"/> + <mb3:serviceAction objectType="demo.EmbeddedTypeMenuJdo" id="embeddedTypes"/> + </mb3:section> </mb3:menu> <mb3:menu> - <mb3:named>@Action</mb3:named> + <mb3:named>Actions</mb3:named> <mb3:section> <mb3:named>@Action</mb3:named> <mb3:serviceAction objectType="demo.ActionMenu" id="choicesFrom"/> @@ -76,10 +82,17 @@ For latest we use: https://raw.githubusercontent.com/apache/causeway/master/anto <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="redirectPolicy"/> <mb3:serviceAction objectType="demo.ActionLayoutMenu" id="sequence"/> </mb3:section> + <mb3:section> + <mb3:named>Prog Model</mb3:named> + <mb3:serviceAction objectType="demo.AssociatedActionMenu" id="associatedActions"/> + <mb3:serviceAction objectType="demo.DependentArgsActionMenu" id="dependentArgsActions"> + <cpt:named>Dependent Arguments</cpt:named> + </mb3:serviceAction> + </mb3:section> </mb3:menu> <mb3:menu> - <mb3:named>@Property</mb3:named> + <mb3:named>Properties</mb3:named> <mb3:section> <mb3:named>@Property</mb3:named> <mb3:serviceAction objectType="demo.PropertyMenu" id="commandPublishing"/> @@ -114,7 +127,7 @@ For latest we use: https://raw.githubusercontent.com/apache/causeway/master/anto </mb3:menu> <mb3:menu> - <mb3:named>@Collection</mb3:named> + <mb3:named>Collections</mb3:named> <mb3:section> <mb3:named>@Collection</mb3:named> <mb3:serviceAction objectType="demo.CollectionMenu" id="domainEvent"/> @@ -134,22 +147,6 @@ For latest we use: https://raw.githubusercontent.com/apache/causeway/master/anto </mb3:section> </mb3:menu> - <mb3:menu> - <mb3:named>Prog Model</mb3:named> - <mb3:section> - <mb3:named>Domain Objects</mb3:named> - <mb3:serviceAction objectType="demo.MixinMenu" id="mixins"/> - <mb3:serviceAction objectType="demo.EmbeddedTypeMenu" id="embeddedTypes"/> - </mb3:section> - <mb3:section> - <mb3:named>Actions</mb3:named> - <mb3:serviceAction objectType="demo.AssociatedActionMenu" id="associatedActions"/> - <mb3:serviceAction objectType="demo.DependentArgsActionMenu" id="dependentArgsActions"> - <cpt:named>Dependent Arguments</cpt:named> - </mb3:serviceAction> - </mb3:section> - </mb3:menu> - <mb3:menu> <mb3:named>Basic Types</mb3:named> <mb3:section> diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJpa.java index 8bb3a18ae0..a42b4dcbd9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJpa.java @@ -25,6 +25,7 @@ import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.Table; import org.springframework.context.annotation.Profile; @@ -42,6 +43,10 @@ import demoapp.dom.services.core.eventbusservice.EventBusServiceDemoVm.UiButtonE @Profile("demo-jpa") @Entity +@Table( + schema = "demo", + name = "EventLogEntryJpa" +) @Named("demo.EventLogEntry") @DomainObject public class EventLogEntryJpa diff --git a/examples/demo/domain/src/test/java/demoapp/dom/domain/objects/other/customvaluetypes/ComplexNumberJdo_Test.java b/examples/demo/domain/src/test/java/demoapp/dom/domain/objects/other/customvaluetypes/ComplexNumberJdo_Test.java index b678b10ff4..d098f46870 100644 --- a/examples/demo/domain/src/test/java/demoapp/dom/domain/objects/other/customvaluetypes/ComplexNumberJdo_Test.java +++ b/examples/demo/domain/src/test/java/demoapp/dom/domain/objects/other/customvaluetypes/ComplexNumberJdo_Test.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test; import lombok.val; -import demoapp.dom.domain.progmodel.objects.embedded.embedded.jdo.ComplexNumberJdo; +import demoapp.dom.domain.progmodel.objects.embedded.jdo.ComplexNumberJdo; class ComplexNumberJdo_Test {
