You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/08/16 12:52:06 UTC

[isis] branch master updated: ISIS-3123: templates: add generatedFileNotice

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/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new c2a2934f77 ISIS-3123: templates: add generatedFileNotice
c2a2934f77 is described below

commit c2a2934f773f8205d6b626584fa78c0f4a41c33f
Author: andi-huber <ah...@apache.org>
AuthorDate: Tue Aug 16 14:51:58 2022 +0200

    ISIS-3123: templates: add generatedFileNotice
---
 .../demoshowcases/value/ValueTypeGenTemplate.java  | 58 ++++++++++++++++++----
 tooling/metaprog/src/main/resources/Templates.java |  1 +
 .../src/main/resources/holder/TemplateHolder.java  |  1 +
 .../src/main/resources/holder/TemplateHolder2.java |  1 +
 .../holder/TemplateHolder_actionReturning.java     |  2 +-
 .../TemplateHolder_actionReturningCollection.java  |  2 +-
 .../holder/TemplateHolder_mixinProperty.java       |  2 +-
 ...plateHolder_updateReadOnlyOptionalProperty.java |  1 +
 .../TemplateHolder_updateReadOnlyProperty.java     |  1 +
 ...teHolder_updateReadOnlyPropertyWithChoices.java |  1 +
 .../src/main/resources/jdo/TemplateJdo.java        |  1 +
 .../main/resources/jdo/TemplateJdoEntities.java    |  1 +
 .../src/main/resources/jpa/TemplateJpa.java        |  1 +
 .../main/resources/jpa/TemplateJpaEntities.java    |  1 +
 .../main/resources/persistence/TemplateEntity.java |  1 +
 .../resources/persistence/TemplateSeeding.java     |  1 +
 .../main/resources/samples/TemplateSamples.java    |  1 +
 .../metaprog/src/main/resources/vm/TemplateVm.java |  1 +
 .../value/ValueTypeGenTemplateTest.java            | 42 +++++++++++-----
 19 files changed, 95 insertions(+), 25 deletions(-)

diff --git a/tooling/metaprog/src/main/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java b/tooling/metaprog/src/main/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java
index cc06eff6f0..33be5d8987 100644
--- a/tooling/metaprog/src/main/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java
+++ b/tooling/metaprog/src/main/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplate.java
@@ -43,16 +43,39 @@ public class ValueTypeGenTemplate {
     public static class Config {
         final File outputRootDir;
         final String showcaseName;
+        final String showcaseValueType;
+        final String showcaseValueSemantics;
         final String javaPackage;
-        @Singular final Map<String, String> templateVariables = new HashMap<>();
+        final boolean suppressGeneratedFileNotice;
+        @Builder.Default
+        final String generatedFileNotice = "This file was generated by the showcase generator (tooling). Do NOT edit!";
+        @Singular
+        final Map<String, String> templateVariables = new HashMap<>();
     }
 
     @RequiredArgsConstructor
     enum Generator {
-        DOC(".adoc"),
-        JAVA(".java"),
-        LAYOUT(".layout.xml");
+        DOC(".adoc"){
+            @Override String formatAsComment(final String text) {
+                return "//// " + text + " ////"; }
+            @Override String formatAsTemplateVar(final String text) {
+                return "////${" + text + "}////"; }
+        },
+        JAVA(".java"){
+            @Override String formatAsComment(final String text) {
+                return "/* " + text + " */"; }
+            @Override String formatAsTemplateVar(final String text) {
+                return "/*${" + text + "}*/"; }
+        },
+        LAYOUT(".layout.xml"){
+            @Override String formatAsComment(final String text) {
+                return "<!-- " + text + " -->"; }
+            @Override String formatAsTemplateVar(final String text) {
+                return "<!--${" + text + "}-->"; }
+        };
         final String fileSuffix;
+        abstract String formatAsComment(String text);
+        abstract String formatAsTemplateVar(String key);
     }
 
     @RequiredArgsConstructor
@@ -108,6 +131,20 @@ public class ValueTypeGenTemplate {
         }
     }
 
