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())); + + } + +}
