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

commit 89ec6683b4557f6e783a0f92cf21e0bc634a634d
Author: andi-huber <[email protected]>
AuthorDate: Tue Aug 16 10:24:46 2022 +0200

    ISIS-3123: enumerate all source files we need to generate
---
 .../apache/isis/commons/internal/base/_Files.java  | 25 +++++++--
 .../compiler/JavaSourceCompilingClassLoader.java   |  3 +-
 .../demoshowcases/value/ValueTypeGenTemplate.java  | 61 ++++++++++++++++++++++
 .../value/ValueTypeGenTemplateTest.java            | 59 +++++++++++++++++++++
 4 files changed, 142 insertions(+), 6 deletions(-)

diff --git 
a/commons/src/main/java/org/apache/isis/commons/internal/base/_Files.java 
b/commons/src/main/java/org/apache/isis/commons/internal/base/_Files.java
index 450c9521b8..5d9de43323 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Files.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Files.java
@@ -23,10 +23,11 @@ import java.io.IOException;
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 
 import org.springframework.lang.Nullable;
@@ -51,8 +52,7 @@ public class _Files {
             final File dir,
             final Predicate<File> dirFilter,
             final Predicate<File> fileFilter) throws IOException {
-
-        final Set<File> fileList = new HashSet<>();
+        final Set<File> fileList = new LinkedHashSet<>();
         searchFiles(dir, dirFilter, fileFilter, fileList::add);
         return fileList;
     }