+    @RequiredArgsConstructor
+    static class TemplateVars extends HashMap<String, String> {
+        private static final long serialVersionUID = 1L;
+        private final Generator generator;
+        @Override
+        public String put(final String key, final String value) {
+            return super.put(generator.formatAsTemplateVar(key), value);
+        }
+        @Override
+        public void putAll(final Map<? extends String, ? extends String> other) {
+            other.forEach((key, value)->put(key, value));
+        }
+    }
+
     final Config config;
 
     public void generate(final Consumer<File> onSourceGenerated) {
@@ -119,13 +156,16 @@ public class ValueTypeGenTemplate {
 
             val genTarget = source.file(config);
 
-            val templateVars = new HashMap<String, String>();
+            val templateVars = new TemplateVars(source.generator);
             templateVars.putAll(config.templateVariables);
             templateVars.put("java-package", source.javaPackage(config));
             templateVars.put("showcase-name", config.showcaseName);
-            templateVars.put("showcase-type", "java.util.UUID");
-            templateVars.put("showcase-value-semantics-provider",
-                    "org.apache.isis.core.metamodel.valuesemantics.UUIDValueSemantics");
+            templateVars.put("showcase-type", config.showcaseValueType);
+            templateVars.put("showcase-value-semantics-provider", config.showcaseValueSemantics);
+
+            templateVars.put("before-class-declaration", config.suppressGeneratedFileNotice
+                    ? ""
+                    : source.generator.formatAsComment(config.generatedFileNotice));
 
             generateFromTemplate(templateVars, template, genTarget);
             onSourceGenerated.accept(genTarget);
@@ -147,7 +187,7 @@ public class ValueTypeGenTemplate {
     private String templateProcessor(final Map<String, String> templateVars, final String line) {
         val lineRef = _Refs.stringRef(line);
         templateVars.forEach((key, value)->{
-            lineRef.update(s->s.replace("/*${" + key + "}*/", value));
+            lineRef.update(s->s.replace(key, value));
         });
         return lineRef.getValue();
     }
diff --git a/tooling/metaprog/src/main/resources/Templates.java b/tooling/metaprog/src/main/resources/Templates.java
index 54103e0347..aaeb33773f 100644
--- a/tooling/metaprog/src/main/resources/Templates.java
+++ b/tooling/metaprog/src/main/resources/Templates.java
@@ -45,6 +45,7 @@ import demoapp.dom.types.Samples;
 import demoapp.dom.types.javautil.uuids.persistence./*${showcase-name}*/Entity;
 import demoapp.dom.types.javautil.uuids.vm./*${showcase-name}*/Vm;
 
+/*${before-class-declaration}*/
 @XmlRootElement(name = "Demo")
 @XmlType
 @XmlAccessorType(XmlAccessType.FIELD)
diff --git a/tooling/metaprog/src/main/resources/holder/TemplateHolder.java b/tooling/metaprog/src/main/resources/holder/TemplateHolder.java
index 43b39f954e..5f6ab82f77 100644
--- a/tooling/metaprog/src/main/resources/holder/TemplateHolder.java
+++ b/tooling/metaprog/src/main/resources/holder/TemplateHolder.java
@@ -20,6 +20,7 @@ package /*${java-package}*/;
 
 import javax.inject.Named;
 
+/*${before-class-declaration}*/
 @Named("demo./*${showcase-name}*/Holder")
 //tag::class[]
 public interface /*${showcase-name}*/Holder {
diff --git a/tooling/metaprog/src/main/resources/holder/TemplateHolder2.java b/tooling/metaprog/src/main/resources/holder/TemplateHolder2.java
index 067f4b8951..78c2a51d22 100644
--- a/tooling/metaprog/src/main/resources/holder/TemplateHolder2.java
+++ b/tooling/metaprog/src/main/resources/holder/TemplateHolder2.java
@@ -23,6 +23,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 
+/*${before-class-declaration}*/
 //tag::class[]
 public interface /*${showcase-name}*/Holder2 extends /*${showcase-name}*/Holder {
 
diff --git a/tooling/metaprog/src/main/resources/holder/TemplateHolder_actionReturning.java b/tooling/metaprog/src/main/resources/holder/TemplateHolder_actionReturning.java
index 8b2ad29136..a40291a31e 100644
--- a/tooling/metaprog/src/main/resources/holder/TemplateHolder_actionReturning.java
+++ b/tooling/metaprog/src/main/resources/holder/TemplateHolder_actionReturning.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
-
+/*${before-class-declaration}*/
 //tag::class[]
 @Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
diff --git a/tooling/metaprog/src/main/resources/holder/TemplateHolder_actionReturningCollection.java b/tooling/metaprog/src/main/resources/holder/TemplateHolder_actionReturningCollection.java
index 2c76bde3d9..ae37fe1bc8 100644
--- a/tooling/metaprog/src/main/resources/holder/TemplateHolder_actionReturningCollection.java
+++ b/tooling/metaprog/src/main/resources/holder/TemplateHolder_actionReturningCollection.java
@@ -29,7 +29,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import demoapp.dom.types.Samples;
 import lombok.RequiredArgsConstructor;
 
-
+/*${before-class-declaration}*/
 //tag::class[]
 @Action(semantics = SemanticsOf.SAFE)
 @RequiredArgsConstructor
diff --git a/tooling/metaprog/src/main/resources/holder/TemplateHolder_mixinProperty.java b/tooling/metaprog/src/main/resources/holder/TemplateHolder_mixinProperty.java
index 4f0accfcec..20a177e73a 100644
--- a/tooling/metaprog/src/main/resources/holder/TemplateHolder_mixinProperty.java
+++ b/tooling/metaprog/src/main/resources/holder/TemplateHolder_mixinProperty.java
@@ -24,7 +24,7 @@ import org.apache.isis.applib.annotation.Where;
 
 import lombok.RequiredArgsConstructor;
 
-
+/*${before-class-declaration}*/
 //tag::class[]
 @Property()
 @PropertyLayout(hidden = Where.ALL_TABLES, fieldSetId = "contributed", sequence = "1")
diff --git a/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyOptionalProperty.java b/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyOptionalProperty.java
index 03501c85e3..5040ccb107 100644
--- a/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyOptionalProperty.java
+++ b/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyOptionalProperty.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
+/*${before-class-declaration}*/
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyProperty.java b/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyProperty.java
index e356ec28fa..4854912adb 100644
--- a/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyProperty.java
+++ b/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyProperty.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 
 import lombok.RequiredArgsConstructor;
 
+/*${before-class-declaration}*/
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyPropertyWithChoices.java b/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyPropertyWithChoices.java
index 1fb93e843c..ca12731a4d 100644
--- a/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyPropertyWithChoices.java
+++ b/tooling/metaprog/src/main/resources/holder/TemplateHolder_updateReadOnlyPropertyWithChoices.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import demoapp.dom.types.Samples;
 import lombok.RequiredArgsConstructor;
 
+/*${before-class-declaration}*/
 //tag::class[]
 @Action(
         semantics = SemanticsOf.IDEMPOTENT
diff --git a/tooling/metaprog/src/main/resources/jdo/TemplateJdo.java b/tooling/metaprog/src/main/resources/jdo/TemplateJdo.java
index 1ef187ebc8..8e7787ad76 100644
--- a/tooling/metaprog/src/main/resources/jdo/TemplateJdo.java
+++ b/tooling/metaprog/src/main/resources/jdo/TemplateJdo.java
@@ -39,6 +39,7 @@ import lombok.Setter;
 
 import demoapp.dom.types.javautil.uuids.persistence./*${showcase-name}*/Entity;
 
+/*${before-class-declaration}*/
 @Profile("demo-jdo")
 //tag::class[]
 @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo")
diff --git a/tooling/metaprog/src/main/resources/jdo/TemplateJdoEntities.java b/tooling/metaprog/src/main/resources/jdo/TemplateJdoEntities.java
index f5124655a6..08d19471e3 100644
--- a/tooling/metaprog/src/main/resources/jdo/TemplateJdoEntities.java
+++ b/tooling/metaprog/src/main/resources/jdo/TemplateJdoEntities.java
@@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
 
 import demoapp.dom._infra.values.ValueHolderRepository;
 
+/*${before-class-declaration}*/
 @Profile("demo-jdo")
 @Service
 public class /*${showcase-name}*/JdoEntities
diff --git a/tooling/metaprog/src/main/resources/jpa/TemplateJpa.java b/tooling/metaprog/src/main/resources/jpa/TemplateJpa.java
index d1c079d1b5..c87fc4d86b 100644
--- a/tooling/metaprog/src/main/resources/jpa/TemplateJpa.java
+++ b/tooling/metaprog/src/main/resources/jpa/TemplateJpa.java
@@ -42,6 +42,7 @@ import lombok.Setter;
 
 import demoapp.dom.types.javautil.uuids.persistence./*${showcase-name}*/Entity;
 
+/*${before-class-declaration}*/
 @Profile("demo-jpa")
 //tag::class[]
 @Entity
diff --git a/tooling/metaprog/src/main/resources/jpa/TemplateJpaEntities.java b/tooling/metaprog/src/main/resources/jpa/TemplateJpaEntities.java
index a49020496c..db90e059a8 100644
--- a/tooling/metaprog/src/main/resources/jpa/TemplateJpaEntities.java
+++ b/tooling/metaprog/src/main/resources/jpa/TemplateJpaEntities.java
@@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
 
 import demoapp.dom._infra.values.ValueHolderRepository;
 
+/*${before-class-declaration}*/
 @Profile("demo-jpa")
 @Service
 public class /*${showcase-name}*/JpaEntities
diff --git a/tooling/metaprog/src/main/resources/persistence/TemplateEntity.java b/tooling/metaprog/src/main/resources/persistence/TemplateEntity.java
index aa3c175a47..c7b05ae8c4 100644
--- a/tooling/metaprog/src/main/resources/persistence/TemplateEntity.java
+++ b/tooling/metaprog/src/main/resources/persistence/TemplateEntity.java
@@ -26,6 +26,7 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom._infra.values.ValueHolder;
 import demoapp.dom.types.javautil.uuids.holder./*${showcase-name}*/Holder2;
 
+/*${before-class-declaration}*/
 @Named("demo./*${showcase-name}*/Entity") // shared permissions with concrete sub class
 @DomainObject
 public abstract class /*${showcase-name}*/Entity
diff --git a/tooling/metaprog/src/main/resources/persistence/TemplateSeeding.java b/tooling/metaprog/src/main/resources/persistence/TemplateSeeding.java
index a278021e18..2f7d123c3e 100644
--- a/tooling/metaprog/src/main/resources/persistence/TemplateSeeding.java
+++ b/tooling/metaprog/src/main/resources/persistence/TemplateSeeding.java
@@ -25,6 +25,7 @@ import org.springframework.stereotype.Service;
 import demoapp.dom._infra.seed.SeedServiceAbstract;
 import demoapp.dom._infra.values.ValueHolderRepository;
 
+/*${before-class-declaration}*/
 @Service
 public class /*${showcase-name}*/Seeding
 extends SeedServiceAbstract {
diff --git a/tooling/metaprog/src/main/resources/samples/TemplateSamples.java b/tooling/metaprog/src/main/resources/samples/TemplateSamples.java
index 492a6e4fce..d97f99905d 100644
--- a/tooling/metaprog/src/main/resources/samples/TemplateSamples.java
+++ b/tooling/metaprog/src/main/resources/samples/TemplateSamples.java
@@ -24,6 +24,7 @@ import org.springframework.stereotype.Service;
 
 import demoapp.dom.types.Samples;
 
+/*${before-class-declaration}*/
 @Service
 public class /*${showcase-name}*/Samples implements Samples</*${showcase-type}*/> {
 
diff --git a/tooling/metaprog/src/main/resources/vm/TemplateVm.java b/tooling/metaprog/src/main/resources/vm/TemplateVm.java
index fa151a3f71..681aff5424 100644
--- a/tooling/metaprog/src/main/resources/vm/TemplateVm.java
+++ b/tooling/metaprog/src/main/resources/vm/TemplateVm.java
@@ -39,6 +39,7 @@ import lombok.Setter;
 import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription;
 import demoapp.dom.types.javautil.uuids.holder./*${showcase-name}*/Holder2;
 
+/*${before-class-declaration}*/
 //tag::class[]
 @XmlRootElement(name = "root")
 @XmlType
diff --git a/tooling/metaprog/src/test/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java b/tooling/metaprog/src/test/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java
index a9b2a55302..f9536aa0c3 100644
--- a/tooling/metaprog/src/test/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java
+++ b/tooling/metaprog/src/test/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java
@@ -47,6 +47,9 @@ class ValueTypeGenTemplateTest {
                 .outputRootDir(outputRootDir)
                 .showcaseName("JavaUtilUuid")
                 .javaPackage("demoapp.dom.types.javautil.uuids")
+                .showcaseValueType("java.util.UUID")
+                .showcaseValueSemantics("org.apache.isis.core.metamodel.valuesemantics.UUIDValueSemantics")
+                .suppressGeneratedFileNotice(true)
                 .build());
 
         val generatedFiles = _Sets.<File>newLinkedHashSet();
@@ -77,24 +80,37 @@ class ValueTypeGenTemplateTest {
         val sortedA = Can.ofCollection(filesA).sorted(Comparator.naturalOrder());
         val sortedB = Can.ofCollection(filesB).sorted(Comparator.naturalOrder());
 
-        val failedFiles = sortedA
-                .zipMap(sortedB, (a, b)->
-                     Objects.equals(
-                            _Text.readLinesFromFile(a, StandardCharsets.UTF_8),
-                            _Text.readLinesFromFile(b, StandardCharsets.UTF_8))
-                            ? null
-                            : b)
-                .map(failedFile->failedFile.getName());
+        val failedFileComparisons = sortedA
+                .zipMap(sortedB, (a, b)->{
+
+                    var linesA = _Text.normalize(
+                            _Text.readLinesFromFile(a, StandardCharsets.UTF_8));
+                    var linesB = _Text.normalize(
+                            _Text.readLinesFromFile(b, StandardCharsets.UTF_8));
 
+                    return Objects.equals(linesA, linesB)
+                            ? null
+                            : String.format("non equal line in file %s: %s",
+                                    a.getName(),
+                                    firstLineNotEqual(linesA, linesB));
+                });
 
-        failedFiles.forEach(failedFile->{
-            System.err.printf("failed comparision: %s%n", failedFile);
-        });
+        failedFileComparisons.forEach(msg->System.err.printf("%s%n", msg));
 
-        if(failedFiles.isNotEmpty()) {
-            fail(String.format("some file contents are not equal %s", failedFiles));
+        if(failedFileComparisons.isNotEmpty()) {
+            fail(String.format("some file contents are not equal %s", failedFileComparisons));
         }
+    }
 
+    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 "";
     }
 
 }