This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/causeway.git
commit ebbf7aa6ee6f7ab0662e1804628e0aeb723a82d4 Author: danhaywood <[email protected]> AuthorDate: Thu May 18 14:12:28 2023 +0100 CAUSEWAY-2845: further fixes for demo showcase value type templates --- .../valuesemantics/BigDecimalValueSemantics.java | 8 ++++++- .../valuesemantics/BigIntegerValueSemantics.java | 9 +++++++- .../valuesemantics/URLValueSemantics.java | 5 +++-- .../demoshowcases/value/ValueShowCase.java | 25 ++++++++++++++++------ .../demoshowcases/value/ValueTypeGenTemplate.java | 13 ++++++----- .../src/main/resources/vm/$TemplateVm.java | 9 ++++---- 6 files changed, 50 insertions(+), 19 deletions(-) diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java index 4b8e51a32b..7a1e791ade 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigDecimalValueSemantics.java @@ -21,6 +21,7 @@ package org.apache.causeway.core.metamodel.valuesemantics; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.function.UnaryOperator; +import java.util.stream.Stream; import javax.annotation.Priority; import javax.inject.Inject; @@ -166,7 +167,12 @@ implements new BigDecimal("1001"), new BigDecimal("-63.1"), new BigDecimal("0.001"), - BigDecimal.ZERO); + BigDecimal.ZERO, + BigDecimal.ONE, + BigDecimal.TEN, + BigDecimal.valueOf(123_456_789_012L), + BigDecimal.valueOf(1234567.8890f), + BigDecimal.valueOf(123_456_789_012L, 3)); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigIntegerValueSemantics.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigIntegerValueSemantics.java index 483468846f..bbea83b61b 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigIntegerValueSemantics.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/BigIntegerValueSemantics.java @@ -125,7 +125,14 @@ implements @Override public Can<BigInteger> getExamples() { - return Can.of(BigInteger.valueOf(-63L), BigInteger.ZERO); + return Can.of( + BigInteger.valueOf(42L), + BigInteger.valueOf(-63L), + BigInteger.ZERO, + BigInteger.ONE, + BigInteger.TEN, + BigInteger.valueOf(123_456_789_012L) + ); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java index 5886cf335f..e458ea5801 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/valuesemantics/URLValueSemantics.java @@ -128,8 +128,9 @@ implements @Override public Can<URL> getExamples() { return Can.of( - new URL("https://a.b.c"), - new URL("https://b.c.d")); + new URL("https://maps.google.com"), + new URL("https://en.wikipedia.org/wiki/Domain-driven_design") + ); } } diff --git a/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueShowCase.java b/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueShowCase.java index a198bfaca6..5d00f1f420 100644 --- a/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueShowCase.java +++ b/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueShowCase.java @@ -35,7 +35,7 @@ public enum ValueShowCase { .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.BlobValueSemantics") .descriptionIfNoPreamble("binary large objects") .causewaySpecific(true) - .templates(Template.NO_ORM_SET) + .templates(Template.NO_ORM_SET.remove(Template.SAMPLES)) .templateVariant(TemplateVariant.LOB) ), CLOB(Config.builder() @@ -45,7 +45,7 @@ public enum ValueShowCase { .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.ClobValueSemantics") .descriptionIfNoPreamble("character large objects") .causewaySpecific(true) - .templates(Template.NO_ORM_SET) + .templates(Template.NO_ORM_SET.remove(Template.SAMPLES)) .templateVariant(TemplateVariant.LOB) ), LOCALRESOURCEPATH(Config.builder() @@ -58,6 +58,7 @@ public enum ValueShowCase { "When an action returns an instance of this type, then this is rendered as a redirect request to the browser to that resource.\n" + "In this way you could for example return a link to a PDF or image (to be rendered by the web browser itself), or provide access to dynamic content by redirecting to a servlet.\n") .causewaySpecific(true) + .templates(Template.REGULAR_SET_NO_SAMPLES) .templateVariant(TemplateVariant.DEFAULT) ), PASSWORD(Config.builder() @@ -99,6 +100,7 @@ public enum ValueShowCase { .frameworkSupportForJpa(true) .frameworkSupportForJdo(true) .frameworkSupportForJaxb(true) + .templates(Template.REGULAR_SET_NO_SAMPLES) .templateVariant(TemplateVariant.DEFAULT) ), JAVAMATHBIGDECIMAL(Config.builder() @@ -138,6 +140,7 @@ public enum ValueShowCase { .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.temporal.legacy.JavaSqlTimeStampValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `java.sql.Timestamp`.") .caveat("Rather than use this data type, consider using a more modern class such as `java.time.OffsetDateTime`") + .jaxbAdapter("org.apache.causeway.applib.jaxb.JavaSqlJaxbAdapters.TimestampToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JAVATIMELOCALDATE(Config.builder() @@ -146,6 +149,7 @@ public enum ValueShowCase { .showcaseValueFullyQualifiedType("java.time.LocalDate") .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `java.time.LocalDate`.") + .jaxbAdapter("org.apache.causeway.applib.jaxb.JavaTimeJaxbAdapters.LocalDateToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JAVATIMELOCALDATETIME(Config.builder() @@ -154,6 +158,7 @@ public enum ValueShowCase { .showcaseValueFullyQualifiedType("java.time.LocalDateTime") .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `java.time.LocalDateTime`.") + .jaxbAdapter("org.apache.causeway.applib.jaxb.JavaTimeJaxbAdapters.LocalDateTimeToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JAVATIMELOCALTIME(Config.builder() @@ -162,6 +167,7 @@ public enum ValueShowCase { .showcaseValueFullyQualifiedType("java.time.LocalTime") .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.temporal.LocalTimeValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `java.time.LocalTime`.") + .jaxbAdapter("org.apache.causeway.applib.jaxb.JavaTimeJaxbAdapters.LocalTimeToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JAVATIMEOFFSETDATETIME(Config.builder() @@ -170,6 +176,7 @@ public enum ValueShowCase { .showcaseValueFullyQualifiedType("java.time.OffsetDateTime") .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.temporal.OffsetDateTimeValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `java.time.OffsetDateTime`.") + .jaxbAdapter("org.apache.causeway.applib.jaxb.JavaTimeJaxbAdapters.OffsetDateTimeToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JAVATIMEOFFSETTIME(Config.builder() @@ -178,6 +185,7 @@ public enum ValueShowCase { .showcaseValueFullyQualifiedType("java.time.OffsetTime") .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.temporal.OffsetTimeValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `java.time.OffsetTime`.") + .jaxbAdapter("org.apache.causeway.applib.jaxb.JavaTimeJaxbAdapters.OffsetTimeAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JAVATIMEZONEDDATETIME(Config.builder() @@ -186,6 +194,7 @@ public enum ValueShowCase { .showcaseValueFullyQualifiedType("java.time.ZonedDateTime") .showcaseValueSemantics("org.apache.causeway.core.metamodel.valuesemantics.temporal.ZonedDateTimeValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `java.time.ZonedDateTime`.") + .jaxbAdapter("org.apache.causeway.applib.jaxb.JavaTimeJaxbAdapters.ZonedDateTimeAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JAVAUTILDATE(Config.builder() @@ -200,38 +209,42 @@ public enum ValueShowCase { ), JODADATETIME(Config.builder() .showcaseName("JodaDateTime") - .javaPackage("demoapp.dom.types.javatime.jodadatetime") + .javaPackage("demoapp.dom.types.jodatime.jodadatetime") .showcaseValueFullyQualifiedType("org.joda.time.DateTime") .showcaseValueSemantics("org.apache.causeway.valuetypes.jodatime.integration.valuesemantics.JodaDateTimeValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `org.joda.time.DateTime`.") .caveat("Rather than use this data type, consider using a more modern class such as `java.time.OffsetDateTime`.") + .jaxbAdapter("org.apache.causeway.valuetypes.jodatime.applib.jaxb.JodaTimeJaxbAdapters.DateTimeToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JODALOCALDATE(Config.builder() .showcaseName("JodaLocalDate") - .javaPackage("demoapp.dom.types.javatime.jodalocaldate") + .javaPackage("demoapp.dom.types.jodatime.jodalocaldate") .showcaseValueFullyQualifiedType("org.joda.time.LocalDate") .showcaseValueSemantics("org.apache.causeway.valuetypes.jodatime.integration.valuesemantics.JodaLocalDateValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `org.joda.time.LocalDate`") .caveat("Rather than use this data type, consider using a more modern class such as `java.time.LocalDate`.") + .jaxbAdapter("org.apache.causeway.valuetypes.jodatime.applib.jaxb.JodaTimeJaxbAdapters.LocalDateToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JODALOCALDATETIME(Config.builder() .showcaseName("JodaLocalDateTime") - .javaPackage("demoapp.dom.types.javatime.jodalocaldatetime") + .javaPackage("demoapp.dom.types.jodatime.jodalocaldatetime") .showcaseValueFullyQualifiedType("org.joda.time.LocalDateTime") .showcaseValueSemantics("org.apache.causeway.valuetypes.jodatime.integration.valuesemantics.JodaLocalDateTimeValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `org.joda.time.LocalDateTime`.") .caveat("Rather than use this data type, consider using a more modern class such as `java.time.LocalDateTime`.") + .jaxbAdapter("org.apache.causeway.valuetypes.jodatime.applib.jaxb.JodaTimeJaxbAdapters.LocalDateTimeToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), JODALOCALTIME(Config.builder() .showcaseName("JodaLocalTime") - .javaPackage("demoapp.dom.types.javatime.jodalocaltime") + .javaPackage("demoapp.dom.types.jodatime.jodalocaltime") .showcaseValueFullyQualifiedType("org.joda.time.LocalTime") .showcaseValueSemantics("org.apache.causeway.valuetypes.jodatime.integration.valuesemantics.JodaLocalTimeValueSemantics") .preamble("The framework has built-in support for a number of temporal types, including `org.joda.time.LocalTime`.") .caveat("Rather than use this data type, consider using a more modern class such as `java.time.LocalTime`.") + .jaxbAdapter("org.apache.causeway.valuetypes.jodatime.applib.jaxb.JodaTimeJaxbAdapters.LocalTimeToStringAdapter") .templateVariant(TemplateVariant.DEFAULT) ), MARKUP(Config.builder() diff --git a/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java b/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java index e2ad87d441..138da90ca7 100644 --- a/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java +++ b/tooling/metaprog/src/main/java/org/apache/causeway/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java @@ -119,10 +119,10 @@ public class ValueTypeGenTemplate { final boolean frameworkSupportForJaxb; /** - * Implied by {@link #isCausewaySpecific()}, if present then indicates that the framework has added support for JAXB serialization for certain data types. + * Implied by {@link #isCausewaySpecific()} or a non-null {@link #getJaxbAdapter()}, if present then indicates that the framework has added support for JAXB serialization for certain data types. */ private boolean isFrameworkSupportForJaxb() { - return causewaySpecific || frameworkSupportForJaxb; + return causewaySpecific || frameworkSupportForJaxb || jaxbAdapter != null; } public String getJaxbTypeSupportNotice() { return isFrameworkSupportForJaxb() @@ -130,7 +130,10 @@ public class ValueTypeGenTemplate { : "JAXB supports `" + getShowcaseValueSimpleType() + "` out-of-the-box, so no special annotations are required.\nSee link:https://docs.oracle.com/cd/E12840_01/wls/docs103/webserv/data_types.html#wp223908[Oracle]"; } - + /** + * If specified, then used to annotate properties of JAXB view models. + */ + final String jaxbAdapter; final String javaPackage; @Builder.Default final String fileNamePlaceholderForShowcaseName = "$Template"; @@ -235,8 +238,7 @@ public class ValueTypeGenTemplate { .remove(VIEWMODEL_DESCRIPTION) .remove(VIEWMODEL_LAYOUT); - public static Can<Template> REGULAR_SET_NO_SAMPLES = Can.ofArray(Template.values()) - .remove(HOLDER_ACTION_RETURNING_ARRAY) + public static Can<Template> REGULAR_SET_NO_SAMPLES = REGULAR_SET .remove(SAMPLES); public static Can<Template> PRIMITIVE_SET = Can.ofArray(Template.values()) @@ -326,6 +328,7 @@ public class ValueTypeGenTemplate { .map(cls->boolean.class.equals(cls) ? "is" : "get") .orElse("get")); + templateVars.put("showcase-jaxb-adapter-type", (config.getJaxbAdapter() != null ? "@XmlJavaTypeAdapter(" + config.getJaxbAdapter() + ".class)\n " : "" )); templateVars.put("showcase-java-package", config.javaPackage); templateVars.put("showcase-value-semantics-provider", config.showcaseValueSemantics); templateVars.put("generated-file-notice", template.generator.formatAsComment(config.generatedFileNotice)); diff --git a/tooling/metaprog/src/main/resources/vm/$TemplateVm.java b/tooling/metaprog/src/main/resources/vm/$TemplateVm.java index be220ad1b7..8545d39e4f 100644 --- a/tooling/metaprog/src/main/resources/vm/$TemplateVm.java +++ b/tooling/metaprog/src/main/resources/vm/$TemplateVm.java @@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.apache.causeway.applib.annotation.DomainObject; import org.apache.causeway.applib.annotation.Editing; @@ -61,24 +62,24 @@ public class /*${showcase-name}*/Vm //tag::class[] @Title(prepend = "/*${showcase-simple-type}*/ view model: ") @PropertyLayout(fieldSetId = "read-only-properties", sequence = "1") - @XmlElement(required = true) // <.> + /*${showcase-jaxb-adapter-type}*/@XmlElement(required = true) // <.> @Getter @Setter private /*${showcase-simple-type}*/ readOnlyProperty; @Property(editing = Editing.ENABLED) // <.> @PropertyLayout(fieldSetId = "editable-properties", sequence = "1") - @XmlElement(required = true) + /*${showcase-jaxb-adapter-type}*/@XmlElement(required = true) @Getter @Setter private /*${showcase-simple-type}*/ readWriteProperty; @Property(optionality = Optionality.OPTIONAL) // <.> @PropertyLayout(fieldSetId = "optional-properties", sequence = "1") - @Getter @Setter + /*${showcase-jaxb-adapter-type}*/@Getter @Setter private /*${showcase-simple-type}*/ readOnlyOptionalProperty; @Property(editing = Editing.ENABLED, optionality = Optionality.OPTIONAL) @PropertyLayout(fieldSetId = "optional-properties", sequence = "2") - @Getter @Setter + /*${showcase-jaxb-adapter-type}*/@Getter @Setter private /*${showcase-simple-type}*/ readWriteOptionalProperty; }