@@ -72,7 +72,6 @@ public class _Files {
             final Predicate<File> dirFilter,
             final Predicate<File> fileFilter,
             final Consumer<File> onFileFound) throws IOException {
-
         try (DirectoryStream<Path> stream = 
Files.newDirectoryStream(dir.toPath())) {
             for (Path path : stream) {
                 val file = path.toFile();
@@ -146,4 +145,22 @@ public class _Files {
         return directoryToBeDeleted.delete();
     }
 
+    /**
+     * Returns a temp directory with delete-on-exit policy.
+     */
+    @SneakyThrows
+    public static File tempDir(final String name) {
+        val tempDir =  Files.createTempDirectory(name).toFile();
+        tempDir.deleteOnExit();
+        return tempDir;
+    }
+
+    public static String realtiveFileName(final File root, final File file) {
+        return 
file.getAbsolutePath().substring(root.getAbsolutePath().length()+1);
+    }
+
+    public static Function<File, String> realtiveFileName(final File root) {
+        return file->realtiveFileName(root, file);
+    }
+
 }
diff --git 
a/tooling/metaprog/src/main/java/org/apache/isis/tooling/metaprog/compiler/JavaSourceCompilingClassLoader.java
 
b/tooling/metaprog/src/main/java/org/apache/isis/tooling/metaprog/compiler/JavaSourceCompilingClassLoader.java
index c7acb6ea5c..ae67a37ab6 100644
--- 
a/tooling/metaprog/src/main/java/org/apache/isis/tooling/metaprog/compiler/JavaSourceCompilingClassLoader.java
+++ 
b/tooling/metaprog/src/main/java/org/apache/isis/tooling/metaprog/compiler/JavaSourceCompilingClassLoader.java
@@ -52,8 +52,7 @@ public class JavaSourceCompilingClassLoader extends 
ClassLoader  {
     @SneakyThrows
     private JavaSourceCompilingClassLoader() {
         // purely for the purpose of communicating with the compiler
-        this.root = Files.createTempDirectory("isis-dsl-cl");
-        this.root.toFile().deleteOnExit();
+        this.root = _Files.tempDir("isis-tooling-cl").toPath();
         log.info("tmp dir created in {}", root);
 
         Thread printingHook = new Thread(() -> {
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 43aaa5bbf8..264465d92e 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
@@ -19,15 +19,76 @@
 package org.apache.isis.tooling.metaprog.demoshowcases.value;
 
 import java.io.File;
+import java.util.function.Consumer;
 
 import lombok.Builder;
+import lombok.RequiredArgsConstructor;
 import lombok.Value;
+import lombok.val;
 
 public class ValueTypeGenTemplate {
 
     @Value @Builder
     public static class Config {
         final File outputRootDir;
+        final String showcaseName;
+    }
+
+    @RequiredArgsConstructor
+    enum Generator {
+        DOC(".adoc"),
+        JAVA(".java"),
+        LAYOUT(".layout.xml");
+        final String fileSuffix;
+    }
+
+    @RequiredArgsConstructor
+    enum Sources {
+        HOLDER("holder/%sHolder", Generator.JAVA),
+        HOLDER2("holder/%sHolder2", Generator.JAVA),
+        HOLDER_ACTION_RETURNING("holder/%sHolder_actionReturning", 
Generator.JAVA),
+        
HOLDER_ACTION_RETURNING_COLLECTION("holder/%sHolder_actionReturningCollection", 
Generator.JAVA),
+        HOLDER_MIXIN_PROPERTY("holder/%sHolder_mixinProperty", Generator.JAVA),
+        
HOLDER_UPDATE_READONLY_OPTIONAL_PROPERTY("holder/%sHolder_updateReadOnlyOptionalProperty",
 Generator.JAVA),
+        
HOLDER_updateReadOnlyProperty("holder/%sHolder_updateReadOnlyProperty", 
Generator.JAVA),
+        
HOLDER_updateReadOnlyPropertyWithChoices("holder/%sHolder_updateReadOnlyPropertyWithChoices",
 Generator.JAVA),
+        COLLECTION("%ss", Generator.JAVA),
+        JDO("jdo/%sJdo", Generator.JAVA),
+        JDO_ENTITIES("jdo/%sJdoEntities", Generator.JAVA),
+        JPA("jpa/%sJpa", Generator.JAVA),
+        JPA_ENTITIES("jpa/%sJpaEntities", Generator.JAVA),
+        ENTITY("persistence/%sEntity", Generator.JAVA),
+        SEEDING("persistence/%sSeeding", Generator.JAVA),
+        SAMPLES("samples/%sSamples", Generator.JAVA),
+        VIEWMODEL("vm/%sVm", Generator.JAVA),
+
+        COMMON_DOC("%ss-common", Generator.DOC),
+        DESCRIPTION("%ss-description", Generator.DOC),
+        JDO_DESCRIPTION("jdo/%sJdo-description", Generator.DOC),
+        JPA_DESCRIPTION("jpa/%sJpa-description", Generator.DOC),
+        VIEWMODEL_DESCRIPTION("vm/%sVm-description", Generator.DOC),
+
+        COLLECTION_LAYOUT("%ss", Generator.LAYOUT),
+        ENTITY_LAYOUT("persistence/%sEntity", Generator.LAYOUT),
+        VIEWMODEL_LAYOUT("vm/%sVm", Generator.LAYOUT)
+
+        ;
+        private final String pathTemplate;
+        private final Generator generator;
+        private final File file(final Config config) {
+            return new File(config.getOutputRootDir(),
+                    String.format(pathTemplate, config.getShowcaseName())
+                    + generator.fileSuffix);
+        }
+    }
+
+    public void generate(final Config config, final Consumer<File> 
onSourceGenerated) {
+
+        for(var source: Sources.values()) {
+            val gen = source.file(config);
+            onSourceGenerated.accept(gen);
+        }
+
     }
 
 }
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
new file mode 100644
index 0000000000..d77aaad22b
--- /dev/null
+++ 
b/tooling/metaprog/src/test/java/org/apache/isis/tooling/metaprog/demoshowcases/value/ValueTypeGenTemplateTest.java
@@ -0,0 +1,59 @@
+package org.apache.isis.tooling.metaprog.demoshowcases.value;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Comparator;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.base._Files;
+import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.commons.internal.functions._Predicates;
+import 
org.apache.isis.tooling.metaprog.demoshowcases.value.ValueTypeGenTemplate.Config;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
+class ValueTypeGenTemplateTest {
+
+    @Test
+    void test() throws IOException {
+
+        val frameWorkRoot = new 
File(".").getAbsoluteFile().getParentFile().getParentFile().getParentFile();
+        val demoDomainRoot = new File(frameWorkRoot, 
"examples/demo/domain/src/main/java");
+        val uuidDemoDomain = new File(demoDomainRoot, 
"demoapp/dom/types/javautil/uuids");
+
+        // list UUID source files
+        val uuidShowcaseFiles = _Files.searchFiles(uuidDemoDomain, 
_Predicates.alwaysTrue(), file->
+                  file.getName().endsWith(".java")
+                  || file.getName().endsWith(".xml")
+                  || file.getName().endsWith(".adoc")
+              );
+
+        val outputRootDir = _Files.tempDir("isis-tooling-showcases");
+        log.info("tmp dir created in {}", outputRootDir);
+
+        val config = Config.builder()
+                .outputRootDir(outputRootDir)
+                .showcaseName("JavaUtilUuid")
+                .build();
+
+        val generatedFiles = _Sets.<File>newLinkedHashSet();
+
+        new ValueTypeGenTemplate().generate(config, generatedFiles::add);
+
+        assertEquals(
+                Can.ofCollection(uuidShowcaseFiles)
+                .map(_Files.realtiveFileName(uuidDemoDomain))
+                .sorted(Comparator.naturalOrder()),
+                Can.ofCollection(generatedFiles)
+                .map(_Files.realtiveFileName(outputRootDir))
+                .sorted(Comparator.naturalOrder()));
+
+    }
+
+}

Reply via email to