You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2026/04/13 16:47:07 UTC

(causeway-app-referenceapp) branch master updated: rewrites codegen as CLI

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway-app-referenceapp.git


The following commit(s) were added to refs/heads/master by this push:
     new de6d383  rewrites codegen as CLI
de6d383 is described below

commit de6d3839e431a96945f6bbf2a2ebefa17c6c3697
Author: andi-huber <ah...@apache.org>
AuthorDate: Mon Apr 13 18:46:57 2026 +0200

    rewrites codegen as CLI
---
 codegen/pom.xml                                    |  14 --
 .../main/java/demoapp/codegen/DemoCodegenCli.java  |  66 +++++++
 codegen/src/main/java/demoapp/codegen/Emitter.java |  48 +++++
 .../src/main/java/demoapp/codegen/NamedPath.java   | 206 +++++++++++++++++++++
 .../main/java/demoapp/codegen/ResourceFolder.java  | 114 ++++++++++++
 .../codegen/demoshowcases/value/ValueShowCase.java |  83 +++++----
 .../demoshowcases/value/ValueTypeGenTemplate.java  |  15 +-
 codegen/src/main/resources/$Templates.java         |   8 +-
 .../src/main/resources/$Templates~primitive.java   |   8 +-
 .../src/main/resources/holder/$TemplateHolder.java |   3 +
 .../main/resources/holder/$TemplateHolder2.java    |   4 +
 .../holder/$TemplateHolder2~primitive.java         |   4 +
 .../holder/$TemplateHolder_actionReturning.java    |   4 +
 .../$TemplateHolder_actionReturningArray.java      |   3 +
 ...plateHolder_actionReturningArray~primitive.java |   3 +
 .../$TemplateHolder_actionReturningCollection.java |   3 +
 ...Holder_actionReturningCollection~primitive.java |   3 +
 .../$TemplateHolder_actionReturning~primitive.java |   4 +
 .../holder/$TemplateHolder_mixinProperty.java      |   4 +
 .../$TemplateHolder_mixinProperty~primitive.java   |   4 +
 ...plateHolder_updateReadOnlyOptionalProperty.java |   4 +
 ..._updateReadOnlyOptionalPropertyWithChoices.java |   3 +
 .../$TemplateHolder_updateReadOnlyProperty.java    |   4 +
 ...teHolder_updateReadOnlyPropertyWithChoices.java |   3 +
 ...pdateReadOnlyPropertyWithChoices~primitive.java |   3 +
 ...ateHolder_updateReadOnlyProperty~primitive.java |   4 +
 .../holder/$TemplateHolder~primitive.java          |   3 +
 codegen/src/main/resources/jpa/$TemplateJpa.java   |   7 +-
 .../main/resources/jpa/$TemplateJpaEntities.java   |   4 +
 .../jpa/$TemplateJpaEntities~primitive.java        |   4 +
 .../src/main/resources/jpa/$TemplateJpa~lob.java   |   7 +-
 .../main/resources/jpa/$TemplateJpa~primitive.java |   7 +-
 .../resources/persistence/$TemplateEntity.java     |   8 +-
 .../persistence/$TemplateEntity~primitive.java     |   7 +-
 .../resources/persistence/$TemplateSeeding.java    |   6 +-
 .../persistence/$TemplateSeeding~primitive.java    |   5 +-
 .../main/resources/samples/$TemplateSamples.java   |   6 +-
 .../samples/$TemplateSamples~primitive.java        |   5 +-
 codegen/src/main/resources/vm/$TemplateVm.java     |  10 +-
 .../main/resources/vm/$TemplateVm~primitive.java   |   9 +-
 .../value/ValueTypeGenTemplateTest.java            | 186 -------------------
 .../src/test/resources/junit-platform.properties   |  37 ----
 codegen/src/test/resources/log4j2-test.xml         |  56 ------
 43 files changed, 613 insertions(+), 376 deletions(-)

diff --git a/codegen/pom.xml b/codegen/pom.xml
index 562a444..5e086f8 100644
--- a/codegen/pom.xml
+++ b/codegen/pom.xml
@@ -56,20 +56,6 @@
 			<version>${javapoet.version}</version>
 		</dependency>
 
-		<dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-		<!-- TESTING -->
-
-		<dependency>
-			<groupId>org.apache.causeway.core</groupId>
-			<artifactId>causeway-core-internaltestsupport</artifactId>
-			<scope>test</scope>
-		</dependency>
-
 	</dependencies>
 
 </project>
