diff --git a/build.gradle b/build.gradle index fbb0d4f951ded7b126db7c7e46fb3c57ef514c6a..db9f3380a3a243bc376cd56697d83fb4c37febbe 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ buildscript { } plugins { + id 'com.github.ben-manes.versions' version '0.36.0' id 'java' id 'idea' id 'application' @@ -49,16 +50,18 @@ idea.module.generatedSourceDirs += genSrc dependencies { // implementation fileTree(include: ['dumpAst2uml.jar'], dir: 'libs') - implementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' - implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.2' - implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.2' + implementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.16' + implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.0' + implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.0' implementation group: 'de.tudresden.inf.st', name: 'dumpAstWithPlantuml', version: '0.3.5' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.12.1' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.1' grammar2umlClasspath group: 'de.tudresden.inf.st', name: 'grammar2uml', version: '0.1.1' - ragconnectClasspath group: 'de.tudresden.inf.st', name: 'ragconnect', version: '0.2.4' -// ragconnectClasspath fileTree(include: ['ragconnect-0.2.5.jar'], dir: '/data/git/jastadd-ragconnect/ragconnect.base/build/libs') - jastadd2 "org.jastadd:jastadd:2.3.4" -// jastadd2 fileTree(include: ['jastadd2.jar'], dir: '/data/git/jastadd-2/') +// ragconnectClasspath group: 'de.tudresden.inf.st', name: 'ragconnect', version: '0.2.4' + ragconnectClasspath fileTree(include: ['ragconnect-0.2.5.jar'], dir: '/data/git/jastadd-ragconnect/ragconnect.base/build/libs') +// jastadd2 "org.jastadd:jastadd:2.3.4" + jastadd2 fileTree(include: ['jastadd2.jar'], dir: '/data/git/jastadd-2/') } // Input files for relast @@ -88,7 +91,11 @@ task ragConnect(type: JavaExec) { 'src/main/jastadd/MinimalModel.relast', 'src/main/jastadd/MinimalModel.connect', '--logReads', - '--rootNode=A' + '--logWrites', + '--verbose', + '--rootNode=A', + '--incremental=param,debug', + "--tracing=cache,flush" ]) } @@ -103,6 +110,7 @@ task relastToJastAdd(type: JavaExec) { "--useJastAddNames", "--listClass=java.util.ArrayList", "--jastAddList=JastAddList", + "--serializer=jackson", "--resolverHelper", "--file"] + @@ -161,13 +169,10 @@ jastadd { extraJastAddOptions = [ '--lineColumnNumbers', '--List=JastAddList', -// '--incremental=param', -// '--cache=all', -// '--tracing=api,flush', - -// "--flush=full", -// "--incremental=param,debug", -// "--tracing=cache,flush", + '--cache=all', + "--flush=full", + "--incremental=param,debug", + "--tracing=cache,flush", ] } diff --git a/src/main/jastadd/MinimalModel.connect b/src/main/jastadd/MinimalModel.connect index fa4c12e6d75c88efcba1fca0a737f82984f12e37..c7f1af635e09d9b999c72930ae2a1e70639a24ac 100644 --- a/src/main/jastadd/MinimalModel.connect +++ b/src/main/jastadd/MinimalModel.connect @@ -2,6 +2,8 @@ receive A.Input ; send A.OutputOnA ; send B.OutputOnB using Transformation ; send C.OutputOnC using Transformation ; +send tree A.D ; +receive tree A.Reading ; // mapping definitions Transformation maps String s to String {: diff --git a/src/main/jastadd/MinimalModel.jrag b/src/main/jastadd/MinimalModel.jrag index 27abf8f6a15176c0101b8203f8a77e59ab79a4b2..c684edbe07795bb53e1131bdbaf533cd584da553 100644 --- a/src/main/jastadd/MinimalModel.jrag +++ b/src/main/jastadd/MinimalModel.jrag @@ -8,4 +8,6 @@ aspect Computation { syn String C.getOutputOnC() = "c" + input(); inh String C.input(); eq A.getC().input() = getInput(); + + syn D A.getD() = new D().setID("dd" + getInput()); } diff --git a/src/main/jastadd/MinimalModel.relast b/src/main/jastadd/MinimalModel.relast index c9c68e91e6cf70dc11096b566e523aec71ca1ad3..1df3cc07e098d21ac34238697ba7afdeecdd5067 100644 --- a/src/main/jastadd/MinimalModel.relast +++ b/src/main/jastadd/MinimalModel.relast @@ -1,3 +1,4 @@ -A ::= <Input:String> /<OutputOnA:String>/ B* C* ; +A ::= <Input:String> /<OutputOnA:String>/ B* C* /D/ Reading:D ; B ::= /<OutputOnB:String>/ ; C ::= /<OutputOnC:String>/ ; +D ::= <ID:String> ; diff --git a/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java b/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java index 88649c62e96b7ea21c7fc2bd1052059032fe3c5a..542ff536c5571c748dfd31e3ed012070a855a46f 100644 --- a/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java +++ b/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java @@ -2,15 +2,13 @@ package de.tudresden.inf.st.mrc; import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper; import de.tudresden.inf.st.mrc.ast.*; -//import de.tudresden.inf.st.mrc.ast.ASTState.Trace.Receiver; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Paths; import java.time.Instant; -import java.util.ArrayList; -import java.util.List; import static java.util.concurrent.TimeUnit.SECONDS; @@ -49,11 +47,22 @@ public class MinimalMain { // static MinimalReceiver receiver = null; public static void main(String[] args) throws Exception { - boolean success; publisher = new MqttHandler("publisher").setHost("localhost"); publisher.waitUntilReady(2, SECONDS); publisher.publish("---", ("Start at " + Instant.now()).getBytes()); +// mainIncremental(); + mainTree(); + } + + private static void mainIncremental() throws Exception { + // byte[] -> bool: input[0] == (byte) 1; + // bool -> byte[]: java.nio.ByteBuffer.allocate(1).put((byte) 1).array(); + + + + boolean success; + A normalA = addNewA(true); // enableTracing(normalA); B b1 = normalA.getB(0); @@ -79,9 +88,6 @@ public class MinimalMain { aWithNoDependency.getC(0).connectOutputOnC("mqtt://localhost/aNoDep/c1/out", true); aWithNoDependency.getC(1).connectOutputOnC("mqtt://localhost/aNoDep/c2/out", false); - // stimulated incremental evaluation - aWithNoDependency.getC(0).getOutputOnC(); - Dumper.read(normalA).dumpAsPNG(Paths.get("image.png")); describedWait(1, "Publish 2"); @@ -94,22 +100,16 @@ public class MinimalMain { publisher.publish(TOPIC_FOR_INPUT, "22".getBytes()); publisher.publish(TOPIC_FOR_INPUT, "23".getBytes()); -// aWithNoDependency.getC(0).getOutputOnC(); - describedWait(2, "Disconnect normalA"); -// success = normalA.disconnectInput(TOPIC_URI_FOR_INPUT); -// logger.info("disconnect success: {}", success); + success = normalA.disconnectInput(TOPIC_URI_FOR_INPUT); + logger.info("disconnect success: {}", success); describedWait(2, "Publish 4"); -// receiver.reset(); publisher.publish(TOPIC_FOR_INPUT, "4".getBytes()); -// describedWait(1, "Print latest attributes"); -// logger.info("latest attributes = {}", receiver.latestAttributes); - describedWait(1, "Disconnect aNoDep"); -// success = aWithNoDependency.disconnectInput(TOPIC_URI_FOR_INPUT); -// logger.info("disconnect success: {}", success); + success = aWithNoDependency.disconnectInput(TOPIC_URI_FOR_INPUT); + logger.info("disconnect success: {}", success); describedWait(1, "Publish 6"); publisher.publish(TOPIC_FOR_INPUT, "6".getBytes()); @@ -165,6 +165,57 @@ public class MinimalMain { return result; } + private static void testTree() throws IOException, SerializationException, DeserializationException { + A root = new A(); + root.setInput("123"); + + + java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream(); + { + com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory(); + com.fasterxml.jackson.core.JsonGenerator generator = factory.createGenerator(outputStream, com.fasterxml.jackson.core.JsonEncoding.UTF8); + root.serialize(generator); + generator.flush(); + } + String content = outputStream.toString(); + System.out.println(content); + + com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper(); + com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory(); + com.fasterxml.jackson.core.JsonParser parser = factory.createParser(content); + A result = A.deserialize((com.fasterxml.jackson.databind.JsonNode)mapper.readTree(parser)); + parser.close(); + logger.info("result.getInput() = " + result.getInput()); + logger.info("result.getD().getID() = " + result.getD().getID()); + } + + private static void mainTree() throws IOException, InterruptedException { + String uriString = "mqtt://localhost/normalA/d/out"; + + A sender = new A(); + sender.setInput("123"); + sender.ragconnectSetupMqttWaitUntilReady(2, SECONDS); + + A receiver = new A(); + receiver.ragconnectSetupMqttWaitUntilReady(2, SECONDS); + receiver.connectReading(uriString); + + sender.connectOutputOnA("mqtt://localhost/normalA/out", true); + sender.connectD(uriString, true); + + describedWait(1, "initial value"); + logger.info("receiver.getReading().getID() = " + receiver.getReading().getID()); + + sender.getD().setID("abc"); + describedWait(1, "after setID (does not work)"); + logger.info("receiver.getReading().getID() = " + receiver.getReading().getID()); + + sender.setInput("def"); + describedWait(1, "after setInput"); + logger.info("receiver.getReading().getID() = " + receiver.getReading().getID()); + } + + // private static void enableTracing(ASTNode<?> node) { // if (node.trace().getReceiver() != null && node.trace().getReceiver() instanceof MinimalReceiver) { // System.out.println("*** receiver already set up ***");