From 09f2414cdd0145155d16cd0f95a4163b7f67e47c Mon Sep 17 00:00:00 2001 From: rschoene <rene.schoene@tu-dresden.de> Date: Tue, 9 Feb 2021 15:10:03 +0100 Subject: [PATCH] Bugfixing, 0.2.6 --- build.gradle | 7 +- .../testing/plugin/JastAddConfiguration.java | 37 ++++-- .../testing/plugin/PreprocessorPlugin.java | 27 +++-- .../plugin/RagConnectConfiguration.java | 31 +++-- .../testing/plugin/RagConnectTest.java | 102 +++++++++++------ .../testing/plugin/RelastConfiguration.java | 26 +++-- .../testing/plugin/RelastTest.java | 106 +++++++++++------- .../preprocessor/testing/plugin/Utils.java | 14 +++ 8 files changed, 229 insertions(+), 121 deletions(-) create mode 100644 src/main/java/org/jastadd/preprocessor/testing/plugin/Utils.java diff --git a/build.gradle b/build.gradle index c9cce39..a5099b2 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'org.jastadd.preprocessor' -version '0.2.5' +version '0.2.6' gradlePlugin { plugins { @@ -19,8 +19,9 @@ gradlePlugin { publishing { publications { maven(MavenPublication) { - groupId = "org.jastadd.preprocessor" - artifactId = "testing" + groupId = "org.jastadd.preprocessor" + artifactId = "testing" + from components.java // jar } } repositories { diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/JastAddConfiguration.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/JastAddConfiguration.java index 960ce58..54f43a8 100644 --- a/src/main/java/org/jastadd/preprocessor/testing/plugin/JastAddConfiguration.java +++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/JastAddConfiguration.java @@ -7,6 +7,7 @@ import org.gradle.api.tasks.OutputDirectory; import java.io.File; import java.nio.file.Paths; +import java.util.Collections; import java.util.List; /** @@ -14,24 +15,40 @@ import java.util.List; * * @author rschoene - Initial contribution */ -public class JastAddConfiguration { - @Optional - @Input - String jastAddList; +public interface JastAddConfiguration { @Input - String packageName; + String getPackageName(); + void setPackageName(String packageName); - @InputFiles - List<File> inputFiles; + @Optional + @Input + String getJastAddList(); + void setJastAddList(String jastAddList); + @Optional @Input - boolean run = true; + boolean isSkipRun(); + void setSkipRun(boolean skipRun); @Optional @Input - List<String> extraOptions; + List<String> getExtraOptions(); + void setExtraOptions(List<String> extraOptions); + default List<String> getExtraOptionsOrDefault() { + return getExtraOptions() != null ? getExtraOptions() : Collections.emptyList(); + } + + @InputFiles + List<File> getInputFiles(); + void setInputFiles(List<File> inputFiles); + @Optional + @OutputDirectory + File getOutputDir(); + void setOutputDir(File outputDir); @OutputDirectory - File outputDir = Paths.get("src", "test", "java-gen").toFile(); + default File getOutputDirOrDefault() { + return getOutputDir() != null ? getOutputDir() : Paths.get("src", "test", "java-gen").toFile(); + } } diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/PreprocessorPlugin.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/PreprocessorPlugin.java index 76016df..718f01d 100644 --- a/src/main/java/org/jastadd/preprocessor/testing/plugin/PreprocessorPlugin.java +++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/PreprocessorPlugin.java @@ -19,36 +19,35 @@ public class PreprocessorPlugin implements Plugin<Project> { @Override public void apply(Project project) { CompilerLocationExtension extension = project.getExtensions().create( - "preprocessor.testing", + "preprocessorTesting", CompilerLocationExtension.class, project); Set<Task> tasks = project.getTasksByName("compileTestJava", false); // there should be only one task "compileTestJava" testTask = tasks.iterator().next(); + + // set compiler locations (if set) + project.afterEvaluate(p -> { + RelastTest.setCompilerLocation(extension.getRelastCompilerLocation().getOrNull()); + RagConnectTest.setRagconnectCompilerLocation(extension.getRagconnectCompilerLocation().getOrNull()); + }); + + // setup tasks TaskCollection<RelastTest> relastTests = project.getTasks().withType(RelastTest.class); - relastTests.forEach(relastTest -> setupRelastTest(relastTest, - extension.getRelastCompilerLocation().getOrNull())); -// relastTests.whenTaskAdded(relastTest -> setupRelastTest(relastTest, extension.getRelastCompilerLocation().getOrNull())); + relastTests.whenTaskAdded(this::setupRelastTest); TaskCollection<RagConnectTest> ragconnectTests = project.getTasks().withType(RagConnectTest.class); - ragconnectTests.forEach(relastTest -> setupRagconnectTest(relastTest, - extension.getRelastCompilerLocation().getOrNull(), - extension.getRagconnectCompilerLocation().getOrNull())); + ragconnectTests.whenTaskAdded(this::setupRagconnectTest); } - private void setupRelastTest(RelastTest relastTest, String compilerLocation) { + private void setupRelastTest(RelastTest relastTest) { testTask.dependsOn(relastTest); - relastTest.setCompilerLocation(compilerLocation); relastTest.setGroup("verification"); relastTest.setDescription("Runs a relast test"); } - private void setupRagconnectTest(RagConnectTest ragConnectTest, - String relastCompilerLocation, - String ragconnectCompilerLocation) { + private void setupRagconnectTest(RagConnectTest ragConnectTest) { testTask.dependsOn(ragConnectTest); - ragConnectTest.setRelastCompilerLocation(relastCompilerLocation); - ragConnectTest.setRagconnectCompilerLocation(ragconnectCompilerLocation); ragConnectTest.setGroup("verification"); ragConnectTest.setDescription("Runs a ragconnect test"); } diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectConfiguration.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectConfiguration.java index da413df..f05b0e7 100644 --- a/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectConfiguration.java +++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectConfiguration.java @@ -12,26 +12,37 @@ import java.util.List; * * @author rschoene - Initial contribution */ -public class RagConnectConfiguration { +public interface RagConnectConfiguration { + @Input - String rootNode; + String getRootNode(); + void setRootNode(String rootNode); + @Optional @Input - boolean logReads; + boolean isLogReads(); + void setLogReads(boolean logReads); + @Optional @Input - boolean logWrites; + boolean isLogWrites(); + void setLogWrites(boolean logWrites); @Input - String outputDir; + String getOutputDir(); + void setOutputDir(String outputDir); @Optional @Input - List<String> protocols; - - @InputFiles - List<File> inputFiles; + boolean isVerbose(); + void setVerbose(boolean verbose); + @Optional @Input - boolean verbose = false; + List<String> getProtocols(); + void setProtocols(List<String> protocols); + + @InputFiles + List<File> getInputFiles(); + void setInputFiles(List<File> inputFiles); } diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectTest.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectTest.java index f3a7ed8..7b50f42 100644 --- a/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectTest.java +++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectTest.java @@ -1,43 +1,76 @@ package org.jastadd.preprocessor.testing.plugin; -import org.gradle.api.DefaultTask; +import groovy.lang.Closure; import org.gradle.api.Project; import org.gradle.api.file.FileCollection; import org.gradle.api.plugins.JavaPlugin; -import org.gradle.api.tasks.Nested; -import org.gradle.api.tasks.SourceSet; -import org.gradle.api.tasks.SourceSetContainer; -import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.*; +import java.io.File; import java.io.IOException; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; +import static groovy.lang.Closure.DELEGATE_FIRST; + /** * RagConnect Test Task. * * @author rschoene - Initial contribution */ -public class RagConnectTest extends DefaultTask { +public abstract class RagConnectTest extends RelastTest { @Nested - RagConnectConfiguration ragconnect; + abstract RagConnectConfiguration getRagconnect(); - @Nested - RelastConfiguration relast; + private static String ragconnectCompilerLocation; - @Nested - JastAddConfiguration jastadd; + public static void setRagconnectCompilerLocation(String ragconnectCompilerLocation) { + RagConnectTest.ragconnectCompilerLocation = ragconnectCompilerLocation; + } + + @SuppressWarnings("unused") + public void ragconnect(Closure<?> c) { + c.setResolveStrategy(DELEGATE_FIRST); + c.setDelegate(getRagconnect()); + c.call(); + } - private String relastCompilerLocation; - private String ragconnectCompilerLocation; + @OutputFiles + public List<File> grammarFilesGeneratedByRagconnect() { + // files are RagConnect.relast and <INPUT_GRAMMAR(s)>.relast + List<File> result = new ArrayList<>(); + result.add(resolveOutputDir("RagConnect.relast")); + for (File inputFile : getRagconnect().getInputFiles()) { + String filename = inputFile.getName(); + if (Utils.fileExtension(filename).equals("relast")) { + result.add(resolveOutputDir(filename)); + } + } + return result; + } - public void setRelastCompilerLocation(String relastCompilerLocation) { - this.relastCompilerLocation = relastCompilerLocation; + @OutputFiles + public List<File> aspectFilesGeneratedByRagconnect() { + // files are RagConnect.jadd and the handler + List<File> result = new ArrayList<>(); + result.add(resolveOutputDir("RagConnect.jadd")); + List<String> protocols = getRagconnect().getProtocols(); + if (protocols == null || protocols.isEmpty() || protocols.contains("mqtt")) { + result.add(resolveOutputDir("MqttHandler.jadd")); + } + if (protocols != null && protocols.contains("rest")) { + result.add(resolveOutputDir("RestHandler.jadd")); + } + if (protocols != null && protocols.contains("java")) { + result.add(resolveOutputDir("JavaHandler.jadd")); + } + return result; } - public void setRagconnectCompilerLocation(String ragconnectCompilerLocation) { - this.ragconnectCompilerLocation = ragconnectCompilerLocation; + private File resolveOutputDir(String s) { + return Paths.get(getRagconnect().getOutputDir(), s).toFile(); } @TaskAction @@ -46,10 +79,15 @@ public class RagConnectTest extends DefaultTask { } protected void runTest() throws IOException { - // run ragconnect before Project project = getProject(); - String absoluteProjectPath = project.getProjectDir().getAbsolutePath(); - // TODO maybe generated files should be deleted here? + + // delete generated files + project.delete(deleteSpec -> { + deleteSpec.delete(grammarFilesGeneratedByRagconnect()); + deleteSpec.delete(aspectFilesGeneratedByRagconnect()); + }); + + // run ragconnect first project.getPlugins().withType(JavaPlugin.class, javaPlugin -> { SourceSetContainer sourceSets = (SourceSetContainer) project.getProperties().get("sourceSets"); FileCollection runtimeClasspath = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getRuntimeClasspath(); @@ -62,31 +100,29 @@ public class RagConnectTest extends DefaultTask { } else { javaExecSpec.setMain("org.jastadd.ragconnect.compiler.Compiler"); } - args.add("--o=" + ragconnect.outputDir); - args.add("--rootNode=" + ragconnect.rootNode); - if (ragconnect.logReads) { + args.add("--o=" + getRagconnect().getOutputDir()); + args.add("--rootNode=" + getRagconnect().getRootNode()); + if (getRagconnect().isLogReads()) { args.add("--logReads"); } - if (ragconnect.logWrites) { + if (getRagconnect().isLogWrites()) { args.add("--logWrites"); } - if (ragconnect.verbose) { + if (getRagconnect().isVerbose()) { args.add("--verbose"); } - if (ragconnect.protocols != null && !ragconnect.protocols.isEmpty()) { - args.add("--protocols=" + String.join(",", ragconnect.protocols)); + if (getRagconnect().getProtocols() != null && !getRagconnect().getProtocols().isEmpty()) { + args.add("--protocols=" + String.join(",", getRagconnect().getProtocols())); } - args.addAll(ragconnect.inputFiles); + args.addAll(getJastadd().getExtraOptionsOrDefault()); + args.addAll(getRagconnect().getInputFiles()); javaExecSpec.args(args); }).assertNormalExitValue(); }); // now run relast + jastadd - RelastTest relastTest = new RelastTest(); - relastTest.jastadd = jastadd; - relastTest.relast = relast; - relastTest.setCompilerLocation(relastCompilerLocation); - relastTest.runTest(); + getRelast().setInputFiles(grammarFilesGeneratedByRagconnect()); + super.runTest(); } } diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastConfiguration.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastConfiguration.java index 8a05d20..ef689d2 100644 --- a/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastConfiguration.java +++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastConfiguration.java @@ -12,31 +12,39 @@ import java.util.List; * * @author rschoene - Initial contribution */ -public class RelastConfiguration { +public interface RelastConfiguration { @Input - boolean useJastAddNames; + boolean isUseJastAddNames(); + void setUseJastAddNames(boolean useJastAddNames); @Input - String grammarName; + String getGrammarName(); + void setGrammarName(String grammarName); @InputFiles @Optional - List<File> inputFiles; + List<File> getInputFiles(); + void setInputFiles(List<File> inputFiles); @Input - boolean writeToFile = true; + boolean isWriteToFile(); // = true; + void setWriteToFile(boolean writeToFile); @Input - boolean resolverHelper = true; + boolean isResolverHelper(); // = true; + void setResolverHelper(boolean resolverHelper); @Optional @Input - String listClass; + String getListClass(); + void setListClass(String listClass); @Optional @Input - String serializer; + String getSerializer(); + void setSerializer(String serializer); @Input - boolean verbose = false; + boolean isVerbose(); // = false; + void setVerbose(boolean verbose); } diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastTest.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastTest.java index a9c4cbc..e61b7d6 100644 --- a/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastTest.java +++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastTest.java @@ -1,5 +1,6 @@ package org.jastadd.preprocessor.testing.plugin; +import groovy.lang.Closure; import org.gradle.api.DefaultTask; import org.gradle.api.Project; import org.gradle.api.file.FileCollection; @@ -9,6 +10,7 @@ import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskAction; +import java.io.File; import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; @@ -18,31 +20,45 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import static groovy.lang.Closure.DELEGATE_FIRST; + /** * RelAst Test Task * * @author rschoene - Initial contribution */ -public class RelastTest extends DefaultTask { +public abstract class RelastTest extends DefaultTask { // configuration from plugin - private String compilerLocation; + private static String compilerLocation; @Nested - RelastConfiguration relast; + abstract RelastConfiguration getRelast(); @Nested - JastAddConfiguration jastadd; + abstract JastAddConfiguration getJastadd(); - public void setCompilerLocation(String compilerLocation) { - this.compilerLocation = compilerLocation; + public static void setCompilerLocation(String compilerLocation) { + RelastTest.compilerLocation = compilerLocation; } - private final String[] genSuffixes = {".ast", ".jadd", "RefResolver.jadd", "ResolverStubs.jrag", "Serializer.jadd"}; + private static final String[] genSuffixes = {".ast", ".jadd", "RefResolver.jadd", "ResolverStubs.jrag", "Serializer.jadd"}; private Path pathToAbsoluteProject(String filename) { return Paths.get(getProject().getProjectDir().getAbsolutePath(), filename); } + public void relast(Closure<?> c) { + c.setResolveStrategy(DELEGATE_FIRST); + c.setDelegate(getRelast()); + c.call(); + } + + public void jastadd(Closure<?> c) { + c.setResolveStrategy(DELEGATE_FIRST); + c.setDelegate(getJastadd()); + c.call(); + } + @TaskAction void taskAction() throws IOException { runTest(); @@ -50,28 +66,28 @@ public class RelastTest extends DefaultTask { protected void runTest() throws IOException { Project project = getProject(); - if (relast.verbose) { + if (getRelast().isVerbose()) { System.out.println("Running relast test in " + project.getDisplayName()); - System.out.println("relast files: " + relast.inputFiles); + System.out.println("relast files: " + getRelast().getInputFiles()); System.out.println("Deleting files"); } // first, delete generated files List<Path> genFiles = new ArrayList<>(); for (String suffix : genSuffixes) { - genFiles.add(pathToAbsoluteProject(relast.grammarName + suffix)); + genFiles.add(pathToAbsoluteProject(getRelast().getGrammarName() + suffix)); } - if (relast.verbose) { + if (getRelast().isVerbose()) { System.out.println("gen files: " + genFiles); } project.delete(deleteSpec -> { deleteSpec.delete(genFiles); // deleteSpec.delete(Paths.get(jastadd.outputDir, jastadd.packageName)); - deleteSpec.delete(jastadd.outputDir.toPath().resolve(jastadd.packageName)); + deleteSpec.delete(getJastadd().getOutputDirOrDefault().toPath().resolve(getJastadd().getPackageName())); }); // create output directories, if not existing - createDirectory(pathToAbsoluteProject(jastadd.outputDir.getName())); - createDirectory(pathToAbsoluteProject(relast.grammarName).getParent()); - if (relast.verbose) { + createDirectory(pathToAbsoluteProject(getJastadd().getOutputDirOrDefault().getName())); + createDirectory(pathToAbsoluteProject(getRelast().getGrammarName()).getParent()); + if (getRelast().isVerbose()) { System.out.println("Pre processing, running relast"); } // then, run relast pre processing @@ -79,43 +95,49 @@ public class RelastTest extends DefaultTask { SourceSetContainer sourceSets = (SourceSetContainer) project.getProperties().get("sourceSets"); FileCollection runtimeClasspath = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getRuntimeClasspath(); project.javaexec(javaExecSpec -> { - List<Object> args = new ArrayList<>(); + List<String> args = new ArrayList<>(); javaExecSpec.setClasspath(runtimeClasspath); - if (compilerLocation != null) { + if (RelastTest.compilerLocation != null) { javaExecSpec.setMain("-jar"); - args.add(compilerLocation); + args.add(RelastTest.compilerLocation); } else { javaExecSpec.setMain("org.jastadd.relast.compiler.Compiler"); } - args.addAll(relast.inputFiles.stream().map(filename -> pathToAbsoluteProject(filename.getName())).collect(Collectors.toList())); + for (File file : getRelast().getInputFiles()) { + args.add(file.getAbsolutePath()); + } args.add("--quiet"); - if (relast.writeToFile) { + if (getRelast().isWriteToFile()) { args.add("--file"); } - if (relast.useJastAddNames) { + if (getRelast().isUseJastAddNames()) { args.add("--useJastAddNames"); } - if (relast.resolverHelper) { + if (getRelast().isResolverHelper()) { args.add("--resolverHelper"); } - if (jastadd.jastAddList != null) { - args.add("--jastAddList=" + jastadd.jastAddList); + if (getJastadd().getJastAddList() != null) { + args.add("--jastAddList=" + getJastadd().getJastAddList()); } - if (relast.listClass != null) { - args.add("--listClass=" + relast.listClass); + if (getRelast().getListClass() != null) { + args.add("--listClass=" + getRelast().getListClass()); } - if (relast.serializer != null) { - args.add("--serializer=" + relast.serializer); + if (getRelast().getSerializer() != null) { + args.add("--serializer=" + getRelast().getSerializer()); } - args.add("--grammarName=" + pathToAbsoluteProject(relast.grammarName)); - if (relast.verbose) { - System.out.println("Start relast with args: " + args); + args.add("--grammarName=" + pathToAbsoluteProject(getRelast().getGrammarName())); + if (getRelast().isVerbose()) { + System.out.println("Start relast with args: " + args + " and main: " + javaExecSpec.getMain()); } javaExecSpec.args(args); }).assertNormalExitValue(); }); - if (jastadd.run) { - if (relast.verbose) { + if (getJastadd().isSkipRun()) { + if (getRelast().isVerbose()) { + System.out.println("Skipping run of JastAdd"); + } + } else { + if (getRelast().isVerbose()) { System.out.println("Compile with JastAdd"); } // check which files were actually generated @@ -128,15 +150,15 @@ public class RelastTest extends DefaultTask { javaExecSpec.setClasspath(runtimeClasspath); javaExecSpec.setMain("org.jastadd.JastAdd"); List<Object> args = new ArrayList<>(); - args.add("--o=" + pathToAbsoluteProject(jastadd.outputDir.getName())); - args.add("--package=" + jastadd.packageName); - if (jastadd.jastAddList != null) { - args.add("--List=" + jastadd.jastAddList); + args.add("--o=" + pathToAbsoluteProject(getJastadd().getOutputDirOrDefault().getName())); + args.add("--package=" + getJastadd().getPackageName()); + if (getJastadd().getJastAddList() != null) { + args.add("--List=" + getJastadd().getJastAddList()); } - args.addAll(jastadd.extraOptions); + args.addAll(getJastadd().getExtraOptionsOrDefault()); args.addAll(genFiles); - args.addAll(jastadd.inputFiles); - if (relast.verbose) { + args.addAll(getJastadd().getInputFiles()); + if (getRelast().isVerbose()) { System.out.println("Start JastAdd with args: " + args); } javaExecSpec.args(args); @@ -147,7 +169,7 @@ public class RelastTest extends DefaultTask { private boolean verboseFileNotExists(Path path) { boolean fileDoesNotExist = !Files.exists(path); - if (fileDoesNotExist && relast.verbose) { + if (fileDoesNotExist && getRelast().isVerbose()) { System.out.println("Do not include " + path); } return fileDoesNotExist; @@ -157,7 +179,7 @@ public class RelastTest extends DefaultTask { if (Files.exists(path) && Files.isDirectory(path)) { return; } - if (relast.verbose) { + if (getRelast().isVerbose()) { System.out.println("Creating " + path.toAbsolutePath()); } try { diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/Utils.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/Utils.java new file mode 100644 index 0000000..b4c56f2 --- /dev/null +++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/Utils.java @@ -0,0 +1,14 @@ +package org.jastadd.preprocessor.testing.plugin; + +/** + * Utility methods. + * + * @author rschoene - Initial contribution + */ +public class Utils { + + public static String fileExtension(String filename) { + int indexOfDot = filename.lastIndexOf('.'); + return indexOfDot == -1 ? filename : filename.substring(indexOfDot + 1); + } +} -- GitLab