Skip to content
Snippets Groups Projects
Commit 91480e88 authored by René Schöne's avatar René Schöne
Browse files

first try for incremental eval usage of local ragconnect

parent ca46468e
No related branches found
No related tags found
No related merge requests found
...@@ -56,7 +56,7 @@ dependencies { ...@@ -56,7 +56,7 @@ dependencies {
grammar2umlClasspath group: 'de.tudresden.inf.st', name: 'grammar2uml', version: '0.1.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 group: 'de.tudresden.inf.st', name: 'ragconnect', version: '0.2.4'
ragconnectClasspath fileTree(include: ['ragconnect-0.2.4.jar'], dir: '/data/git/jastadd-ragconnect/ragconnect.base/build/libs') 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 "org.jastadd:jastadd:2.3.4"
jastadd2 fileTree(include: ['jastadd2.jar'], dir: '/data/git/jastadd-2/') jastadd2 fileTree(include: ['jastadd2.jar'], dir: '/data/git/jastadd-2/')
} }
...@@ -87,6 +87,7 @@ task ragConnect(type: JavaExec) { ...@@ -87,6 +87,7 @@ task ragConnect(type: JavaExec) {
'--o=src/gen/jastadd', '--o=src/gen/jastadd',
'src/main/jastadd/MinimalModel.relast', 'src/main/jastadd/MinimalModel.relast',
'src/main/jastadd/MinimalModel.connect', 'src/main/jastadd/MinimalModel.connect',
'--logReads',
'--rootNode=A' '--rootNode=A'
]) ])
...@@ -160,13 +161,13 @@ jastadd { ...@@ -160,13 +161,13 @@ jastadd {
extraJastAddOptions = [ extraJastAddOptions = [
'--lineColumnNumbers', '--lineColumnNumbers',
'--List=JastAddList', '--List=JastAddList',
// '--incremental=param', '--incremental=param',
// '--cache=all', '--cache=all',
// '--tracing=api,flush', // '--tracing=api,flush',
//
// "--flush=full", "--flush=full",
// "--incremental=param,debug", // "--incremental=param,debug",
"--tracing=api", "--tracing=cache,flush",
] ]
} }
......
receive A.Input ; receive A.Input ;
send A.OutputOnA ; send A.OutputOnA ;
send B.OutputOnB using Transformation ; send B.OutputOnB using Transformation ;
send C.OutputOnC using Transformation ;
// mapping definitions // mapping definitions
Transformation maps String s to String {: Transformation maps String s to String {:
...@@ -10,3 +11,4 @@ Transformation maps String s to String {: ...@@ -10,3 +11,4 @@ Transformation maps String s to String {:
// dependency definitions // dependency definitions
A.OutputOnA canDependOn A.Input as dependencyA ; A.OutputOnA canDependOn A.Input as dependencyA ;
B.OutputOnB canDependOn A.Input as dependencyB ; B.OutputOnB canDependOn A.Input as dependencyB ;
C.OutputOnC canDependOn A.Input as dependencyC ;
...@@ -4,4 +4,8 @@ aspect Computation { ...@@ -4,4 +4,8 @@ aspect Computation {
syn String B.getOutputOnB() = "b" + input(); syn String B.getOutputOnB() = "b" + input();
inh String B.input(); inh String B.input();
eq A.getB().input() = getInput(); eq A.getB().input() = getInput();
syn String C.getOutputOnC() = "c" + input();
inh String C.input();
eq A.getC().input() = getInput();
} }
A ::= <Input:String> /<OutputOnA:String>/ B* ; A ::= <Input:String> /<OutputOnA:String>/ B* C* ;
B ::= /<OutputOnB:String>/ ; B ::= /<OutputOnB:String>/ ;
C ::= /<OutputOnC:String>/ ;
package de.tudresden.inf.st.mrc; package de.tudresden.inf.st.mrc;
import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper; import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
import de.tudresden.inf.st.mrc.ast.A; import de.tudresden.inf.st.mrc.ast.*;
import de.tudresden.inf.st.mrc.ast.B; import de.tudresden.inf.st.mrc.ast.ASTState.Trace.Receiver;
import de.tudresden.inf.st.mrc.ast.MqttHandler;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Scanner; import java.time.Instant;
import java.util.concurrent.TimeUnit; import java.util.ArrayList;
import java.util.List;
import static java.util.concurrent.TimeUnit.SECONDS;
/** /**
* Minimal main. * Minimal main.
...@@ -23,13 +25,36 @@ public class MinimalMain { ...@@ -23,13 +25,36 @@ public class MinimalMain {
private static final String TOPIC_URI_FOR_INPUT = "mqtt://localhost/" + TOPIC_FOR_INPUT; private static final String TOPIC_URI_FOR_INPUT = "mqtt://localhost/" + TOPIC_FOR_INPUT;
private static MqttHandler publisher; private static MqttHandler publisher;
static class MinimalReceiver implements Receiver {
List<String> latestAttributes;
Receiver oldReceiver;
MinimalReceiver(Receiver oldReceiver) {
this.oldReceiver = oldReceiver;
reset();
}
void reset() {
latestAttributes = new ArrayList<>();
}
@SuppressWarnings("rawtypes")
@Override
public void accept(ASTState.Trace.Event event, ASTNode node, String attribute, Object params, Object value) {
oldReceiver.accept(event, node, attribute, params, value);
logger.info("event: {}, node: {}, attribute: {}, params: {}, value: {},", event, node, attribute, params, value);
latestAttributes.add(attribute);
}
}
static MinimalReceiver receiver = null;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
publisher = new MqttHandler("publisher").setHost("localhost"); publisher = new MqttHandler("publisher").setHost("localhost");
publisher.waitUntilReady(2, TimeUnit.SECONDS); publisher.waitUntilReady(2, SECONDS);
publisher.publish("---", "---".getBytes()); publisher.publish("---", ("Start at " + Instant.now()).getBytes());
A normalA = addNewA(); A normalA = addNewA(true);
enableTracing(normalA); // enableTracing(normalA);
B b1 = normalA.getB(0); B b1 = normalA.getB(0);
B b2 = normalA.getB(1); B b2 = normalA.getB(1);
...@@ -45,55 +70,80 @@ public class MinimalMain { ...@@ -45,55 +70,80 @@ public class MinimalMain {
b1.connectOutputOnB("mqtt://localhost/normalA/b1/out", true); b1.connectOutputOnB("mqtt://localhost/normalA/b1/out", true);
b2.connectOutputOnB("mqtt://localhost/normalA/b2/out", false); b2.connectOutputOnB("mqtt://localhost/normalA/b2/out", false);
A aWithNoDependency = addNewA(); A aWithNoDependency = addNewA(false);
enableTracing(aWithNoDependency); // enableTracing(aWithNoDependency);
aWithNoDependency.connectInput(TOPIC_URI_FOR_INPUT); aWithNoDependency.connectInput(TOPIC_URI_FOR_INPUT);
aWithNoDependency.connectOutputOnA("mqtt://localhost/aNoDep/out", true); aWithNoDependency.connectOutputOnA("mqtt://localhost/aNoDep/out", true);
aWithNoDependency.getB(0).connectOutputOnB("mqtt://localhost/aNoDep/b1/out", true); aWithNoDependency.getC(0).connectOutputOnC("mqtt://localhost/aNoDep/c1/out", true);
aWithNoDependency.getB(1).connectOutputOnB("mqtt://localhost/aNoDep/b2/out", false); aWithNoDependency.getC(1).connectOutputOnC("mqtt://localhost/aNoDep/c2/out", false);
// stimulated incremental evaluation // stimulated incremental evaluation
aWithNoDependency.getB(0).getOutputOnB(); aWithNoDependency.getC(0).getOutputOnC();
Dumper.read(normalA).dumpAsPNG(Paths.get("images.png")); Dumper.read(normalA).dumpAsPNG(Paths.get("image.png"));
waitAndRun(1, "Publish 2", () -> publisher.publish(TOPIC_FOR_INPUT, "2".getBytes())); describedWait(1, "Publish 2");
waitAndRun(2, "Disconnect normalA", () -> { publisher.publish(TOPIC_FOR_INPUT, "2".getBytes());
// aWithNoDependency.getC(0).getOutputOnC();
describedWait(2, "Disconnect normalA");
try { try {
boolean success = normalA.disconnectInput(TOPIC_URI_FOR_INPUT); boolean success = normalA.disconnectInput(TOPIC_URI_FOR_INPUT);
System.out.println("disconnect success: " + success); logger.info("disconnect success: " + success);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
});
waitAndRun(3, "Publish 4", () -> publisher.publish(TOPIC_FOR_INPUT, "4".getBytes())); // aWithNoDependency.getC(0).getOutputOnC();
describedWait(2, "Publish 4");
// receiver.reset();
publisher.publish(TOPIC_FOR_INPUT, "4".getBytes());
// aWithNoDependency.getC(0).getOutputOnC();
// describedWait(1, "Print latest attributes");
// logger.info("latest attributes = {}", receiver.latestAttributes);
// while (true) {} // while (true) {}
// System.out.println("[Enter] to exit"); // System.out.println("[Enter] to exit");
// Scanner scanner = new Scanner(System.in); // Scanner scanner = new Scanner(System.in);
// scanner.nextLine(); // scanner.nextLine();
Thread.sleep(6); // SECONDS.sleep(15);
} }
private static void waitAndRun(long seconds, String description, Runnable runnable) throws InterruptedException { private static void describedWait(long seconds, String description) throws InterruptedException {
Thread.sleep(seconds); SECONDS.sleep(seconds);
System.out.println(description); logger.info("--- {} ---", description);
publisher.publish("---", description.getBytes()); publisher.publish("---", description.getBytes());
runnable.run();
} }
private static A addNewA() { private static A addNewA(boolean useB) {
A result = new A(); A result = new A();
result.setInput("1"); result.setInput("1");
if (useB) {
B b1 = new B(); B b1 = new B();
B b2 = new B(); B b2 = new B();
result.addB(b1); result.addB(b1);
result.addB(b2); result.addB(b2);
} else {
C c1 = new C();
C c2 = new C();
result.addC(c1);
result.addC(c2);
}
return result; return result;
} }
private static void enableTracing(A a) { private static void enableTracing(ASTNode<?> node) {
a.trace().setReceiver((event, node, attribute, params, value) -> logger.info("event: {}, node: {}, attribute: {}, params: {}, value: {},", event, node, attribute, params, value)); if (node.trace().getReceiver() != null && node.trace().getReceiver() instanceof MinimalReceiver) {
System.out.println("*** receiver already set up ***");
} else {
System.out.println("*** activate receiver ***");
receiver = new MinimalReceiver(node.trace().getReceiver());
node.trace().setReceiver(receiver);
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment