diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4989fda9ed75ff08ae1e20e92038258397b4f527..2a93d62f014e5927f58f0415fb2def09bdbc85b3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,27 +1,11 @@ variables: GIT_SUBMODULE_STRATEGY: recursive -services: - - name: "eclipse-mosquitto:1.6.9" - alias: "mqtt" - stages: - build - - test build: image: openjdk:8 stage: build - before_script: - - ls -lah * script: - ./gradlew assemble - -test: - image: openjdk:8 - stage: test - script: - - ./gradlew allTests - artifacts: - reports: - junit: ros2rag.tests/build/test-results/test/TEST-*.xml diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index d26b5a22d5a7098f78d4bb4cbb21b00b09ace7d0..0000000000000000000000000000000000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "relast-preprocessor"] - path = relast.preprocessor - url = ../relast-preprocessor.git diff --git a/buildSrc/.gitignore b/buildSrc/.gitignore deleted file mode 100644 index 567609b1234a9b8806c5a05da6c866e480aa148d..0000000000000000000000000000000000000000 --- a/buildSrc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build/ diff --git a/buildSrc/src/main/java/org/jastadd/relast/plugin/CompilerLocationExtension.java b/buildSrc/src/main/java/org/jastadd/relast/plugin/CompilerLocationExtension.java deleted file mode 100644 index d28d7131797be7eac9869b9c7f0b58ed05739b14..0000000000000000000000000000000000000000 --- a/buildSrc/src/main/java/org/jastadd/relast/plugin/CompilerLocationExtension.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.jastadd.relast.plugin; - -import org.gradle.api.Project; -import org.gradle.api.provider.Property; - -/** - * TODO: Add description. - * - * @author rschoene - Initial contribution - */ -public class CompilerLocationExtension { - public Property<String> compilerLocation; - - public CompilerLocationExtension(Project project) { - compilerLocation = project.getObjects().property(String.class); - } - - public Property<String> getCompilerLocation() { - return compilerLocation; - } -} diff --git a/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastPlugin.java b/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastPlugin.java deleted file mode 100644 index 1ce9e963b27c2efdf53092a91335680e708e7509..0000000000000000000000000000000000000000 --- a/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastPlugin.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.jastadd.relast.plugin; - -import org.gradle.api.Plugin; -import org.gradle.api.Project; -import org.gradle.api.Task; -import org.gradle.api.tasks.TaskCollection; - -import java.util.Set; - -/** - * Plugin for RelAst-Test. - * - * @author rschoene - Initial contribution - */ -public class RelastPlugin implements Plugin<Project> { - - private Task testTask; - - @Override - public void apply(Project project) { - CompilerLocationExtension extension = project.getExtensions().create( - "relastTest", - CompilerLocationExtension.class, - project); - - Set<Task> tasks = project.getTasksByName("test", false); - // there should be only one task "test" - testTask = tasks.iterator().next(); - TaskCollection<RelastTest> relastTests = project.getTasks().withType(RelastTest.class); - relastTests.forEach(relastTest -> setupRelastTest(relastTest, extension.getCompilerLocation().getOrNull())); - relastTests.whenTaskAdded(relastTest -> setupRelastTest(relastTest, extension.getCompilerLocation().getOrNull())); - } - - private void setupRelastTest(RelastTest relastTest, String compilerLocation) { - testTask.dependsOn(relastTest); - relastTest.setCompilerLocation(compilerLocation); - relastTest.setGroup("verification"); - } -} diff --git a/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastTest.java b/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastTest.java deleted file mode 100644 index dbda5a403e9c653a3836ead48da7a973bc0ba694..0000000000000000000000000000000000000000 --- a/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastTest.java +++ /dev/null @@ -1,304 +0,0 @@ -package org.jastadd.relast.plugin; - -import org.gradle.api.DefaultTask; -import org.gradle.api.Project; -import org.gradle.api.file.FileCollection; -import org.gradle.api.plugins.JavaPlugin; -import org.gradle.api.tasks.SourceSet; -import org.gradle.api.tasks.SourceSetContainer; -import org.gradle.api.tasks.TaskAction; - -import java.io.IOException; -import java.nio.file.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * RelAst Test Task - * - * @author rschoene - Initial contribution - */ -@SuppressWarnings({"unused", "WeakerAccess"}) -public class RelastTest extends DefaultTask { - // configuration from plugin - private String compilerLocation; - // general options - private boolean verbose = false; - // pre-process options - private List<String> relastFiles = new ArrayList<>(); - private boolean useJastAddNames; - private boolean resolverHelper; - private boolean writeToFile = true; - private String grammarName; - private String listClass; - private String jastAddList; - private String serializer; - - // compile options - private boolean runJastAdd = true; - private String outputDir = "src/test/java-gen/"; - private String packageName; - private final List<String> moreInputFiles = new ArrayList<>(); - - public void setCompilerLocation(String compilerLocation) { - this.compilerLocation = compilerLocation; - } - - public boolean isVerbose() { - return verbose; - } - - public void setVerbose(boolean verbose) { - this.verbose = verbose; - } - - // pre-process options - public List<String> getRelastFiles() { - return relastFiles; - } - - public void relastFiles(String relastFile) { - this.relastFiles.add(relastFile); - } - - public void relastFiles(String[] relastFilesArray) { - this.relastFiles = Arrays.asList(relastFilesArray); - } - - public boolean isUseJastAddNames() { - return useJastAddNames; - } - - public void setUseJastAddNames(boolean useJastAddNames) { - this.useJastAddNames = useJastAddNames; - } - - public boolean isResolverHelper() { - return resolverHelper; - } - - public void setResolverHelper(boolean resolverHelper) { - this.resolverHelper = resolverHelper; - } - - public boolean isWriteToFile() { - return writeToFile; - } - - public void setWriteToFile(boolean writeToFile) { - this.writeToFile = writeToFile; - } - - public String getGrammarName() { - return grammarName; - } - - public void setGrammarName(String grammarName) { - this.grammarName = grammarName; - } - - public String getListClass() { - return listClass; - } - - public void setListClass(String listClass) { - this.listClass = listClass; - } - - public String getJastAddList() { - return jastAddList; - } - - public void setJastAddList(String jastAddList) { - this.jastAddList = jastAddList; - } - - public String getSerializer() { - return serializer; - } - - public void setSerializer(String serializer) { - this.serializer = serializer; - } - - // compile options - public boolean isRunJastAdd() { - return runJastAdd; - } - - public void setRunJastAdd(boolean runJastAdd) { - this.runJastAdd = runJastAdd; - } - - public String getOutputDir() { - return outputDir; - } - - public void setOutputDir(String outputDir) { - this.outputDir = outputDir; - } - - public String getPackageName() { - return packageName; - } - - public void setPackageName(String packageName) { - this.packageName = packageName; - } - - public List<String> getMoreInputFiles() { - return moreInputFiles; - } - - public void moreInputFiles(String f) { - this.moreInputFiles.add(f); - } - - public void moreInputFiles(String[] fileArray) { - this.moreInputFiles.addAll(Arrays.asList(fileArray)); - } - - private boolean isSet(String option) { - return option != null && !option.isEmpty(); - } - - private final String[] genSuffixes = {".ast", ".jadd", "RefResolver.jadd", "ResolverStubs.jrag", "Serializer.jadd"}; - - private Path pathToAbsoluteProject(String filename) { - return Paths.get(getProject().getProjectDir().getAbsolutePath(), filename); - } - - @TaskAction - void runTest() throws IOException { - setGroup("verification"); - setDescription("Runs a relast test"); - Project project = getProject(); - String absoluteProjectPath = project.getProjectDir().getAbsolutePath(); - if (isVerbose()) { - System.out.println("Running relast test in " + project.getDisplayName()); - System.out.println("relast files: " + getRelastFiles()); - System.out.println("Deleting files"); - } - // first, delete generated files - List<Path> genFiles = new ArrayList<>(); - for (String suffix : genSuffixes) { - genFiles.add(pathToAbsoluteProject(getGrammarName() + suffix)); - } - if (isVerbose()) { - System.out.println("gen files: " + genFiles); - } - project.delete(deleteSpec -> { - deleteSpec.delete(genFiles); - if (isSet(getPackageName())) { - deleteSpec.delete(Paths.get(getOutputDir(), getPackageName())); - } - }); - // create output directories, if not existing - createDirectory(pathToAbsoluteProject(getOutputDir())); - createDirectory(pathToAbsoluteProject(getGrammarName()).getParent()); - if (isVerbose()) { - System.out.println("Pre processing, running relast"); - } - // then, run relast pre processing - project.getPlugins().withType(JavaPlugin.class, javaPlugin -> { - 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<>(); - javaExecSpec.setClasspath(runtimeClasspath); - if (compilerLocation != null) { - javaExecSpec.setMain("-jar"); - args.add(compilerLocation); - } else { - javaExecSpec.setMain("org.jastadd.relast.compiler.Compiler"); - } - args.addAll(getRelastFiles().stream().map(this::pathToAbsoluteProject).collect(Collectors.toList())); - args.add("--quiet"); - if (isWriteToFile()) { - args.add("--file"); - } - if (isUseJastAddNames()) { - args.add("--useJastAddNames"); - } - if (isResolverHelper()) { - args.add("--resolverHelper"); - } - if (isSet(getJastAddList())) { - args.add("--jastAddList=" + getJastAddList()); - } - if (isSet(getListClass())) { - args.add("--listClass=" + getListClass()); - } - if (isSet(getSerializer())) { - args.add("--serializer=" + getSerializer()); - } - args.add("--grammarName=" + pathToAbsoluteProject(getGrammarName())); - if (isVerbose()) { - System.out.println("Start relast with args: " + args); - } - javaExecSpec.args(args); - }).assertNormalExitValue(); - }); - if (isRunJastAdd()) { - if (isVerbose()) { - System.out.println("Compile with JastAdd"); - } - // check which files were actually generated - genFiles.removeIf(this::verboseFileNotExists); - // finally, compile generated files - project.getPlugins().withType(JavaPlugin.class, javaPlugin -> { - SourceSetContainer sourceSets = (SourceSetContainer) project.getProperties().get("sourceSets"); - FileCollection runtimeClasspath = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getRuntimeClasspath(); - project.javaexec(javaExecSpec -> { - javaExecSpec.setClasspath(runtimeClasspath); - javaExecSpec.setMain("org.jastadd.JastAdd"); - List<Object> args = new ArrayList<>(); - args.add("--o=" + pathToAbsoluteProject(getOutputDir())); - args.add("--package=" + getPackageName()); - if (isSet(getJastAddList())) { - args.add("--List=" + getJastAddList()); - } - args.addAll(genFiles); - args.addAll(getMoreInputFiles().stream().map(this::pathToAbsoluteProject).collect(Collectors.toList())); - if (isVerbose()) { - System.out.println("Start JastAdd with args: " + args); - } - javaExecSpec.args(args); - }); - }); - } - } - - private String fileExtension(String filename) { - int indexOfDot = filename.lastIndexOf('.'); - return indexOfDot == -1 ? filename : filename.substring(indexOfDot + 1); - } - - private boolean verboseFileNotExists(Path path) { - boolean fileDoesNotExist = !Files.exists(path); - if (fileDoesNotExist && isVerbose()) { - System.out.println("Do not include " + path); - } - return fileDoesNotExist; - } - - private void createDirectory(Path path) throws IOException { - if (Files.exists(path) && Files.isDirectory(path)) { - return; - } - if (isVerbose()) { - System.out.println("Creating " + path.toAbsolutePath()); - } - try { - Files.createDirectories(path); - } catch (FileAlreadyExistsException e) { - System.err.println("Skipping creation of already existing " + path); - } catch (IOException e) { - System.err.println("Could not create output directory " + path); - throw e; - } - } - -} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/org.jastadd.relast.plugin.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/org.jastadd.relast.plugin.properties deleted file mode 100644 index 20222b8953522469ec2c0340ea3aeb5ed6294d13..0000000000000000000000000000000000000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/org.jastadd.relast.plugin.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=org.jastadd.relast.plugin.RelastPlugin diff --git a/libs/ragconnect.jar b/libs/ragconnect.jar new file mode 100644 index 0000000000000000000000000000000000000000..d4f6a9a1cfcb7241b3f312ea671ee3fa0cb03148 Binary files /dev/null and b/libs/ragconnect.jar differ diff --git a/ragconnect.base/.gitignore b/ragconnect.base/.gitignore deleted file mode 100644 index 87b4cdd3d7c6a41502ca98703abeeb69a1d536fb..0000000000000000000000000000000000000000 --- a/ragconnect.base/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -build -src/gen-res/ -src/gen/ -out/ -*.class diff --git a/ragconnect.base/build.gradle b/ragconnect.base/build.gradle deleted file mode 100644 index c986f2a61adf610a9c2e5fdc7fd20eb193a9a46a..0000000000000000000000000000000000000000 --- a/ragconnect.base/build.gradle +++ /dev/null @@ -1,174 +0,0 @@ -apply plugin: 'jastadd' -apply plugin: 'application' - -sourceCompatibility = 1.8 - -mainClassName = 'org.jastadd.ragconnect.compiler.Compiler' - -repositories { - jcenter() -} - -buildscript { - repositories.jcenter() - dependencies { - classpath 'org.jastadd:jastaddgradle:1.13.3' - } -} - -dependencies { - implementation project(':relast.preprocessor') - implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.6' - implementation group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.11.2' - runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4' - api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' -} - -def versionFile = 'src/main/resources/ragConnectVersion.properties' -def oldProps = new Properties() - -try { - file(versionFile).withInputStream { stream -> oldProps.load(stream) } - version = oldProps['version'] -} catch (e) { - // this happens, if either the properties file is not present, or cannot be read from - throw new GradleException("File ${versionFile} not found or unreadable. Aborting.", e) -} - -task newVersion() { - doFirst { - def props = new Properties() - props['version'] = value - props.store(file(versionFile).newWriter(), null) - } -} - -sourceSets { - main { - java.srcDir "src/gen/java" - } -} - -test { - useJUnitPlatform() - - maxHeapSize = '1G' -} - -jar { - manifest { - attributes "Main-Class": 'org.jastadd.ragconnect.compiler.Compiler' - } - - from { - configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } - } -} - -task relast(type: JavaExec) { - group = 'Build' - main = "-jar" - - args = [ - "../libs/relast.jar", - "../relast.preprocessor/src/main/jastadd/RelAst.relast", - "./src/main/jastadd/RagConnect.relast", - "./src/main/jastadd/MustacheNodes.relast", - "./src/main/jastadd/YAML.relast", - "--listClass=java.util.ArrayList", - "--jastAddList=JastAddList", - "--useJastAddNames", - "--file", - "--resolverHelper", - "--grammarName=./src/gen/jastadd/RagConnect" - ] - - inputs.files("../libs/relast.jar", - "../relast.preprocessor/src/main/jastadd/RelAst.relast", - "./src/main/jastadd/RagConnect.relast", - "./src/main/jastadd/MustacheNodes.relast", - "./src/main/jastadd/YAML.relast") - outputs.files("./src/gen/jastadd/RagConnect.ast", - "./src/gen/jastadd/RagConnect.jadd", - "./src/gen/jastadd/RagConnectRefResolver.jadd", - './src/gen/jastadd/RagConnectResolverStubs.jrag') -} - -jastadd { - configureModuleBuild() - modules { - //noinspection GroovyAssignabilityCheck - module("RagConnect") { - - java { - basedir ".." - include "relast.preprocessor/main/**/*.java" - include "relast.preprocessor/gen/**/*.java" - include "ragconnect.base/src/main/**/*.java" - include "ragconnect.base/src/gen/**/*.java" - } - - jastadd { - basedir ".." - include "relast.preprocessor/src/main/jastadd/**/*.ast" - include "relast.preprocessor/src/main/jastadd/**/*.jadd" - include "relast.preprocessor/src/main/jastadd/**/*.jrag" - include "ragconnect.base/src/main/jastadd/**/*.ast" - include "ragconnect.base/src/main/jastadd/**/*.jadd" - include "ragconnect.base/src/main/jastadd/**/*.jrag" - include "ragconnect.base/src/gen/jastadd/**/*.ast" - include "ragconnect.base/src/gen/jastadd/**/*.jadd" - include "ragconnect.base/src/gen/jastadd/**/*.jrag" - } - - scanner { - basedir ".." - include "ragconnect.base/src/main/jastadd/scanner/Header.flex", [-5] - include "relast.preprocessor/src/main/jastadd/scanner/Preamble.flex", [-4] - include "relast.preprocessor/src/main/jastadd/scanner/Macros.flex", [-3] - include "ragconnect.base/src/main/jastadd/scanner/Macros.flex", [-3] - include "relast.preprocessor/src/main/jastadd/scanner/RulesPreamble.flex", [-2] - include "ragconnect.base/src/main/jastadd/scanner/MappingContent.flex", [-1] - include "ragconnect.base/src/main/jastadd/scanner/Keywords.flex" - include "relast.preprocessor/src/main/jastadd/scanner/Keywords.flex" - include "relast.preprocessor/src/main/jastadd/scanner/Symbols.flex", [1] - include "relast.preprocessor/src/main/jastadd/scanner/RulesPostamble.flex", [2] - } - - parser { - basedir ".." - include "ragconnect.base/src/main/jastadd/parser/Preamble.parser" - include "ragconnect.base/src/main/jastadd/parser/RagConnect.parser" - include "relast.preprocessor/src/main/jastadd/parser/RelAst.parser" - } - } - } - - cleanGen.doFirst { - delete "src/gen/java/org" - delete "src/gen-res/BuildInfo.properties" - } - - preprocessParser.doFirst { - - args += ["--no-beaver-symbol"] - - } - - module = "RagConnect" - - astPackage = 'org.jastadd.ragconnect.ast' - - parser.name = 'RagConnectParser' - - genDir = 'src/gen/java' - - buildInfoDir = 'src/gen-res' - - scanner.genDir = "src/gen/java/org/jastadd/ragconnect/scanner" - parser.genDir = "src/gen/java/org/jastadd/ragconnect/parser" - - jastaddOptions = ["--lineColumnNumbers", "--List=JastAddList", "--safeLazy", "--visitCheck=true", "--rewrite=cnta", "--cache=all"] -} - -generateAst.dependsOn relast diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag deleted file mode 100644 index b62399960f34a4b8c23a8d23762ec195491ce4e3..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/Analysis.jrag +++ /dev/null @@ -1,57 +0,0 @@ -aspect Analysis { - // --- lookupTokenEndpointDefinition --- - inh java.util.List<TokenEndpointDefinition> TokenEndpointDefinition.lookupTokenEndpointDefinitions(TokenComponent token); - eq RagConnect.getEndpointDefinition().lookupTokenEndpointDefinitions(TokenComponent token) = lookupTokenEndpointDefinitions(token); - syn java.util.List<TokenEndpointDefinition> RagConnect.lookupTokenEndpointDefinitions(TokenComponent token) { - java.util.List<TokenEndpointDefinition> result = new java.util.ArrayList<>(); - for (EndpointDefinition def : getEndpointDefinitionList()) { - if (def.isTokenEndpointDefinition() && def.asTokenEndpointDefinition().getToken().equals(token)) { - result.add(def.asTokenEndpointDefinition()); - } - } - return result; - } - - // --- lookupDependencyDefinition --- - inh DependencyDefinition DependencyDefinition.lookupDependencyDefinition(TypeDecl source, String id); - eq RagConnect.getDependencyDefinition().lookupDependencyDefinition(TypeDecl source, String id) { - for (DependencyDefinition def : getDependencyDefinitionList()) { - if (def.getID().equals(id) && def.getSource().containingTypeDecl().equals(source)) { - return def; - } - } - return null; - } - - // --- isAlreadyDefined --- - syn boolean TokenEndpointDefinition.isAlreadyDefined() = lookupTokenEndpointDefinitions(getToken()).size() > 1; - syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this; - - syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target); - eq JavaMappingDefinitionType.assignableTo(JavaTypeUse target) = getType().assignableTo(target); - eq JavaArrayMappingDefinitionType.assignableTo(JavaTypeUse target) { - if (!target.getName().endsWith("[]")) { return false; } - return getType().assignableTo(new SimpleJavaTypeUse(target.getName().replace("[]", ""))); - } - syn boolean JavaTypeUse.assignableTo(JavaTypeUse target) { - // target var = this; - return target.primitivePrettyPrint().equals(this.primitivePrettyPrint()); - } - syn String JavaTypeUse.primitivePrettyPrint() { - switch(getName()) { - case "int": - case "Integer": return "int"; - case "short": - case "Short": return "short"; - case "long": - case "Long": return "long"; - case "float": - case "Float": return "float"; - case "double": - case "Double": return "double"; - case "char": - case "Character": return "char"; - default: return getName(); - } - } -} diff --git a/ragconnect.base/src/main/jastadd/Errors.jrag b/ragconnect.base/src/main/jastadd/Errors.jrag deleted file mode 100644 index fe2fcd59efd365174ca2803affebc34819cf3d7e..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/Errors.jrag +++ /dev/null @@ -1,121 +0,0 @@ -import java.util.Set; -import java.util.TreeSet; -import java.util.LinkedList; - -aspect Errors { - coll Set<ErrorMessage> RagConnect.errors() - [new TreeSet<ErrorMessage>()] - root RagConnect; - - ReceiveTokenEndpointDefinition contributes error("Receive definition already defined for " + getToken().getName()) - when isAlreadyDefined() - to RagConnect.errors(); - - ReceiveTokenEndpointDefinition contributes error("Receiving target token must not be an NTA token!") - when getToken().getNTA() - to RagConnect.errors(); - - // if first mapping is null, then suitableDefaultMapping() == null - ReceiveTokenEndpointDefinition contributes error("No suitable default mapping found for type " + - ((getMappingList().isEmpty()) - ? getToken().effectiveJavaTypeUse().prettyPrint() - : getMappingList().get(0).getFromType().prettyPrint())) - when effectiveMappings().get(0) == null - to RagConnect.errors(); - - ReceiveTokenEndpointDefinition contributes error("to-type of last mapping (" + effectiveMappings().get(effectiveMappings().size() - 1).getToType().prettyPrint() + ") not assignable to type of the Token (" + getToken().effectiveJavaTypeUse().prettyPrint() + ")!") - when !effectiveMappings().get(effectiveMappings().size() - 1).getToType().assignableTo( - getToken().effectiveJavaTypeUse()) - to RagConnect.errors(); - - SendTokenEndpointDefinition contributes error("Sending target token must be an NTA token!") - when !getToken().getNTA() - to RagConnect.errors(); - - SendTokenEndpointDefinition contributes error("Send definition already defined for " + getToken().getName()) - when isAlreadyDefined() - to RagConnect.errors(); - - DependencyDefinition contributes error("Dependency definition already defined for " + getSource().containingTypeDecl().getName() + " with name " + getID()) - when isAlreadyDefined() - to RagConnect.errors(); - - DependencyDefinition contributes error("The name of a dependency definition must not be equal to a list-node on the source") - when isAlreadyDefinedAsList() - to RagConnect.errors(); - - DependencyDefinition contributes error("There must be a send endpoint definition targeting " + getSource().parentTypeypeAndName() + " for dependency definition " + getID()) - when targetEndpointDefinition() == null - to RagConnect.errors(); -} - -aspect ErrorHelpers { - syn boolean DependencyDefinition.isAlreadyDefinedAsList() { - for (Component comp : getSource().containingTypeDecl().getComponentList()) { - if (comp.isListComponent() && comp.getName().equals(this.getID())) { - return true; - } - } - return false; - } - syn String TokenComponent.parentTypeypeAndName() = containingTypeDecl().getName() + "." + getName(); -} - -aspect ErrorMessage { - public class ErrorMessage implements Comparable<ErrorMessage> { - private final ASTNode node; - private final String filename; - private final int line; - private final int col; - private final String message; - - public ErrorMessage(ASTNode node, String message) { - this.node = node; - this.filename = node.containedFileName(); - this.line = node.getStartLine(); - this.col = node.getStartColumn(); - this.message = message; - } - - public ASTNode getNode() { - return node; - } - public int getLine() { - return line; - } - public int getCol() { - return col; - } - public String getMessage() { - return message; - } - - public String toString() { - return filename + " Line " + line + ", column " + col + ": " + message; - } - - @Override - public int compareTo(ErrorMessage err) { - int n = filename.compareTo(err.filename); - if (n != 0) { - return n; - } - - n = line - err.line; - if (n != 0) { - return n; - } - - n = col-err.col; - if (n != 0) { - return n; - } - - return message.compareTo(err.message); - } - } - - protected ErrorMessage ASTNode.error(String message) { - return new ErrorMessage(this, message); - } -} diff --git a/ragconnect.base/src/main/jastadd/MustacheNodes.relast b/ragconnect.base/src/main/jastadd/MustacheNodes.relast deleted file mode 100644 index 62ecdb6166a783e125cefef2826d550b73ab9e1b..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/MustacheNodes.relast +++ /dev/null @@ -1,19 +0,0 @@ -MRagConnect ::= ReceiveDefinition:MReceiveDefinition* SendDefinition:MSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent*; -abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*; -MReceiveDefinition : MEndpointDefinition; -MSendDefinition : MEndpointDefinition; -MMappingDefinition; -MInnerMappingDefinition; -MDependencyDefinition; -MTypeComponent; -MTokenComponent; - -rel MRagConnect.RagConnect -> RagConnect; -rel MInnerMappingDefinition.MMappingDefinition -> MMappingDefinition; -rel MReceiveDefinition.ReceiveTokenEndpointDefinition -> ReceiveTokenEndpointDefinition; -rel MSendDefinition.SendTokenEndpointDefinition -> SendTokenEndpointDefinition; -rel MMappingDefinition.MappingDefinition -> MappingDefinition; -rel MDependencyDefinition.DependencyDefinition -> DependencyDefinition; -rel MTypeComponent.TypeComponent -> TypeComponent; -rel MTokenComponent.TokenComponent -> TokenComponent; -rel MTokenComponent.DependencyDefinition* -> MDependencyDefinition; diff --git a/ragconnect.base/src/main/jastadd/NameResolution.jrag b/ragconnect.base/src/main/jastadd/NameResolution.jrag deleted file mode 100644 index f282ba55983feeae814e12823ff31f1d6480b6a8..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/NameResolution.jrag +++ /dev/null @@ -1,14 +0,0 @@ -aspect NameResolution { - - refine RefResolverStubs eq EndpointDefinition.resolveMappingByToken(String id, int position) { - // return a MappingDefinition - for (MappingDefinition mappingDefinition : ragconnect().getMappingDefinitionList()) { - if (mappingDefinition.getID().equals(id)) { - return mappingDefinition; - } - } - System.err.println("Could not resolve MappingDefinition '" + id + "'."); - return null; - } - -} diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag deleted file mode 100644 index 752fc36aea4c59348874c1a08134696a9543b6cb..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/Navigation.jrag +++ /dev/null @@ -1,60 +0,0 @@ -aspect Navigation { - - // --- program --- - eq RagConnect.getChild().program() = getProgram(); - eq MRagConnect.getChild().program() = getRagConnect().program(); - - // --- ragconnect --- - inh RagConnect ASTNode.ragconnect(); - eq RagConnect.getChild().ragconnect() = this; - eq MRagConnect.getChild().ragconnect() = getRagConnect(); - - // --- containedFile - eq Grammar.getChild().containedFile() = null; - eq RagConnect.getChild().containedFile() = null; - eq MRagConnect.getChild().containedFile() = null; - - // --- containedFileName --- - eq Grammar.getChild().containedFileName() = null; // should be in PP - eq RagConnect.getChild().containedFileName() = getFileName(); - eq MRagConnect.getChild().containedFileName() = null; - - // --- isTokenEndpointDefinition --- - syn boolean EndpointDefinition.isTokenEndpointDefinition() = false; - eq TokenEndpointDefinition.isTokenEndpointDefinition() = true; - - // --- asTokenEndpointDefinition --- - syn TokenEndpointDefinition EndpointDefinition.asTokenEndpointDefinition() = null; - eq TokenEndpointDefinition.asTokenEndpointDefinition() = this; - - // --- isSendTokenEndpointDefinition --- - syn boolean EndpointDefinition.isSendTokenEndpointDefinition() = false; - eq SendTokenEndpointDefinition.isSendTokenEndpointDefinition() = true; - - // --- asSendTokenEndpointDefinition --- - syn SendTokenEndpointDefinition EndpointDefinition.asSendTokenEndpointDefinition() = null; - eq SendTokenEndpointDefinition.asSendTokenEndpointDefinition() = this; - - // --- asReceiveTokenEndpointDefinition --- - syn ReceiveTokenEndpointDefinition EndpointDefinition.asReceiveTokenEndpointDefinition() = null; - eq ReceiveTokenEndpointDefinition.asReceiveTokenEndpointDefinition() = this; - - // --- targetEndpointDefinition --- - syn SendTokenEndpointDefinition DependencyDefinition.targetEndpointDefinition() { - // resolve definition in here, as we do not need resolveMethod in any other place (yet) - for (EndpointDefinition endpointDefinition : ragconnect().getEndpointDefinitionList()) { - if (endpointDefinition.isSendTokenEndpointDefinition() && - endpointDefinition.asSendTokenEndpointDefinition().getToken().equals(this.getTarget())) { - return endpointDefinition.asSendTokenEndpointDefinition(); - } - } - return null; - } - - // --- effectiveJavaTypeUse (should be in preprocessor) --- - syn lazy JavaTypeUse TokenComponent.effectiveJavaTypeUse() = hasJavaTypeUse() ? getJavaTypeUse() : new SimpleJavaTypeUse("String"); - - // --- isDefaultMappingDefinition --- - syn boolean MappingDefinition.isDefaultMappingDefinition() = false; - eq DefaultMappingDefinition.isDefaultMappingDefinition() = true; -} diff --git a/ragconnect.base/src/main/jastadd/Printing.jrag b/ragconnect.base/src/main/jastadd/Printing.jrag deleted file mode 100644 index 74607aeb7737e1e43c9565b799693889a648a9df..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/Printing.jrag +++ /dev/null @@ -1,75 +0,0 @@ -aspect Printing { - String ASTNode.PRINT_INDENT = " "; - - syn String MappingDefinitionType.prettyPrint(); - eq JavaMappingDefinitionType.prettyPrint() = getType().getName(); - eq JavaArrayMappingDefinitionType.prettyPrint() = getType().getName() + "[]"; - - syn String JavaTypeUse.prettyPrint() { - StringBuilder sb = new StringBuilder(); - generateAbstractGrammar(sb); - return sb.toString(); - } - - syn String Document.prettyPrint() { - StringBuilder sb = new StringBuilder(); - sb.append("# RagConnect created at ").append(java.time.Instant.now()).append("\n"); - for (ComplexElement element : getComplexElementList()) { - element.prettyPrint(sb, false, ""); - } - if (sb.charAt(sb.length() - 1) != '\n') { - sb.append("\n"); - } - return sb.toString(); - } - syn StringBuilder Element.prettyPrint(StringBuilder sb, boolean printIndent, String indent); - eq ValueElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) { - sb.append(getValue()); - return sb; - } - eq StringElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) { - sb.append("\"").append(getValue()).append("\""); - return sb; - } - eq ListElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) { - if (isEmpty()) { - sb.append("[]"); - } else { - for (Element element : getElementList()) { - sb.append(indent).append("- "); - element.prettyPrint(sb, false, indent + PRINT_INDENT); - sb.append("\n"); - } - // delete last newline - sb.deleteCharAt(sb.length() - 1); - } - return sb; - } - eq KeyValuePair.prettyPrint(StringBuilder sb, boolean printIndent, String indent) { - if (printIndent) sb.append(indent); - sb.append(getKey()).append(": "); - if (getValue().isComplex() && !getValue().isEmpty()) { - sb.append("\n"); - getValue().prettyPrint(sb, true, indent + PRINT_INDENT); //); - } else { - getValue().prettyPrint(sb, false, indent); - } - return sb; - } - eq MappingElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) { - if (isEmpty()) { - sb.append("{}"); - } else { - boolean first = true; - for (KeyValuePair pair : getKeyValuePairList()) { - if (!first || printIndent) sb.append(indent); - first = false; - pair.prettyPrint(sb, false, indent); // + PRINT_INDENT - sb.append("\n"); - } - // delete last newline - sb.deleteCharAt(sb.length() - 1); - } - return sb; - } -} diff --git a/ragconnect.base/src/main/jastadd/RagConnect.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast deleted file mode 100644 index accc617714ff6bdd24a22831ea84e5d93e6a15b8..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/RagConnect.relast +++ /dev/null @@ -1,21 +0,0 @@ -RagConnect ::= EndpointDefinition* DependencyDefinition* MappingDefinition* Program <FileName> ; - -abstract EndpointDefinition ::= <AlwaysApply:boolean> ; - -rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*; - -abstract TokenEndpointDefinition : EndpointDefinition; -rel TokenEndpointDefinition.Token -> TokenComponent; - -ReceiveTokenEndpointDefinition : TokenEndpointDefinition; -SendTokenEndpointDefinition : TokenEndpointDefinition; - -DependencyDefinition ::= <ID>; -rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*; -rel DependencyDefinition.Target -> TokenComponent; - -MappingDefinition ::= <ID> FromType:MappingDefinitionType <FromVariableName> ToType:MappingDefinitionType <Content> ; -abstract MappingDefinitionType ::= ; -JavaMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ; -JavaArrayMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ; -DefaultMappingDefinition : MappingDefinition ; diff --git a/ragconnect.base/src/main/jastadd/Util.jadd b/ragconnect.base/src/main/jastadd/Util.jadd deleted file mode 100644 index 3b59b13c53a8d0e1ca2a05feba43294797a4577e..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/Util.jadd +++ /dev/null @@ -1,5 +0,0 @@ -aspect Util { - static String ASTNode.capitalize(String s) { - return Character.toUpperCase(s.charAt(0)) + s.substring(1); - } -} diff --git a/ragconnect.base/src/main/jastadd/YAML.jrag b/ragconnect.base/src/main/jastadd/YAML.jrag deleted file mode 100644 index 93dd0f34b7b7b0505cf0970b6541fa3ae5bee7fa..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/YAML.jrag +++ /dev/null @@ -1,31 +0,0 @@ -aspect Navigation { - eq Document.getChild().program() = null; - eq Document.getChild().ragconnect() = null; - eq Document.getChild().containedFile() = null; - eq Document.getChild().containedFileName() = getFileName(); - - syn boolean Element.isComplex() = false; - eq ComplexElement.isComplex() = true; - - syn boolean Element.isEmpty() = false; - eq MappingElement.isEmpty() = getNumKeyValuePair() == 0; - eq ListElement.isEmpty() = getNumElement() == 0; -} - -aspect Helper { - public static ValueElement ValueElement.of(int value) { - return new ValueElement(String.valueOf(value)); - } - public static ValueElement ValueElement.of(boolean value) { - return new ValueElement(String.valueOf(value)); - } - public static ValueElement ValueElement.of(String value) { - return new ValueElement(value); - } - public static StringElement StringElement.of(String value) { - return new StringElement(value); - } - public void MappingElement.addKeyValuePair(String key, Element value) { - addKeyValuePair(new KeyValuePair(key, value)); - } -} diff --git a/ragconnect.base/src/main/jastadd/YAML.relast b/ragconnect.base/src/main/jastadd/YAML.relast deleted file mode 100644 index 94f4ab20fdc3838348bd53b812b3d1477cae3558..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/YAML.relast +++ /dev/null @@ -1,9 +0,0 @@ -Document ::= <FileName> ComplexElement* ; -abstract Element ; -abstract ComplexElement : Element ; -MappingElement : ComplexElement ::= KeyValuePair* ; -KeyValuePair : ComplexElement ::= <Key> Value:Element ; -ListElement : ComplexElement ::= Element* ; -abstract SimpleElement : Element ; -ValueElement : SimpleElement ::= <Value> ; -StringElement : SimpleElement ::= <Value> ; diff --git a/ragconnect.base/src/main/jastadd/backend/Configuration.jadd b/ragconnect.base/src/main/jastadd/backend/Configuration.jadd deleted file mode 100644 index 8d3b16c3f99014408c6aefa5655201d222c3d892..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/backend/Configuration.jadd +++ /dev/null @@ -1,7 +0,0 @@ -aspect Configuration { - public static boolean ASTNode.loggingEnabledForReads = false; - public static boolean ASTNode.loggingEnabledForWrites = false; - public static TypeDecl ASTNode.rootNode; - public static boolean ASTNode.usesMqtt; - public static boolean ASTNode.usesRest; -} diff --git a/ragconnect.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/backend/Generation.jadd deleted file mode 100644 index 4b8d357e82e82eb8454451978589434f1ef44505..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/backend/Generation.jadd +++ /dev/null @@ -1,255 +0,0 @@ -/* -Design considerations -- InnerMappingDefinition needed for iteration attribute (first, last) - not easily possible with list-relation -*/ - -aspect AttributesForMustache { - // --- MRagConnect --- - eq MRagConnect.getRootTypeComponent(int i).isFirst() = i == 0; - - syn String MRagConnect.closeMethod() = "ragconnectCloseConnections"; - syn String MRagConnect.mqttHandlerAttribute() = "_mqttHandler"; - syn String MRagConnect.mqttHandlerField() = "_mqttHandler"; - syn String MRagConnect.mqttSetupWaitUntilReadyMethod() = "ragconnectSetupMqttWaitUntilReady"; - - syn String MRagConnect.restHandlerAttribute() = "_restHandler"; - syn String MRagConnect.restHandlerField() = "_restHandler"; - - // --- MEndpointDefinition --- - syn String MEndpointDefinition.preemptiveExpectedValue(); - syn String MEndpointDefinition.preemptiveReturn(); - syn TokenEndpointDefinition MEndpointDefinition.endpointDef(); - syn String MEndpointDefinition.firstInputVarName(); - - eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1; - eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName(); - - syn String MEndpointDefinition.connectParameterName() = "uriString"; - syn String MEndpointDefinition.connectMethod() = "connect" + tokenName(); - syn TokenComponent MEndpointDefinition.token() = endpointDef().getToken(); - syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply(); - syn String MEndpointDefinition.parentTypeName() = token().containingTypeDecl().getName(); - syn String MEndpointDefinition.tokenName() = token().getName(); - syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1); - syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType(); - syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName(); - syn String MEndpointDefinition.condition() { - if (lastDefinition().mappingDef().getToType().isArray()) { - return "java.util.Arrays.equals(" + preemptiveExpectedValue() + ", " + lastResult() + ")"; - } - if (token().isPrimitiveType() && lastDefinition().mappingDef().getToType().isPrimitiveType()) { - return preemptiveExpectedValue() + " == " + lastResult(); - } - if (lastDefinition().mappingDef().isDefaultMappingDefinition()) { - return preemptiveExpectedValue() + " != null && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")"; - } - return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null"; - } - - // --- MInnerMappingDefinition --- - inh boolean MInnerMappingDefinition.isLast(); - inh String MInnerMappingDefinition.inputVarName(); - syn String MInnerMappingDefinition.toType() = mappingDef().getToType().prettyPrint(); - syn String MInnerMappingDefinition.methodName() = getMMappingDefinition().methodName(); - syn MappingDefinition MInnerMappingDefinition.mappingDef() = getMMappingDefinition().getMappingDefinition(); - syn String MInnerMappingDefinition.outputVarName() = "result" + methodName(); // we do not need "_" in between here, because methodName begins with one - - // --- MReceiveDefinition --- - eq MReceiveDefinition.preemptiveExpectedValue() = "get" + tokenName() + "()"; - eq MReceiveDefinition.preemptiveReturn() = "return;"; - eq MReceiveDefinition.endpointDef() = getReceiveTokenEndpointDefinition(); - eq MReceiveDefinition.firstInputVarName() = "message"; - - // --- MSendDefinition --- - eq MSendDefinition.preemptiveExpectedValue() = lastValue(); - eq MSendDefinition.preemptiveReturn() = "return false;"; - eq MSendDefinition.endpointDef() = getSendTokenEndpointDefinition(); - eq MSendDefinition.firstInputVarName() = "get" + tokenName() + "()"; - - syn String MSendDefinition.sender() = "_sender_" + tokenName(); - syn String MSendDefinition.lastValue() = "_lastValue" + tokenName(); - syn String MSendDefinition.updateMethod() = "_update_" + tokenName(); - syn String MSendDefinition.writeMethod() = "_writeLastValue_" + tokenName(); - syn String MSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset"; - - // --- MMappingDefinition --- - syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint(); - syn String MMappingDefinition.methodName() = "_apply_" + getMappingDefinition().getID(); - syn String MMappingDefinition.fromType() = getMappingDefinition().getFromType().prettyPrint(); - syn String MMappingDefinition.fromVariableName() = getMappingDefinition().getFromVariableName(); - syn String MMappingDefinition.content() = getMappingDefinition().getContent(); - - // --- MDependencyDefinition --- - syn String MDependencyDefinition.targetParentTypeName() = getDependencyDefinition().getTarget().containingTypeDecl().getName(); - syn String MDependencyDefinition.dependencyMethod() = "add" + capitalize(getDependencyDefinition().getID()); - syn String MDependencyDefinition.sourceParentTypeName() = getDependencyDefinition().getSource().containingTypeDecl().getName(); - syn String MDependencyDefinition.internalRelationPrefix() = "_internal_" + getDependencyDefinition().getID(); - syn nta MSendDefinition MDependencyDefinition.targetEndpointDefinition() { - return getDependencyDefinition().targetEndpointDefinition().toMustache(); - } - - // --- MTypeComponent --- - syn String MTypeComponent.name() = getTypeComponent().getName(); - inh boolean MTypeComponent.isFirst(); - - // --- MTokenComponent --- - syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName(); - syn String MTokenComponent.name() = getTokenComponent().getName(); - syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint(); - syn String MTokenComponent.internalName() = getTokenComponent().getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + name(); - syn String MTokenComponent.externalName() = name(); - - // --- toMustache --- - syn lazy MRagConnect RagConnect.toMustache() { - MRagConnect result = new MRagConnect(); - result.setRagConnect(this); - for (EndpointDefinition def : getEndpointDefinitionList()) { - if (def.isSendTokenEndpointDefinition()) { - SendTokenEndpointDefinition sendDef = def.asSendTokenEndpointDefinition(); - result.addSendDefinition(sendDef.toMustache()); - } else { - result.addReceiveDefinition(def.asReceiveTokenEndpointDefinition().toMustache()); - } - } - for (MappingDefinition def : allMappingDefinitions()) { - result.addMappingDefinition(def.toMustache()); - } - for (DependencyDefinition def : getDependencyDefinitionList()) { - result.addDependencyDefinition(def.toMustache()); - } - for (TokenComponent token : getProgram().allTokenComponents()) { - if (!token.getDependencySourceDefinitionList().isEmpty()) { - result.addTokenComponent(token.toMustache()); - } - } - for (Component child : rootNode.getComponentList()) { - if (child.isTypeComponent()) { - result.addRootTypeComponent(child.asTypeComponent().toMustache()); - } - } - return result; - } - - protected void MEndpointDefinition.addInnerMappings() { - for (MappingDefinition def : endpointDef().effectiveMappings()) { - MInnerMappingDefinition inner = new MInnerMappingDefinition(); - inner.setMMappingDefinition(def.toMustache()); - addInnerMappingDefinition(inner); - } - } - - syn lazy MReceiveDefinition ReceiveTokenEndpointDefinition.toMustache() { - MReceiveDefinition result = new MReceiveDefinition(); - result.setReceiveTokenEndpointDefinition(this); - result.addInnerMappings(); - return result; - } - - syn lazy MSendDefinition SendTokenEndpointDefinition.toMustache() { - MSendDefinition result = new MSendDefinition(); - result.setSendTokenEndpointDefinition(this); - result.addInnerMappings(); - return result; - } - - syn lazy MMappingDefinition MappingDefinition.toMustache() { - MMappingDefinition result = new MMappingDefinition(); - result.setMappingDefinition(this); - return result; - } - - syn lazy MDependencyDefinition DependencyDefinition.toMustache() { - MDependencyDefinition result = new MDependencyDefinition(); - result.setDependencyDefinition(this); - return result; - } - - syn lazy MTypeComponent TypeComponent.toMustache() { - MTypeComponent result = new MTypeComponent(); - result.setTypeComponent(this); - return result; - } - - syn lazy MTokenComponent TokenComponent.toMustache() { - MTokenComponent result = new MTokenComponent(); - result.setTokenComponent(this); - for (DependencyDefinition def : getDependencySourceDefinitionList()) { - result.addDependencyDefinition(def.toMustache()); - } - return result; - } -} - -aspect AspectGeneration { - // --- rootNodeName --- - syn String ASTNode.rootNodeName() = rootNode.getName(); - - public String RagConnect.generateAspect(String rootNodeName) { - rootNode = getProgram().resolveTypeDecl(rootNodeName); - return toMustache().generateAspect(); - } - - public String MRagConnect.generateAspect() { - StringBuilder sb = new StringBuilder(); - com.github.mustachejava.reflect.ReflectionObjectHandler roh = new com.github.mustachejava.reflect.ReflectionObjectHandler() { - @Override - public com.github.mustachejava.Binding createBinding(String name, final com.github.mustachejava.TemplateContext tc, com.github.mustachejava.Code code) { - return new com.github.mustachejava.reflect.GuardedBinding(this, name, tc, code) { - @Override - protected synchronized com.github.mustachejava.util.Wrapper getWrapper(String name, java.util.List<Object> scopes) { - com.github.mustachejava.util.Wrapper wrapper = super.getWrapper(name, scopes); - if (wrapper instanceof com.github.mustachejava.reflect.MissingWrapper) { - throw new com.github.mustachejava.MustacheException(name + " not found in " + tc); - } - return wrapper; - } - }; - } - }; - com.github.mustachejava.DefaultMustacheFactory mf = new com.github.mustachejava.DefaultMustacheFactory(); - mf.setObjectHandler(roh); - com.github.mustachejava.Mustache m = mf.compile("ragconnect.mustache"); - m.execute(new java.io.PrintWriter(new org.jastadd.ragconnect.compiler.AppendableWriter(sb)), this); - return sb.toString(); - } -} - -aspect RelationGeneration { - syn java.util.List<Relation> RagConnect.additionalRelations() { - java.util.List<Relation> result = new java.util.ArrayList<>(); - for (DependencyDefinition dd : getDependencyDefinitionList()) { - result.add(dd.getRelationToCreate()); - } - return result; - } - - syn nta Relation DependencyDefinition.getRelationToCreate() { - String internalRelationPrefix = toMustache().internalRelationPrefix(); - BidirectionalRelation result = new BidirectionalRelation(); - NavigableRole left = new ListRole(internalRelationPrefix + "Source"); - left.setType(getTarget().containingTypeDecl()); - NavigableRole right = new ListRole(internalRelationPrefix + "Target"); - right.setType(getSource().containingTypeDecl()); - result.setLeft(left); - result.setRight(right); - result.addComment(new WhitespaceComment("\n")); - return result; - } -} - -aspect GrammarExtension { - refine BackendAbstractGrammar public void TokenComponent.generateAbstractGrammar(StringBuilder b) { - if (getNTA()) { - b.append("/"); - } - b.append("<"); - if (!getName().equals("")) { - b.append(toMustache().internalName()).append(":"); - } - effectiveJavaTypeUse().generateAbstractGrammar(b); - b.append(">"); - if (getNTA()) { - b.append("/"); - } - } -} diff --git a/ragconnect.base/src/main/jastadd/backend/Mappings.jrag b/ragconnect.base/src/main/jastadd/backend/Mappings.jrag deleted file mode 100644 index 7aa82d304079592d605997484d1348a3d3681875..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/backend/Mappings.jrag +++ /dev/null @@ -1,270 +0,0 @@ -aspect DefaultMappings { - - private String RagConnect.baseDefaultMappingTypeNamePart(String typeName) { - return capitalize(typeName).replace("[]", "s"); - } - - private MappingDefinitionType RagConnect.baseDefaultMappingTypeFromName(String typeName) { - return typeName.endsWith("[]") ? - new JavaArrayMappingDefinitionType(new SimpleJavaTypeUse(typeName.replace("[]", ""))) : - new JavaMappingDefinitionType(new SimpleJavaTypeUse(typeName)); - } - - private DefaultMappingDefinition RagConnect.baseDefaultMappingDefinition(String fromTypeName, String toTypeName, String content) { - DefaultMappingDefinition result = new DefaultMappingDefinition(); - result.setID("_Default" + baseDefaultMappingTypeNamePart(fromTypeName) + "To" + baseDefaultMappingTypeNamePart(toTypeName) + "Mapping"); - result.setFromType(baseDefaultMappingTypeFromName(fromTypeName)); - result.setFromVariableName("input"); - result.setToType(baseDefaultMappingTypeFromName(toTypeName)); - result.setContent(content); - return result; - } - - syn nta DefaultMappingDefinition RagConnect.defaultBytesToIntMapping() = baseDefaultMappingDefinition( - "byte[]", "int", "return java.nio.ByteBuffer.wrap(input).getInt();"); - syn nta DefaultMappingDefinition RagConnect.defaultBytesToShortMapping() = baseDefaultMappingDefinition( - "byte[]", "short", "return java.nio.ByteBuffer.wrap(input).getShort();"); - syn nta DefaultMappingDefinition RagConnect.defaultBytesToLongMapping() = baseDefaultMappingDefinition( - "byte[]", "long", "return java.nio.ByteBuffer.wrap(input).getLong();"); - syn nta DefaultMappingDefinition RagConnect.defaultBytesToFloatMapping() = baseDefaultMappingDefinition( - "byte[]", "float", "return java.nio.ByteBuffer.wrap(input).getFloat();"); - syn nta DefaultMappingDefinition RagConnect.defaultBytesToDoubleMapping() = baseDefaultMappingDefinition( - "byte[]", "double", "return java.nio.ByteBuffer.wrap(input).getDouble();"); - syn nta DefaultMappingDefinition RagConnect.defaultBytesToCharMapping() = baseDefaultMappingDefinition( - "byte[]", "char", "return java.nio.ByteBuffer.wrap(input).getChar();"); - syn nta DefaultMappingDefinition RagConnect.defaultBytesToStringMapping() = baseDefaultMappingDefinition( - "byte[]", "String", "return new String(input);"); - - syn nta DefaultMappingDefinition RagConnect.defaultIntToBytesMapping() = baseDefaultMappingDefinition( - "int", "byte[]", "return java.nio.ByteBuffer.allocate(Integer.BYTES).putInt(input).array();"); - syn nta DefaultMappingDefinition RagConnect.defaultShortToBytesMapping() = baseDefaultMappingDefinition( - "short", "byte[]", "return java.nio.ByteBuffer.allocate(Short.BYTES).putShort(input).array();"); - syn nta DefaultMappingDefinition RagConnect.defaultLongToBytesMapping() = baseDefaultMappingDefinition( - "long", "byte[]", "return java.nio.ByteBuffer.allocate(Long.BYTES).putLong(input).array();"); - syn nta DefaultMappingDefinition RagConnect.defaultFloatToBytesMapping() = baseDefaultMappingDefinition( - "float", "byte[]", "return java.nio.ByteBuffer.allocate(Float.BYTES).putFloat(input).array();"); - syn nta DefaultMappingDefinition RagConnect.defaultDoubleToBytesMapping() = baseDefaultMappingDefinition( - "double", "byte[]", "return java.nio.ByteBuffer.allocate(Double.BYTES).putDouble(input).array();"); - syn nta DefaultMappingDefinition RagConnect.defaultCharToBytesMapping() = baseDefaultMappingDefinition( - "char", "byte[]", "return java.nio.ByteBuffer.allocate(Character.BYTES).putChar(input).array();"); - syn nta DefaultMappingDefinition RagConnect.defaultStringToBytesMapping() = baseDefaultMappingDefinition( - "String", "byte[]", "return input.getBytes();"); - - syn nta DefaultMappingDefinition RagConnect.defaultStringToIntMapping() = baseDefaultMappingDefinition( - "String", "int", "return Integer.parseInt(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultStringToShortMapping() = baseDefaultMappingDefinition( - "String", "short", "return Short.parseShort(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultStringToLongMapping() = baseDefaultMappingDefinition( - "String", "long", "return Long.parseLong(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultStringToFloatMapping() = baseDefaultMappingDefinition( - "String", "float", "return Float.parseFloat(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultStringToDoubleMapping() = baseDefaultMappingDefinition( - "String", "double", "return Double.parseDouble(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultStringToCharMapping() = baseDefaultMappingDefinition( - "String", "char", "return input.charAt(0);"); - - syn nta DefaultMappingDefinition RagConnect.defaultIntToStringMapping() = baseDefaultMappingDefinition( - "int", "String", "return String.valueOf(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultShortToStringMapping() = baseDefaultMappingDefinition( - "short", "String", "return String.valueOf(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultLongToStringMapping() = baseDefaultMappingDefinition( - "long", "String", "return String.valueOf(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultFloatToStringMapping() = baseDefaultMappingDefinition( - "float", "String", "return String.valueOf(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultDoubleToStringMapping() = baseDefaultMappingDefinition( - "double", "String", "return String.valueOf(input);"); - syn nta DefaultMappingDefinition RagConnect.defaultCharToStringMapping() = baseDefaultMappingDefinition( - "char", "String", "return String.valueOf(input);"); -} - -aspect Mappings { - // --- effectiveMappings --- - syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings(); - eq ReceiveTokenEndpointDefinition.effectiveMappings() { - // if there is a first mapping, check if it is suitable. - // or if no mappings are specified. - // then prepend the suitable default mapping - java.util.List<MappingDefinition> result; - if (getMappingList().isEmpty() || !hasSuitableEdgeMapping()) { - result = new java.util.ArrayList(); - result.add(suitableDefaultMapping()); - result.addAll(getMappingList()); - } else { - result = getMappingList(); - } - return result; - } - eq SendTokenEndpointDefinition.effectiveMappings() { - // if there is a mapping, check if it is suitable. - // or if no mappings are specified. - // then append the suitable default mapping - java.util.List<MappingDefinition> result; - if (getMappingList().isEmpty() || !hasSuitableEdgeMapping()) { - result = new java.util.ArrayList(getMappingList()); - result.add(suitableDefaultMapping()); - } else { - result = getMappingList(); - } - return result; - } - - // --- hasSuitableEdgeMapping --- - syn boolean TokenEndpointDefinition.hasSuitableEdgeMapping(); - eq ReceiveTokenEndpointDefinition.hasSuitableEdgeMapping() = isSuitableEdgeMapping(getMappingList().get(0)); - eq SendTokenEndpointDefinition.hasSuitableEdgeMapping() = isSuitableEdgeMapping(getMappingList().get(getMappingList().size() - 1)); - - // --- isSuitableEdgeMapping(def) --- - syn boolean TokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def); - eq ReceiveTokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def) = def.getFromType().isByteArray(); - eq SendTokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def) = def.getToType().isByteArray(); - - // --- isPrimitiveType --- - syn boolean TokenComponent.isPrimitiveType() = effectiveJavaTypeUse().isPrimitiveType(); - syn boolean JavaTypeUse.isPrimitiveType() = false; - eq SimpleJavaTypeUse.isPrimitiveType() { - switch(getName()) { - case "int": - case "short": - case "long": - case "float": - case "double": - case "char": - case "byte": return true; - default: return false; - } - } - syn boolean MappingDefinitionType.isPrimitiveType() = false; - eq JavaMappingDefinitionType.isPrimitiveType() = getType().isPrimitiveType(); - - // --- isArray --- - syn boolean MappingDefinitionType.isArray() = false; - eq JavaArrayMappingDefinitionType.isArray() = true; - - // --- suitableDefaultMapping --- - syn DefaultMappingDefinition EndpointDefinition.suitableDefaultMapping(); - eq ReceiveTokenEndpointDefinition.suitableDefaultMapping() { - String typeName = getMappingList().isEmpty() ? - getToken().effectiveJavaTypeUse().getName() : - getMappingList().get(0).getFromType().prettyPrint(); - switch(typeName) { - case "int": - case "Integer": return ragconnect().defaultBytesToIntMapping(); - case "short": - case "Short": return ragconnect().defaultBytesToShortMapping(); - case "long": - case "Long": return ragconnect().defaultBytesToLongMapping(); - case "float": - case "Float": return ragconnect().defaultBytesToFloatMapping(); - case "double": - case "Double": return ragconnect().defaultBytesToDoubleMapping(); - case "char": - case "Character": return ragconnect().defaultBytesToCharMapping(); - case "String": return ragconnect().defaultBytesToStringMapping(); - default: return null; - } - } - eq SendTokenEndpointDefinition.suitableDefaultMapping() { - String typeName = getMappingList().isEmpty() ? - getToken().effectiveJavaTypeUse().getName() : - getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint(); - switch(typeName) { - case "int": - case "Integer": return ragconnect().defaultIntToBytesMapping(); - case "short": - case "Short": return ragconnect().defaultShortToBytesMapping(); - case "long": - case "Long": return ragconnect().defaultLongToBytesMapping(); - case "float": - case "Float": return ragconnect().defaultFloatToBytesMapping(); - case "double": - case "Double": return ragconnect().defaultDoubleToBytesMapping(); - case "char": - case "Character": return ragconnect().defaultCharToBytesMapping(); - case "String": return ragconnect().defaultStringToBytesMapping(); - default: return null; - } - } -// eq ReceiveFromRestDefinition.suitableDefaultMapping() { -// String typeName = getMappingList().isEmpty() ? -// getToken().getJavaTypeUse().getName() : -// getMappingList().get(0).getFromType().prettyPrint(); -// switch(typeName) { -// case "int": -// case "Integer": return ragconnect().defaultStringToIntMapping(); -// case "short": -// case "Short": return ragconnect().defaultStringToShortMapping(); -// case "long": -// case "Long": return ragconnect().defaultStringToLongMapping(); -// case "float": -// case "Float": return ragconnect().defaultStringToFloatMapping(); -// case "double": -// case "Double": return ragconnect().defaultStringToDoubleMapping(); -// case "char": -// case "Character": return ragconnect().defaultStringToCharMapping(); -// default: return null; -// } -// } -// eq SendToRestDefinition.suitableDefaultMapping() { -// String typeName = getMappingList().isEmpty() ? -// getToken().getJavaTypeUse().getName() : -// getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint(); -// switch(typeName) { -// case "int": -// case "Integer": return ragconnect().defaultIntToStringMapping(); -// case "short": -// case "Short": return ragconnect().defaultShortToStringMapping(); -// case "long": -// case "Long": return ragconnect().defaultLongToStringMapping(); -// case "float": -// case "Float": return ragconnect().defaultFloatToStringMapping(); -// case "double": -// case "Double": return ragconnect().defaultDoubleToStringMapping(); -// case "char": -// case "Character": return ragconnect().defaultCharToStringMapping(); -// default: return null; -// } -// } - - // --- isByteArray --- - syn boolean MappingDefinitionType.isByteArray() = false; - eq JavaArrayMappingDefinitionType.isByteArray() = getType().getName().equals("byte"); - -// // --- isString --- -// syn boolean MappingDefinitionType.isString() = false; -// eq JavaMappingDefinitionType.isString() = getType().getName().equals("String"); - - // --- allMappingDefinitions --- - syn java.util.List<MappingDefinition> RagConnect.allMappingDefinitions() { - java.util.List<MappingDefinition> result = new java.util.ArrayList<>(); - getMappingDefinitionList().iterator().forEachRemaining(result::add); - // byte[] conversion - result.add(defaultBytesToIntMapping()); - result.add(defaultBytesToShortMapping()); - result.add(defaultBytesToLongMapping()); - result.add(defaultBytesToFloatMapping()); - result.add(defaultBytesToDoubleMapping()); - result.add(defaultBytesToCharMapping()); - result.add(defaultBytesToStringMapping()); - result.add(defaultIntToBytesMapping()); - result.add(defaultShortToBytesMapping()); - result.add(defaultLongToBytesMapping()); - result.add(defaultFloatToBytesMapping()); - result.add(defaultDoubleToBytesMapping()); - result.add(defaultCharToBytesMapping()); - result.add(defaultStringToBytesMapping()); -// // string conversion -// result.add(defaultStringToIntMapping()); -// result.add(defaultStringToShortMapping()); -// result.add(defaultStringToLongMapping()); -// result.add(defaultStringToFloatMapping()); -// result.add(defaultStringToDoubleMapping()); -// result.add(defaultStringToCharMapping()); -// result.add(defaultIntToStringMapping()); -// result.add(defaultShortToStringMapping()); -// result.add(defaultLongToStringMapping()); -// result.add(defaultFloatToStringMapping()); -// result.add(defaultDoubleToStringMapping()); -// result.add(defaultCharToStringMapping()); - return result; - } -} diff --git a/ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag b/ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag deleted file mode 100644 index 2894d3a8a531a190e8146121dc8e7c97f2cecc91..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag +++ /dev/null @@ -1,155 +0,0 @@ -aspect MustacheNodesToYAML { - syn Document MRagConnect.toYAML() { - Document doc = new Document(); - MappingElement root = new MappingElement(); - root.addKeyValuePair("rootNodeName", StringElement.of(rootNodeName())); - root.addKeyValuePair("closeMethod", StringElement.of(closeMethod())); - root.addKeyValuePair("usesMqtt", ValueElement.of(usesMqtt)); - root.addKeyValuePair("usesRest", ValueElement.of(usesRest)); - // mqtt - root.addKeyValuePair("mqttHandlerField", StringElement.of(mqttHandlerField())); - root.addKeyValuePair("mqttHandlerAttribute", StringElement.of(mqttHandlerAttribute())); - root.addKeyValuePair("mqttSetupWaitUntilReadyMethod", StringElement.of(mqttSetupWaitUntilReadyMethod())); - - // rootTypeComponents - ListElement rootTypeComponents = new ListElement(); - for (MTypeComponent comp : getRootTypeComponentList()) { - MappingElement inner = new MappingElement(); - inner.addKeyValuePair("first", ValueElement.of(comp.isFirst())); - inner.addKeyValuePair("name", StringElement.of(comp.name())); - rootTypeComponents.addElement(inner); - } - root.addKeyValuePair("RootTypeComponents", rootTypeComponents); - - // rest - root.addKeyValuePair("restHandlerField", StringElement.of(restHandlerField())); - root.addKeyValuePair("restHandlerAttribute", StringElement.of(restHandlerAttribute())); - - // ReceiveDefinitions - ListElement receiveDefinitions = new ListElement(); - for (MReceiveDefinition def : getReceiveDefinitionList()) { - receiveDefinitions.addElement(def.toYAML()); - } - root.addKeyValuePair("ReceiveDefinitions", receiveDefinitions); - - // SendDefinitions - ListElement sendDefinitions = new ListElement(); - for (MSendDefinition def : getSendDefinitionList()) { - sendDefinitions.addElement(def.toYAML()); - } - root.addKeyValuePair("SendDefinitions", sendDefinitions); - - // MappingDefinitions - ListElement mappingDefinitions = new ListElement(); - for (MMappingDefinition def : getMappingDefinitionList()) { - mappingDefinitions.addElement(def.toYAML()); - } - root.addKeyValuePair("MappingDefinitions", mappingDefinitions); - - // DependencyDefinitions - ListElement dependencyDefinitions = new ListElement(); - for (MDependencyDefinition def : getDependencyDefinitionList()) { - dependencyDefinitions.addElement(def.toYAML()); - } - root.addKeyValuePair("DependencyDefinitions", dependencyDefinitions); - - // TokenComponents - ListElement tokenComponents = new ListElement(); - for (MTokenComponent comp : getTokenComponentList()) { - tokenComponents.addElement(comp.toYAML()); - } - root.addKeyValuePair("TokenComponents", tokenComponents); - - doc.addComplexElement(root); - return doc; - } - - syn MappingElement MEndpointDefinition.toYAML() { - MappingElement result = new MappingElement(); - result.addKeyValuePair("parentTypeName", StringElement.of(parentTypeName())); - result.addKeyValuePair("connectMethod", StringElement.of(connectMethod())); - result.addKeyValuePair("connectParameterName", StringElement.of(connectParameterName())); - result.addKeyValuePair("lastDefinitionToType", StringElement.of(lastDefinitionToType())); - result.addKeyValuePair("preemptiveReturn", StringElement.of(preemptiveReturn())); - result.addKeyValuePair("alwaysApply", ValueElement.of(alwaysApply())); - result.addKeyValuePair("condition", StringElement.of( - condition().replace("\"", "\\\"").replace("\n", "\\n"))); - result.addKeyValuePair("lastResult", StringElement.of(lastResult())); - result.addKeyValuePair("tokenName", StringElement.of(tokenName())); - result.addKeyValuePair("InnerMappingDefinitions", innerMappingDefinitionsAsListElement()); - return result; - } - - syn MappingElement MReceiveDefinition.toYAML() { - MappingElement result = super.toYAML(); - result.addKeyValuePair("loggingEnabledForReads", ValueElement.of(loggingEnabledForReads)); - return result; - } - - syn MappingElement MSendDefinition.toYAML() { - MappingElement result = super.toYAML(); - result.addKeyValuePair("sender", StringElement.of(sender())); - result.addKeyValuePair("lastValue", StringElement.of(lastValue())); - result.addKeyValuePair("loggingEnabledForWrites", ValueElement.of(loggingEnabledForWrites)); - result.addKeyValuePair("updateMethod", StringElement.of(updateMethod())); - result.addKeyValuePair("writeMethod", StringElement.of(writeMethod())); - result.addKeyValuePair("tokenResetMethod", StringElement.of(tokenResetMethod())); - return result; - } - - syn Element MMappingDefinition.toYAML() { - MappingElement result = new MappingElement(); - result.addKeyValuePair("toType", StringElement.of(toType())); - result.addKeyValuePair("methodName", StringElement.of(methodName())); - result.addKeyValuePair("fromType", StringElement.of(fromType())); - result.addKeyValuePair("fromVariableName", StringElement.of(fromVariableName())); - result.addKeyValuePair("content", StringElement.of( - content().replace("\"", "\\\"").replace("\n", "\\n"))); - return result; - } - - syn Element MDependencyDefinition.toYAML() { - MappingElement result = new MappingElement(); - result.addKeyValuePair("targetParentTypeName", StringElement.of(targetParentTypeName())); - result.addKeyValuePair("dependencyMethod", StringElement.of(dependencyMethod())); - result.addKeyValuePair("sourceParentTypeName", StringElement.of(sourceParentTypeName())); - result.addKeyValuePair("internalRelationPrefix", StringElement.of(internalRelationPrefix())); - return result; - } - - syn Element MTokenComponent.toYAML() { - MappingElement result = new MappingElement(); - result.addKeyValuePair("parentTypeName", StringElement.of(parentTypeName())); - result.addKeyValuePair("name", StringElement.of(name())); - result.addKeyValuePair("javaType", StringElement.of(javaType())); - result.addKeyValuePair("internalName", StringElement.of(internalName())); - ListElement dependencyDefinitions = new ListElement(); - for (MDependencyDefinition def : getDependencyDefinitionList()) { - MappingElement inner = new MappingElement(); - inner.addKeyValuePair("targetParentTypeName", StringElement.of(def.targetParentTypeName())); - inner.addKeyValuePair("internalRelationPrefix", StringElement.of(def.internalRelationPrefix())); - MappingElement targetEndpointDefinition = new MappingElement(); - targetEndpointDefinition.addKeyValuePair("updateMethod", StringElement.of(def.targetEndpointDefinition().updateMethod())); - targetEndpointDefinition.addKeyValuePair("writeMethod", StringElement.of(def.targetEndpointDefinition().writeMethod())); - inner.addKeyValuePair("targetEndpointDefinition", targetEndpointDefinition); - dependencyDefinitions.addElement(inner); - } - result.addKeyValuePair("DependencyDefinitions", dependencyDefinitions); - return result; - } - - ListElement MEndpointDefinition.innerMappingDefinitionsAsListElement() { - ListElement innerMappingDefinitions = new ListElement(); - for (MInnerMappingDefinition def : getInnerMappingDefinitionList()) { - MappingElement inner = new MappingElement(); - inner.addKeyValuePair("toType", StringElement.of(def.toType())); - inner.addKeyValuePair("methodName", StringElement.of(def.methodName())); - inner.addKeyValuePair("inputVarName", StringElement.of(def.inputVarName())); - inner.addKeyValuePair("outputVarName", StringElement.of(def.outputVarName())); - inner.addKeyValuePair("last", ValueElement.of(def.isLast())); - innerMappingDefinitions.addElement(inner); - } - return innerMappingDefinitions; - } - -} diff --git a/ragconnect.base/src/main/jastadd/parser/Preamble.parser b/ragconnect.base/src/main/jastadd/parser/Preamble.parser deleted file mode 100644 index d701db19d6edb6d6c616bc79fc0145ea59d2713d..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/parser/Preamble.parser +++ /dev/null @@ -1,7 +0,0 @@ -%header {: -package org.jastadd.ragconnect.parser; -import org.jastadd.ragconnect.ast.*; -:}; - -%goal goal; -%goal ragconnect; diff --git a/ragconnect.base/src/main/jastadd/parser/RagConnect.parser b/ragconnect.base/src/main/jastadd/parser/RagConnect.parser deleted file mode 100644 index 0432b0df96c44060f6df1d6918a856f62810230d..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/parser/RagConnect.parser +++ /dev/null @@ -1,84 +0,0 @@ -RagConnect ragconnect - = endpoint_definition.d ragconnect.r {: r.getEndpointDefinitionList().insertChild(d, 0); return r; :} - | dependency_definition.d ragconnect.r {: r.getDependencyDefinitionList().insertChild(d, 0); return r; :} - | mapping_definition.d ragconnect.r {: r.getMappingDefinitionList().insertChild(d, 0); return r; :} - | comment ragconnect.r {: return r; :} - | {: return new RagConnect(); :} -; - -%embed {: - private Iterable<String> makeMappingDefs(ArrayList<?> raw_mapping_defs) { - return () -> raw_mapping_defs.stream().map(raw -> ((Symbol) raw).value.toString()).iterator(); - } - private TokenEndpointDefinition enableAlwaysApply(TokenEndpointDefinition def) { - def.setAlwaysApply(true); - return def; - } -:} ; - -EndpointDefinition endpoint_definition - = endpoint_definition_type.endpointDef SCOL - {: - return endpointDef; - :} - | endpoint_definition_type.endpointDef USING string_list.mapping_defs SCOL - {: - for (String mapping_def : makeMappingDefs(mapping_defs)) { - endpointDef.addMapping(MappingDefinition.createRef(mapping_def)); - } - return endpointDef; - :} -; - -EndpointDefinition endpoint_definition_type - = RECEIVE token_ref {: return new ReceiveTokenEndpointDefinition().setToken(token_ref); :} - | SEND token_ref {: return new SendTokenEndpointDefinition().setToken(token_ref); :} -; - -TokenComponent token_ref - = ID.type_name DOT ID.token_name {: return TokenComponent.createRef(type_name + "." + token_name); :} -; - -ArrayList string_list - = ID - | string_list COMMA ID -; - -DependencyDefinition dependency_definition - = ID.target_type DOT ID.target_token CAN_DEPEND_ON ID.source_type DOT ID.source_token AS ID.id SCOL - {: - DependencyDefinition result = new DependencyDefinition(); - result.setSource(TokenComponent.createRef(source_type + "." + source_token)); - result.setTarget(TokenComponent.createRef(target_type + "." + target_token)); - result.setID(id); - return result; - :} -; - -MappingDefinition mapping_definition - = ID.id MAPS mapping_type.from_type ID.from_name TO mapping_type.to_type MAPPING_CONTENT.content - {: - MappingDefinition result = new MappingDefinition(); - result.setID(id); - result.setFromType(from_type); - result.setFromVariableName(from_name); - result.setToType(to_type); - result.setContent(content.substring(2, content.length() - 2)); - return result; - :} -; - -MappingDefinitionType mapping_type - = java_type_use.type - {: - JavaMappingDefinitionType result = new JavaMappingDefinitionType(); - result.setType(type); - return result; - :} - | java_type_use.type LBRACKET RBRACKET - {: - JavaArrayMappingDefinitionType result = new JavaArrayMappingDefinitionType(); - result.setType(type); - return result; - :} -; diff --git a/ragconnect.base/src/main/jastadd/scanner/Header.flex b/ragconnect.base/src/main/jastadd/scanner/Header.flex deleted file mode 100644 index f289a7e89438a572e3dd936548355cf600d3b8bd..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/scanner/Header.flex +++ /dev/null @@ -1,20 +0,0 @@ -package org.jastadd.ragconnect.scanner; - -import org.jastadd.ragconnect.parser.RagConnectParser.Terminals; -%% - -%public -%final -%class RagConnectScanner -%extends beaver.Scanner - -%type beaver.Symbol -%function nextToken -%yylexthrow beaver.Scanner.Exception -%scanerror RagConnectScanner.ScannerError - -%x COMMENT -%s DECLARATION - -%line -%column diff --git a/ragconnect.base/src/main/jastadd/scanner/Keywords.flex b/ragconnect.base/src/main/jastadd/scanner/Keywords.flex deleted file mode 100644 index 5773118d8fda8ffdc536b504aa7056b8784ddfb3..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/scanner/Keywords.flex +++ /dev/null @@ -1,7 +0,0 @@ -"receive" { yybegin(DECLARATION); return sym(Terminals.RECEIVE); } -"send" { yybegin(DECLARATION); return sym(Terminals.SEND); } -"using" { return sym(Terminals.USING); } -"canDependOn" { return sym(Terminals.CAN_DEPEND_ON); } -"maps" { return sym(Terminals.MAPS); } -"to" { return sym(Terminals.TO); } -"as" { return sym(Terminals.AS); } diff --git a/ragconnect.base/src/main/jastadd/scanner/Macros.flex b/ragconnect.base/src/main/jastadd/scanner/Macros.flex deleted file mode 100644 index 08bb629fe2f9c10db42ab6e4587918447e330a63..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/scanner/Macros.flex +++ /dev/null @@ -1 +0,0 @@ -MappingContent = [{][:][^:]*[:]+([^:}][^:]*[:]+)*[}] diff --git a/ragconnect.base/src/main/jastadd/scanner/MappingContent.flex b/ragconnect.base/src/main/jastadd/scanner/MappingContent.flex deleted file mode 100644 index fdf3f205113e79a007bc7f5bb9d5f28433f7f387..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/jastadd/scanner/MappingContent.flex +++ /dev/null @@ -1 +0,0 @@ -{MappingContent} { return sym(Terminals.MAPPING_CONTENT); } diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java deleted file mode 100644 index 55818dcda1c89948726065c9d11640fcb6601130..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.jastadd.ragconnect.compiler; - -import java.io.IOException; -import java.io.Writer; - -/** - * Writer appending to a StringBuilder. - * - * @author rschoene - Initial contribution - */ -public class AppendableWriter extends Writer { - private final StringBuilder sb; - - public AppendableWriter(StringBuilder sb) { - this.sb = sb; - } - - @Override - public void write(char[] chars, int off, int len) throws IOException { - sb.append(chars, off, len); - } - - @Override - public void write(String str) throws IOException { - sb.append(str); - } - - @Override - public void flush() { - - } - - @Override - public void close() { - - } -} diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java deleted file mode 100644 index 711169ec2ea7d9c21b48dc52c5a7d2cf4cc8b427..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java +++ /dev/null @@ -1,283 +0,0 @@ -package org.jastadd.ragconnect.compiler; - -import beaver.Parser; -import org.jastadd.option.BooleanOption; -import org.jastadd.option.ValueOption; -import org.jastadd.relast.compiler.AbstractCompiler; -import org.jastadd.relast.compiler.CompilerException; -import org.jastadd.ragconnect.ast.*; -import org.jastadd.ragconnect.parser.RagConnectParser; -import org.jastadd.ragconnect.scanner.RagConnectScanner; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.*; - -public class Compiler extends AbstractCompiler { - -// private ValueOption optionOutputDir; - private ValueOption optionRootNode; - private ValueOption optionProtocols; - private BooleanOption optionPrintYaml; - private BooleanOption optionVerbose; - private BooleanOption optionLogReads; - private BooleanOption optionLogWrites; - - private static final String OPTION_PROTOCOL_MQTT = "mqtt"; - private static final String OPTION_PROTOCOL_REST = "rest"; - - public Compiler() { - super("ragconnect", true); - } - - @Override - protected int compile() throws CompilerException { - if (getConfiguration().shouldPrintVersion()) { - System.out.println(readVersion()); - return 0; - } - if (getConfiguration().shouldPrintHelp()) { - getConfiguration().printHelp(System.out); - return 0; - } - - printMessage("Running RagConnect " + readVersion()); - - if (!getConfiguration().outputDir().exists()) { - try { - Files.createDirectories(getConfiguration().outputDir().toPath()); - } catch (IOException e) { - throw new CompilerException("Error creating output dir " + getConfiguration().outputDir(), e); - } - } - - if (!optionRootNode.isMatched()) { - return error("Root node not specified"); - } - - RagConnect ragConnect = parseProgram(getConfiguration().getFiles()); - - if (!ragConnect.errors().isEmpty()) { - System.err.println("Errors:"); - for (ErrorMessage e : ragConnect.errors()) { - System.err.println(e); - } - System.exit(1); - } - - if (optionPrintYaml.value()) { - ASTNode.rootNode = ragConnect.getProgram().resolveTypeDecl(optionRootNode.value()); - String yamlContent = ragConnect.toMustache().toYAML().prettyPrint(); - System.out.println(yamlContent); - writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.yml"), yamlContent); - return 0; - } - - printMessage("Writing output files"); - final List<String> handlers = new ArrayList<>(); - if (ASTNode.usesMqtt) { - handlers.add("MqttHandler.jadd"); - } - if (ASTNode.usesRest) { - handlers.add("RestHandler.jadd"); - } - // copy handlers into outputDir - for (String handlerFileName : handlers) { - try { - InputStream inputStream = Compiler.class.getClassLoader().getResourceAsStream(handlerFileName); - if (inputStream == null) { - throw new CompilerException("Could not open " + handlerFileName); - } - Files.copy(inputStream, - getConfiguration().outputDir().toPath().resolve(handlerFileName), - StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - throw new CompilerException("Could not copy " + handlerFileName, e); - } - } - for (GrammarFile grammarFile : ragConnect.getProgram().getGrammarFileList()) { - Path outputFile = getConfiguration().outputDir().toPath().resolve(grammarFile.getFileName()); - writeToFile(outputFile, grammarFile.generateAbstractGrammar()); - } - writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.jadd"), ragConnect.generateAspect(optionRootNode.value())); - return 0; - } - - public static void main(String[] args) { - System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); - System.setProperty("mustache.debug", "true"); - try { - new Compiler().run(args); - } catch (CompilerException e) { - e.printStackTrace(); - System.exit(1); - } - } - - /** - * Reads the version string. - * - * The version string is read from the property file - * src/main/resources/Version.properties. This - * file should be generated during the build process. If it is missing - * then there is some problem in the build script. - * - * @author Jesper Öqvist <jesper.oqvist@cs.lth.se> - * @return the read version string, or <code>version ?</code> - */ - private String readVersion() { - try { - ResourceBundle resources = ResourceBundle.getBundle("ragConnectVersion"); - return resources.getString("version"); - } catch (MissingResourceException e) { - return "version ?"; - } - } - - private void printMessage(String message) { - System.out.println(message); - } - - private void writeToFile(Path path, String str) throws CompilerException { - try (BufferedWriter writer = Files.newBufferedWriter(path)) { - writer.append(str); - } catch (Exception e) { - throw new CompilerException("Could not write to file " + path.toAbsolutePath(), e); - } - } - - protected void initOptions() { - super.initOptions(); - optionRootNode = addOption( - new ValueOption("rootNode", "root node in the base grammar.") - .acceptAnyValue() - .needsValue(true)); - optionProtocols = addOption( - new ValueOption("protocols", "Protocols to enable") - .acceptMultipleValues(true) - .addDefaultValue(OPTION_PROTOCOL_MQTT, "Enable MQTT") - .addAcceptedValue(OPTION_PROTOCOL_REST, "Enable REST") - ); - optionPrintYaml = addOption( - new BooleanOption("printYaml", "Print out YAML instead of generating files") - .defaultValue(false)); - optionVerbose = addOption( - new BooleanOption("verbose", "Print more messages while compiling.") - .defaultValue(false)); - optionLogReads = addOption( - new BooleanOption("logReads", "Enable logging for every read.") - .defaultValue(false)); - optionLogWrites = addOption( - new BooleanOption("logWrites", "Enable logging for every write.") - .defaultValue(false)); - } - - private RagConnect parseProgram(Collection<String> files) throws CompilerException { - Program program = new Program(); - boolean atLeastOneGrammar = false; - boolean atLeastOneRagConnect = false; - - RagConnect ragConnect = new RagConnect(); - ragConnect.setProgram(program); - - GrammarFile ragConnectGrammarPart = new GrammarFile(); - ragConnectGrammarPart.setFileName("RagConnect.relast"); - program.addGrammarFile(ragConnectGrammarPart); - - for (String filename : files) { - String extension = filename.substring(filename.lastIndexOf('.') + 1); - switch (extension) { - case "ast": - case "relast": - // processGrammar - parseGrammar(program, filename); - atLeastOneGrammar = true; - break; - case "connect": - case "ragconnect": - // process ragConnect - RagConnect parsedRagConnect = parseRagConnect(program, filename); - mergeRagConnectDefinitions(ragConnect, parsedRagConnect); - atLeastOneRagConnect = true; - break; - default: - throw new CompilerException("Unknown file extension in " + filename); - } - } - if (!atLeastOneGrammar) { - System.err.println("No grammar file specified! (*.ast, *.relast)"); - } - if (!atLeastOneRagConnect) { - System.err.println("No ragconnect file specified! (*.connect, *.ragconnect)"); - } - if (!atLeastOneGrammar && !atLeastOneRagConnect) { - System.exit(1); - } - ragConnect.treeResolveAll(); - ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration); - ASTNode.loggingEnabledForReads = optionLogReads.value(); - ASTNode.loggingEnabledForWrites = optionLogWrites.value(); - ASTNode.usesMqtt = optionProtocols.hasValue(OPTION_PROTOCOL_MQTT); - ASTNode.usesRest = optionProtocols.hasValue(OPTION_PROTOCOL_REST); - return ragConnect; - } - - private void parseGrammar(Program program, String filename) throws CompilerException { - try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) { - RagConnectScanner scanner = new RagConnectScanner(reader); - RagConnectParser parser = new RagConnectParser(); - GrammarFile grammarFile = (GrammarFile) parser.parse(scanner); - if (optionVerbose.value()) { - grammarFile.dumpTree(System.out); - } - program.addGrammarFile(grammarFile); - grammarFile.treeResolveAll(); - grammarFile.setFileName(toBaseName(filename)); - } catch (IOException | Parser.Exception e) { - throw new CompilerException("Could not parse grammar file " + filename, e); - } - } - - private RagConnect parseRagConnect(Program program, String filename) throws CompilerException { - try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) { - RagConnectScanner scanner = new RagConnectScanner(reader); - RagConnectParser parser = new RagConnectParser(); - RagConnect ragConnect = (RagConnect) parser.parse(scanner, RagConnectParser.AltGoals.ragconnect); - ragConnect.setProgram(program); - ragConnect.setFileName(toBaseName(filename)); - return ragConnect; - } catch (IOException | Parser.Exception e) { - throw new CompilerException("Could not parse connect file " + filename, e); - } - } - - /** - * Extracts the basename of the given file, with file extension - * @param filename the given filename - * @return the basename - */ - private String toBaseName(String filename) { - return new File(filename).getName(); - } - - private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) { - for (EndpointDefinition endpointDefinition : ragConnectToIntegrate.getEndpointDefinitionList()) { - ragConnect.addEndpointDefinition(endpointDefinition); - } - for (MappingDefinition mappingDefinition : ragConnectToIntegrate.getMappingDefinitionList()) { - ragConnect.addMappingDefinition(mappingDefinition); - } - for (DependencyDefinition dependencyDefinition : ragConnectToIntegrate.getDependencyDefinitionList()) { - ragConnect.addDependencyDefinition(dependencyDefinition); - } - } - -// protected void printUsage() { -// System.out.println("Usage: java -jar ragconnect.jar [--option1] [--option2=value] ... <filename1> <filename2> ... "); -// System.out.println("Options:"); -// System.out.print(commandLine.printOptionHelp()); -// } -} diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java deleted file mode 100644 index ee9ed046348efeaa4b12dbc816c55414d93289cf..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.jastadd.ragconnect.compiler; - -import org.jastadd.ragconnect.ast.*; -import org.jastadd.ragconnect.parser.RagConnectParser; -import org.jastadd.ragconnect.scanner.RagConnectScanner; - -import java.io.Reader; -import java.nio.file.Files; -import java.nio.file.Paths; - -/** - * Testing Ros2Rag without parser. - * - * @author rschoene - Initial contribution - */ -public class SimpleMain { - - private static void printManualYAML() { - Document doc = new Document(); - KeyValuePair root = new KeyValuePair(); - root.setKey("panda_mqtt_connector"); - MappingElement firstLevel = new MappingElement(); - firstLevel.addKeyValuePair(new KeyValuePair("server", new StringElement("tcp://localhost:1883"))); - firstLevel.addKeyValuePair(new KeyValuePair("robot_speed_factor", new ValueElement(".7"))); - - KeyValuePair topics = new KeyValuePair(); - topics.setKey("topics"); - MappingElement theTopics = new MappingElement(); - theTopics.addKeyValuePair(new KeyValuePair("robotConfig", new StringElement("robotconfig"))); - theTopics.addKeyValuePair(new KeyValuePair("trajectory", new StringElement("trajectory"))); - theTopics.addKeyValuePair(new KeyValuePair("nextStep", new StringElement("ros2rag/nextStep"))); - topics.setValue(theTopics); - firstLevel.addKeyValuePair(topics); - - firstLevel.addKeyValuePair(new KeyValuePair("zone_size", new ValueElement("0.5"))); - - KeyValuePair zones = new KeyValuePair(); - zones.setKey("zones"); - ListElement theZones = new ListElement(); - theZones.addElement(new StringElement("1 1")); - theZones.addElement(new StringElement("0 1")); - theZones.addElement(new StringElement("-1 1")); - zones.setValue(theZones); - firstLevel.addKeyValuePair(zones); - - KeyValuePair parts = new KeyValuePair(); - parts.setKey("end_effectors"); - KeyValuePair pandaParts = new KeyValuePair(); - pandaParts.setKey("panda"); - MappingElement thePanda = new MappingElement(); - thePanda.addKeyValuePair(new KeyValuePair("Link0", new StringElement("panda_link0"))); - thePanda.addKeyValuePair(new KeyValuePair("Link1", new StringElement("panda_link1"))); - thePanda.addKeyValuePair(new KeyValuePair("Link2", new StringElement("panda_link2"))); - thePanda.addKeyValuePair(new KeyValuePair("Link3", new StringElement("panda_link3"))); - thePanda.addKeyValuePair(new KeyValuePair("Link4", new StringElement("panda_link4"))); - thePanda.addKeyValuePair(new KeyValuePair("Link5", new StringElement("panda_link5"))); - thePanda.addKeyValuePair(new KeyValuePair("Link6", new StringElement("panda_link6"))); - thePanda.addKeyValuePair(new KeyValuePair("RightFinger", new StringElement("panda_rightfinger"))); - thePanda.addKeyValuePair(new KeyValuePair("LeftFinger", new StringElement("panda_leftfinger"))); - pandaParts.setValue(thePanda); - parts.setValue(pandaParts); - firstLevel.addKeyValuePair(parts); - - KeyValuePair end_effectors = new KeyValuePair(); - end_effectors.setKey("end_effectors"); - KeyValuePair endEffectorParts = new KeyValuePair(); - endEffectorParts.setKey("panda"); - endEffectorParts.setValue(new KeyValuePair("EndEffector", new StringElement("panda_hand"))); - end_effectors.setValue(endEffectorParts); - firstLevel.addKeyValuePair(end_effectors); - - KeyValuePair goalPoses = new KeyValuePair(); - goalPoses.setKey("goal_poses"); - ListElement theGoalPoses = new ListElement(); - addPose(theGoalPoses, "0.4 0.4 0.3"); - addPose(theGoalPoses, "-0.4 0.4 0.3"); - addPose(theGoalPoses, "-0.4 -0.4 0.3"); - addPose(theGoalPoses, "0.4 0.4 0.3"); - addPose(theGoalPoses, "-0.4 0.4 0.3"); - addPose(theGoalPoses, "0.4 0.4 0.3"); - goalPoses.setValue(theGoalPoses); - firstLevel.addKeyValuePair(goalPoses); - - root.setValue(firstLevel); - doc.addComplexElement(root); - - System.out.println(doc.prettyPrint()); - } - - private static void addPose(ListElement theGoalPoses, String position) { - MappingElement goalPose1 = new MappingElement(); - goalPose1.addKeyValuePair(new KeyValuePair("position", new StringElement(position))); - goalPose1.addKeyValuePair(new KeyValuePair("orientation", new StringElement("1 1 0 0"))); - goalPose1.addKeyValuePair(new KeyValuePair("work", new StringElement("20000"))); - theGoalPoses.addElement(goalPose1); - } - - public static void main(String[] args) { - printManualYAML(); - } -} diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java deleted file mode 100644 index c083fe1d912fa74cb4461fce5fcb839f5b88a40f..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jastadd.ragconnect.compiler; - -import java.util.*; -import java.util.function.Predicate; - -import static java.util.stream.Collectors.toList; - -public class Utils { - public static <T> List<T> filterToList(Collection<T> collection, Predicate<T> predicate) { - return collection.stream().filter(predicate).collect(toList()); - } - - public static <T> Set<T> asSet(T... t) { - return new HashSet<T>(Arrays.asList(t)); - } -} diff --git a/ragconnect.base/src/main/resources/MqttHandler.jadd b/ragconnect.base/src/main/resources/MqttHandler.jadd deleted file mode 100644 index 6f40612520cfb97151600dff53c8e0d384ab441e..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/MqttHandler.jadd +++ /dev/null @@ -1,319 +0,0 @@ -import java.io.IOException; -import java.util.concurrent.TimeUnit;aspect MqttHandler { -public class MqttServerHandler { - private final java.util.Map<String, MqttHandler> handlers = new java.util.HashMap<>(); - private long time; - private java.util.concurrent.TimeUnit unit; - private String name; - - public MqttServerHandler() { - this("RagConnect"); - } - - public MqttServerHandler(String name) { - this.name = name; - setupWaitUntilReady(1, TimeUnit.SECONDS); - } - - public void setupWaitUntilReady(long time, java.util.concurrent.TimeUnit unit) { - this.time = time; - this.unit = unit; - } - - public MqttHandler resolveHandler(java.net.URI uri) throws IOException { - MqttHandler handler = handlers.get(uri.getHost()); - if (handler == null) { - // first connect to that server - handler = new MqttHandler(); - if (uri.getPort() == -1) { - handler.setHost(uri.getHost()); - } else { - handler.setHost(uri.getHost(), uri.getPort()); - } - handlers.put(uri.getHost(), handler); - } - handler.waitUntilReady(this.time, this.unit); - return handler; - } - - public boolean newConnection(java.net.URI uri, java.util.function.Consumer<byte[]> callback) throws IOException { - return resolveHandler(uri).newConnection(extractTopic(uri), callback); - } - - public void publish(java.net.URI uri, byte[] bytes) throws IOException { - resolveHandler(uri).publish(extractTopic(uri), bytes); - } - - public void publish(java.net.URI uri, byte[] bytes, boolean retain) throws IOException { - resolveHandler(uri).publish(extractTopic(uri), bytes, retain); - } - - public void publish(java.net.URI uri, byte[] bytes, - org.fusesource.mqtt.client.QoS qos, boolean retain) throws IOException { - resolveHandler(uri).publish(extractTopic(uri), bytes, qos, retain); - } - - private String extractTopic(java.net.URI uri) { - String path = uri.getPath(); - if (path.charAt(0) == '/') { - path = path.substring(1); - } - return path; - } - - public void close() { - for (MqttHandler handler : handlers.values()) { - handler.close(); - } - } - -} -/** - * Helper class to receive updates via MQTT and use callbacks to handle those messages. - * - * @author rschoene - Initial contribution - */ -public class MqttHandler { - private static final int DEFAULT_PORT = 1883; - - private final org.apache.logging.log4j.Logger logger; - private final String name; - - /** The host running the MQTT broker. */ - private java.net.URI host; - /** The connection to the MQTT broker. */ - private org.fusesource.mqtt.client.CallbackConnection connection; - /** Whether we are connected yet */ - private final java.util.concurrent.CountDownLatch readyLatch; - private boolean sendWelcomeMessage = true; - private org.fusesource.mqtt.client.QoS qos; - /** Dispatch knowledge */ - private final java.util.Map<String, java.util.List<java.util.function.Consumer<byte[]>>> callbacks; - - public MqttHandler() { - this("RagConnect"); - } - - public MqttHandler(String name) { - this.name = java.util.Objects.requireNonNull(name, "Name must be set"); - this.logger = org.apache.logging.log4j.LogManager.getLogger(MqttHandler.class); - this.callbacks = new java.util.HashMap<>(); - this.readyLatch = new java.util.concurrent.CountDownLatch(1); - this.qos = org.fusesource.mqtt.client.QoS.AT_LEAST_ONCE; - } - - public MqttHandler dontSendWelcomeMessage() { - this.sendWelcomeMessage = false; - return this; - } - - /** - * Sets the host (with default port) to receive messages from, and connects to it. - * @throws IOException if could not connect, or could not subscribe to a topic - * @return self - */ - public MqttHandler setHost(String host) throws java.io.IOException { - return setHost(host, DEFAULT_PORT); - } - - /** - * Sets the host to receive messages from, and connects to it. - * @throws IOException if could not connect, or could not subscribe to a topic - * @return self - */ - public MqttHandler setHost(String host, int port) throws java.io.IOException { - java.util.Objects.requireNonNull(host, "Host need to be set!"); - - this.host = java.net.URI.create("tcp://" + host + ":" + port); - logger.debug("Host for {} is {}", this.name, this.host); - - org.fusesource.mqtt.client.MQTT mqtt = new org.fusesource.mqtt.client.MQTT(); - mqtt.setHost(this.host); - connection = mqtt.callbackConnection(); - java.util.concurrent.atomic.AtomicReference<Throwable> error = new java.util.concurrent.atomic.AtomicReference<>(); - - // add the listener to dispatch messages later - connection.listener(new org.fusesource.mqtt.client.ExtendedListener() { - public void onConnected() { - logger.debug("Connected"); - } - - @Override - public void onDisconnected() { - logger.debug("Disconnected"); - } - - @Override - public void onPublish(org.fusesource.hawtbuf.UTF8Buffer topic, org.fusesource.hawtbuf.Buffer body, org.fusesource.mqtt.client.Callback<org.fusesource.mqtt.client.Callback<Void>> ack) { - String topicString = topic.toString(); - java.util.List<java.util.function.Consumer<byte[]>> callbackList = callbacks.get(topicString); - if (callbackList == null || callbackList.isEmpty()) { - logger.debug("Got a message, but no callback to call. Forgot to subscribe?"); - } else { - byte[] message = body.toByteArray(); -// System.out.println("message = " + Arrays.toString(message)); - for (java.util.function.Consumer<byte[]> callback : callbackList) { - callback.accept(message); - } - } - ack.onSuccess(null); // always acknowledge message - } - - @Override - public void onPublish(org.fusesource.hawtbuf.UTF8Buffer topicBuffer, org.fusesource.hawtbuf.Buffer body, Runnable ack) { - logger.warn("onPublish should not be called"); - } - - @Override - public void onFailure(Throwable cause) { -// logger.catching(cause); - error.set(cause); - } - }); - throwIf(error); - - // actually establish the connection - connection.connect(new org.fusesource.mqtt.client.Callback<Void>() { - @Override - public void onSuccess(Void value) { - if (MqttHandler.this.sendWelcomeMessage) { - connection.publish("components", (name + " is connected").getBytes(), org.fusesource.mqtt.client.QoS.AT_LEAST_ONCE, false, new org.fusesource.mqtt.client.Callback<Void>() { - @Override - public void onSuccess(Void value) { - logger.debug("success sending welcome message"); - setReady(); - } - - @Override - public void onFailure(Throwable value) { - logger.debug("failure sending welcome message", value); - } - }); - } else { - setReady(); - } - } - - @Override - public void onFailure(Throwable cause) { -// logger.error("Could not connect", cause); - error.set(cause); - } - }); - throwIf(error); - return this; - } - - public java.net.URI getHost() { - return host; - } - - private void setReady() { - readyLatch.countDown(); - } - - private void throwIf(java.util.concurrent.atomic.AtomicReference<Throwable> error) throws java.io.IOException { - if (error.get() != null) { - throw new java.io.IOException(error.get()); - } - } - - public void setQoSForSubscription(org.fusesource.mqtt.client.QoS qos) { - this.qos = qos; - } - - public boolean newConnection(String topic, java.util.function.Consumer<byte[]> callback) { - if (readyLatch.getCount() > 0) { - System.err.println("Handler not ready"); - return false; -// // should maybe be something more kind than throwing an exception here -// throw new IllegalStateException("Updater not ready"); - } - // register callback - logger.debug("new connection for {}", topic); - if (callbacks.get(topic) == null) { - callbacks.put(topic, new java.util.ArrayList<>()); - - // subscribe at broker - org.fusesource.mqtt.client.Topic[] topicArray = { new org.fusesource.mqtt.client.Topic(topic, this.qos) }; - connection.getDispatchQueue().execute(() -> { - connection.subscribe(topicArray, new org.fusesource.mqtt.client.Callback<byte[]>() { - @Override - public void onSuccess(byte[] qoses) { - logger.debug("Subscribed to {}, qoses: {}", topic, qoses); - } - - @Override - public void onFailure(Throwable cause) { - logger.error("Could not subscribe to {}", topic, cause); - } - }); - }); - } - callbacks.get(topic).add(callback); - return true; - } - - /** - * Waits until this updater is ready to receive MQTT messages. - * If it already is ready, return immediately with the value <code>true</code>. - * Otherwise waits for the given amount of time, and either return <code>true</code> within the timespan, - * if it got ready, or <code>false</code> upon a timeout. - * @param time the maximum time to wait - * @param unit the time unit of the time argument - * @return whether this updater is ready - */ - public boolean waitUntilReady(long time, java.util.concurrent.TimeUnit unit) { - try { - return readyLatch.await(time, unit); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return false; - } - - public void close() { - if (connection == null) { - logger.warn("Stopping without connection. Was setHost() called?"); - return; - } - connection.getDispatchQueue().execute(() -> { - connection.disconnect(new org.fusesource.mqtt.client.Callback<Void>() { - @Override - public void onSuccess(Void value) { - logger.info("Disconnected {} from {}", name, host); - } - - @Override - public void onFailure(Throwable ignored) { - // Disconnects never fail. And we do not care either. - } - }); - }); - } - - public void publish(String topic, byte[] bytes) { - publish(topic, bytes, false); - } - - public void publish(String topic, byte[] bytes, boolean retain) { - publish(topic, bytes, this.qos, retain); - } - - public void publish(String topic, byte[] bytes, org.fusesource.mqtt.client.QoS qos, boolean retain) { - connection.getDispatchQueue().execute(() -> { - connection.publish(topic, bytes, qos, retain, new org.fusesource.mqtt.client.Callback<Void>() { - @Override - public void onSuccess(Void value) { - logger.debug("Published some bytes to {}", topic); - } - - @Override - public void onFailure(Throwable value) { - logger.warn("Could not publish on topic '{}'", topic, value); - } - }); - }); - } -} -} diff --git a/ragconnect.base/src/main/resources/RestHandler.jadd b/ragconnect.base/src/main/resources/RestHandler.jadd deleted file mode 100644 index f7b1a83304fe7aaebe97d105514c3f192d052aec..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/RestHandler.jadd +++ /dev/null @@ -1,140 +0,0 @@ -import java.util.concurrent.TimeUnit;aspect RestHandler { -public class RestServerHandler { - private static final int DEFAULT_PORT = 4567; - private final java.util.Map<Integer, RestHandler> handlers = new java.util.HashMap<>(); - private String name; - - public RestServerHandler() { - this("RagConnect"); - } - - public RestServerHandler(String name) { - this.name = name; - } - - private RestHandler resolveHandler(java.net.URI uri) { - int port = uri.getPort() != -1 ? uri.getPort() : DEFAULT_PORT; - RestHandler handler = handlers.get(port); - if (handler == null) { - // first connect to that server - handler = new RestHandler(); - handler.setPort(port); - handlers.put(port, handler); - } - return handler; - } - - public boolean newPUTConnection(java.net.URI uri, java.util.function.Consumer<String> callback) { - resolveHandler(uri).newPUTConnection(uri.getPath(), callback); - return true; - } - - public boolean newGETConnection(java.net.URI uri, SupplierWithException<String> supplier) { - resolveHandler(uri).newGETConnection(uri.getPath(), supplier); - return true; - } - - public void close() { - for (RestHandler handler : handlers.values()) { - handler.close(); - } - } -} -/** - * Helper class to receive updates and publishes information via REST. - * @author rschoene - Initial contribution - */ -public class RestHandler { - private static final int DEFAULT_PORT = 4567; - - private final org.apache.logging.log4j.Logger logger; - private final String name; - private int port; - private final java.util.concurrent.CountDownLatch exitCondition; - /** Dispatch knowledge */ - private final java.util.Map<String, java.util.List<java.util.function.Consumer<String>>> callbacks; - private final java.util.Map<String, SupplierWithException<String>> suppliers; - - public RestHandler() { - this("RagConnect"); - } - - public RestHandler(String name) { - this.logger = org.apache.logging.log4j.LogManager.getLogger(RestHandler.class); - this.name = name; - this.port = DEFAULT_PORT; - this.exitCondition = new java.util.concurrent.CountDownLatch(1); - this.callbacks = new java.util.HashMap<>(); - this.suppliers = new java.util.HashMap<>(); - } - - public RestHandler setPort(int port) { - this.port = port; - start(); - return this; - } - - public void newPUTConnection(String path, java.util.function.Consumer<String> callback) { - if (callbacks.containsKey(path)) { - callbacks.get(path).add(callback); - } else { - // setup path - java.util.List<java.util.function.Consumer<String>> callbackList = new java.util.ArrayList<>(); - callbackList.add(callback); - callbacks.put(path, callbackList); - spark.Spark.put(path, (request, response) -> { - String content = request.body(); - java.util.Set<String> errors = new java.util.HashSet<>(); - for (java.util.function.Consumer<String> f : callbackList) { - try { - f.accept(content); - } catch (Exception e) { - errors.add(e.getMessage()); - } - } - if (errors.isEmpty()) { - return "OK"; - } else { - return makeError(response, 500, errors.stream().collect(java.util.stream.Collectors.joining("\n", "The following error(s) happened: [", "]"))); - } - }); - } - } - - public void newGETConnection(String path, SupplierWithException<String> supplier) { - if (suppliers.get(path) != null) { - logger.warn("Overriding existing supplier for '{}'", path); - } - suppliers.put(path, supplier); - spark.Spark.get(path, (request, response) -> { - try { - return supplier.get(); - } catch (Exception e) { - return makeError(response, 500, e.getMessage()); - } - }); - } - - private String makeError(spark.Response response, int statusCode, String message) { - response.status(statusCode); - return message; - } - - private void start() { - logger.info("Starting REST server at {}", this.port); - spark.Spark.port(this.port); - spark.Spark.init(); - spark.Spark.awaitInitialization(); - } - - public void close() { - spark.Spark.stop(); - spark.Spark.awaitStop(); - } - -} -@FunctionalInterface -public interface SupplierWithException<T> { - public T get() throws Exception; -} -} diff --git a/ragconnect.base/src/main/resources/dependencyDefinition.mustache b/ragconnect.base/src/main/resources/dependencyDefinition.mustache deleted file mode 100644 index 0ab8d55242816a7d3ada0491c8c7db6dcd70ee42..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/dependencyDefinition.mustache +++ /dev/null @@ -1,3 +0,0 @@ -public void {{targetParentTypeName}}.{{dependencyMethod}}({{sourceParentTypeName}} source) { - add{{internalRelationPrefix}}Source(source); -} diff --git a/ragconnect.base/src/main/resources/handleUri.mustache b/ragconnect.base/src/main/resources/handleUri.mustache deleted file mode 100644 index 1a20e7c4df2a4c54ccba4c825fff55ca89a51dec..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/handleUri.mustache +++ /dev/null @@ -1,11 +0,0 @@ -String scheme,host, path; -java.net.URI uri; -try { - uri = new java.net.URI({{connectParameterName}}); - scheme = uri.getScheme(); - host = uri.getHost(); - path = uri.getPath(); -} catch (java.net.URISyntaxException e) { - System.err.println(e.getMessage()); // Maybe re-throw error? - return false; -} diff --git a/ragconnect.base/src/main/resources/handler.mustache b/ragconnect.base/src/main/resources/handler.mustache deleted file mode 100644 index e89c451007ff309a77297b9b66fe0e20dece73b8..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/handler.mustache +++ /dev/null @@ -1,7 +0,0 @@ -aspect RagConnectHandler { -interface RagConnectHandler<T> { - boolean connectReceive(String path, java.util.function.Consumer<T> callback); - boolean sendPush(String path, T value); - boolean connectSendPull(String path, SupplierWithException<T> supplier); -} -} diff --git a/ragconnect.base/src/main/resources/log4j2.xml b/ragconnect.base/src/main/resources/log4j2.xml deleted file mode 100644 index 98cfd73c75df58d8598521bc10b043e214ec4ad8..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/log4j2.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Configuration status="INFO"> - <Appenders> - <Console name="Console" target="SYSTEM_OUT"> - <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> - </Console> - </Appenders> - <Loggers> - <Root level="info"> - <AppenderRef ref="Console"/> - </Root> - </Loggers> -</Configuration> \ No newline at end of file diff --git a/ragconnect.base/src/main/resources/mappingApplication.mustache b/ragconnect.base/src/main/resources/mappingApplication.mustache deleted file mode 100644 index 064004b94886c155be883e7b186557c6fa87d38c..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/mappingApplication.mustache +++ /dev/null @@ -1,14 +0,0 @@ -{{lastDefinitionToType}} {{lastResult}}; -try { - {{#InnerMappingDefinitions}} - {{^last}}{{toType}} {{/last}}{{outputVarName}} = {{methodName}}({{inputVarName}}); - {{/InnerMappingDefinitions}} -} catch (Exception e) { - e.printStackTrace(); - {{preemptiveReturn}} -} -{{^alwaysApply}} -if ({{{condition}}}) { - {{preemptiveReturn}} -} -{{/alwaysApply}} diff --git a/ragconnect.base/src/main/resources/mappingDefinition.mustache b/ragconnect.base/src/main/resources/mappingDefinition.mustache deleted file mode 100644 index fe26e949b7a8e446bf97947e1632624741a83726..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/mappingDefinition.mustache +++ /dev/null @@ -1,3 +0,0 @@ -protected static {{toType}} ASTNode.{{methodName}}({{fromType}} {{fromVariableName}}) throws Exception { - {{{content}}}{{!maybe print line by line to get better indentation}} -} diff --git a/ragconnect.base/src/main/resources/mqtt.mustache b/ragconnect.base/src/main/resources/mqtt.mustache deleted file mode 100644 index 9391d1091c41eee257f9e6a1368297ef743e39ce..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/mqtt.mustache +++ /dev/null @@ -1,16 +0,0 @@ -aspect MQTT { - private String {{rootNodeName}}.MqttName() { return "RagConnectMQTT"; } - private MqttServerHandler {{rootNodeName}}.{{mqttHandlerField}} = new MqttServerHandler(MqttName()); - - public void {{rootNodeName}}.{{mqttSetupWaitUntilReadyMethod}}(long time, java.util.concurrent.TimeUnit unit) { - {{mqttHandlerField}}.setupWaitUntilReady(time, unit); - } - - {{#RootTypeComponents}} - {{#first}}inh MqttServerHandler ASTNode.{{mqttHandlerAttribute}}();{{/first}} - eq {{rootNodeName}}.get{{name}}().{{mqttHandlerAttribute}}() = {{mqttHandlerField}}; - {{/RootTypeComponents}} - {{^RootTypeComponents}} - syn MqttServerHandler {{rootNodeName}}.{{mqttHandlerAttribute}}() = {{mqttHandlerField}}; - {{/RootTypeComponents}} -} diff --git a/ragconnect.base/src/main/resources/ragConnectVersion.properties b/ragconnect.base/src/main/resources/ragConnectVersion.properties deleted file mode 100644 index 8ec441610d66cd3f793075302676eb132eea35c3..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/ragConnectVersion.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Wed Jul 29 16:29:05 CEST 2020 -version=0.2.0 diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache deleted file mode 100644 index a39510d73854301efb1f05fe7f9c1fd476916ef7..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/ragconnect.mustache +++ /dev/null @@ -1,27 +0,0 @@ -{{#usesMqtt}}{{> mqtt}}{{/usesMqtt}} -{{#usesRest}}{{> rest}}{{/usesRest}} -aspect ROS2RAG { - public void {{rootNodeName}}.{{closeMethod}}() { - {{#usesMqtt}}{{mqttHandlerField}}.close();{{/usesMqtt}} - {{#usesRest}}{{restHandlerField}}.close();{{/usesRest}} - } - {{#ReceiveDefinitions}} - {{> receiveDefinition}} - {{/ReceiveDefinitions}} - - {{#SendDefinitions}} - {{> sendDefinition}} - {{/SendDefinitions}} - - {{#MappingDefinitions}} - {{> mappingDefinition}} - {{/MappingDefinitions}} - - {{#DependencyDefinitions}} - {{> dependencyDefinition}} - {{/DependencyDefinitions}} - - {{#TokenComponents}} - {{> tokenComponent}} - {{/TokenComponents}} -} diff --git a/ragconnect.base/src/main/resources/receiveDefinition.mustache b/ragconnect.base/src/main/resources/receiveDefinition.mustache deleted file mode 100644 index 1dd0e0ddbfbfd2acf03536ff41a2d740043eb34b..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/receiveDefinition.mustache +++ /dev/null @@ -1,23 +0,0 @@ -public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterName}}) throws java.io.IOException { - {{>handleUri}} - java.util.function.Consumer<byte[]> consumer = message -> { - {{> mappingApplication}} - {{#loggingEnabledForReads}} - System.out.println("[Receive] " + {{connectParameterName}} + " -> {{tokenName}} = " + {{lastResult}}); - {{/loggingEnabledForReads}} - set{{tokenName}}({{lastResult}}); - }; - switch (scheme) { - {{#usesMqtt}} - case "mqtt": return {{mqttHandlerAttribute}}().newConnection(uri, consumer); - {{/usesMqtt}} - {{#usesRest}} - case "rest": return {{restHandlerAttribute}}().newPUTConnection(uri, input -> { - consumer.accept(input.getBytes()); - }); - {{/usesRest}} - default: - System.err.println("Unknown protocol '" + scheme + "'."); - return false; - } -} diff --git a/ragconnect.base/src/main/resources/rest.mustache b/ragconnect.base/src/main/resources/rest.mustache deleted file mode 100644 index 6bbde2be4d26e519635c85a6f39f9a18514bfb19..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/rest.mustache +++ /dev/null @@ -1,12 +0,0 @@ -aspect REST { - private String {{rootNodeName}}.RestName() { return "RagConnectREST"; } - private RestServerHandler {{rootNodeName}}.{{restHandlerField}} = new RestServerHandler(RestName()); - - {{#getRootTypeComponents}} - {{#first}}inh RestServerHandler ASTNode.{{restHandlerAttribute}}();{{/first}} - eq {{rootNodeName}}.get{{name}}().{{restHandlerAttribute}}() = {{restHandlerField}}; - {{/getRootTypeComponents}} - {{^getRootTypeComponents}} - syn RestServerHandler {{rootNodeName}}.{{restHandlerAttribute}}() = {{restHandlerField}}; - {{/getRootTypeComponents}} -} diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache deleted file mode 100644 index fac4ecd37967b8047c9101b58fab273527979ab2..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/sendDefinition.mustache +++ /dev/null @@ -1,51 +0,0 @@ -private Runnable {{parentTypeName}}.{{sender}} = null; -private byte[] {{parentTypeName}}.{{lastValue}} = null; - -public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterName}}, boolean writeCurrentValue) { - {{>handleUri}} - switch (scheme) { - {{#usesMqtt}} - case "mqtt": - // MqttHandler handler = {{mqttHandlerAttribute}}().resolveHandler(uri);{{!optimize later}} - {{sender}} = () -> { - {{#loggingEnabledForWrites}} - System.out.println("[Send] {{tokenName}} = " + get{{tokenName}}() + " -> " + {{connectParameterName}}); - {{/loggingEnabledForWrites}} - try { - {{mqttHandlerAttribute}}().publish(uri, {{lastValue}}); - } catch (java.io.IOException e) { - e.printStackTrace(); - } - }; - {{updateMethod}}(); - if (writeCurrentValue) { - {{writeMethod}}(); - } - break; - {{/usesMqtt}} - {{#usesRest}} - case "rest": - {{restHandlerAttribute}}().newGETConnection(uri, () -> { - {{updateMethod}}(); - return new String({{lastValue}}); - }); - break; - {{/usesRest}} - default: - System.err.println("Unknown protocol '" + scheme + "'."); - return false; - } - return true; -} - -protected boolean {{parentTypeName}}.{{updateMethod}}() { - {{tokenResetMethod}}(); - {{> mappingApplication}} - {{lastValue}} = {{lastResult}}; - // normally we would return true here. unless no connect method was called so far to initialize {{sender}} yet - return {{sender}} != null; -} - -protected void {{parentTypeName}}.{{writeMethod}}() { - {{sender}}.run(); -} diff --git a/ragconnect.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache deleted file mode 100644 index e78efb96b846bd7aa814723472032299a70c7de3..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/resources/tokenComponent.mustache +++ /dev/null @@ -1,19 +0,0 @@ -public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) { - set{{internalName}}(value); - {{#DependencyDefinitions}} - for ({{targetParentTypeName}} target : get{{internalRelationPrefix}}TargetList()) { - {{#targetEndpointDefinition}} - {{!#isPush}} - if (target.{{updateMethod}}()) { - target.{{writeMethod}}(); - } - {{!/isPush}} - {{/targetEndpointDefinition}} - } - {{/DependencyDefinitions}} - return this; -} - -public {{javaType}} {{parentTypeName}}.get{{name}}() { - return get{{internalName}}(); -} diff --git a/ragconnect.tests/.gitignore b/ragconnect.tests/.gitignore deleted file mode 100644 index 87b4cdd3d7c6a41502ca98703abeeb69a1d536fb..0000000000000000000000000000000000000000 --- a/ragconnect.tests/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -build -src/gen-res/ -src/gen/ -out/ -*.class diff --git a/ragconnect.tests/README.md b/ragconnect.tests/README.md deleted file mode 100644 index aabbb0195519ca2c1ce1e3bb5c82af475457bb0c..0000000000000000000000000000000000000000 --- a/ragconnect.tests/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Creating a new test case - -The following things must be done: - -- Create a new directory in `src/test/01-input` and put at least grammar, the ros2rag-specification and a README.md in there. Optionally, aspect files as needed. -- Optionally, add new protobuf definitions in `src/test/proto` (they are processed automatically in this directory) -- Copy and modify the compiler instructions in `build.gradle`, e.g. `preprocessExampleTest` and `compileExampleTest` for the `example` case. Also, copy the dependsOn-Definitions. - - Change the name of the tasks - - Change the directory in `delete` spec, and in all arguments - - Add/Remove aspect files - - Change the `packageName` argument in the compile-step - - Change the `--rootNode` argument in the preprocess-step - - For debugging build problems, the `--verbose` flag in the preprocess-step can be helpful -- Create the test case itself in `src/test/java/` in the package `org.jastadd.ros2rag.tests` and import the AST files of your defined target generation package - - Extend the abstract base class `AbstractMqttTest` to have fail-fast-behaviour in case the MQTT-broker is not connected - - Remember to close all used MQTT-handling objects, like MqttHandler and the model itself after each test diff --git a/ragconnect.tests/build.gradle b/ragconnect.tests/build.gradle deleted file mode 100644 index d638ec5001a8a58505045e37e480ac7c5d08079d..0000000000000000000000000000000000000000 --- a/ragconnect.tests/build.gradle +++ /dev/null @@ -1,268 +0,0 @@ -import org.jastadd.relast.plugin.RelastPlugin -import org.jastadd.relast.plugin.RelastTest -apply plugin: 'jastadd' -apply plugin: 'com.google.protobuf' -apply plugin: RelastPlugin - -sourceCompatibility = 1.8 - -repositories { - jcenter() -} - -buildscript { - repositories.jcenter() - dependencies { - classpath 'org.jastadd:jastaddgradle:1.13.3' - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' - } -} - -dependencies { - implementation project(':ragconnect.base') - - runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4' - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.4.0' - testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.4.0' - testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.12.1' - - // mqtt - testImplementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' - - // rest and client - testImplementation group: 'com.sparkjava', name: 'spark-core', version: '2.9.2' - testImplementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.2' - testImplementation group: 'org.glassfish.jersey.core', name: 'jersey-client', version: '2.31' - testImplementation group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: '2.31' - - testImplementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' - api group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0' -} - -test { - useJUnitPlatform { - excludeTags 'mqtt' - } - - maxHeapSize = '1G' -} - -protobuf { - protoc { - // The artifact spec for the Protobuf Compiler - artifact = 'com.google.protobuf:protoc:3.0.0' - } -} - -task allTests(type: Test, dependsOn: testClasses) { - description = 'Run every test' - group = 'verification' - - useJUnitPlatform { - includeTags 'mqtt' - } -} - -relastTest { - compilerLocation = '../libs/relast.jar' -} - -File genSrc = file("src/test/java-gen"); -sourceSets.test.java.srcDir genSrc -idea.module.generatedSourceDirs += genSrc - -clean { - delete 'src/test/02-after-ragconnect/*/', 'src/test/03-after-relast/*/', 'src/test/java-gen/*/' -} - -// --- Test: Example --- -task preprocessExampleTest(type: JavaExec, group: 'verification') { - doFirst { - delete 'src/test/02-after-ragconnect/example/Test.relast', - 'src/test/02-after-ragconnect/example/MqttHandler.java', - 'src/test/02-after-ragconnect/example/RagConnect.jadd' - } - - classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--o=src/test/02-after-ragconnect/example', - 'src/test/01-input/example/Test.relast', - 'src/test/01-input/example/Test.connect', - '--rootNode=Model', - '--logReads', '--logWrites' -} - -task compileExampleTest(type: RelastTest) { - useJastAddNames = true - jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/example/Test.relast', - 'src/test/02-after-ragconnect/example/RagConnect.relast' - grammarName = 'src/test/03-after-relast/example/example' - packageName = 'example.ast' - moreInputFiles 'src/test/01-input/example/Test.jadd', - 'src/test/02-after-ragconnect/example/MqttHandler.jadd', - 'src/test/02-after-ragconnect/example/RagConnect.jadd' -} - -compileTestJava.dependsOn compileExampleTest -compileExampleTest.dependsOn preprocessExampleTest - -// --- Test: default-only-read --- -task preprocessDefaultOnlyReadTest(type: JavaExec, group: 'verification') { - doFirst { - delete 'src/test/02-after-ragconnect/defaultOnlyRead/Test.relast', - 'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.java', - 'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd' - } - - classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--o=src/test/02-after-ragconnect/defaultOnlyRead', - 'src/test/01-input/defaultOnlyRead/Test.relast', - 'src/test/01-input/defaultOnlyRead/Test.connect', - '--rootNode=A' -} - -task compileDefaultOnlyReadTest(type: RelastTest) { - useJastAddNames = true - jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/defaultOnlyRead/Test.relast', - 'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.relast' - grammarName = 'src/test/03-after-relast/defaultOnlyRead/defaultOnlyRead' - packageName = 'defaultOnlyRead.ast' - moreInputFiles 'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.jadd', - 'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd' -} - -compileTestJava.dependsOn compileDefaultOnlyReadTest -compileDefaultOnlyReadTest.dependsOn preprocessDefaultOnlyReadTest - -// --- Test: default-only-write --- -task preprocessDefaultOnlyWriteTest(type: JavaExec, group: 'verification') { - doFirst { - delete 'src/test/02-after-ragconnect/defaultOnlyWrite/Test.relast', - 'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.java', - 'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd' - } - - classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--o=src/test/02-after-ragconnect/defaultOnlyWrite', - 'src/test/01-input/defaultOnlyWrite/Test.relast', - 'src/test/01-input/defaultOnlyWrite/Test.connect', - '--rootNode=A' -} - -task compileDefaultOnlyWriteTest(type: RelastTest) { - useJastAddNames = true - jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/defaultOnlyWrite/Test.relast', - 'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.relast' - grammarName = 'src/test/03-after-relast/defaultOnlyWrite/defaultOnlyWrite' - packageName = 'defaultOnlyWrite.ast' - moreInputFiles 'src/test/01-input/defaultOnlyWrite/Test.jadd', - 'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.jadd', - 'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd' -} - -compileTestJava.dependsOn compileDefaultOnlyWriteTest -compileDefaultOnlyWriteTest.dependsOn preprocessDefaultOnlyWriteTest - -// --- Test: read1write2 --- -task preprocessRead1Write2Test(type: JavaExec, group: 'verification') { - doFirst { - delete 'src/test/02-after-ragconnect/read1write2/Test.relast', - 'src/test/02-after-ragconnect/read1write2/MqttHandler.java', - 'src/test/02-after-ragconnect/read1write2/RagConnect.jadd' - } - - classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--o=src/test/02-after-ragconnect/read1write2', - 'src/test/01-input/read1write2/Test.relast', - 'src/test/01-input/read1write2/Test.connect', - '--rootNode=A', - '--logReads', '--logWrites' -} - -task compileRead1Write2Test(type: RelastTest) { - useJastAddNames = true - jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/read1write2/Test.relast', - 'src/test/02-after-ragconnect/read1write2/RagConnect.relast' - grammarName = 'src/test/03-after-relast/read1write2/read1write2' - packageName = 'read1write2.ast' - moreInputFiles 'src/test/01-input/read1write2/Test.jadd', - 'src/test/02-after-ragconnect/read1write2/MqttHandler.jadd', - 'src/test/02-after-ragconnect/read1write2/RagConnect.jadd' -} - -compileTestJava.dependsOn compileRead1Write2Test -compileRead1Write2Test.dependsOn preprocessRead1Write2Test - -// --- Test: read2write1 --- -task preprocessRead2Write1Test(type: JavaExec, group: 'verification') { - doFirst { - delete 'src/test/02-after-ragconnect/read2write1/Test.relast', - 'src/test/02-after-ragconnect/read2write1/MqttHandler.java', - 'src/test/02-after-ragconnect/read2write1/RagConnect.jadd' - } - - classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--o=src/test/02-after-ragconnect/read2write1', - 'src/test/01-input/read2write1/Test.relast', - 'src/test/01-input/read2write1/Test.connect', - '--rootNode=A', - '--logReads', '--logWrites' -} - -task compileRead2Write1Test(type: RelastTest) { - useJastAddNames = true - jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/read2write1/Test.relast', - 'src/test/02-after-ragconnect/read2write1/RagConnect.relast' - grammarName = 'src/test/03-after-relast/read2write1/read2write1' - packageName = 'read2write1.ast' - moreInputFiles 'src/test/01-input/read2write1/Test.jadd', - 'src/test/02-after-ragconnect/read2write1/MqttHandler.jadd', - 'src/test/02-after-ragconnect/read2write1/RagConnect.jadd' -} - -compileTestJava.dependsOn compileRead2Write1Test -compileRead2Write1Test.dependsOn preprocessRead2Write1Test - -// --- Test: via --- -task preprocessViaTest(type: JavaExec, group: 'verification') { - doFirst { - delete 'src/test/02-after-ragconnect/via/Test.relast', - 'src/test/02-after-ragconnect/via/MqttHandler.java', - 'src/test/02-after-ragconnect/via/RestHandler.java', - 'src/test/02-after-ragconnect/via/RagConnect.jadd' - } - - classpath = sourceSets.main.runtimeClasspath - main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--o=src/test/02-after-ragconnect/via', - 'src/test/01-input/via/Test.relast', - 'src/test/01-input/via/Test.connect', - '--rootNode=A', '--verbose', - '--protocols=mqtt,rest', - '--logReads', '--logWrites' -} - -task compileViaTest(type: RelastTest) { - useJastAddNames = true - jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/via/Test.relast', - 'src/test/02-after-ragconnect/via/RagConnect.relast' - grammarName = 'src/test/03-after-relast/via/via' - packageName = 'via.ast' - moreInputFiles 'src/test/01-input/via/Test.jadd', - 'src/test/02-after-ragconnect/via/MqttHandler.jadd', - 'src/test/02-after-ragconnect/via/RestHandler.jadd', - 'src/test/02-after-ragconnect/via/RagConnect.jadd' -} - -compileTestJava.dependsOn compileViaTest -compileViaTest.dependsOn preprocessViaTest diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md b/ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md deleted file mode 100644 index ee05db648e9204945245cd42ad8d802d2cdab887..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Default Only Read - -Idea: Use only `ReadFromMqttDefinition`, test all default mapping definitions from `byte[]` to primitive (and boxed) types diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect deleted file mode 100644 index e274994175513ff743409068375f419b6e3141fc..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect +++ /dev/null @@ -1,15 +0,0 @@ -// --- update definitions --- -receive NativeTypes.IntValue; -receive NativeTypes.ShortValue; -receive NativeTypes.LongValue; -receive NativeTypes.FloatValue; -receive NativeTypes.DoubleValue; -receive NativeTypes.CharValue; -receive NativeTypes.StringValue; - -receive BoxedTypes.IntValue; -receive BoxedTypes.ShortValue; -receive BoxedTypes.LongValue; -receive BoxedTypes.FloatValue; -receive BoxedTypes.DoubleValue; -receive BoxedTypes.CharValue; diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast deleted file mode 100644 index 30eba76b346dace40c72ca4e172b88ef206ea063..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast +++ /dev/null @@ -1,3 +0,0 @@ -A ::= NativeTypes* BoxedTypes* ; -NativeTypes ::= <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <StringValue:String> ; -BoxedTypes ::= <IntValue:Integer> <ShortValue:Short> <LongValue:Long> <FloatValue:Float> <DoubleValue:Double> <CharValue:Character> ; diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md deleted file mode 100644 index 1bcc8d61a7854b7f9ef4bc1694f4f81caaac2aed..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Default Only Write - -Idea: Use only `WriteToMqttDefintion`, test all default mapping definitions from primitive (and boxed) types to `byte[]`. diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect deleted file mode 100644 index a48f49f60f66c3358ee513e79f2bbeb43df8d5e9..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect +++ /dev/null @@ -1,51 +0,0 @@ -// --- update definitions --- -// native types, synthesized -send NativeTypesSyn.IntValue; -send NativeTypesSyn.ShortValue; -send NativeTypesSyn.LongValue; -send NativeTypesSyn.FloatValue; -send NativeTypesSyn.DoubleValue; -send NativeTypesSyn.CharValue; -send NativeTypesSyn.StringValue; - -// boxed types, synthesized -send BoxedTypesSyn.IntValue; -send BoxedTypesSyn.ShortValue; -send BoxedTypesSyn.LongValue; -send BoxedTypesSyn.FloatValue; -send BoxedTypesSyn.DoubleValue; -send BoxedTypesSyn.CharValue; - -// --- dependency definitions --- -NativeTypesSyn.IntValue canDependOn NativeTypesSyn.DriverSyn as nativeIntDependency; -NativeTypesSyn.ShortValue canDependOn NativeTypesSyn.DriverSyn as nativeShortDependency; -NativeTypesSyn.LongValue canDependOn NativeTypesSyn.DriverSyn as nativeLongDependency; -NativeTypesSyn.FloatValue canDependOn NativeTypesSyn.DriverSyn as nativeFloatDependency; -NativeTypesSyn.DoubleValue canDependOn NativeTypesSyn.DriverSyn as nativeDoubleDependency; -NativeTypesSyn.CharValue canDependOn NativeTypesSyn.DriverSyn as nativeCharDependency; -NativeTypesSyn.StringValue canDependOn NativeTypesSyn.DriverSyn as nativeStringDependency; -BoxedTypesSyn.IntValue canDependOn BoxedTypesSyn.DriverSyn as boxedIntDependency; -BoxedTypesSyn.ShortValue canDependOn BoxedTypesSyn.DriverSyn as boxedShortDependency; -BoxedTypesSyn.LongValue canDependOn BoxedTypesSyn.DriverSyn as boxedLongDependency; -BoxedTypesSyn.FloatValue canDependOn BoxedTypesSyn.DriverSyn as boxedFloatDependency; -BoxedTypesSyn.DoubleValue canDependOn BoxedTypesSyn.DriverSyn as boxedDoubleDependency; -BoxedTypesSyn.CharValue canDependOn BoxedTypesSyn.DriverSyn as boxedCharDependency; - - -// --- inherited attributes not supported --- -//// native types, inherited -//send NativeTypesInh.IntValue; -//send NativeTypesInh.ShortValue; -//send NativeTypesInh.LongValue; -//send NativeTypesInh.FloatValue; -//send NativeTypesInh.DoubleValue; -//send NativeTypesInh.CharValue; -//send NativeTypesInh.StringValue; -// -//// boxed types, inherited -//send BoxedTypesInh.IntValue; -//send BoxedTypesInh.ShortValue; -//send BoxedTypesInh.LongValue; -//send BoxedTypesInh.FloatValue; -//send BoxedTypesInh.DoubleValue; -//send BoxedTypesInh.CharValue; diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd deleted file mode 100644 index 49bbf604d398f7a9d92e879b2b515c9e83dd3182..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd +++ /dev/null @@ -1,49 +0,0 @@ -aspect Computation { - // native types, synthesized - syn int NativeTypesSyn.getIntValue() = Integer.parseInt(getDriverSyn()); - syn short NativeTypesSyn.getShortValue() = Short.parseShort(getDriverSyn()); - syn long NativeTypesSyn.getLongValue() = Long.parseLong(getDriverSyn()); - syn float NativeTypesSyn.getFloatValue() = Float.parseFloat(getDriverSyn()); - syn double NativeTypesSyn.getDoubleValue() = Double.parseDouble(getDriverSyn()); - syn char NativeTypesSyn.getCharValue() = getDriverSyn().charAt(0); - syn String NativeTypesSyn.getStringValue() = new String(getDriverSyn()); - - // boxed types, synthesized - syn Integer BoxedTypesSyn.getIntValue() = Integer.valueOf(getDriverSyn()); - syn Short BoxedTypesSyn.getShortValue() = Short.valueOf(getDriverSyn()); - syn Long BoxedTypesSyn.getLongValue() = Long.valueOf(getDriverSyn()); - syn Float BoxedTypesSyn.getFloatValue() = Float.valueOf(getDriverSyn()); - syn Double BoxedTypesSyn.getDoubleValue() = Double.valueOf(getDriverSyn()); - syn Character BoxedTypesSyn.getCharValue() = getDriverSyn().charAt(0); - -// --- inherited attributes not supported --- -// // native types, inherited -// inh int NativeTypesInh.getIntValue(); -// eq A.getNativeTypesInh().getIntValue() = Integer.parseInt(getDriverInh()); -// inh short NativeTypesInh.getShortValue(); -// eq A.getNativeTypesInh().getShortValue() = Short.parseShort(getDriverInh()); -// inh long NativeTypesInh.getLongValue(); -// eq A.getNativeTypesInh().getLongValue() = Long.parseLong(getDriverInh()); -// inh float NativeTypesInh.getFloatValue(); -// eq A.getNativeTypesInh().getFloatValue() = Float.parseFloat(getDriverInh()); -// inh double NativeTypesInh.getDoubleValue(); -// eq A.getNativeTypesInh().getDoubleValue() = Double.parseDouble(getDriverInh()); -// inh char NativeTypesInh.getCharValue(); -// eq A.getNativeTypesInh().getCharValue() = getDriverInh().charAt(0); -// inh String NativeTypesInh.getStringValue(); -// eq A.getNativeTypesInh().getStringValue() = new String(getDriverInh()); -// -// // boxed types, inherited -// inh Integer BoxedTypesInh.getIntValue(); -// eq A.getBoxedTypesInh().getIntValue() = Integer.valueOf(getDriverInh()); -// inh Short BoxedTypesInh.getShortValue(); -// eq A.getBoxedTypesInh().getShortValue() = Short.valueOf(getDriverInh()); -// inh Long BoxedTypesInh.getLongValue(); -// eq A.getBoxedTypesInh().getLongValue() = Long.valueOf(getDriverInh()); -// inh Float BoxedTypesInh.getFloatValue(); -// eq A.getBoxedTypesInh().getFloatValue() = Float.valueOf(getDriverInh()); -// inh Double BoxedTypesInh.getDoubleValue(); -// eq A.getBoxedTypesInh().getDoubleValue() = Double.valueOf(getDriverInh()); -// inh Character BoxedTypesInh.getCharValue(); -// eq A.getBoxedTypesInh().getCharValue() = getDriverInh().charAt(0); -} diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast deleted file mode 100644 index e0fd7829b88b8fac04b64393e0262c69b4ac6a62..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast +++ /dev/null @@ -1,11 +0,0 @@ -A ::= NativeTypesSyn* BoxedTypesSyn* <DriverInh:String>; -// native types, synthesized -NativeTypesSyn ::= <DriverSyn:String> /<IntValue:int>/ /<ShortValue:short>/ /<LongValue:long>/ /<FloatValue:float>/ /<DoubleValue:double>/ /<CharValue:char>/ /<StringValue:String>/ ; -// boxed types, synthesized -BoxedTypesSyn ::= <DriverSyn:String> /<IntValue:Integer>/ /<ShortValue:Short>/ /<LongValue:Long>/ /<FloatValue:Float>/ /<DoubleValue:Double>/ /<CharValue:Character>/ ; - -// --- inherited attributes not supported --- -//// native types, inherited -//NativeTypesInh ::= /<IntValue:int>/ /<ShortValue:short>/ /<LongValue:long>/ /<FloatValue:float>/ /<DoubleValue:double>/ /<CharValue:char>/ /<StringValue:String>/ ; -//// boxed types, inherited -//BoxedTypesInh ::= /<IntValue:Integer>/ /<ShortValue:Short>/ /<LongValue:Long>/ /<FloatValue:Float>/ /<DoubleValue:Double>/ /<CharValue:Character>/ ; diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.connect b/ragconnect.tests/src/test/01-input/errors/Errors.connect deleted file mode 100644 index bd57822a6c70198cc36698f790fa90655ed4db73..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/errors/Errors.connect +++ /dev/null @@ -1,72 +0,0 @@ -// --- update receive definitions --- -// Error: there must not be two receive definitions for the same token -receive B.DoubledValue ; -receive B.DoubledValue using IntToInt ; - -// NOT HANDLED \\ Error: the token must be resolvable within the parent type -// NOT HANDLED \\ receive B.NonExisting ; - -// Error: the Token must not be a TokenNTA (i.e., check for !Token.getNTA()) -receive B.ErrorNTA ; - -// Error: from-type of first mapping must be byte[] or a supported primitive type -receive B.ErrorTypeOfFirstMapping using ListToList ; - -// Error: to-type of last mapping must be type of the Token -receive B.ErrorTypeOfLastMapping using StringToList ; - -// Error: types of mappings must match (modulo inheritance) -receive B.ErrorTypeMismatch using StringToList, IntToInt ; - -// --- update send definitions --- -// NOT HANDLED \\ Error: the token must be resolvable within the parent type -// NOT HANDLED \\ receive C.NonExisting ; - -// Error: Token must be a TokenNTA (i.e., check for Token.getNTA()) -send C.ErrorNotNTA ; - -// Error: from-type of first mapping must be type of Token -send C.ErrorTypeOfFirstMapping using IntToInt ; - -// Error: to-type of last mapping must be byte[] or a supported primitive type -send C.ErrorTypeOfLastMapping1 using StringToList ; -send C.ErrorTypeOfLastMapping2 ; - -// Error: types of mappings must match (modulo inheritance) -send C.ErrorTypeMismatch using StringToList, IntToInt ; - -// Error: no more than one send mapping for each TokenComponent -send C.DoubledValue ; -send C.DoubledValue using IntToInt ; - -// --- dependency definitions --- -// NOT HANDLED \\ Error: Both, source and target must be resolvable within the parent type -// NOT HANDLED \\ D.SourceNonExistingTarget canDependOn D.NonExisting as NonExistingTarget ; -// NOT HANDLED \\ D.NonExisting canDependOn D.TargetNonExistingSource as NonExistingSource ; - -// Error: There must be a send update definition for the target token -D.SourceNoWriteDef canDependOn D.TargetNoWriteDef as NoWriteDef ; - -// Error: The name of a dependency definition must not be equal to a list-node on the source -D.SourceSameAsListNode canDependOn D.TargetSameAsListNode as MyList ; -send D.TargetSameAsListNode; - -// Error: There must not be two dependency definitions with the same name -D.SourceDoubledValue canDependOn D.TargetDoubledValue as DoubledValue ; -D.SourceDoubledValue canDependOn D.TargetDoubledValue as DoubledValue ; -send D.TargetDoubledValue; - -// --- mapping definitions --- -ListToList maps java.util.List<String> list to java.util.List<String> {: - return list; -:} - -StringToList maps String s to List<String> {: - java.util.List<String> result = new java.util.ArrayList<>(); - result.add(s); - return result; -:} - -IntToInt maps int number to int {: - return number + 1; -:} diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.expected b/ragconnect.tests/src/test/01-input/errors/Errors.expected deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.relast b/ragconnect.tests/src/test/01-input/errors/Errors.relast deleted file mode 100644 index fcde7df1d2e48b9591ddea31aaa3b0a9efdd4cfa..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/errors/Errors.relast +++ /dev/null @@ -1,15 +0,0 @@ -A ::= B C D ; - -// read definitions -B ::= /<ErrorNTA:String>/ <ErrorTypeOfFirstMapping:String> <ErrorTypeOfLastMapping:String> <DoubledValue:int> <ErrorTypeMismatch:String> ; - -// write definitions -C ::= <ErrorNotNTA:String> /<ErrorTypeOfFirstMapping:String>/ /<ErrorTypeOfLastMapping1:String>/ /<ErrorTypeOfLastMapping2:List<String>>/ /<ErrorTypeMismatch:String>/ /<DoubledValue:int>/ ; - -// dependency definitions -D ::= <SourceNonExistingTarget> - /<TargetNonExistingSource>/ - <SourceNoWriteDef> /<TargetNoWriteDef>/ - <SourceSameAsListNode> /<TargetSameAsListNode>/ - <SourceDoubledValue> /<TargetDoubledValue>/ - MyList:D* ; diff --git a/ragconnect.tests/src/test/01-input/errors/README.md b/ragconnect.tests/src/test/01-input/errors/README.md deleted file mode 100644 index e8efed33eb3868441a63dc719e3e92993a2c9d49..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/errors/README.md +++ /dev/null @@ -1,25 +0,0 @@ -Ideas for errors: - -- Read-Update - - the token must be resolvable within the parent type - - the Token must not be a TokenNTA (i.e., check for `!Token.getNTA()`) - - type of first mapping must be `byte[]` - - type of last mapping must be type of the Token - - types of mappings must match (modulo inheritance) -- Write-Update - - the token must be resolvable within the parent type - - Token must be a TokenNTA (i.e., check for `Token.getNTA()`) - - type of first mapping must be type of Token - - type of last mapping must be `byte[]` - - types of mappings must match (modulo inheritance) - - no more than one write mapping for each TokenComponent -- for all type checks, there are three cases regarding the two types to check against: - 1) both are nonterminal types, check with grammar - 2) both are known classes, check with `Class.forName()` and subclass-checking-methods - 3) otherwise issue warning, that types could not be matched -- dependency-definition - - There **must be** a write update definition for the target token - - Otherwise there are missing update and write methods used in the virtual setter - - Both, source and target must be resolvable within the parent type - - The name of a dependency definition must not be equal to a list-node on the source - - There must not be two dependency definitions with the same name diff --git a/ragconnect.tests/src/test/01-input/example/README.md b/ragconnect.tests/src/test/01-input/example/README.md deleted file mode 100644 index 7665b437a513602587474904ef08135efee13b44..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/example/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Example - -Idea: Use the motivating example from our paper as a test case, including one read, one write update definition diff --git a/ragconnect.tests/src/test/01-input/example/Test.connect b/ragconnect.tests/src/test/01-input/example/Test.connect deleted file mode 100644 index 2a26051b743145ad8af6ad7b8ea84ad58ce1348f..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/example/Test.connect +++ /dev/null @@ -1,31 +0,0 @@ -/* Version 2020-07-15 */ -// --- update definitions --- -receive Link.CurrentPosition using ParseRobotState, RobotStateToIntPosition ; -send RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ; - -// --- dependency definitions --- -RobotArm.AppropriateSpeed canDependOn Link.CurrentPosition as dependency1 ; - -// --- mapping definitions --- -ParseRobotState maps byte[] bytes to robot.RobotStateOuterClass.RobotState {: - TestCounter.INSTANCE.numberParseLinkState += 1; - return robot.RobotStateOuterClass.RobotState.parseFrom(bytes); -:} - -SerializeRobotConfig maps config.Config.RobotConfig rc to byte[] {: - TestCounter.INSTANCE.numberSerializeRobotConfig += 1; - return rc.toByteArray(); -:} - -RobotStateToIntPosition maps robot.RobotStateOuterClass.RobotState rs to IntPosition {: - TestCounter.INSTANCE.numberLinkStateToIntPosition += 1; - robot.RobotStateOuterClass.RobotState.Position p = rs.getPosition(); - return IntPosition.of((int) (Math.round(p.getX() * 10)), (int) (Math.round(p.getY() * 10)), (int) (Math.round(p.getZ() * 10))); -:} - -CreateSpeedMessage maps double speed to config.Config.RobotConfig {: - TestCounter.INSTANCE.numberCreateSpeedMessage += 1; - return config.Config.RobotConfig.newBuilder() - .setSpeed(speed) - .build(); -:} diff --git a/ragconnect.tests/src/test/01-input/example/Test.jadd b/ragconnect.tests/src/test/01-input/example/Test.jadd deleted file mode 100644 index b62b9aee7cb344c587993feefccdd64ab0bf6e4b..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/example/Test.jadd +++ /dev/null @@ -1,95 +0,0 @@ -aspect GrammarTypes { - public class TestCounter { - public static TestCounter INSTANCE = new TestCounter(); - public int numberParseLinkState = 0; - public int numberSerializeRobotConfig = 0; - public int numberLinkStateToIntPosition = 0; - public int numberCreateSpeedMessage = 0; - public int numberInSafetyZone = 0; - public static void reset() { - TestCounter.INSTANCE = new TestCounter(); - } - } - - public class IntPosition { - private final int x, y, z; - - private IntPosition(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - } - - public static IntPosition of(int x, int y, int z) { - return new IntPosition(x, y, z); - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getZ() { - return z; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - IntPosition that = (IntPosition) o; - return x == that.x && - y == that.y && - z == that.z; - } - - @Override - public int hashCode() { - return java.util.Objects.hash(x, y, z); - } - - @Override - public String toString() { - return "(" + x + ", " + y + ", " + z + ")"; - } - } - - inh Model RobotArm.model(); - eq Model.getRobotArm().model() = this; - - inh RobotArm Link.containingRobotArm(); - eq RobotArm.getLink().containingRobotArm() = this; - eq RobotArm.getEndEffector().containingRobotArm() = this; - - syn boolean RobotArm.isInSafetyZone() { - TestCounter.INSTANCE.numberInSafetyZone += 1; - for (Link link : getLinkList()) { - if (model().getZoneModel().isInSafetyZone(link.getCurrentPosition())) { - return true; - } - } - return model().getZoneModel().isInSafetyZone(getEndEffector().getCurrentPosition()); - } - - cache ZoneModel.isInSafetyZone(IntPosition pos); - syn boolean ZoneModel.isInSafetyZone(IntPosition pos) { - for (Zone sz : getSafetyZoneList()) { - for (Coordinate coordinate : sz.getCoordinateList()) { - if (coordinate.getPosition().equals(pos)) { - return true; - } - } - } - return false; - } - - syn double RobotArm.speedLow() = 0.4d; - syn double RobotArm.speedHigh() = 1.0d; - - syn double RobotArm.getAppropriateSpeed() { - return isInSafetyZone() ? speedLow() : speedHigh(); - } -} diff --git a/ragconnect.tests/src/test/01-input/example/Test.relast b/ragconnect.tests/src/test/01-input/example/Test.relast deleted file mode 100644 index b8d932ae470e4bf3dc433f8610eec1f05016e595..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/example/Test.relast +++ /dev/null @@ -1,13 +0,0 @@ -Model ::= RobotArm ZoneModel ; - -ZoneModel ::= SafetyZone:Zone* ; - -Zone ::= Coordinate* ; - -RobotArm ::= Link* EndEffector /<AppropriateSpeed:double>/ ; - -Link ::= <Name:String> <CurrentPosition:IntPosition> ; - -EndEffector : Link; - -Coordinate ::= <Position:IntPosition> ; diff --git a/ragconnect.tests/src/test/01-input/example/config.json b/ragconnect.tests/src/test/01-input/example/config.json deleted file mode 100644 index 02843152a51197a04bce4e8e54ad4ec0f703eca5..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/example/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "joints": [ - {"name": "Joint1", "topic": "robot/arm/joint1"}, - {"name": "Joint2", "topic": "robot/arm/joint2"}, - {"name": "EndEffector", "topic": "-", "isEndEffector": true} - ], - "robotConfigTopic": "robot/config", - "dataConfigTopic": "-" -} diff --git a/ragconnect.tests/src/test/01-input/read1write2/README.md b/ragconnect.tests/src/test/01-input/read1write2/README.md deleted file mode 100644 index 197eeb5b1399a079bd16c9e928622732511f7ca1..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/read1write2/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Read one - Write two - -Idea: Define Read-Update for one terminal, add dependencies to two other terminals, which each have Write-Update defined. Test, whether code gets generated correctly and that write is trigger for each of the two terminals upon read. diff --git a/ragconnect.tests/src/test/01-input/read1write2/Test.connect b/ragconnect.tests/src/test/01-input/read1write2/Test.connect deleted file mode 100644 index e826f1d040d1668ae5d5d56a83e5b4e5e96a7290..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/read1write2/Test.connect +++ /dev/null @@ -1,18 +0,0 @@ -// --- update definitions --- -// OnSameNonterminal -receive OnSameNonterminal.Input; -send OnSameNonterminal.OutInteger; -send OnSameNonterminal.OutString; - -// OnDifferentNonterminal -receive OnDifferentNonterminal.Input; -send TheOther.OutInteger; -send TheOther.OutString; - -// --- dependency definitions --- -// OnSameNonterminal -OnSameNonterminal.OutInteger canDependOn OnSameNonterminal.Input as IntDependency; -OnSameNonterminal.OutString canDependOn OnSameNonterminal.Input as StringDependency; -// OnDifferentNonterminal -TheOther.OutInteger canDependOn OnDifferentNonterminal.Input as IntDependency; -TheOther.OutString canDependOn OnDifferentNonterminal.Input as StringDependency; diff --git a/ragconnect.tests/src/test/01-input/read1write2/Test.jadd b/ragconnect.tests/src/test/01-input/read1write2/Test.jadd deleted file mode 100644 index 490772fcc7dcd1f27841c84eaa8a0231851ed6cc..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/read1write2/Test.jadd +++ /dev/null @@ -1,11 +0,0 @@ -aspect Computation{ - // OnSameNonterminal - syn int OnSameNonterminal.getOutInteger() = Integer.parseInt(getInput()); - syn String OnSameNonterminal.getOutString() = "prefix" + getInput(); - - // OnDifferentNonterminal - syn int TheOther.getOutInteger() = Integer.parseInt(input()); - syn String TheOther.getOutString() = "prefix" + input(); - inh String TheOther.input(); - eq OnDifferentNonterminal.getTheOther().input() = getInput(); -} diff --git a/ragconnect.tests/src/test/01-input/read1write2/Test.relast b/ragconnect.tests/src/test/01-input/read1write2/Test.relast deleted file mode 100644 index fa0b171c4b96f097e6812f34434fc60801bc307c..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/read1write2/Test.relast +++ /dev/null @@ -1,4 +0,0 @@ -A ::= OnSameNonterminal OnDifferentNonterminal ; -OnSameNonterminal ::= <Input:String> /<OutInteger:int>/ /<OutString:String>/ ; -OnDifferentNonterminal ::= <Input:String> TheOther* ; -TheOther ::= /<OutInteger:int>/ /<OutString:String>/ ; diff --git a/ragconnect.tests/src/test/01-input/read2write1/Test.connect b/ragconnect.tests/src/test/01-input/read2write1/Test.connect deleted file mode 100644 index 4c2a9b237acb5b42f274a2f095fcb74b4132a49d..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/read2write1/Test.connect +++ /dev/null @@ -1,18 +0,0 @@ -// --- update definitions --- -// OnSameNonterminal -receive OnSameNonterminal.Input1; -receive OnSameNonterminal.Input2; -send OnSameNonterminal.OutInteger; - -// OnDifferentNonterminal -receive OnDifferentNonterminal.Input1; -receive OnDifferentNonterminal.Input2; -send TheOther.OutInteger; - -// --- dependency definitions --- -// OnSameNonterminal -OnSameNonterminal.OutInteger canDependOn OnSameNonterminal.Input1 as Int1Dependency; -OnSameNonterminal.OutInteger canDependOn OnSameNonterminal.Input2 as Int2Dependency; -// OnDifferentNonterminal -TheOther.OutInteger canDependOn OnDifferentNonterminal.Input1 as Int1Dependency; -TheOther.OutInteger canDependOn OnDifferentNonterminal.Input2 as Int2Dependency; diff --git a/ragconnect.tests/src/test/01-input/read2write1/Test.jadd b/ragconnect.tests/src/test/01-input/read2write1/Test.jadd deleted file mode 100644 index 4d31f1a6441311469f8f93cd150e6c8bb353877e..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/read2write1/Test.jadd +++ /dev/null @@ -1,11 +0,0 @@ -aspect Computation{ - // OnSameNonterminal - syn int OnSameNonterminal.getOutInteger() = Integer.parseInt(getInput1() + getInput2()); - - // OnDifferentNonterminal - syn int TheOther.getOutInteger() = Integer.parseInt(input1() + input2()); - inh String TheOther.input1(); - eq OnDifferentNonterminal.getTheOther().input1() = getInput1(); - inh String TheOther.input2(); - eq OnDifferentNonterminal.getTheOther().input2() = getInput2(); -} diff --git a/ragconnect.tests/src/test/01-input/read2write1/Test.relast b/ragconnect.tests/src/test/01-input/read2write1/Test.relast deleted file mode 100644 index afe0125760afe222c830f383536f6e2f97c8f656..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/read2write1/Test.relast +++ /dev/null @@ -1,4 +0,0 @@ -A ::= OnSameNonterminal OnDifferentNonterminal ; -OnSameNonterminal ::= <Input1:String> <Input2:String> /<OutInteger:int>/ ; -OnDifferentNonterminal ::= <Input1:String> <Input2:String> TheOther* ; -TheOther ::= /<OutInteger:int>/ ; diff --git a/ragconnect.tests/src/test/01-input/via/Test.connect b/ragconnect.tests/src/test/01-input/via/Test.connect deleted file mode 100644 index e4d2862a651dd6e68f67d2a492b6105a15f0a77c..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/via/Test.connect +++ /dev/null @@ -1,33 +0,0 @@ -receive A.Mqtt2MqttInput using MarkMqttInput ; -receive A.Rest2RestInput using MarkRestInput ; -receive A.Mqtt2RestInput using MarkMqttInput ; -receive A.Rest2MqttInput using MarkRestInput ; -receive A.Both2BothInput ; - -send A.Mqtt2MqttOutput using MarkMqttOutput ; -send A.Rest2RestOutput using MarkRestOutput ; -send A.Mqtt2RestOutput using MarkRestOutput ; -send A.Rest2MqttOutput using MarkMqttOutput ; -send A.Both2RestOutput using MarkRestOutput ; -send A.Both2MqttOutput using MarkMqttOutput ; - -A.Mqtt2MqttOutput canDependOn A.Mqtt2MqttInput as dependencyMqtt2Mqtt ; -A.Rest2RestOutput canDependOn A.Rest2RestInput as dependencyRest2Rest ; -A.Mqtt2RestOutput canDependOn A.Mqtt2RestInput as dependencyMqtt2Rest ; -A.Rest2MqttOutput canDependOn A.Rest2MqttInput as dependencyRest2Mqtt ; -A.Both2RestOutput canDependOn A.Both2BothInput as dependencyBoth2Rest ; -A.Both2MqttOutput canDependOn A.Both2BothInput as dependencyBoth2Mqtt ; - -MarkMqttInput maps String s to String {: - return "FromMqtt-" + s; -:} -MarkRestInput maps String s to String {: - return "FromRest-" + s; -:} - -MarkMqttOutput maps String s to String {: - return s + "-ToMqtt"; -:} -MarkRestOutput maps String s to String {: - return s + "-ToRest"; -:} diff --git a/ragconnect.tests/src/test/01-input/via/Test.jadd b/ragconnect.tests/src/test/01-input/via/Test.jadd deleted file mode 100644 index 9d25387d26e651fe25a937a56a863311b4b7b69a..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/via/Test.jadd +++ /dev/null @@ -1,8 +0,0 @@ -aspect Computation { - syn lazy String A.getMqtt2MqttOutput() = getMqtt2MqttInput() + "-M2M" ; - syn lazy String A.getRest2RestOutput() = getRest2RestInput() + "-R2R" ; - syn lazy String A.getMqtt2RestOutput() = getMqtt2RestInput() + "-M2R" ; - syn lazy String A.getRest2MqttOutput() = getRest2MqttInput() + "-R2M" ; - syn lazy String A.getBoth2MqttOutput() = getBoth2BothInput() + "-B2M" ; - syn lazy String A.getBoth2RestOutput() = getBoth2BothInput() + "-B2R" ; -} diff --git a/ragconnect.tests/src/test/01-input/via/Test.relast b/ragconnect.tests/src/test/01-input/via/Test.relast deleted file mode 100644 index 1e707fbbc04b1204381351d0c38e826fcbcc8b80..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/01-input/via/Test.relast +++ /dev/null @@ -1,5 +0,0 @@ -A ::= <Mqtt2MqttInput> /<Mqtt2MqttOutput>/ - <Rest2RestInput> /<Rest2RestOutput>/ - <Mqtt2RestInput> /<Mqtt2RestOutput>/ - <Rest2MqttInput> /<Rest2MqttOutput>/ - <Both2BothInput> /<Both2MqttOutput>/ /<Both2RestOutput>/; diff --git a/ragconnect.tests/src/test/02-after-ragconnect/.gitignore b/ragconnect.tests/src/test/02-after-ragconnect/.gitignore deleted file mode 100644 index d6b7ef32c8478a48c3994dcadc86837f4371184d..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/02-after-ragconnect/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/ragconnect.tests/src/test/03-after-relast/.gitignore b/ragconnect.tests/src/test/03-after-relast/.gitignore deleted file mode 100644 index d6b7ef32c8478a48c3994dcadc86837f4371184d..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/03-after-relast/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/ragconnect.tests/src/test/java-gen/.gitignore b/ragconnect.tests/src/test/java-gen/.gitignore deleted file mode 100644 index d6b7ef32c8478a48c3994dcadc86837f4371184d..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java-gen/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractMqttTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractMqttTest.java deleted file mode 100644 index efaa302508d351f8d1fce557b49634527b54ac6e..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractMqttTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import defaultOnlyRead.ast.MqttHandler; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Tag; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -/** - * Base class for tests ensuring running mqtt broker. - * - * @author rschoene - Initial contribution - */ -@Tag("mqtt") -public abstract class AbstractMqttTest { - static boolean checkDone = false; - static Boolean checkResult; - - @BeforeAll - public static void checkMqttConnection() { - if (!checkDone) { - checkDone = true; - try { - checkResult = new MqttHandler() - .dontSendWelcomeMessage() - .setHost(TestUtils.getMqttHost()) - .waitUntilReady(2, TimeUnit.SECONDS); - } catch (IOException e) { - checkResult = false; - } - } - if (!checkResult) { - throw new IllegalStateException("Mqtt Broker not ready!"); - } - } -} diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java deleted file mode 100644 index 3746ceb3eaf8c83671747000e1fbf70ff37b9e96..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import defaultOnlyRead.ast.A; -import defaultOnlyRead.ast.BoxedTypes; -import defaultOnlyRead.ast.MqttHandler; -import defaultOnlyRead.ast.NativeTypes; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.concurrent.TimeUnit; - -import static org.jastadd.ragconnect.tests.TestUtils.mqttUri; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Test case "defaultOnlyRead". - * - * @author rschoene - Initial contribution - */ -public class DefaultOnlyReadTest extends AbstractMqttTest { - - private static final String TOPIC_NATIVE_INT = "native/int"; - private static final String TOPIC_NATIVE_SHORT = "native/short"; - private static final String TOPIC_NATIVE_LONG = "native/long"; - private static final String TOPIC_NATIVE_FLOAT = "native/float"; - private static final String TOPIC_NATIVE_DOUBLE = "native/double"; - private static final String TOPIC_NATIVE_CHAR = "native/char"; - private static final String TOPIC_NATIVE_STRING = "native/string"; - - private static final String TOPIC_BOXED_INTEGER = "boxed/Integer"; - private static final String TOPIC_BOXED_SHORT = "boxed/Short"; - private static final String TOPIC_BOXED_LONG = "boxed/Long"; - private static final String TOPIC_BOXED_FLOAT = "boxed/Float"; - private static final String TOPIC_BOXED_DOUBLE = "boxed/Double"; - private static final String TOPIC_BOXED_CHARACTER = "boxed/Character"; - - private A model; - private NativeTypes integers; - private NativeTypes floats; - private NativeTypes chars; - private BoxedTypes allBoxed; - private MqttHandler sender; - - @AfterEach - public void closeConnections() { - if (sender != null) { - sender.close(); - } - if (model != null) { - model.ragconnectCloseConnections(); - } - } - - - @Test - public void buildModel() { - createModel(); - } - - @Test - public void communicate() throws IOException, InterruptedException { - createModel(); - model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS); - - integers.connectIntValue(mqttUri(TOPIC_NATIVE_INT)); - integers.connectShortValue(mqttUri(TOPIC_NATIVE_SHORT)); - integers.connectLongValue(mqttUri(TOPIC_NATIVE_LONG)); - floats.connectFloatValue(mqttUri(TOPIC_NATIVE_FLOAT)); - floats.connectDoubleValue(mqttUri(TOPIC_NATIVE_DOUBLE)); - chars.connectCharValue(mqttUri(TOPIC_NATIVE_CHAR)); - chars.connectStringValue(mqttUri(TOPIC_NATIVE_STRING)); - allBoxed.connectIntValue(mqttUri(TOPIC_BOXED_INTEGER)); - allBoxed.connectShortValue(mqttUri(TOPIC_BOXED_SHORT)); - allBoxed.connectLongValue(mqttUri(TOPIC_BOXED_LONG)); - allBoxed.connectFloatValue(mqttUri(TOPIC_BOXED_FLOAT)); - allBoxed.connectDoubleValue(mqttUri(TOPIC_BOXED_DOUBLE)); - allBoxed.connectCharValue(mqttUri(TOPIC_BOXED_CHARACTER)); - - sender = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost()); - assertTrue(sender.waitUntilReady(2, TimeUnit.SECONDS)); - - final int expectedIntValue = 1; - final short expectedShortValue = 2; - final long expectedLongValue = 3L; - final float expectedFloatValue = 4.1f; - final double expectedDoubleValue = 5.2; - final char expectedCharValue = 'c'; - final String expectedStringValue = "6.3"; - - sender.publish(TOPIC_NATIVE_INT, ByteBuffer.allocate(4).putInt(expectedIntValue).array()); - sender.publish(TOPIC_NATIVE_SHORT, ByteBuffer.allocate(2).putShort(expectedShortValue).array()); - sender.publish(TOPIC_NATIVE_LONG, ByteBuffer.allocate(8).putLong(expectedLongValue).array()); - sender.publish(TOPIC_NATIVE_FLOAT, ByteBuffer.allocate(4).putFloat(expectedFloatValue).array()); - sender.publish(TOPIC_NATIVE_DOUBLE, ByteBuffer.allocate(8).putDouble(expectedDoubleValue).array()); - sender.publish(TOPIC_NATIVE_CHAR, ByteBuffer.allocate(2).putChar(expectedCharValue).array()); - sender.publish(TOPIC_NATIVE_STRING, expectedStringValue.getBytes()); - - sender.publish(TOPIC_BOXED_INTEGER, ByteBuffer.allocate(4).putInt(expectedIntValue).array()); - sender.publish(TOPIC_BOXED_SHORT, ByteBuffer.allocate(2).putShort(expectedShortValue).array()); - sender.publish(TOPIC_BOXED_LONG, ByteBuffer.allocate(8).putLong(expectedLongValue).array()); - sender.publish(TOPIC_BOXED_FLOAT, ByteBuffer.allocate(4).putFloat(expectedFloatValue).array()); - sender.publish(TOPIC_BOXED_DOUBLE, ByteBuffer.allocate(8).putDouble(expectedDoubleValue).array()); - sender.publish(TOPIC_BOXED_CHARACTER, ByteBuffer.allocate(2).putChar(expectedCharValue).array()); - - TestUtils.waitForMqtt(); - - assertEquals(expectedIntValue, integers.getIntValue()); - assertEquals(expectedShortValue, integers.getShortValue()); - assertEquals(expectedLongValue, integers.getLongValue()); - assertEquals(expectedFloatValue, floats.getFloatValue(), TestUtils.DELTA); - assertEquals(expectedDoubleValue, floats.getDoubleValue(), TestUtils.DELTA); - assertEquals(expectedCharValue, chars.getCharValue()); - assertEquals(expectedStringValue, chars.getStringValue()); - - assertEquals(expectedIntValue, allBoxed.getIntValue().intValue()); - assertEquals(expectedShortValue, allBoxed.getShortValue().shortValue()); - assertEquals(expectedLongValue, allBoxed.getLongValue().longValue()); - assertEquals(expectedFloatValue, allBoxed.getFloatValue(), TestUtils.DELTA); - assertEquals(expectedDoubleValue, allBoxed.getDoubleValue(), TestUtils.DELTA); - assertEquals(expectedCharValue, allBoxed.getCharValue().charValue()); - } - - private void createModel() { - model = new A(); - integers = new NativeTypes(); - model.addNativeTypes(integers); - floats = new NativeTypes(); - model.addNativeTypes(floats); - chars = new NativeTypes(); - model.addNativeTypes(chars); - allBoxed = new BoxedTypes(); - model.addBoxedTypes(allBoxed); - } - -} diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java deleted file mode 100644 index 80bd95c603da385184927862b42a6f54b1d4f57e..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java +++ /dev/null @@ -1,319 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import defaultOnlyWrite.ast.A; -import defaultOnlyWrite.ast.BoxedTypesSyn; -import defaultOnlyWrite.ast.MqttHandler; -import defaultOnlyWrite.ast.NativeTypesSyn; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import static org.jastadd.ragconnect.tests.TestUtils.mqttUri; -import static org.junit.jupiter.api.Assertions.*; - -/** - * Test case "defaultOnlyRead". - * - * @author rschoene - Initial contribution - */ -public class DefaultOnlyWriteTest extends AbstractMqttTest { - - private static final String TOPIC_NATIVE_INT = "native/int"; - private static final String TOPIC_NATIVE_SHORT = "native/short"; - private static final String TOPIC_NATIVE_LONG = "native/long"; - private static final String TOPIC_NATIVE_FLOAT = "native/float"; - private static final String TOPIC_NATIVE_DOUBLE = "native/double"; - private static final String TOPIC_NATIVE_CHAR = "native/char"; - private static final String TOPIC_NATIVE_STRING = "native/string"; - - private static final String TOPIC_BOXED_INTEGER = "boxed/Integer"; - private static final String TOPIC_BOXED_SHORT = "boxed/Short"; - private static final String TOPIC_BOXED_LONG = "boxed/Long"; - private static final String TOPIC_BOXED_FLOAT = "boxed/Float"; - private static final String TOPIC_BOXED_DOUBLE = "boxed/Double"; - private static final String TOPIC_BOXED_CHARACTER = "boxed/Character"; - - private A model; - private NativeTypesSyn nativeIntegers; - private NativeTypesSyn nativeFloats; - private NativeTypesSyn nativeChars; - private BoxedTypesSyn boxedIntegers; - private BoxedTypesSyn boxedFloats; - private BoxedTypesSyn boxedChars; - private MqttHandler receiver; - private ReceiverData data; - - @AfterEach - public void closeConnections() { - if (receiver != null) { - receiver.close(); - } - if (model != null) { - model.ragconnectCloseConnections(); - } - } - - - @Test - public void buildModel() { - createModel(); - } - - @Test - public void communicateSendInitialValue() throws IOException, InterruptedException { - createModel(); - setData("1", "1.1", "ab"); - setupReceiverAndConnect(true); - - // check initial value - TestUtils.waitForMqtt(); - checkData(1, 1, 1.1, 'a', "ab"); - - // set new value - setData("2", "2.2", "cd"); - - // check new value - TestUtils.waitForMqtt(); - checkData(2, 2, 2.2, 'c', "cd"); - - // set new value - setData("3", "3.2", "ee"); - - // check new value - TestUtils.waitForMqtt(); - checkData(3, 3, 3.2, 'e', "ee"); - } - - @Test - public void communicateOnlyUpdatedValue() throws IOException, InterruptedException { - createModel(); - setData("1", "1.1", "ab"); - setupReceiverAndConnect(false); - - // check initial value (will be default values) - TestUtils.waitForMqtt(); - checkData(0, null, null, null, null); - - // set new value - setData("2", "2.2", "cd"); - - // check new value - TestUtils.waitForMqtt(); - checkData(1, 2, 2.2, 'c', "cd"); - - // set new value - setData("3", "3.2", "ee"); - - // check new value - TestUtils.waitForMqtt(); - checkData(2, 3, 3.2, 'e', "ee"); - } - - private void createModel() { - model = new A(); - - nativeIntegers = new NativeTypesSyn(); - nativeFloats = new NativeTypesSyn(); - nativeChars = new NativeTypesSyn(); - model.addNativeTypesSyn(nativeIntegers); - model.addNativeTypesSyn(nativeFloats); - model.addNativeTypesSyn(nativeChars); - - boxedIntegers = new BoxedTypesSyn(); - boxedFloats = new BoxedTypesSyn(); - boxedChars = new BoxedTypesSyn(); - model.addBoxedTypesSyn(boxedIntegers); - model.addBoxedTypesSyn(boxedFloats); - model.addBoxedTypesSyn(boxedChars); - } - - private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException { - model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS); - - receiver = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost()); - assertTrue(receiver.waitUntilReady(2, TimeUnit.SECONDS)); - - nativeIntegers.addNativeIntDependency(nativeIntegers); - nativeIntegers.addNativeShortDependency(nativeIntegers); - nativeIntegers.addNativeLongDependency(nativeIntegers); - nativeFloats.addNativeFloatDependency(nativeFloats); - nativeFloats.addNativeDoubleDependency(nativeFloats); - nativeChars.addNativeCharDependency(nativeChars); - nativeChars.addNativeStringDependency(nativeChars); - - boxedIntegers.addBoxedIntDependency(boxedIntegers); - boxedIntegers.addBoxedShortDependency(boxedIntegers); - boxedIntegers.addBoxedLongDependency(boxedIntegers); - boxedFloats.addBoxedFloatDependency(boxedFloats); - boxedFloats.addBoxedDoubleDependency(boxedFloats); - boxedChars.addBoxedCharDependency(boxedChars); - - data = new ReceiverData(); - - receiver.newConnection(TOPIC_NATIVE_INT, bytes -> { - data.numberOfNativeIntValues += 1; - data.lastNativeIntValue = java.nio.ByteBuffer.wrap(bytes).getInt(); - }); - receiver.newConnection(TOPIC_NATIVE_SHORT, bytes -> { - data.numberOfNativeShortValues += 1; - data.lastNativeShortValue = java.nio.ByteBuffer.wrap(bytes).getShort(); - }); - receiver.newConnection(TOPIC_NATIVE_LONG, bytes -> { - data.numberOfNativeLongValues += 1; - data.lastNativeLongValue = java.nio.ByteBuffer.wrap(bytes).getLong(); - }); - receiver.newConnection(TOPIC_NATIVE_FLOAT, bytes -> { - data.numberOfNativeFloatValues += 1; - data.lastNativeFloatValue = java.nio.ByteBuffer.wrap(bytes).getFloat(); - }); - receiver.newConnection(TOPIC_NATIVE_DOUBLE, bytes -> { - data.numberOfNativeDoubleValues += 1; - data.lastNativeDoubleValue = java.nio.ByteBuffer.wrap(bytes).getDouble(); - }); - receiver.newConnection(TOPIC_NATIVE_CHAR, bytes -> { - data.numberOfNativeCharValues += 1; - data.lastNativeCharValue = java.nio.ByteBuffer.wrap(bytes).getChar(); - }); - receiver.newConnection(TOPIC_NATIVE_STRING, bytes -> { - data.numberOfNativeStringValues += 1; - data.lastNativeStringValue = new String(bytes); - }); - receiver.newConnection(TOPIC_BOXED_INTEGER, bytes -> { - data.numberOfBoxedIntValues += 1; - data.lastBoxedIntValue = java.nio.ByteBuffer.wrap(bytes).getInt(); - }); - receiver.newConnection(TOPIC_BOXED_SHORT, bytes -> { - data.numberOfBoxedShortValues += 1; - data.lastBoxedShortValue = java.nio.ByteBuffer.wrap(bytes).getShort(); - }); - receiver.newConnection(TOPIC_BOXED_LONG, bytes -> { - data.numberOfBoxedLongValues += 1; - data.lastBoxedLongValue = java.nio.ByteBuffer.wrap(bytes).getLong(); - }); - receiver.newConnection(TOPIC_BOXED_FLOAT, bytes -> { - data.numberOfBoxedFloatValues += 1; - data.lastBoxedFloatValue = java.nio.ByteBuffer.wrap(bytes).getFloat(); - }); - receiver.newConnection(TOPIC_BOXED_DOUBLE, bytes -> { - data.numberOfBoxedDoubleValues += 1; - data.lastBoxedDoubleValue = java.nio.ByteBuffer.wrap(bytes).getDouble(); - }); - receiver.newConnection(TOPIC_BOXED_CHARACTER, bytes -> { - data.numberOfBoxedCharValues += 1; - data.lastBoxedCharValue = java.nio.ByteBuffer.wrap(bytes).getChar(); - }); - - nativeIntegers.connectIntValue(mqttUri(TOPIC_NATIVE_INT), writeCurrentValue); - nativeIntegers.connectShortValue(mqttUri(TOPIC_NATIVE_SHORT), writeCurrentValue); - nativeIntegers.connectLongValue(mqttUri(TOPIC_NATIVE_LONG), writeCurrentValue); - nativeFloats.connectFloatValue(mqttUri(TOPIC_NATIVE_FLOAT), writeCurrentValue); - nativeFloats.connectDoubleValue(mqttUri(TOPIC_NATIVE_DOUBLE), writeCurrentValue); - nativeChars.connectCharValue(mqttUri(TOPIC_NATIVE_CHAR), writeCurrentValue); - nativeChars.connectStringValue(mqttUri(TOPIC_NATIVE_STRING), writeCurrentValue); - boxedIntegers.connectIntValue(mqttUri(TOPIC_BOXED_INTEGER), writeCurrentValue); - boxedIntegers.connectShortValue(mqttUri(TOPIC_BOXED_SHORT), writeCurrentValue); - boxedIntegers.connectLongValue(mqttUri(TOPIC_BOXED_LONG), writeCurrentValue); - boxedFloats.connectFloatValue(mqttUri(TOPIC_BOXED_FLOAT), writeCurrentValue); - boxedFloats.connectDoubleValue(mqttUri(TOPIC_BOXED_DOUBLE), writeCurrentValue); - boxedChars.connectCharValue(mqttUri(TOPIC_BOXED_CHARACTER), writeCurrentValue); - } - - private void setData(String integerDriver, String floatDriver, String stringDriver) { - nativeIntegers.setDriverSyn(integerDriver); - nativeFloats.setDriverSyn(floatDriver); - nativeChars.setDriverSyn(stringDriver); - - boxedIntegers.setDriverSyn(integerDriver); - boxedFloats.setDriverSyn(floatDriver); - boxedChars.setDriverSyn(stringDriver); - } - - private void checkData(int expectedNumberOfValues, - Integer expectedInt, Double expectedDouble, - Character expectedChar, String expectedString) { - assertEquals(expectedNumberOfValues, data.numberOfNativeIntValues); - assertEquals(expectedNumberOfValues, data.numberOfNativeShortValues); - assertEquals(expectedNumberOfValues, data.numberOfNativeLongValues); - assertEquals(expectedNumberOfValues, data.numberOfNativeFloatValues); - assertEquals(expectedNumberOfValues, data.numberOfNativeDoubleValues); - assertEquals(expectedNumberOfValues, data.numberOfNativeCharValues); - assertEquals(expectedNumberOfValues, data.numberOfNativeStringValues); - - assertEquals(expectedNumberOfValues, data.numberOfBoxedIntValues); - assertEquals(expectedNumberOfValues, data.numberOfBoxedShortValues); - assertEquals(expectedNumberOfValues, data.numberOfBoxedLongValues); - assertEquals(expectedNumberOfValues, data.numberOfBoxedFloatValues); - assertEquals(expectedNumberOfValues, data.numberOfBoxedDoubleValues); - assertEquals(expectedNumberOfValues, data.numberOfBoxedCharValues); - - if (expectedInt != null) { - assertEquals(expectedInt.intValue(), data.lastNativeIntValue); - assertEquals(expectedInt.shortValue(), data.lastNativeShortValue); - assertEquals(expectedInt.longValue(), data.lastNativeLongValue); - assertEquals(expectedInt.intValue(), data.lastBoxedIntValue.intValue()); - assertEquals(expectedInt.shortValue(), data.lastBoxedShortValue.shortValue()); - assertEquals(expectedInt.longValue(), data.lastBoxedLongValue.longValue()); - } else { - assertEquals(0, data.lastNativeIntValue); - assertEquals(0, data.lastNativeShortValue); - assertEquals(0, data.lastNativeLongValue); - assertNull(data.lastBoxedIntValue); - assertNull(data.lastBoxedShortValue); - assertNull(data.lastBoxedLongValue); - } - - if (expectedDouble != null) { - assertEquals(expectedDouble.floatValue(), data.lastNativeFloatValue, TestUtils.DELTA); - assertEquals(expectedDouble, data.lastNativeDoubleValue, TestUtils.DELTA); - assertEquals(expectedDouble.floatValue(), data.lastBoxedFloatValue, TestUtils.DELTA); - assertEquals(expectedDouble, data.lastBoxedDoubleValue, TestUtils.DELTA); - } else { - assertEquals(0f, data.lastNativeFloatValue, TestUtils.DELTA); - assertEquals(0d, data.lastNativeDoubleValue, TestUtils.DELTA); - assertNull(data.lastBoxedFloatValue); - assertNull(data.lastBoxedDoubleValue); - } - - if (expectedChar != null) { - assertEquals(expectedChar.charValue(), data.lastNativeCharValue); - assertEquals(expectedChar, data.lastBoxedCharValue); - } else { - assertEquals('\0', data.lastNativeCharValue); - assertNull(data.lastBoxedCharValue); - } - assertEquals(expectedString, data.lastNativeStringValue); - } - - private static class ReceiverData { - int lastNativeIntValue; - int numberOfNativeIntValues = 0; - short lastNativeShortValue; - int numberOfNativeShortValues = 0; - long lastNativeLongValue; - int numberOfNativeLongValues = 0; - float lastNativeFloatValue; - int numberOfNativeFloatValues = 0; - double lastNativeDoubleValue; - int numberOfNativeDoubleValues = 0; - char lastNativeCharValue; - int numberOfNativeCharValues = 0; - String lastNativeStringValue; - int numberOfNativeStringValues = 0; - - Integer lastBoxedIntValue; - int numberOfBoxedIntValues = 0; - Short lastBoxedShortValue; - int numberOfBoxedShortValues = 0; - Long lastBoxedLongValue; - int numberOfBoxedLongValues = 0; - Float lastBoxedFloatValue; - int numberOfBoxedFloatValues = 0; - Double lastBoxedDoubleValue; - int numberOfBoxedDoubleValues = 0; - Character lastBoxedCharValue; - int numberOfBoxedCharValues = 0; - } - -} diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java deleted file mode 100644 index 17d853fba71c2ee46c6c6c7b5424958af0a5f8d2..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jastadd.ragconnect.compiler.Compiler; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import static org.jastadd.ragconnect.tests.TestUtils.exec; -import static org.jastadd.ragconnect.tests.TestUtils.readFile; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class Errors { - - private static final Logger logger = LogManager.getLogger(Errors.class); - private static final String FILENAME_PATTERN = "$FILENAME"; - private static final String INPUT_DIRECTORY = "./src/test/01-input/errors/"; - private static final String OUTPUT_DIRECTORY = "./src/test/02-after-ragconnect/errors/"; - - @BeforeAll - public static void createOutputDirectory() { - File outputDirectory = new File(OUTPUT_DIRECTORY); - assertTrue((outputDirectory.exists() && outputDirectory.isDirectory()) || outputDirectory.mkdir()); - } - - @Test - void testStandardErrors() throws IOException { - test("Errors", "A"); - } - - @SuppressWarnings("SameParameterValue") - private void test(String name, String rootNode) throws IOException { - String grammarFile = INPUT_DIRECTORY + name + ".relast"; - String ragconnectFile = INPUT_DIRECTORY + name + ".connect"; - String outFile = OUTPUT_DIRECTORY + name + ".out"; - String expectedFile = INPUT_DIRECTORY + name + ".expected"; - - try { - logger.debug("user.dir: {}", System.getProperty("user.dir")); - String[] args = { - "--o=" + OUTPUT_DIRECTORY, - grammarFile, - ragconnectFile, - "--rootNode=" + rootNode, - "--verbose" - }; - int returnValue = exec(Compiler.class, args, new File(outFile)); - Assertions.assertEquals(1, returnValue, "RagConnect did not return with value 1"); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } - - String out = readFile(outFile, Charset.defaultCharset()); - String expected = readFile(expectedFile, Charset.defaultCharset()); -// if (inFiles.size() == 1) { - expected = expected.replace(FILENAME_PATTERN, name); -// } else { -// for (int i = 0; i < inFiles.size(); i++) { -// expected = expected.replace(FILENAME_PATTERN + (i + 1), inFiles.get(i)); -// } -// } - List<String> outList = Arrays.asList(out.split("\n")); - Collections.sort(outList); - List<String> expectedList = Arrays.stream(expected.split("\n")) - .sorted() - .filter(s -> !s.isEmpty() && !s.startsWith("//")) - .collect(Collectors.toList()); - - // FIXME errors not handled correctly at the moment -// Assertions.assertLinesMatch(expectedList, outList); - - logger.info("ragconnect for " + name + " returned:\n{}", out); - } - -} diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ExampleTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ExampleTest.java deleted file mode 100644 index 3d0706c075d8e4af3b3c5e5fa703f3885b80ddf3..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ExampleTest.java +++ /dev/null @@ -1,286 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import com.google.protobuf.InvalidProtocolBufferException; -import config.Config.RobotConfig; -import example.ast.*; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import robot.RobotStateOuterClass.RobotState; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import static org.jastadd.ragconnect.tests.TestUtils.mqttUri; -import static org.junit.jupiter.api.Assertions.*; - -/** - * Test case "example". - * - * @author rschoene - Initial contribution - */ -public class ExampleTest extends AbstractMqttTest { - - private static final String TOPIC_CONFIG = "robot/config"; - private static final String TOPIC_JOINT1 = "robot/arm/joint1"; - private static final String TOPIC_JOINT2 = "robot/arm/joint2"; - - private Model model; - private RobotArm robotArm; - private Link link1; - private Link link2; - private MqttHandler handler; - private ReceiverData data; - - @BeforeEach - public void resetTestCounter() { - TestCounter.reset(); - } - - @AfterEach - public void closeConnections() { - if (handler != null) { - handler.close(); - } - if (model != null) { - model.ragconnectCloseConnections(); - } - } - - @Test - public void buildModel() { - createModel(); - } - - @Test - public void communicateSendInitialValue() throws IOException, InterruptedException { - createModel(); - setupReceiverAndConnect(true); - - // joint is currently within the safety zone, so speed should be low - TestUtils.waitForMqtt(); - assertEquals(0, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(0, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(1, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(1, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(1, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(1, data.numberOfConfigs); - assertFalse(data.failedLastConversion); - assertEquals(robotArm.speedLow(), data.lastConfig.getSpeed(), TestUtils.DELTA); - - // change position of the first joint out of the safety zone, second still in - sendData(TOPIC_JOINT1, 0.2f, 0.2f, 0.2f); - - // still in safety zone, so no update should have been sent - TestUtils.waitForMqtt(); - assertEquals(makePosition(2, 2, 2), link1.getCurrentPosition()); - assertEquals(1, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(1, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(2, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(2, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(2, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(1, data.numberOfConfigs); - assertFalse(data.failedLastConversion); - assertEquals(robotArm.speedLow(), data.lastConfig.getSpeed(), TestUtils.DELTA); - - // change position of second joint also out of the safety zone, now speed must be high - sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f); - - TestUtils.waitForMqtt(); - assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition()); - assertEquals(2, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(2, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(3, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(3, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(2, data.numberOfConfigs); - assertFalse(data.failedLastConversion); - assertEquals(robotArm.speedHigh(), data.lastConfig.getSpeed(), TestUtils.DELTA); - - // change position of second joint, no change after mapping - sendData(TOPIC_JOINT2, 0.33f, 0.42f, 0.51f); - - TestUtils.waitForMqtt(); - assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition()); - assertEquals(3, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(3, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(3, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(3, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(2, data.numberOfConfigs); - assertFalse(data.failedLastConversion); - - // change position of second joint, still out of the safety zone, no update should be sent - sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f); - - TestUtils.waitForMqtt(); - assertEquals(makePosition(13, 24, 35), link2.getCurrentPosition()); - assertEquals(4, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(4, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(4, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(4, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(4, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(2, data.numberOfConfigs); - assertFalse(data.failedLastConversion); - } - - @Test - public void communicateOnlyUpdatedValue() throws IOException, InterruptedException { - createModel(); - setupReceiverAndConnect(false); - - // no value should have been sent - TestUtils.waitForMqtt(); - assertEquals(0, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(0, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(1, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(1, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(1, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(0, data.numberOfConfigs); - - // change position of the first joint out of the safety zone, second still in - sendData(TOPIC_JOINT1, 0.2f, 0.2f, 0.2f); - - // still in safety zone, hence, no value should have been sent - TestUtils.waitForMqtt(); - assertEquals(makePosition(2, 2, 2), link1.getCurrentPosition()); - assertEquals(1, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(1, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(2, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(2, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(2, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(0, data.numberOfConfigs); - - // change position of second joint also out of the safety zone, now speed must be high - sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f); - - TestUtils.waitForMqtt(); - assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition()); - assertEquals(2, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(2, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(3, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(3, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(1, data.numberOfConfigs); - assertFalse(data.failedLastConversion); - assertEquals(robotArm.speedHigh(), data.lastConfig.getSpeed(), TestUtils.DELTA); - - // change position of second joint, no change after mapping - sendData(TOPIC_JOINT2, 0.33f, 0.42f, 0.51f); - - TestUtils.waitForMqtt(); - assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition()); - assertEquals(3, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(3, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(3, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(3, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(1, data.numberOfConfigs); - assertFalse(data.failedLastConversion); - - // change position of second joint, still out of the safety zone, no update should be sent - sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f); - - TestUtils.waitForMqtt(); - assertEquals(makePosition(13, 24, 35), link2.getCurrentPosition()); - assertEquals(4, TestCounter.INSTANCE.numberParseLinkState); - assertEquals(4, TestCounter.INSTANCE.numberLinkStateToIntPosition); - assertEquals(4, TestCounter.INSTANCE.numberInSafetyZone); - assertEquals(4, TestCounter.INSTANCE.numberCreateSpeedMessage); - assertEquals(4, TestCounter.INSTANCE.numberSerializeRobotConfig); - assertEquals(1, data.numberOfConfigs); - assertFalse(data.failedLastConversion); - } - - @Test - public void testFailedConversion() throws IOException { - createModel(); - setupReceiverAndConnect(false); - - handler.publish(TOPIC_JOINT1, "not-a-pandaLinkState".getBytes()); - assertEquals(0, data.numberOfConfigs); - assertTrue(data.failedLastConversion); - } - - private void sendData(String topic, float x, float y, float z) { - handler.publish(topic, RobotState.newBuilder() - .setPosition(RobotState.Position.newBuilder().setX(x).setY(y).setZ(z).build()) - .build() - .toByteArray() - ); - } - - private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException { - model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS); - - handler = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost()); - assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS)); - - // add dependencies - robotArm.addDependency1(link1); - robotArm.addDependency1(link2); - robotArm.addDependency1(robotArm.getEndEffector()); - - data = new ReceiverData(); - - handler.newConnection(TOPIC_CONFIG, bytes -> { - data.numberOfConfigs += 1; - try { - data.lastConfig = RobotConfig.parseFrom(bytes); - data.failedLastConversion = false; - } catch (InvalidProtocolBufferException e) { - data.failedLastConversion = true; - } - }); - - robotArm.connectAppropriateSpeed(mqttUri(TOPIC_CONFIG), writeCurrentValue); - link1.connectCurrentPosition(mqttUri(TOPIC_JOINT1)); - link2.connectCurrentPosition(mqttUri(TOPIC_JOINT2)); - } - - private void createModel() { - model = new Model(); - - ZoneModel zoneModel = new ZoneModel(); - - IntPosition firstPosition = makePosition(0, 0, 0); - IntPosition secondPosition = makePosition(-1, 0, 0); - IntPosition thirdPosition = makePosition(1, 0, 0); - - Zone safetyZone = new Zone(); - safetyZone.addCoordinate(new Coordinate(firstPosition)); - safetyZone.addCoordinate(new Coordinate(secondPosition)); - safetyZone.addCoordinate(new Coordinate(thirdPosition)); - zoneModel.addSafetyZone(safetyZone); - model.setZoneModel(zoneModel); - - robotArm = new RobotArm(); - - link1 = new Link(); - link1.setName("joint1"); - link1.setCurrentPosition(firstPosition); - - link2 = new Link(); - link2.setName("joint2"); - link2.setCurrentPosition(secondPosition); - - EndEffector endEffector = new EndEffector(); - endEffector.setName("gripper"); - endEffector.setCurrentPosition(makePosition(2, 2, 3)); - - robotArm.addLink(link1); - robotArm.addLink(link2); - robotArm.setEndEffector(endEffector); - model.setRobotArm(robotArm); - } - - private static IntPosition makePosition(int x, int y, int z) { - return IntPosition.of(x, y, z); - } - - private static class ReceiverData { - RobotConfig lastConfig; - boolean failedLastConversion = true; - int numberOfConfigs = 0; - } -} diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java deleted file mode 100644 index 5ede1e1896afadc70da7b868cf4272eafa250514..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java +++ /dev/null @@ -1,250 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import read1write2.ast.*; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import static org.jastadd.ragconnect.tests.TestUtils.mqttUri; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Test case "read-1-write-2". - * - * @author rschoene - Initial contribution - */ -public class Read1Write2Test extends AbstractMqttTest { - - private static final String TOPIC_SAME_READ = "same/read"; - private static final String TOPIC_SAME_WRITE_INT = "same/write/int"; - private static final String TOPIC_SAME_WRITE_STRING = "same/write/string"; - private static final String TOPIC_DIFFERENT_READ = "different/read"; - private static final String TOPIC_DIFFERENT_WRITE1_INT = "different/write1/int"; - private static final String TOPIC_DIFFERENT_WRITE1_STRING = "different/write1/string"; - private static final String TOPIC_DIFFERENT_WRITE2_INT = "different/write2/int"; - private static final String TOPIC_DIFFERENT_WRITE2_STRING = "different/write2/string"; - private static final String INITIAL_VALUE = "-1"; - - private MqttHandler handler; - private A model; - private OnSameNonterminal onSameNonterminal; - private OnDifferentNonterminal onDifferentNonterminal; - private TheOther other1; - private TheOther other2; - - private ReceiverData dataSame; - private ReceiverData dataOther1; - private ReceiverData dataOther2; - - @AfterEach - public void closeConnections() { - if (handler != null) { - handler.close(); - } - if (model != null) { - model.ragconnectCloseConnections(); - } - } - - @Test - public void buildModel() { - createModel(); - } - - @Test - public void communicateSendInitialValue() throws IOException, InterruptedException { - createModel(); - setupReceiverAndConnect(true); - - // check initial value - TestUtils.waitForMqtt(); - checkData(1, Integer.parseInt(INITIAL_VALUE), prefixed(INITIAL_VALUE), 1, Integer.parseInt(INITIAL_VALUE), prefixed(INITIAL_VALUE)); - - // set new value - sendData("2", "3"); - - // check new value - TestUtils.waitForMqtt(); - checkData(2, 2, prefixed("2"), 2, 3, prefixed("3")); - - // set new value - sendData("4", "4"); - - // check new value - TestUtils.waitForMqtt(); - checkData(3, 4, prefixed("4"), 3, 4, prefixed("4")); - - // set new value only for same - setDataOnlySame("77"); - - // check new value - TestUtils.waitForMqtt(); - checkData(4, 77, prefixed("77"), 3, 4, prefixed("4")); - } - - private String prefixed(String s) { - return "prefix" + s; - } - - @Test - public void communicateOnlyUpdatedValue() throws IOException, InterruptedException { - createModel(); - setupReceiverAndConnect(false); - - // check initial value - TestUtils.waitForMqtt(); - checkData(0, null, null, 0, null, null); - - // set new value - sendData("2", "3"); - - // check new value - TestUtils.waitForMqtt(); - checkData(1, 2, prefixed("2"), 1, 3, prefixed("3")); - - // set new value - sendData("4", "4"); - - // check new value - TestUtils.waitForMqtt(); - checkData(2, 4, prefixed("4"), 2, 4, prefixed("4")); - - // set new value only for same - setDataOnlySame("77"); - - // check new value - TestUtils.waitForMqtt(); - checkData(3, 77, prefixed("77"), 2, 4, prefixed("4")); - } - - private void createModel() { - // Setting value for Input without dependencies does not trigger any updates - model = new A(); - - onSameNonterminal = new OnSameNonterminal(); - model.setOnSameNonterminal(onSameNonterminal); - onSameNonterminal.setInput(INITIAL_VALUE); - - onDifferentNonterminal = new OnDifferentNonterminal(); - other1 = new TheOther(); - other2 = new TheOther(); - onDifferentNonterminal.addTheOther(other1); - onDifferentNonterminal.addTheOther(other2); - model.setOnDifferentNonterminal(onDifferentNonterminal); - onDifferentNonterminal.setInput(INITIAL_VALUE); - } - - private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException { - model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS); - - handler = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost()); - assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS)); - - onSameNonterminal.addIntDependency(onSameNonterminal); - onSameNonterminal.addStringDependency(onSameNonterminal); - other1.addIntDependency(onDifferentNonterminal); - other1.addStringDependency(onDifferentNonterminal); - other2.addIntDependency(onDifferentNonterminal); - other2.addStringDependency(onDifferentNonterminal); - - dataSame = new Read1Write2Test.ReceiverData(); - dataOther1 = new Read1Write2Test.ReceiverData(); - dataOther2 = new Read1Write2Test.ReceiverData(); - - handler.newConnection(TOPIC_SAME_WRITE_INT, bytes -> { - dataSame.numberOfIntValues += 1; - dataSame.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt(); - }); - handler.newConnection(TOPIC_SAME_WRITE_STRING, bytes -> { - dataSame.numberOfStringValues += 1; - dataSame.lastStringValue = new String(bytes); - }); - - handler.newConnection(TOPIC_DIFFERENT_WRITE1_INT, bytes -> { - dataOther1.numberOfIntValues += 1; - dataOther1.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt(); - }); - handler.newConnection(TOPIC_DIFFERENT_WRITE1_STRING, bytes -> { - dataOther1.numberOfStringValues += 1; - dataOther1.lastStringValue = new String(bytes); - }); - - handler.newConnection(TOPIC_DIFFERENT_WRITE2_INT, bytes -> { - dataOther2.numberOfIntValues += 1; - dataOther2.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt(); - }); - handler.newConnection(TOPIC_DIFFERENT_WRITE2_STRING, bytes -> { - dataOther2.numberOfStringValues += 1; - dataOther2.lastStringValue = new String(bytes); - }); - - onSameNonterminal.connectInput(mqttUri(TOPIC_SAME_READ)); - onSameNonterminal.connectOutInteger(mqttUri(TOPIC_SAME_WRITE_INT), writeCurrentValue); - onSameNonterminal.connectOutString(mqttUri(TOPIC_SAME_WRITE_STRING), writeCurrentValue); - - onDifferentNonterminal.connectInput(mqttUri(TOPIC_DIFFERENT_READ)); - other1.connectOutInteger(mqttUri(TOPIC_DIFFERENT_WRITE1_INT), writeCurrentValue); - other1.connectOutString(mqttUri(TOPIC_DIFFERENT_WRITE1_STRING), writeCurrentValue); - other2.connectOutInteger(mqttUri(TOPIC_DIFFERENT_WRITE2_INT), writeCurrentValue); - other2.connectOutString(mqttUri(TOPIC_DIFFERENT_WRITE2_STRING), writeCurrentValue); - } - - private void sendData(String inputSame, String inputDifferent) { - handler.publish(TOPIC_SAME_READ, inputSame.getBytes()); - handler.publish(TOPIC_DIFFERENT_READ, inputDifferent.getBytes()); - } - - private void setDataOnlySame(String inputSame) { - handler.publish(TOPIC_SAME_READ, inputSame.getBytes()); - } - - private void checkData(int numberOfSameValues, Integer lastSameIntValue, String lastSameStringValue, - int numberOfDifferentValues, Integer lastDifferentIntValue, - String lastDifferentStringValue) { - /* the value "-2" is never used in the test, so a test will always fail comparing to this value - especially, it is not the initial value */ - ReceiverData expectedDataSame = ReceiverData.of( - numberOfSameValues, - lastSameIntValue != null ? lastSameIntValue : -2, - lastSameStringValue); - compareData(expectedDataSame, dataSame); - ReceiverData expectedDataDifferent = ReceiverData.of( - numberOfDifferentValues, - lastDifferentIntValue != null ? lastDifferentIntValue : -2, - lastDifferentStringValue); - compareData(expectedDataDifferent, dataOther1); - compareData(expectedDataDifferent, dataOther2); - } - - private void compareData(ReceiverData expectedData, - ReceiverData actual) { - assertEquals(expectedData.numberOfIntValues, actual.numberOfIntValues); - assertEquals(expectedData.numberOfStringValues, actual.numberOfStringValues); - if (expectedData.numberOfIntValues > 0) { - assertEquals(expectedData.lastIntValue, actual.lastIntValue); - } - if (expectedData.numberOfStringValues > 0) { - assertEquals(expectedData.lastStringValue, actual.lastStringValue); - } - } - - private static class ReceiverData { - int lastIntValue; - int numberOfIntValues = 0; - String lastStringValue; - int numberOfStringValues = 0; - - static ReceiverData of(int numberOfValues, int lastIntValue, String lastStringValue) { - ReceiverData result = new ReceiverData(); - result.lastIntValue = lastIntValue; - result.lastStringValue = lastStringValue; - result.numberOfIntValues = numberOfValues; - result.numberOfStringValues = numberOfValues; - return result; - } - } - -} diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java deleted file mode 100644 index 9881eb7110f98a3bc36301f2f7a163c417e9a54e..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java +++ /dev/null @@ -1,241 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import read2write1.ast.*; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import static org.jastadd.ragconnect.tests.TestUtils.mqttUri; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Test case "read-1-write-2". - * - * @author rschoene - Initial contribution - */ -public class Read2Write1Test extends AbstractMqttTest { - - private static final String TOPIC_SAME_READ1 = "same/read1"; - private static final String TOPIC_SAME_READ2 = "same/read2"; - private static final String TOPIC_SAME_WRITE_INT = "same/write/int"; - private static final String TOPIC_DIFFERENT_READ1 = "different/read1"; - private static final String TOPIC_DIFFERENT_READ2 = "different/read2"; - private static final String TOPIC_DIFFERENT_WRITE1_INT = "different/write1/int"; - private static final String TOPIC_DIFFERENT_WRITE2_INT = "different/write2/int"; - private static final String INITIAL_VALUE = "0"; - - private MqttHandler handler; - private A model; - private OnSameNonterminal onSameNonterminal; - private OnDifferentNonterminal onDifferentNonterminal; - private TheOther other1; - private TheOther other2; - - private ReceiverData dataSame; - private ReceiverData dataOther1; - private ReceiverData dataOther2; - - @AfterEach - public void closeConnections() { - if (handler != null) { - handler.close(); - } - if (model != null) { - model.ragconnectCloseConnections(); - } - } - - @Test - public void buildModel() { - createModel(); - } - - @Test - public void communicateSendInitialValue() throws IOException, InterruptedException { - createModel(); - setupReceiverAndConnect(true); - - // check initial value - TestUtils.waitForMqtt(); - checkData(1, Integer.parseInt(INITIAL_VALUE + INITIAL_VALUE), - 1, Integer.parseInt(INITIAL_VALUE + INITIAL_VALUE)); - - // set new value - sendData(true, "2", true, "3"); - - // check new value. same: 2, 0. different: 3, 0. - TestUtils.waitForMqtt(); - checkData(2, 20, - 2, 30); - - // set new value - sendData(false, "4", false, "4"); - - // check new value. same: 2, 4. different: 3, 4. - TestUtils.waitForMqtt(); - checkData(3, 24, - 3, 34); - - // set new value only for same - setDataOnlySame(true, "77"); - - // check new value. same: 77, 4. different: 3, 4. - TestUtils.waitForMqtt(); - checkData(4, 774, - 3, 34); - } - - private String prefixed(String s) { - return "prefix" + s; - } - - @Test - public void communicateOnlyUpdatedValue() throws IOException, InterruptedException { - createModel(); - setupReceiverAndConnect(false); - - // check initial value - TestUtils.waitForMqtt(); - checkData(0, null, - 0, null); - - // set new value - sendData(true, "2", true, "3"); - - // check new value. same: 2, 0. different: 3, 0. - TestUtils.waitForMqtt(); - checkData(1, 20, - 1, 30); - - // set new value - sendData(false, "4", false, "4"); - - // check new value. same: 2, 4. different: 3, 4. - TestUtils.waitForMqtt(); - checkData(2, 24, - 2, 34); - - // set new value only for same - setDataOnlySame(true, "77"); - - // check new value. same: 77, 4. different: 3, 4. - TestUtils.waitForMqtt(); - checkData(3, 774, - 2, 34); - } - - private void createModel() { - // Setting value for Input without dependencies does not trigger any updates - model = new A(); - - onSameNonterminal = new OnSameNonterminal(); - model.setOnSameNonterminal(onSameNonterminal); - onSameNonterminal.setInput1(INITIAL_VALUE); - onSameNonterminal.setInput2(INITIAL_VALUE); - - onDifferentNonterminal = new OnDifferentNonterminal(); - other1 = new TheOther(); - other2 = new TheOther(); - onDifferentNonterminal.addTheOther(other1); - onDifferentNonterminal.addTheOther(other2); - model.setOnDifferentNonterminal(onDifferentNonterminal); - onDifferentNonterminal.setInput1(INITIAL_VALUE); - onDifferentNonterminal.setInput2(INITIAL_VALUE); - } - - private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException { - model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS); - - handler = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost()); - assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS)); - - onSameNonterminal.addInt1Dependency(onSameNonterminal); - onSameNonterminal.addInt2Dependency(onSameNonterminal); - other1.addInt1Dependency(onDifferentNonterminal); - other1.addInt2Dependency(onDifferentNonterminal); - other2.addInt1Dependency(onDifferentNonterminal); - other2.addInt2Dependency(onDifferentNonterminal); - - dataSame = new Read2Write1Test.ReceiverData(); - dataOther1 = new Read2Write1Test.ReceiverData(); - dataOther2 = new Read2Write1Test.ReceiverData(); - - handler.newConnection(TOPIC_SAME_WRITE_INT, bytes -> { - dataSame.numberOfIntValues += 1; - dataSame.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt(); - }); - - handler.newConnection(TOPIC_DIFFERENT_WRITE1_INT, bytes -> { - dataOther1.numberOfIntValues += 1; - dataOther1.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt(); - }); - - handler.newConnection(TOPIC_DIFFERENT_WRITE2_INT, bytes -> { - dataOther2.numberOfIntValues += 1; - dataOther2.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt(); - }); - - onSameNonterminal.connectInput1(mqttUri(TOPIC_SAME_READ1)); - onSameNonterminal.connectInput2(mqttUri(TOPIC_SAME_READ2)); - onSameNonterminal.connectOutInteger(mqttUri(TOPIC_SAME_WRITE_INT), writeCurrentValue); - - onDifferentNonterminal.connectInput1(mqttUri(TOPIC_DIFFERENT_READ1)); - onDifferentNonterminal.connectInput2(mqttUri(TOPIC_DIFFERENT_READ2)); - other1.connectOutInteger(mqttUri(TOPIC_DIFFERENT_WRITE1_INT), writeCurrentValue); - other2.connectOutInteger(mqttUri(TOPIC_DIFFERENT_WRITE2_INT), writeCurrentValue); - } - - private void sendData(boolean useSameInput1, String inputSame, - boolean useDifferentInput1, String inputDifferent) { - handler.publish(useSameInput1 ? TOPIC_SAME_READ1 : TOPIC_SAME_READ2, - inputSame.getBytes()); - handler.publish(useDifferentInput1 ? TOPIC_DIFFERENT_READ1 : TOPIC_DIFFERENT_READ2, - inputDifferent.getBytes()); - } - - private void setDataOnlySame(boolean useSameInput1, String inputSame) { - handler.publish(useSameInput1 ? TOPIC_SAME_READ1 : TOPIC_DIFFERENT_READ2, - inputSame.getBytes()); - } - - private void checkData(int numberOfSameValues, Integer lastSameIntValue, - int numberOfDifferentValues, Integer lastDifferentIntValue) { - /* the value "-2" is never used in the test, so a test will always fail comparing to this value - especially, it is not the initial value */ - ReceiverData expectedDataSame = ReceiverData.of( - numberOfSameValues, - lastSameIntValue != null ? lastSameIntValue : -2 - ); - compareData(expectedDataSame, dataSame); - ReceiverData expectedDataDifferent = ReceiverData.of( - numberOfDifferentValues, - lastDifferentIntValue != null ? lastDifferentIntValue : -2 - ); - compareData(expectedDataDifferent, dataOther1); - compareData(expectedDataDifferent, dataOther2); - } - - private void compareData(ReceiverData expectedData, - ReceiverData actual) { - assertEquals(expectedData.numberOfIntValues, actual.numberOfIntValues); - if (expectedData.numberOfIntValues > 0) { - assertEquals(expectedData.lastIntValue, actual.lastIntValue); - } - } - - private static class ReceiverData { - int lastIntValue; - int numberOfIntValues = 0; - - static ReceiverData of(int numberOfValues, int lastIntValue) { - ReceiverData result = new ReceiverData(); - result.lastIntValue = lastIntValue; - result.numberOfIntValues = numberOfValues; - return result; - } - } - -} diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java deleted file mode 100644 index 26c32c5a438bf133d984efa31bde4b05b3b15af1..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import org.junit.jupiter.api.Assertions; - -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.concurrent.TimeUnit; - -/** - * Utility methods for tests. - * - * @author rschoene - Initial contribution - */ -public class TestUtils { - - public static final double DELTA = 0.001d; - - public static String getMqttHost() { - if (System.getenv("GITLAB_CI") != null) { - // we are in the CI, so use "mqtt" as host - return "mqtt"; - } { - // else assume a locally running mqtt broker - return "localhost"; - } - } - - public static String mqttUri(String path) { - return "mqtt://" + getMqttHost() + "/" + path; - } - - public static String restUri(String path, int port) { - return "rest://localhost:" + port + "/" + path; - } - - public static int getMqttDefaultPort() { - return 1883; - } - - public static int exec(Class<?> klass, String[] args, File err) throws IOException, - InterruptedException { - String javaHome = System.getProperty("java.home"); - String javaBin = javaHome + File.separator + "bin" + File.separator + "java"; - String classpath = System.getProperty("java.class.path"); - String className = klass.getName(); - - String[] newArgs = new String[args.length + 4]; - newArgs[0] = javaBin; - newArgs[1] = "-cp"; - newArgs[2] = classpath; - newArgs[3] = className; - System.arraycopy(args, 0, newArgs, 4, args.length); - - ProcessBuilder builder = new ProcessBuilder(newArgs); -// builder.redirectOutput(err); - builder.redirectError(err); - - Process process = builder.start(); - process.waitFor(); - return process.exitValue(); - } - - public static String readFile(String path, Charset encoding) - throws IOException { - byte[] encoded = Files.readAllBytes(Paths.get(path)); - return new String(encoded, encoding); - } - - static void waitForMqtt() throws InterruptedException { - TimeUnit.SECONDS.sleep(2); - } -} diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java deleted file mode 100644 index 896b8711fee14bce4dcf8a12006ddb9e26a5791c..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java +++ /dev/null @@ -1,333 +0,0 @@ -package org.jastadd.ragconnect.tests; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import via.ast.A; -import via.ast.MqttHandler; - -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import static org.jastadd.ragconnect.tests.TestUtils.mqttUri; -import static org.jastadd.ragconnect.tests.TestUtils.restUri; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Test case "via". - * - * @author rschoene - Initial contribution - */ -@Tag("rest") -public class ViaTest extends AbstractMqttTest { - - private static final int REST_PORT = 9002; - - private static final String TOPIC_MQTT_2_MQTT_RECEIVE = "mqtt2mqtt/receive"; - private static final String PATH_REST_2_REST_RECEIVE = "rest2rest/receive"; - private static final String TOPIC_MQTT_2_REST_RECEIVE = "mqtt2rest/receive"; - private static final String PATH_REST_2_MQTT_RECEIVE = "rest2mqtt/receive"; - private static final String TOPIC_BOTH_MQTT_RECEIVE = "both/send"; - private static final String PATH_BOTH_REST_RECEIVE = "both/send"; - - private static final String TOPIC_MQTT_2_MQTT_SEND = "mqtt2mqtt/send"; - private static final String PATH_REST_2_REST_SEND = "rest2rest/send"; - private static final String PATH_MQTT_2_REST_SEND = "mqtt2rest/send"; - private static final String TOPIC_REST_2_MQTT_SEND = "rest2mqtt/send"; - private static final String TOPIC_BOTH_2_MQTT_SEND = "both2mqtt/send"; - private static final String PATH_BOTH_2_REST_SEND = "both2rest/send"; - - private static final String REST_SERVER_BASE_URL = "http://localhost:" + REST_PORT + "/"; - - private MqttHandler handler; - private A model; - private ReceiverData dataMqtt2Mqtt; - private ReceiverData dataRest2Mqtt; - private WebTarget dataRest2Rest; - private WebTarget dataMqtt2Rest; - private ReceiverData dataBoth2Mqtt; - private WebTarget dataBoth2Rest; - - private WebTarget senderRest2Rest; - private WebTarget senderRest2Mqtt; - private WebTarget senderBoth2Rest; - - @AfterEach - public void closeConnections() { - if (handler != null) { - handler.close(); - } - if (model != null) { - model.ragconnectCloseConnections(); - } - } - - @Test - public void buildModel() { - createModel(); - } - - @Test - public void communicateSendInitialValue() throws IOException, InterruptedException { - createModel(); - setupReceiverAndConnect(true); - - // check initial value - TestUtils.waitForMqtt(); - checkData(1, "100-M2M-ToMqtt", - "200-R2R-ToRest", - "300-M2R-ToRest", - 1, "400-R2M-ToMqtt", - 1, "500-B2M-ToMqtt", - "500-B2R-ToRest"); - - sendData("101", "201", "301", "401"); - sendDataForBoth("501", true); - - // check new value - TestUtils.waitForMqtt(); - checkData(2, "FromMqtt-101-M2M-ToMqtt", - "FromRest-201-R2R-ToRest", - "FromMqtt-301-M2R-ToRest", - 2, "FromRest-401-R2M-ToMqtt", - 2, "501-B2M-ToMqtt", - "501-B2R-ToRest"); - - // send value only for bothInput via REST - sendDataForBoth("502", false); - - // check this value - TestUtils.waitForMqtt(); - checkData(2, "FromMqtt-101-M2M-ToMqtt", - "FromRest-201-R2R-ToRest", - "FromMqtt-301-M2R-ToRest", - 2, "FromRest-401-R2M-ToMqtt", - 3, "502-B2M-ToMqtt", - "502-B2R-ToRest"); - - // send same value only for bothInput via MQTT - sendDataForBoth("502", true); - - // check this value - TestUtils.waitForMqtt(); - checkData(2, "FromMqtt-101-M2M-ToMqtt", - "FromRest-201-R2R-ToRest", - "FromMqtt-301-M2R-ToRest", - 2, "FromRest-401-R2M-ToMqtt", - 3, "502-B2M-ToMqtt", - "502-B2R-ToRest"); - - // send values for other things - sendData("102", "202", "302", "402"); - - // check this value - TestUtils.waitForMqtt(); - checkData(3, "FromMqtt-102-M2M-ToMqtt", - "FromRest-202-R2R-ToRest", - "FromMqtt-302-M2R-ToRest", - 3, "FromRest-402-R2M-ToMqtt", - 3, "502-B2M-ToMqtt", - "502-B2R-ToRest"); - - // send same values again for other things - sendData("102", "202", "302", "402"); - - // check this value - TestUtils.waitForMqtt(); - checkData(3, "FromMqtt-102-M2M-ToMqtt", - "FromRest-202-R2R-ToRest", - "FromMqtt-302-M2R-ToRest", - 3, "FromRest-402-R2M-ToMqtt", - 3, "502-B2M-ToMqtt", - "502-B2R-ToRest"); - } - - @Test - public void communicateOnlyUpdatedValue() throws IOException, InterruptedException { - createModel(); - setupReceiverAndConnect(false); - - // check initial value - TestUtils.waitForMqtt(); - checkData(0, null, - "200-R2R-ToRest", - "300-M2R-ToRest", - 0, null, - 0, null, - "500-B2R-ToRest"); - - sendData("111", "211", "311", "411"); - sendDataForBoth("511", true); - - // check new value - TestUtils.waitForMqtt(); - checkData(1, "FromMqtt-111-M2M-ToMqtt", - "FromRest-211-R2R-ToRest", - "FromMqtt-311-M2R-ToRest", - 1, "FromRest-411-R2M-ToMqtt", - 1, "511-B2M-ToMqtt", - "511-B2R-ToRest"); - - // send value only for bothInput via REST - sendDataForBoth("512", false); - - // check this value - TestUtils.waitForMqtt(); - checkData(1, "FromMqtt-111-M2M-ToMqtt", - "FromRest-211-R2R-ToRest", - "FromMqtt-311-M2R-ToRest", - 1, "FromRest-411-R2M-ToMqtt", - 2, "512-B2M-ToMqtt", - "512-B2R-ToRest"); - - // send same value only for bothInput via MQTT - sendDataForBoth("512", true); - - // check this value - TestUtils.waitForMqtt(); - checkData(1, "FromMqtt-111-M2M-ToMqtt", - "FromRest-211-R2R-ToRest", - "FromMqtt-311-M2R-ToRest", - 1, "FromRest-411-R2M-ToMqtt", - 2, "512-B2M-ToMqtt", - "512-B2R-ToRest"); - - // send values for other things - sendData("112", "212", "312", "412"); - - // check this value - TestUtils.waitForMqtt(); - checkData(2, "FromMqtt-112-M2M-ToMqtt", - "FromRest-212-R2R-ToRest", - "FromMqtt-312-M2R-ToRest", - 2, "FromRest-412-R2M-ToMqtt", - 2, "512-B2M-ToMqtt", - "512-B2R-ToRest"); - - // send same values again for other things - sendData("112", "212", "312", "412"); - - // check this value - TestUtils.waitForMqtt(); - checkData(2, "FromMqtt-112-M2M-ToMqtt", - "FromRest-212-R2R-ToRest", - "FromMqtt-312-M2R-ToRest", - 2, "FromRest-412-R2M-ToMqtt", - 2, "512-B2M-ToMqtt", - "512-B2R-ToRest"); - } - - private void sendData(String inputMqtt2Mqtt, String inputRest2Rest, String inputMqtt2Rest, String inputRest2Mqtt) { - handler.publish(TOPIC_MQTT_2_MQTT_RECEIVE, inputMqtt2Mqtt.getBytes()); - senderRest2Rest.request().put(Entity.entity(inputRest2Rest, MediaType.TEXT_PLAIN_TYPE)); - handler.publish(TOPIC_MQTT_2_REST_RECEIVE, inputMqtt2Rest.getBytes()); - senderRest2Mqtt.request().put(Entity.entity(inputRest2Mqtt, MediaType.TEXT_PLAIN_TYPE)); - } - - private void sendDataForBoth(String input, boolean useMqtt) { - if (useMqtt) { - handler.publish(TOPIC_BOTH_MQTT_RECEIVE, input.getBytes()); - } else { - senderBoth2Rest.request().put(Entity.entity(input, MediaType.TEXT_PLAIN_TYPE)); - } - } - - private void checkData(int numberOfMqtt2MqttValues, String mqtt2MqttValue, String rest2RestValue, String mqtt2RestValue, int numberOfRest2MqttValues, String rest2MqttValue, int numberOfBoth2MqttValues, String both2MqttValue, String both2RestValue) { - dataMqtt2Mqtt.assertEqualData(numberOfMqtt2MqttValues, mqtt2MqttValue); - dataRest2Mqtt.assertEqualData(numberOfRest2MqttValues, rest2MqttValue); - dataBoth2Mqtt.assertEqualData(numberOfBoth2MqttValues, both2MqttValue); - assertEquals(rest2RestValue, readRest2Rest()); - assertEquals(mqtt2RestValue, readMqtt2Rest()); - assertEquals(both2RestValue, readBoth2Rest()); - } - - private String readRest2Rest() { - return dataRest2Rest.request().get().readEntity(String.class); - } - - private String readMqtt2Rest() { - return dataMqtt2Rest.request().get().readEntity(String.class); - } - - private String readBoth2Rest() { - return dataBoth2Rest.request().get().readEntity(String.class); - } - - private void createModel() { - // Setting value for Input without dependencies does not trigger any updates - model = new A(); - model.setMqtt2MqttInput("100"); - model.setRest2RestInput("200"); - model.setMqtt2RestInput("300"); - model.setRest2MqttInput("400"); - model.setBoth2BothInput("500"); - } - - private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException { - model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS); - - handler = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost()); - assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS)); - - model.addDependencyMqtt2Mqtt(model); - model.addDependencyRest2Rest(model); - model.addDependencyMqtt2Rest(model); - model.addDependencyRest2Mqtt(model); - model.addDependencyBoth2Mqtt(model); - model.addDependencyBoth2Rest(model); - - dataMqtt2Mqtt = new ReceiverData(); - dataRest2Mqtt = new ReceiverData(); - dataBoth2Mqtt = new ReceiverData(); - - handler.newConnection(TOPIC_MQTT_2_MQTT_SEND, bytes -> { - dataMqtt2Mqtt.numberOfStringValues += 1; - dataMqtt2Mqtt.lastStringValue = new String(bytes); - }); - handler.newConnection(TOPIC_REST_2_MQTT_SEND, bytes -> { - dataRest2Mqtt.numberOfStringValues += 1; - dataRest2Mqtt.lastStringValue = new String(bytes); - }); - handler.newConnection(TOPIC_BOTH_2_MQTT_SEND, bytes -> { - dataBoth2Mqtt.numberOfStringValues += 1; - dataBoth2Mqtt.lastStringValue = new String(bytes); - }); - - Client client = ClientBuilder.newClient(); - dataRest2Rest = client.target(REST_SERVER_BASE_URL + PATH_REST_2_REST_SEND); - dataMqtt2Rest = client.target(REST_SERVER_BASE_URL + PATH_MQTT_2_REST_SEND); - dataBoth2Rest = client.target(REST_SERVER_BASE_URL + PATH_BOTH_2_REST_SEND); - senderRest2Rest = client.target(REST_SERVER_BASE_URL + PATH_REST_2_REST_RECEIVE); - senderRest2Mqtt = client.target(REST_SERVER_BASE_URL + PATH_REST_2_MQTT_RECEIVE); - senderBoth2Rest = client.target(REST_SERVER_BASE_URL + PATH_BOTH_REST_RECEIVE); - - model.connectMqtt2MqttInput(mqttUri(TOPIC_MQTT_2_MQTT_RECEIVE)); - model.connectMqtt2MqttOutput(mqttUri(TOPIC_MQTT_2_MQTT_SEND), writeCurrentValue); - model.connectMqtt2RestInput(mqttUri(TOPIC_MQTT_2_REST_RECEIVE)); - model.connectMqtt2RestOutput(restUri(PATH_MQTT_2_REST_SEND, REST_PORT), writeCurrentValue); - model.connectRest2MqttInput(restUri(PATH_REST_2_MQTT_RECEIVE, REST_PORT)); - model.connectRest2MqttOutput(mqttUri(TOPIC_REST_2_MQTT_SEND), writeCurrentValue); - model.connectRest2RestInput(restUri(PATH_REST_2_REST_RECEIVE, REST_PORT)); - model.connectRest2RestOutput(restUri(PATH_REST_2_REST_SEND, REST_PORT), writeCurrentValue); - model.connectBoth2BothInput(mqttUri(TOPIC_BOTH_MQTT_RECEIVE)); - model.connectBoth2BothInput(restUri(PATH_BOTH_REST_RECEIVE, REST_PORT)); - model.connectBoth2MqttOutput(mqttUri(TOPIC_BOTH_2_MQTT_SEND), writeCurrentValue); - model.connectBoth2RestOutput(restUri(PATH_BOTH_2_REST_SEND, REST_PORT), writeCurrentValue); - } - - private static class ReceiverData { - String lastStringValue; - int numberOfStringValues = 0; - - public void assertEqualData(int expectedNumberOfValues, String expectedLastValue) { - assertEquals(expectedNumberOfValues, this.numberOfStringValues); - assertEquals(expectedLastValue, this.lastStringValue); - } - } -} diff --git a/ragconnect.tests/src/test/proto/config.proto b/ragconnect.tests/src/test/proto/config.proto deleted file mode 100644 index 38cb5d0a25b02c96dcbdf30f685212ea972feee6..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/proto/config.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -package config; - -message RobotConfig { - double speed = 1; -} \ No newline at end of file diff --git a/ragconnect.tests/src/test/proto/robot_state.proto b/ragconnect.tests/src/test/proto/robot_state.proto deleted file mode 100644 index 6630631f16e00493be3f50307c9092e56184e9c6..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/proto/robot_state.proto +++ /dev/null @@ -1,37 +0,0 @@ -syntax = "proto3"; - -package robot; - -message RobotState { - - message Position { - double x = 1; - double y = 2; - double z = 3; - } - - message Orientation { - double x = 1; - double y = 2; - double z = 3; - double w = 4; - } - - message LinearTwist { - double x = 1; - double y = 2; - double z = 3; - } - - message AngularTwist { - double x = 1; - double y = 2; - double z = 3; - } - - string name = 1; - Position position = 2; - Orientation orientation = 3; - LinearTwist linear_twist = 4; - AngularTwist angular_twist = 5; -} \ No newline at end of file diff --git a/ragconnect.tests/src/test/proto/trajectory.proto b/ragconnect.tests/src/test/proto/trajectory.proto deleted file mode 100644 index 4a7f375e1ae37ba386f45e1149dc38990d0c7a0e..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/proto/trajectory.proto +++ /dev/null @@ -1,33 +0,0 @@ -syntax = "proto3"; - -package plan; - -message Trajectory { - - message Position { - double x = 1; - double y = 2; - double z = 3; - } - - message Orientation { - double x = 1; - double y = 2; - double z = 3; - double w = 4; - } - - enum PlanningMode { - FLUID = 0; - CARTESIAN = 1; - } - - message Pose { - Position position = 1; - Orientation orientation = 2; - PlanningMode mode = 3; - } - - repeated Pose pose = 1; - bool loop = 2; -} diff --git a/ragconnect.tests/src/test/resources/log4j2.xml b/ragconnect.tests/src/test/resources/log4j2.xml deleted file mode 100644 index 4c0d4548c61b23abad6aabc6811e68cd8a928871..0000000000000000000000000000000000000000 --- a/ragconnect.tests/src/test/resources/log4j2.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Configuration status="INFO"> - <Appenders> - <Console name="Console" target="SYSTEM_OUT"> - <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> - </Console> - </Appenders> - <Loggers> - <Root level="debug"> - <AppenderRef ref="Console"/> - </Root> - <Logger name="org.eclipse.jetty" level="info" additivity="false"> - <AppenderRef ref="Console"/> - </Logger> - </Loggers> -</Configuration> diff --git a/relast.preprocessor b/relast.preprocessor deleted file mode 160000 index 79d237fda220364ffebf77dc7de0a7b29635e360..0000000000000000000000000000000000000000 --- a/relast.preprocessor +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 79d237fda220364ffebf77dc7de0a7b29635e360 diff --git a/ros2rag.goal/build.gradle b/ros2rag.goal/build.gradle index 3bfe45ab6c9aef96b069ff56faf8c47597f11acf..d372747e0417f0dcf17aa9ecac084e3163e56a19 100644 --- a/ros2rag.goal/build.gradle +++ b/ros2rag.goal/build.gradle @@ -23,9 +23,7 @@ sourceSets.main.java.srcDir genSrc idea.module.generatedSourceDirs += genSrc dependencies { - implementation project (':ragconnect.base') implementation project (':ros2rag.common') - baseRuntimeClasspath project (':ragconnect.base') api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' jastadd2 "org.jastadd:jastadd:2.3.4" @@ -37,12 +35,11 @@ def relastFiles = ["src/gen/jastadd/GoalModel.relast", "src/gen/jastadd/RagConne // phases: ragConnect -> RelAst -> JastAdd // phase: ragConnect task ragConnect(type: JavaExec) { - classpath = configurations.baseRuntimeClasspath - group = 'Build' - main = 'org.jastadd.ragconnect.compiler.Compiler' + main = '-jar' args([ + '../libs/ragconnect.jar', '--verbose', '--o=src/gen/jastadd', 'src/main/jastadd/GoalModel.relast', diff --git a/ros2rag.receiverstub/build.gradle b/ros2rag.receiverstub/build.gradle index 02b49e36590bc01a544bcc9a7fc839109d32d817..e774287a067bffbcd0de8938a05f703e59b9407d 100644 --- a/ros2rag.receiverstub/build.gradle +++ b/ros2rag.receiverstub/build.gradle @@ -21,9 +21,7 @@ configurations { } dependencies { - implementation project(':ragconnect.base') implementation project(':ros2rag.common') - baseRuntimeClasspath project (':ragconnect.base') api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' jastadd2 "org.jastadd:jastadd:2.3.4" @@ -33,9 +31,10 @@ task ragConnect(type: JavaExec) { classpath = configurations.baseRuntimeClasspath group = 'Build' - main = 'org.jastadd.ragconnect.compiler.Compiler' + main = '-jar' args([ + '../libs/ragconnect.jar', '--o=src/gen/jastadd', 'src/main/jastadd/Receiver.ast', 'src/main/jastadd/Receiver.connect', diff --git a/ros2rag.safety/build.gradle b/ros2rag.safety/build.gradle index 4bfec22f282ed5700cd4bf05edfd4791b0f4515a..ea820a988b3077ce3fb0d0f38ccc42473f82a7c6 100644 --- a/ros2rag.safety/build.gradle +++ b/ros2rag.safety/build.gradle @@ -24,9 +24,7 @@ sourceSets.main.java.srcDir genSrc idea.module.generatedSourceDirs += genSrc dependencies { - implementation project (':ragconnect.base') implementation project (':ros2rag.common') - baseRuntimeClasspath project (':ragconnect.base') api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' jastadd2 "org.jastadd:jastadd:2.3.4" @@ -41,9 +39,10 @@ task ragConnect(type: JavaExec) { classpath = configurations.baseRuntimeClasspath group = 'Build' - main = 'org.jastadd.ragconnect.compiler.Compiler' + main = '-jar' args([ + '../libs/ragconnect.jar', '--o=src/gen/jastadd', 'src/main/jastadd/SafetyModel.relast', 'src/main/jastadd/SafetyModel.connect', diff --git a/ros2rag.senderstub/build.gradle b/ros2rag.senderstub/build.gradle index 1497d02abfcb5882708dd12497686c893976d772..66d17274772d01c4643f9f204c6fafad046c0d91 100644 --- a/ros2rag.senderstub/build.gradle +++ b/ros2rag.senderstub/build.gradle @@ -21,9 +21,7 @@ configurations { } dependencies { - implementation project(':ragconnect.base') implementation project(':ros2rag.common') - baseRuntimeClasspath project (':ragconnect.base') api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' jastadd2 "org.jastadd:jastadd:2.3.4" @@ -33,9 +31,10 @@ task ragConnect(type: JavaExec) { classpath = configurations.baseRuntimeClasspath group = 'Build' - main = 'org.jastadd.ragconnect.compiler.Compiler' + main = '-jar' args([ + '../libs/ragconnect.jar', '--o=src/gen/jastadd', 'src/main/jastadd/Sender.ast', 'src/main/jastadd/Sender.connect', diff --git a/settings.gradle b/settings.gradle index cc56321647f48ec49cd042b9a2ae609a13cf5398..bc157327cc0b950e86b6412268067219547231d0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,8 +1,5 @@ rootProject.name = 'ros2rag' -include 'relast.preprocessor' -include 'ragconnect.base' -include 'ragconnect.tests' include 'ros2rag.safety' include 'ros2rag.senderstub' include 'ros2rag.receiverstub'