diff --git a/codegen/src/main/java/demoapp/codegen/DemoCodegenCli.java b/codegen/src/main/java/demoapp/codegen/DemoCodegenCli.java
new file mode 100644
index 0000000..310a7ed
--- /dev/null
+++ b/codegen/src/main/java/demoapp/codegen/DemoCodegenCli.java
@@ -0,0 +1,66 @@
+/*
+ *  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.codegen;
+
+import java.util.HashMap;
+
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.base._Strings;
+
+import demoapp.codegen.demoshowcases.value.ValueShowCase;
+
+public class DemoCodegenCli {
+
+    public static void main(final String[] args) {
+        var argsModel = ArgsModel.parse(args);
+        new Emitter(argsModel.projectRoot).emit(ValueShowCase.WSHORT);
+    }
+
+    // -- HELPER
+
+    private record ArgsModel(ResourceFolder projectRoot) {
+
+        static ArgsModel parse(final String[] args) {
+            if(args.length==0) {
+                printUsageAndExit();
+                return null;
+            }
+            var map = new HashMap<String, ResourceFolder>();
+            Can.ofArray(args).stream()
+                .map(kv->_Strings.parseKeyValuePair(kv, '=').orElseThrow())
+                .forEach(kvp->map.put(kvp.key(), ResourceFolder.ofFileName(kvp.value()) ));
+            var projectRoot = map.get("projectRoot");
+            if(projectRoot==null) {
+                printUsageAndExit();
+                return null;
+            }
+            return new ArgsModel(map.get("projectRoot"));
+        }
+
+        static void printUsageAndExit() {
+            System.err.println(
+                    """
+                    please provide the project root directory as input parameter like e.g.
+                    projectRoot=/path/to/project
+                    """);
+            System.exit(1);
+        }
+    }
+
+}
diff --git a/codegen/src/main/java/demoapp/codegen/Emitter.java b/codegen/src/main/java/demoapp/codegen/Emitter.java
new file mode 100644
index 0000000..dd08a39
--- /dev/null
+++ b/codegen/src/main/java/demoapp/codegen/Emitter.java
@@ -0,0 +1,48 @@
+package demoapp.codegen;
+
+import java.io.File;
+import java.util.LinkedHashSet;
+import java.util.stream.Stream;
+
+import org.springframework.util.Assert;
+
+import demoapp.codegen.demoshowcases.value.ValueShowCase;
+import demoapp.codegen.demoshowcases.value.ValueTypeGenTemplate;
+import demoapp.codegen.demoshowcases.value.ValueTypeGenTemplate.Config;
+
+record Emitter(ResourceFolder projectRoot) {
+
+    void emitAll() {
+        Stream.of(ValueShowCase.values())
+            .forEach(this::emit);
+    }
+
+    void emit(final ValueShowCase valueShowCase) {
+        var preconfig = valueShowCase.getConfigBuilder()
+                .build();
+        var config = valueShowCase.getConfigBuilder()
+            .outputRootDir(outputDir(preconfig))
+            .build();
+
+        var generator = new ValueTypeGenTemplate(config);
+        var generatedFiles = new LinkedHashSet<File>();
+        generator.generate(generatedFiles::add);
+
+        generatedFiles.forEach(genFile->{
+            System.out.println("generated: %s".formatted(generatedFiles));
+        });
+
+    }
+
+    // -- HELPER
+
+    private File outputDir(final Config preconfig) {
+        var targetFolder = projectRoot.relativeFile(
+                "domain/src/main/java/" + preconfig.getJavaPackage().replace('.', '/'));
+        Assert.isTrue(targetFolder.exists(), ()->"this is implemented as update only, "
+                + "package folder %s is expected to already exist"
+                .formatted(preconfig.getJavaPackage()));
+        return targetFolder;
+    }
+
+}
diff --git a/codegen/src/main/java/demoapp/codegen/NamedPath.java b/codegen/src/main/java/demoapp/codegen/NamedPath.java
new file mode 100644
index 0000000..a989950
--- /dev/null
+++ b/codegen/src/main/java/demoapp/codegen/NamedPath.java
@@ -0,0 +1,206 @@
+/*
+ *  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.codegen;
+
+import java.io.File;
+import java.io.Serializable;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
+import org.apache.causeway.commons.collections.Can;
+import org.apache.causeway.commons.internal.assertions._Assert;
+import org.apache.causeway.commons.internal.base._Strings;
+import org.apache.causeway.commons.internal.exceptions._Exceptions;
+
+/**
+ * Wraps a collection of non-null {@link String}(s) which represents the names of a (general purpose) path.
+ */
+record NamedPath(@NonNull Can<String> names) implements Iterable<String>, Serializable {
+
+    // -- FACTORIES
+
+    public static NamedPath empty() {
+        return new NamedPath(Can.empty());
+    }
+
+    public static NamedPath of(final @Nullable String ... names) {
+        return new NamedPath(Can.ofArray(names));
+    }
+
+    public static NamedPath of(final java.nio.file.@Nullable Path path) {
+        if(path==null
+                || path.getNameCount()==0)
+            return empty();
+        var normalized = path.normalize();
+        var names = IntStream.range(0, normalized.getNameCount())
+            .mapToObj(normalized::getName)
+            .map(java.nio.file.Path::toString)
+            .collect(Can.toCan());
+        return new NamedPath(names);
+    }
+
+    public static NamedPath of(final @Nullable File file) {
+        return file!=null
+                ? of(file.toPath())
+                : empty();
+    }
+
+    public static NamedPath parse(final @Nullable String stringified, final @NonNull String delimiter) {
+        return new NamedPath(parseAsCan(stringified, delimiter));
+    }
+
+    // -- CONSTRUCTOR
+
+    public NamedPath(final @Nullable Can<String> names) {
+        this.names = names != null
+                ? names.filter(_Strings::isNotEmpty)
+                : Can.empty();
+    }
+
+    // -- TRANSFORMATION
+
+    public NamedPath add(final String name) {
+        return new NamedPath(names.add(name));
+    }
+
+    public NamedPath add(final @Nullable NamedPath other) {
+        if(other==null
+                || other.isEmpty())
+            return this;
+        return new NamedPath(names.addAll(other.names()));
+    }
+
+    public Optional<NamedPath> parent() {
+        return isEmpty()
+                ? Optional.empty()
+                : Optional.of(new NamedPath(names.subCan(0, -1)));
+    }
+    public NamedPath parentElseFail() {
+        return parent().orElseThrow(()->
+            _Exceptions.unsupportedOperation("empty path has no parent"));
+    }
+
+    /**
+     * Strips all the other names from the start of this path.
+     * Assert this path starts with all names of the other, otherwise throws.
+     * @param other - nullable
+     */
+    public NamedPath toRelativePath(final @Nullable NamedPath other) {
+        if(other==null
+                || other.isEmpty())
+            return this;
+        if(this.isEmpty())
+            return other;
+        // assert this path starts with all names of the other
+        other.names().zip(this.names(), (o, t)->{
+            _Assert.assertEquals(o, t);
+        });
+        return this.nameCount() == other.nameCount()
+                ? empty()
+                : subPath(other.nameCount());
+    }
+
+    public NamedPath subPath(final int fromIndex) {
+        return new NamedPath(names.subCan(fromIndex));
+    }
+
+    public NamedPath subPath(final int fromIndex, final int toIndexExclusive) {
+        return new NamedPath(names.subCan(fromIndex, toIndexExclusive));
+    }
+
+    // -- SHORTCUTS
+
+    public int nameCount() {
+        return names().size();
+    }
+
+    public boolean isEmpty() {
+        return names().isEmpty();
+    }
+
+    public String getName(final int index) {
+        return names().getElseFail(index);
+    }
+
+    public Optional<String> lastName() {
+        return names().getLast();
+    }
+
+    public String lastNameElseFail() {
+        return names().getLastElseFail();
+    }
+
+    public Stream<String> streamNames() {
+        return names().stream();
+    }
+
+    @Override
+    public Iterator<String> iterator() {
+        return names().iterator();
+    }
+
+    // -- UTILITY
+
+    public String toString(final @NonNull String delimiter) {
+        return streamNames()
+                .collect(Collectors.joining(delimiter));
+    }
+
+    // -- PREDICATES
+
+    public boolean startsWith(final @Nullable NamedPath other) {
+        if(other==null
+                || other.isEmpty())
+            return true;
+        return this.names().startsWith(other.names());
+    }
+
+    // -- COMPARISON
+
+    public static Comparator<NamedPath> comparator() {
+        return comparator(String::compareTo);
+    }
+
+    public static Comparator<NamedPath> comparator(final @NonNull Comparator<String> nameComparator) {
+        return Comparator.comparingInt(NamedPath::nameCount)
+            .thenComparing((a, b)->{
+                for (int i = 0; i < a.nameCount(); i++) {
+                    int c = nameComparator.compare(a.getName(i), b.getName(i));
+                    if(c!=0) return c;
+                }
+                return 0;
+            });
+    }
+
+    // -- HELPER
+
+    private static Can<String> parseAsCan(final String stringified, final String delimiter) {
+        return _Strings.splitThenStream(stringified, delimiter)
+                .collect(Can.toCan());
+    }
+
+}
+
diff --git a/codegen/src/main/java/demoapp/codegen/ResourceFolder.java b/codegen/src/main/java/demoapp/codegen/ResourceFolder.java
new file mode 100644
index 0000000..36e89ce
--- /dev/null
+++ b/codegen/src/main/java/demoapp/codegen/ResourceFolder.java
@@ -0,0 +1,114 @@
+/*
+ *  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.codegen;
+
+import java.io.File;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import org.jspecify.annotations.NonNull;
+
+import org.apache.causeway.commons.internal.base._NullSafe;
+import org.apache.causeway.commons.internal.exceptions._Exceptions;
+import org.apache.causeway.commons.internal.functions._Predicates;
+import org.apache.causeway.commons.io.FileUtils;
+
+import lombok.SneakyThrows;
+
+record ResourceFolder(File root) {
+
+    // -- FACTORIES
+
+    public static ResourceFolder projectRoot() {
+        return new ResourceFolder(new File("").getAbsoluteFile());
+    }
+    public static ResourceFolder resourceRoot() {
+        return new ResourceFolder(projectRoot().relativeFile("src/main/resources"));
+    }
+    public static ResourceFolder testResourceRoot() {
+        return new ResourceFolder(projectRoot().relativeFile("src/test/resources"));
+    }
+    public static ResourceFolder moduleRoot(final Class<?> anyClassInModule) {
+        int nesting = 3 + (int) anyClassInModule.getPackageName().chars().filter(c->c=='.').count();
+        var moduleRoot = new File(anyClassInModule.getResource("").getFile());
+        for (int i = 0; i < nesting; i++) {
+            moduleRoot = moduleRoot.getParentFile();
+        }
+        return new ResourceFolder(moduleRoot);
+    }
+    public static ResourceFolder testResourceRoot(final Class<?> anyClassInModule) {
+        return new ResourceFolder(moduleRoot(anyClassInModule).relativeFile("src/test/resources"));
+    }
+    public static ResourceFolder ofFileName(final String fileName) {
+        return ofFile(new File(fileName));
+    }
+    public static ResourceFolder ofFile(final File rootDir) {
+        return new ResourceFolder(FileUtils.existingDirectoryElseFail(rootDir));
+    }
+
+    // -- UTILITIES
+
+    /**
+     * Returns a (non-recursive) {@link Stream} of (immediate) sub-folder names.
+     */
+    public Stream<String> streamSubFolderNames() {
+        return _NullSafe.stream(root.listFiles())
+                .filter(File::isDirectory)
+                .map(File::getName);
+    }
+
+    public Optional<ResourceFolder> relative(final String relativeFolderName) {
+        return FileUtils.existingDirectory(relativeFile(relativeFolderName))
+                .map(ResourceFolder::ofFile);
+    }
+
+    public Optional<ResourceFolder> relative(final NamedPath relativePath) {
+        return relative(relativePath.toString("/"));
+    }
+
+    public File relativeFile(final String relativeFileName) {
+        return new File(root, relativeFileName);
+    }
+
+    public File relativeFile(final String relativeFileNameTemplate, final String arg) {
+        return new File(root, String.format(relativeFileNameTemplate, arg));
+    }
+
+    public File relativeFile(final NamedPath relativePath) {
+        return new File(root, relativePath.toString("/"));
+    }
+
+    public ResourceFolder makeDir(final NamedPath relativePath) {
+        FileUtils.makeDir(relativeFile(relativePath));
+        return relative(relativePath).orElseThrow(()->
+                _Exceptions.illegalState("failed to mkdir %s", relativePath));
+    }
+
+    @SneakyThrows
+    public void purgeFiles() {
+        purgeFiles(file->false);
+    }
+
+    @SneakyThrows
+    public void purgeFiles(final @NonNull Predicate<File> keep) {
+        FileUtils.searchFiles(root, dir->true, _Predicates.not(keep), FileUtils::deleteFile);
+    }
+
+}
diff --git a/codegen/src/main/java/demoapp/codegen/demoshowcases/value/ValueShowCase.java b/codegen/src/main/java/demoapp/codegen/demoshowcases/value/ValueShowCase.java
index 258fbda..4d7b154 100644
--- a/codegen/src/main/java/demoapp/codegen/demoshowcases/value/ValueShowCase.java
+++ b/codegen/src/main/java/demoapp/codegen/demoshowcases/value/ValueShowCase.java
@@ -82,7 +82,7 @@ public enum ValueShowCase {
 //            .templateVariant(TemplateVariant.DEFAULT)),
     CALENDAREVENT(Config.builder()
             .showcaseName("CausewayCalendarEvent")
-            .javaPackage("demoapp.dom.types.causewayext.cal")
+            .javaPackage("demoapp.dom.featured.causewayext.cal")
             .showcaseValueFullyQualifiedType("org.apache.causeway.extensions.fullcalendar.applib.value.CalendarEvent")
             .showcaseValueSemantics("org.apache.causeway.extensions.fullcalendar.applib.value.CalendarEventSemantics")
             .preamble(
@@ -208,46 +208,47 @@ public enum ValueShowCase {
             .frameworkSupportForJaxb(true)
             .templateVariant(TemplateVariant.DEFAULT)
     ),
-    JODADATETIME(Config.builder()
-            .showcaseName("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.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.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.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)
-    ),
+//no longer supported
+//    JODADATETIME(Config.builder()
+//            .showcaseName("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.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.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.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()
             .showcaseName("CausewayMarkup")
             .javaPackage("demoapp.dom.types.causeway.markups")
diff --git a/codegen/src/main/java/demoapp/codegen/demoshowcases/value/ValueTypeGenTemplate.java b/codegen/src/main/java/demoapp/codegen/demoshowcases/value/ValueTypeGenTemplate.java
index 6a7cfd8..892bd85 100644
--- a/codegen/src/main/java/demoapp/codegen/demoshowcases/value/ValueTypeGenTemplate.java
+++ b/codegen/src/main/java/demoapp/codegen/demoshowcases/value/ValueTypeGenTemplate.java
@@ -196,9 +196,10 @@ public class ValueTypeGenTemplate {
         HOLDER_UPDATE_RO_PROPERTY_WITH_CHOICES("holder/%sHolder_updateReadOnlyPropertyWithChoices", Generator.JAVA),
         HOLDER_UPDATE_ROO_PROPERTY_WITH_CHOICES("holder/%sHolder_updateReadOnlyOptionalPropertyWithChoices", Generator.JAVA),
 
-        JDO("jdo/%sJdo", Generator.JAVA),
-        JDO_ENTITIES("jdo/%sJdoEntities", Generator.JAVA),
-        JDO_DESCRIPTION("jdo/%sJdo-description", Generator.DOC),
+// no longer supported
+//        JDO("jdo/%sJdo", Generator.JAVA),
+//        JDO_ENTITIES("jdo/%sJdoEntities", Generator.JAVA),
+//        JDO_DESCRIPTION("jdo/%sJdo-description", Generator.DOC),
 
         JPA("jpa/%sJpa", Generator.JAVA),
         JPA_ENTITIES("jpa/%sJpaEntities", Generator.JAVA),
@@ -227,9 +228,11 @@ public class ValueTypeGenTemplate {
                 .remove(JPA)
                 .remove(JPA_DESCRIPTION)
                 .remove(JPA_ENTITIES)
-                .remove(JDO)
-                .remove(JDO_DESCRIPTION)
-                .remove(JDO_ENTITIES);
+// no longer supported
+//                .remove(JDO)
+//                .remove(JDO_DESCRIPTION)
+//                .remove(JDO_ENTITIES)
+                ;
 
         public static Can<Template> NO_VIEWMODEL_SET = REGULAR_SET
                 .remove(VIEWMODEL)
diff --git a/codegen/src/main/resources/$Templates.java b/codegen/src/main/resources/$Templates.java
index e1c343a..30a700c 100644
--- a/codegen/src/main/resources/$Templates.java
+++ b/codegen/src/main/resources/$Templates.java
@@ -20,6 +20,7 @@ package /*${java-package}*/;
 
 import java.util.List;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
 import jakarta.xml.bind.annotation.XmlAccessType;
@@ -47,12 +48,13 @@ import demoapp.dom.types.Samples;
 import /*${showcase-java-package}*/.persistence./*${showcase-name}*/Entity;
 import /*${showcase-java-package}*/.vm./*${showcase-name}*/Vm;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
+@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED)
+@Named("demo./*${showcase-name}*/s")
 @XmlRootElement(name = "Demo")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo./*${showcase-name}*/s")
-@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED)
-//@Log4j2
 public class /*${showcase-name}*/s implements HasAsciiDocDescription {
 
     @ObjectSupport public String title() {
diff --git a/codegen/src/main/resources/$Templates~primitive.java b/codegen/src/main/resources/$Templates~primitive.java
index 20feb33..2d36a7a 100644
--- a/codegen/src/main/resources/$Templates~primitive.java
+++ b/codegen/src/main/resources/$Templates~primitive.java
@@ -20,6 +20,7 @@ package /*${java-package}*/;
 
 import java.util.List;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
 import jakarta.xml.bind.annotation.XmlAccessType;
@@ -45,12 +46,13 @@ import demoapp.dom.types.Samples;
 import /*${showcase-java-package}*/.persistence./*${showcase-name}*/Entity;
 import /*${showcase-java-package}*/.vm./*${showcase-name}*/Vm;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
+@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED)
+@Named("demo./*${showcase-name}*/s")
 @XmlRootElement(name = "Demo")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo./*${showcase-name}*/s")
-@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED)
-//@Log4j2
 public class /*${showcase-name}*/s implements HasAsciiDocDescription {
 
     @ObjectSupport public String title() {
diff --git a/codegen/src/main/resources/holder/$TemplateHolder.java b/codegen/src/main/resources/holder/$TemplateHolder.java
index 2cd7603..9160825 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder.java
@@ -18,10 +18,13 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
 
 import /*${showcase-fully-qualified-type}*/;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Named("demo./*${showcase-name}*/Holder")
 //tag::class[]
 public interface /*${showcase-name}*/Holder {
diff --git a/codegen/src/main/resources/holder/$TemplateHolder2.java b/codegen/src/main/resources/holder/$TemplateHolder2.java
index 162e691..89dc6d3 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder2.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder2.java
@@ -18,12 +18,16 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.LabelPosition;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
 import org.apache.causeway.applib.annotation.Where;
 import /*${showcase-fully-qualified-type}*/;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 public interface /*${showcase-name}*/Holder2 extends /*${showcase-name}*/Holder {
 
diff --git a/codegen/src/main/resources/holder/$TemplateHolder2~primitive.java b/codegen/src/main/resources/holder/$TemplateHolder2~primitive.java
index 1b0ab38..0b01094 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder2~primitive.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder2~primitive.java
@@ -18,11 +18,15 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.LabelPosition;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
 import org.apache.causeway.applib.annotation.Where;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 public interface /*${showcase-name}*/Holder2 extends /*${showcase-name}*/Holder {
 
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_actionReturning.java b/codegen/src/main/resources/holder/$TemplateHolder_actionReturning.java
index 42d7882..f66c271 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_actionReturning.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_actionReturning.java
@@ -18,6 +18,8 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
@@ -25,6 +27,8 @@ import /*${showcase-fully-qualified-type}*/;
 
 import lombok.RequiredArgsConstructor;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_actionReturningArray.java b/codegen/src/main/resources/holder/$TemplateHolder_actionReturningArray.java
index 8212dfe..cca58af 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_actionReturningArray.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_actionReturningArray.java
@@ -18,6 +18,7 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -30,6 +31,8 @@ import lombok.RequiredArgsConstructor;
 
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_actionReturningArray~primitive.java b/codegen/src/main/resources/holder/$TemplateHolder_actionReturningArray~primitive.java
index c845415..1da534f 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_actionReturningArray~primitive.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_actionReturningArray~primitive.java
@@ -18,6 +18,7 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -28,6 +29,8 @@ import lombok.RequiredArgsConstructor;
 
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_actionReturningCollection.java b/codegen/src/main/resources/holder/$TemplateHolder_actionReturningCollection.java
index 26a57e8..00c36e7 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_actionReturningCollection.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_actionReturningCollection.java
@@ -21,6 +21,7 @@ package /*${java-package}*/;
 import java.util.Collection;
 import java.util.stream.Collectors;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -32,6 +33,8 @@ import lombok.RequiredArgsConstructor;
 
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_actionReturningCollection~primitive.java b/codegen/src/main/resources/holder/$TemplateHolder_actionReturningCollection~primitive.java
index 908f1fb..1403a6a 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_actionReturningCollection~primitive.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_actionReturningCollection~primitive.java
@@ -21,6 +21,7 @@ package /*${java-package}*/;
 import java.util.Collection;
 import java.util.stream.Collectors;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -30,6 +31,8 @@ import lombok.RequiredArgsConstructor;
 
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_actionReturning~primitive.java b/codegen/src/main/resources/holder/$TemplateHolder_actionReturning~primitive.java
index 00f048b..75542bb 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_actionReturning~primitive.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_actionReturning~primitive.java
@@ -18,11 +18,15 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_mixinProperty.java b/codegen/src/main/resources/holder/$TemplateHolder_mixinProperty.java
index 9cfe467..de36730 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_mixinProperty.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_mixinProperty.java
@@ -18,6 +18,8 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
 import org.apache.causeway.applib.annotation.Where;
@@ -26,6 +28,8 @@ import /*${showcase-fully-qualified-type}*/;
 
 import lombok.RequiredArgsConstructor;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Property()
 @PropertyLayout(hidden = Where.ALL_TABLES, fieldSetId = "contributed", sequence = "1")
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_mixinProperty~primitive.java b/codegen/src/main/resources/holder/$TemplateHolder_mixinProperty~primitive.java
index 5679a4c..c768ba3 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_mixinProperty~primitive.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_mixinProperty~primitive.java
@@ -18,12 +18,16 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.PropertyLayout;
 import org.apache.causeway.applib.annotation.Where;
 
 import lombok.RequiredArgsConstructor;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Property()
 @PropertyLayout(hidden = Where.ALL_TABLES, fieldSetId = "contributed", sequence = "1")
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyOptionalProperty.java b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyOptionalProperty.java
index 642a42d..33cae5e 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyOptionalProperty.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyOptionalProperty.java
@@ -18,6 +18,8 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
@@ -30,6 +32,8 @@ import /*${showcase-fully-qualified-type}*/;
 
 import lombok.RequiredArgsConstructor;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyOptionalPropertyWithChoices.java b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyOptionalPropertyWithChoices.java
index f6d516d..6ade46a 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyOptionalPropertyWithChoices.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyOptionalPropertyWithChoices.java
@@ -21,6 +21,7 @@ package /*${java-package}*/;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -37,6 +38,8 @@ import lombok.RequiredArgsConstructor;
 
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyProperty.java b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyProperty.java
index 6002eeb..b1ad3e0 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyProperty.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyProperty.java
@@ -18,6 +18,8 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
@@ -28,6 +30,8 @@ import /*${showcase-fully-qualified-type}*/;
 
 import lombok.RequiredArgsConstructor;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyPropertyWithChoices.java b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyPropertyWithChoices.java
index 04690a8..1658da2 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyPropertyWithChoices.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyPropertyWithChoices.java
@@ -21,6 +21,7 @@ package /*${java-package}*/;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -35,6 +36,8 @@ import lombok.RequiredArgsConstructor;
 
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyPropertyWithChoices~primitive.java b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyPropertyWithChoices~primitive.java
index 9e70fac..fda0538 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyPropertyWithChoices~primitive.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyPropertyWithChoices~primitive.java
@@ -21,6 +21,7 @@ package /*${java-package}*/;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -33,6 +34,8 @@ import lombok.RequiredArgsConstructor;
 
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyProperty~primitive.java b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyProperty~primitive.java
index ec9e1bb..59d41aa 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyProperty~primitive.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder_updateReadOnlyProperty~primitive.java
@@ -18,6 +18,8 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.MemberSupport;
@@ -26,6 +28,8 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/codegen/src/main/resources/holder/$TemplateHolder~primitive.java b/codegen/src/main/resources/holder/$TemplateHolder~primitive.java
index 04e0b40..ab3542d 100644
--- a/codegen/src/main/resources/holder/$TemplateHolder~primitive.java
+++ b/codegen/src/main/resources/holder/$TemplateHolder~primitive.java
@@ -18,8 +18,11 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Named("demo./*${showcase-name}*/Holder")
 //tag::class[]
 public interface /*${showcase-name}*/Holder {
diff --git a/codegen/src/main/resources/jpa/$TemplateJpa.java b/codegen/src/main/resources/jpa/$TemplateJpa.java
index 41c5baa..618049d 100644
--- a/codegen/src/main/resources/jpa/$TemplateJpa.java
+++ b/codegen/src/main/resources/jpa/$TemplateJpa.java
@@ -18,6 +18,7 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
@@ -44,16 +45,18 @@ import lombok.Setter;
 
 import /*${showcase-java-package}*/.persistence./*${showcase-name}*/Entity;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Profile("demo-jpa")
 //tag::class[]
+@DomainObject
+@Named("demo./*${showcase-name}*/Entity")
 @Entity
 @Table(
       schema = "demo",
       name = "/*${showcase-name}*/Jpa"
 )
 @EntityListeners(CausewayEntityListener.class)
-@Named("demo./*${showcase-name}*/Entity")
-@DomainObject
 @NoArgsConstructor                                                             // <.>
 public class /*${showcase-name}*/Jpa
         extends /*${showcase-name}*/Entity {
diff --git a/codegen/src/main/resources/jpa/$TemplateJpaEntities.java b/codegen/src/main/resources/jpa/$TemplateJpaEntities.java
index b33f959..3c1f399 100644
--- a/codegen/src/main/resources/jpa/$TemplateJpaEntities.java
+++ b/codegen/src/main/resources/jpa/$TemplateJpaEntities.java
@@ -18,6 +18,8 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Service;
 
@@ -25,6 +27,8 @@ import /*${showcase-fully-qualified-type}*/;
 
 import demoapp.dom._infra.values.ValueHolderRepository;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Profile("demo-jpa")
 @Service
 public class /*${showcase-name}*/JpaEntities
diff --git a/codegen/src/main/resources/jpa/$TemplateJpaEntities~primitive.java b/codegen/src/main/resources/jpa/$TemplateJpaEntities~primitive.java
index 016b69e..33b68ce 100644
--- a/codegen/src/main/resources/jpa/$TemplateJpaEntities~primitive.java
+++ b/codegen/src/main/resources/jpa/$TemplateJpaEntities~primitive.java
@@ -18,11 +18,15 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
+
 import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Service;
 
 import demoapp.dom._infra.values.ValueHolderRepository;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Profile("demo-jpa")
 @Service
 public class /*${showcase-name}*/JpaEntities
diff --git a/codegen/src/main/resources/jpa/$TemplateJpa~lob.java b/codegen/src/main/resources/jpa/$TemplateJpa~lob.java
index fc4b362..74594ce 100644
--- a/codegen/src/main/resources/jpa/$TemplateJpa~lob.java
+++ b/codegen/src/main/resources/jpa/$TemplateJpa~lob.java
@@ -18,6 +18,7 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
 import jakarta.persistence.Basic;
 import jakarta.persistence.Column;
@@ -48,16 +49,18 @@ import lombok.Setter;
 
 import /*${showcase-java-package}*/.persistence./*${showcase-name}*/Entity;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Profile("demo-jpa")
 //tag::class[]
+@DomainObject
+@Named("demo./*${showcase-name}*/Entity")
 @Entity
 @Table(
       schema = "demo",
       name = "/*${showcase-name}*/Jpa"
 )
 @EntityListeners(CausewayEntityListener.class)
-@Named("demo./*${showcase-name}*/Entity")
-@DomainObject
 @NoArgsConstructor                                                             // <.>
 public class /*${showcase-name}*/Jpa
         extends /*${showcase-name}*/Entity {
diff --git a/codegen/src/main/resources/jpa/$TemplateJpa~primitive.java b/codegen/src/main/resources/jpa/$TemplateJpa~primitive.java
index 3e03b91..798ebd0 100644
--- a/codegen/src/main/resources/jpa/$TemplateJpa~primitive.java
+++ b/codegen/src/main/resources/jpa/$TemplateJpa~primitive.java
@@ -18,6 +18,7 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
 import jakarta.persistence.Entity;
 import jakarta.persistence.EntityListeners;
@@ -40,16 +41,18 @@ import lombok.Setter;
 
 import /*${showcase-java-package}*/.persistence./*${showcase-name}*/Entity;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Profile("demo-jpa")
 //tag::class[]
+@DomainObject
+@Named("demo./*${showcase-name}*/Entity")
 @Entity
 @Table(
       schema = "demo",
       name = "/*${showcase-name}*/Jpa"
 )
 @EntityListeners(CausewayEntityListener.class)
-@Named("demo./*${showcase-name}*/Entity")
-@DomainObject
 @NoArgsConstructor                                                             // <.>
 public class /*${showcase-name}*/Jpa
         extends /*${showcase-name}*/Entity {
diff --git a/codegen/src/main/resources/persistence/$TemplateEntity.java b/codegen/src/main/resources/persistence/$TemplateEntity.java
index 633cb63..89037c2 100644
--- a/codegen/src/main/resources/persistence/$TemplateEntity.java
+++ b/codegen/src/main/resources/persistence/$TemplateEntity.java
@@ -18,18 +18,18 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
-
 import org.apache.causeway.applib.annotation.DomainObject;
-
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom._infra.values.ValueHolder;
 import /*${showcase-java-package}*/.holder./*${showcase-name}*/Holder2;
-
 import /*${showcase-fully-qualified-type}*/;
 
-@Named("demo./*${showcase-name}*/Entity") // shared permissions with concrete sub class
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @DomainObject
+@Named("demo./*${showcase-name}*/Entity") // shared permissions with concrete sub class
 public abstract class /*${showcase-name}*/Entity
 implements
     HasAsciiDocDescription,
diff --git a/codegen/src/main/resources/persistence/$TemplateEntity~primitive.java b/codegen/src/main/resources/persistence/$TemplateEntity~primitive.java
index 1777d85..67681ed 100644
--- a/codegen/src/main/resources/persistence/$TemplateEntity~primitive.java
+++ b/codegen/src/main/resources/persistence/$TemplateEntity~primitive.java
@@ -18,16 +18,17 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
-
 import org.apache.causeway.applib.annotation.DomainObject;
-
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom._infra.values.ValueHolder;
 import /*${showcase-java-package}*/.holder./*${showcase-name}*/Holder2;
 
-@Named("demo./*${showcase-name}*/Entity") // shared permissions with concrete sub class
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @DomainObject
+@Named("demo./*${showcase-name}*/Entity") // shared permissions with concrete sub class
 public abstract class /*${showcase-name}*/Entity
 implements
     HasAsciiDocDescription,
diff --git a/codegen/src/main/resources/persistence/$TemplateSeeding.java b/codegen/src/main/resources/persistence/$TemplateSeeding.java
index 162ae51..07b61ee 100644
--- a/codegen/src/main/resources/persistence/$TemplateSeeding.java
+++ b/codegen/src/main/resources/persistence/$TemplateSeeding.java
@@ -18,15 +18,15 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
-
 import org.springframework.stereotype.Service;
-
 import /*${showcase-fully-qualified-type}*/;
-
 import demoapp.dom._infra.seed.SeedServiceAbstract;
 import demoapp.dom._infra.values.ValueHolderRepository;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Service
 public class /*${showcase-name}*/Seeding
 extends SeedServiceAbstract {
diff --git a/codegen/src/main/resources/persistence/$TemplateSeeding~primitive.java b/codegen/src/main/resources/persistence/$TemplateSeeding~primitive.java
index 8688b37..8882644 100644
--- a/codegen/src/main/resources/persistence/$TemplateSeeding~primitive.java
+++ b/codegen/src/main/resources/persistence/$TemplateSeeding~primitive.java
@@ -18,13 +18,14 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Inject;
-
 import org.springframework.stereotype.Service;
-
 import demoapp.dom._infra.seed.SeedServiceAbstract;
 import demoapp.dom._infra.values.ValueHolderRepository;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Service
 public class /*${showcase-name}*/Seeding
 extends SeedServiceAbstract {
diff --git a/codegen/src/main/resources/samples/$TemplateSamples.java b/codegen/src/main/resources/samples/$TemplateSamples.java
index d8db1ce..2d1855f 100644
--- a/codegen/src/main/resources/samples/$TemplateSamples.java
+++ b/codegen/src/main/resources/samples/$TemplateSamples.java
@@ -19,13 +19,13 @@
 package /*${java-package}*/;
 
 import java.util.stream.Stream;
-
+import jakarta.annotation.Generated;
 import org.springframework.stereotype.Service;
-
 import /*${showcase-fully-qualified-type}*/;
-
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Service
 public class /*${showcase-name}*/Samples implements Samples</*${showcase-simple-type}*/> {
 
diff --git a/codegen/src/main/resources/samples/$TemplateSamples~primitive.java b/codegen/src/main/resources/samples/$TemplateSamples~primitive.java
index c20ae9c..30c825c 100644
--- a/codegen/src/main/resources/samples/$TemplateSamples~primitive.java
+++ b/codegen/src/main/resources/samples/$TemplateSamples~primitive.java
@@ -19,11 +19,12 @@
 package /*${java-package}*/;
 
 import java.util.stream.Stream;
-
+import jakarta.annotation.Generated;
 import org.springframework.stereotype.Service;
-
 import demoapp.dom.types.Samples;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 @Service
 public class /*${showcase-name}*/Samples implements Samples</*${showcase-simple-type}*/> {
 
diff --git a/codegen/src/main/resources/vm/$TemplateVm.java b/codegen/src/main/resources/vm/$TemplateVm.java
index b757a00..f75aff2 100644
--- a/codegen/src/main/resources/vm/$TemplateVm.java
+++ b/codegen/src/main/resources/vm/$TemplateVm.java
@@ -18,13 +18,13 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
 import jakarta.xml.bind.annotation.XmlAccessType;
 import jakarta.xml.bind.annotation.XmlAccessorType;
 import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlRootElement;
 import jakarta.xml.bind.annotation.XmlType;
-import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.causeway.applib.annotation.DomainObject;
 import org.apache.causeway.applib.annotation.Editing;
@@ -42,13 +42,15 @@ import lombok.Setter;
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import /*${showcase-java-package}*/.holder./*${showcase-name}*/Holder2;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo./*${showcase-name}*/Vm")
 @XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo./*${showcase-name}*/Vm")
-@DomainObject(
-        nature=Nature.VIEW_MODEL)
 @lombok.NoArgsConstructor                                                       // <.>
 public class /*${showcase-name}*/Vm
         implements HasAsciiDocDescription, /*${showcase-name}*/Holder2 {
diff --git a/codegen/src/main/resources/vm/$TemplateVm~primitive.java b/codegen/src/main/resources/vm/$TemplateVm~primitive.java
index 7c6a108..68ab3e2 100644
--- a/codegen/src/main/resources/vm/$TemplateVm~primitive.java
+++ b/codegen/src/main/resources/vm/$TemplateVm~primitive.java
@@ -18,6 +18,7 @@
  */
 package /*${java-package}*/;
 
+import jakarta.annotation.Generated;
 import jakarta.inject.Named;
 import jakarta.xml.bind.annotation.XmlAccessType;
 import jakarta.xml.bind.annotation.XmlAccessorType;
@@ -37,13 +38,15 @@ import lombok.Setter;
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import /*${showcase-java-package}*/.holder./*${showcase-name}*/Holder2;
 
+@Generated("generated by demoapp.codegen.DemoCodegenCli")
+
 //tag::class[]
+@DomainObject(
+        nature=Nature.VIEW_MODEL)
+@Named("demo./*${showcase-name}*/Vm")
 @XmlRootElement(name = "root")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
-@Named("demo./*${showcase-name}*/Vm")
-@DomainObject(
-        nature=Nature.VIEW_MODEL)
 @lombok.NoArgsConstructor                                                       // <.>
 public class /*${showcase-name}*/Vm
         implements HasAsciiDocDescription, /*${showcase-name}*/Holder2 {
diff --git a/codegen/src/test/java/demoapp/codegen/demoshowcases/value/ValueTypeGenTemplateTest.java b/codegen/src/test/java/demoapp/codegen/demoshowcases/value/ValueTypeGenTemplateTest.java
deleted file mode 100644
index ed07b7a..0000000
--- a/codegen/src/test/java/demoapp/codegen/demoshowcases/value/ValueTypeGenTemplateTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  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.codegen.demoshowcases.value;
-
-import java.io.File;
-import java.nio.charset.StandardCharsets;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Objects;
-
-import org.jspecify.annotations.NonNull;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.EnumSource;
-
-import static org.junit.jupiter.api.Assertions.fail;
-
-import org.apache.causeway.commons.collections.Can;
-import org.apache.causeway.commons.internal.base._Text;
-import org.apache.causeway.commons.internal.collections._Sets;
-import org.apache.causeway.commons.internal.functions._Predicates;
-import org.apache.causeway.commons.io.FileUtils;
-import org.apache.causeway.commons.io.TextUtils;
-
-import lombok.SneakyThrows;
-import lombok.val;
-import lombok.extern.log4j.Log4j2;
-
-@SuppressWarnings("unused")
-@Log4j2
-class ValueTypeGenTemplateTest {
-
-    @ParameterizedTest
-    @EnumSource(ValueShowCase.class)
-    void test(final ValueShowCase valueShowCase) {
-        testShowcase(valueShowCase.getConfigBuilder()
-                .outputRootDir(outputDir(valueShowCase.name().toLowerCase()))
-                .build());
-    }
-
-    // -- HELPER
-
-    @SneakyThrows
-    void testShowcase(final ValueTypeGenTemplate.Config config) {
-
-        var frameWorkRoot = new File(".").getAbsoluteFile().getParentFile().getParentFile().getParentFile();
-
-        // hack for Dan's PC; write out to a different git worktree
-        frameWorkRoot = new File(frameWorkRoot.getParentFile(), "demo");
-
-        var demoDomainRoot = new File(frameWorkRoot, "examples/demo/domain/src/main/java");
-        var demoDomainShowCase = new File(demoDomainRoot, config.getJavaPackage().replace('.', '/'));
-
-        // list reference source files
-        var refShowcaseFiles = FileUtils.searchFiles(demoDomainShowCase, _Predicates.alwaysTrue(), file->
-                  file.getName().endsWith(".java")
-                  || file.getName().endsWith(".xml")
-                  || file.getName().endsWith(".adoc")
-              );
-
-        var generator = new ValueTypeGenTemplate(config);
-
-        var generatedFiles = _Sets.<File>newLinkedHashSet();
-        generator.generate(generatedFiles::add);
-
-        // override origin
-        copyFiles(generatedFiles, config.getOutputRootDir(), demoDomainShowCase);
-        copyMissingFiles(generatedFiles, config.getOutputRootDir(), demoDomainShowCase);
-
-//        assertFileSetEquals(refShowcaseFiles, demoDomainShowCase, generatedFiles, config.getOutputRootDir());
-//        assertFileContentEquals(refShowcaseFiles, generatedFiles);
-
-    }
-
-    static File outputRootDir;
-
-    @BeforeAll
-    static void setup() {
-        outputRootDir = FileUtils.tempDir("causeway-tooling-showcases");
-        log.info("tmp dir created in {}", outputRootDir);
-    }
-
-    private File outputDir(final String subfolder) {
-        return new File(outputRootDir, subfolder);
-    }
-
-    /* not used
-    private void assertFileSetEquals(
-            final Set<File> setA, final File rootA,
-            final Set<File> setB, final File rootB) {
-        assertEquals(
-                Can.ofCollection(setA)
-                .map(FileUtils.realtiveFileName(rootA))
-                .sorted(Comparator.naturalOrder()),
-                Can.ofCollection(setB)
-                .map(FileUtils.realtiveFileName(rootB))
-                .sorted(Comparator.naturalOrder()));
-    }*/
-
-    private void copyFiles(final Collection<File> generatedFiles, final File sourceRoot, final File destinationRoot) {
-        generatedFiles.forEach(src->{
-            val dest = new File(destinationRoot, FileUtils.realtiveFileName(sourceRoot, src));
-            FileUtils.makeDir(dest.getParentFile());
-            copyWithCrlf(src, dest);
-//            FileUtils.copy(src, dest);
-        });
-    }
-
-    private void copyMissingFiles(final Collection<File> generatedFiles, final File sourceRoot, final File destinationRoot) {
-        generatedFiles.forEach(src->{
-            val dest = new File(destinationRoot, FileUtils.realtiveFileName(sourceRoot, src));
-            if(!dest.exists()) {
-                FileUtils.makeDir(dest.getParentFile());
-                copyWithCrlf(src, dest);
-//                FileUtils.copy(src, dest);
-            }
-        });
-    }
-
-    private void assertFileContentEquals(final Collection<File> filesA, final Collection<File> filesB) {
-
-        val sortedA = Can.ofCollection(filesA).sorted(Comparator.naturalOrder());
-        val sortedB = Can.ofCollection(filesB).sorted(Comparator.naturalOrder());
-
-        val failedFileComparisons = sortedA
-                .zipMap(sortedB, (a, b)->{
-
-                    var linesA = _Text.normalize(
-                            TextUtils.readLinesFromFile(a, StandardCharsets.UTF_8))
-                            .map(this::normalizeForComparision);
-                    var linesB = _Text.normalize(
-                            TextUtils.readLinesFromFile(b, StandardCharsets.UTF_8))
-                            .map(this::normalizeForComparision);
-
-                    return Objects.equals(linesA, linesB)
-                            ? null
-                            : String.format("non equal line in file %s: %s",
-                                    a.getName(),
-                                    firstLineNotEqual(linesA, linesB));
-                });
-
-        failedFileComparisons.forEach(msg->System.err.printf("%s%n", msg));
-
-        if(failedFileComparisons.isNotEmpty()) {
-            fail(String.format("some file contents are not equal %s", failedFileComparisons));
-        }
-    }
-
-    private String normalizeForComparision(final String line) {
-        return line;//.replace("java.lang.Long", "Long");
-    }
-
-    private String firstLineNotEqual(final Can<String> linesA, final Can<String> linesB) {
-        int lineIndex = 0;
-        for(val lineA : linesA) {
-            val lineB = linesB.get(lineIndex++).orElse(null);
-            if(!lineA.equals(lineB))
-                return String.format("%s <-> %s", lineA, lineB);
-        }
-        return "";
-    }
-
-    private void copyWithCrlf(final @NonNull File from, final @NonNull File to) {
-        // Appends CR before the LF line ending to each line
-        FileUtils.copyLines(from, to, StandardCharsets.UTF_8, line->line + "\r");
-    }
-
-}
diff --git a/codegen/src/test/resources/junit-platform.properties b/codegen/src/test/resources/junit-platform.properties
deleted file mode 100644
index 87f4e41..0000000
--- a/codegen/src/test/resources/junit-platform.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# 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.
-#
-#
-
-# as per https://github.com/cucumber/cucumber-jvm/tree/master/junit-platform-engine#configuration-options
-cucumber.publish.quiet=true
-cucumber.filter.tags=not @backlog and not @ignore
-#we are using @Cucumber annotated classes and restrict classpath search to
-cucumber.glue=org.apache.causeway.testdomain.cucumber
-#we are using built-in reporting plugins
-cucumber.plugin=pretty, html:target/cucumber-reports/cucumber-report.html
-
-# WARNING:
-#
-# cucumber.plugin=..., json:target/cucumber-reports/cucumber-report.json, ...
-#
-# will cause an empty file to be created when running from mvn.
-#
-# this is why the maven configuration to execute cucumber using the CLI (antrun:run@cucumber-cli)
-# is configured to use --plugins json:target/cucumber-no-clobber.json
-#
diff --git a/codegen/src/test/resources/log4j2-test.xml b/codegen/src/test/resources/log4j2-test.xml
deleted file mode 100644
index ec24be9..0000000
--- a/codegen/src/test/resources/log4j2-test.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<Configuration status="WARN">
-	<Properties>
-		<Property name="PID">????</Property>
-		<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
-		<Property name="LOG_LEVEL_PATTERN">%5p</Property>
-		<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
-		<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
-		<Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
-	</Properties>
-	<Appenders>
-		<Console name="Console" target="SYSTEM_OUT" follow="true">
-			<PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}" />
-		</Console>
-	</Appenders>
-	<Loggers>
-		<Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
-		<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
-		<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
-		<logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
-		<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
-		<Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
-		<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
-		<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
-		
-		<logger name="org.apache.directory" level="warn"/>
-		<logger name="org.apache.directory.api.ldap.model.entry.Value" level="off"/>
-		
-		<logger name="DataNucleus.Persistence" level="info"/>
-		<logger name="DataNucleus.Transaction" level="info"/>
-		<logger name="DataNucleus.Datastore.Schema" level="info"/>
-		<logger name="DataNucleus.Datastore.Native" level="info"/>
-		
-		<Root level="info">
-			<AppenderRef ref="Console" />
-		</Root>
-	</Loggers>
-</Configuration>