From 29110428cf7b3fc2b5d808dccd966c22e2655bed Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 21 Jan 2021 19:47:55 +0100
Subject: [PATCH] Continue working on incremental dependencies.

---
 libs/buildSrc.jar                             | Bin 8942 -> 0 bytes
 .../src/main/jastadd/Configuration.jadd       |   1 +
 .../jastadd/ragconnect/compiler/Compiler.java |   3 +-
 .../src/main/resources/MqttHandler.jadd       |   2 +-
 .../main/resources/RagConnectObserver.jadd    |  54 ----------------
 .../src/main/resources/ragconnect.mustache    |  59 ++++++++++++++++++
 .../main/resources/sendDefinition.mustache    |  26 ++++++--
 ragconnect.tests/build.gradle                 |  16 +++--
 8 files changed, 96 insertions(+), 65 deletions(-)
 delete mode 100644 libs/buildSrc.jar

diff --git a/libs/buildSrc.jar b/libs/buildSrc.jar
deleted file mode 100644
index b0ca2cbc4fc7f12022592944d7446a429d855add..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8942
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
Kz_3sr!~+0saM`W^

diff --git a/ragconnect.base/src/main/jastadd/Configuration.jadd b/ragconnect.base/src/main/jastadd/Configuration.jadd
index 8d3b16c..4116807 100644
--- a/ragconnect.base/src/main/jastadd/Configuration.jadd
+++ b/ragconnect.base/src/main/jastadd/Configuration.jadd
@@ -4,4 +4,5 @@ aspect Configuration {
   public static TypeDecl ASTNode.rootNode;
   public static boolean ASTNode.usesMqtt;
   public static boolean ASTNode.usesRest;
+  public static boolean ASTNode.incrementalOptionActive;
 }
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
index d2894e6..b14ed91 100644
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
@@ -78,7 +78,6 @@ public class Compiler extends AbstractCompiler {
 
     printMessage("Writing output files");
     final List<String> handlers = new ArrayList<>();
-    handlers.add("RagConnectObserver.jadd");
     if (ASTNode.usesMqtt) {
       handlers.add("MqttHandler.jadd");
     }
@@ -224,6 +223,8 @@ public class Compiler extends AbstractCompiler {
     ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration);
     ASTNode.loggingEnabledForReads = optionLogReads.value();
     ASTNode.loggingEnabledForWrites = optionLogWrites.value();
+    // reuse "--incremental" option of JastAdd
+    ASTNode.incrementalOptionActive = getConfiguration().incremental() && getConfiguration().traceFlush();
     ASTNode.usesMqtt = optionProtocols.hasValue(OPTION_PROTOCOL_MQTT);
     ASTNode.usesRest = optionProtocols.hasValue(OPTION_PROTOCOL_REST);
     return ragConnect;
diff --git a/ragconnect.base/src/main/resources/MqttHandler.jadd b/ragconnect.base/src/main/resources/MqttHandler.jadd
index 6b0ea71..987c0c4 100644
--- a/ragconnect.base/src/main/resources/MqttHandler.jadd
+++ b/ragconnect.base/src/main/resources/MqttHandler.jadd
@@ -252,7 +252,7 @@ public class MqttHandler {
     }
     // register callback
     logger.debug("new connection for {}", topic);
-    if (callbacks.get(topic) == null) {
+    if (callbacks.get(topic) == null || callbacks.get(topic).isEmpty()) {
       callbacks.put(topic, new java.util.ArrayList<>());
 
       // subscribe at broker
diff --git a/ragconnect.base/src/main/resources/RagConnectObserver.jadd b/ragconnect.base/src/main/resources/RagConnectObserver.jadd
index 3658f7b..e69de29 100644
--- a/ragconnect.base/src/main/resources/RagConnectObserver.jadd
+++ b/ragconnect.base/src/main/resources/RagConnectObserver.jadd
@@ -1,54 +0,0 @@
-aspect RagConnectObserver {
-  class RagConnectObserver implements ASTState.Trace.Receiver {
-    ASTState.Trace.Receiver oldReceiver;
-    class RagConnectObserverEntry {
-      ASTNode node;
-      String attributeString;
-      Runnable attributeCall;
-      RagConnectObserverEntry(ASTNode node, String attributeString, Runnable attributeCall) {
-        this.node = node;
-        this.attributeString = attributeString;
-        this.attributeCall = attributeCall;
-      }
-    }
-    java.util.List<RagConnectObserverEntry> observedNodes = new java.util.ArrayList<>();
-    RagConnectObserver(ASTNode node) {
-      // set the receiver. potentially dangerous because overriding existing receiver!
-      oldReceiver = node.trace().getReceiver();
-      node.trace().setReceiver(this);
-    }
-    void add(ASTNode node, String attributeString, Runnable attributeCall) {
-      System.out.println("** observer add " + node + " on " + attributeString);
-      observedNodes.add(new RagConnectObserverEntry(node, attributeString, attributeCall));
-    }
-    void remove(ASTNode node, String attributeString, Runnable attributeCall) {
-      observedNodes.remove(new RagConnectObserverEntry(node, attributeString, attributeCall));
-    }
-    @Override
-    public void accept(ASTState.Trace.Event event, ASTNode node, String attribute, Object params, Object value) {
-      oldReceiver.accept(event, node, attribute, params, value);
-      // ignore all events but INC_FLUSH_ATTR
-      if (event != ASTState.Trace.Event.INC_FLUSH_ATTR) {
-        return;
-      }
-      System.out.println("** observer check INC_FLUSH_ATTR event");
-      // iterate through list, if matching pair. could maybe be more efficient.
-      for (RagConnectObserverEntry entry : observedNodes) {
-        if (entry.node.equals(node) && entry.attributeString.equals(attribute)) {
-          // hit. call the attribute/nta-token
-          System.out.println("** observer hit " + entry.node + " on " + entry.attributeString);
-          entry.attributeCall.run();
-        }
-      }
-    }
-  }
-
-  private static RagConnectObserver ASTNode._ragConnectObserverInstance;
-  RagConnectObserver ASTNode._ragConnectObserver() {
-    if (_ragConnectObserverInstance == null) {
-      // does not matter, which node is used to create the observer as ASTState/tracing is also static
-      _ragConnectObserverInstance = new RagConnectObserver(this);
-    }
-    return _ragConnectObserverInstance;
-  }
-}
diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache
index 49d1721..d82f430 100644
--- a/ragconnect.base/src/main/resources/ragconnect.mustache
+++ b/ragconnect.base/src/main/resources/ragconnect.mustache
@@ -21,3 +21,62 @@ aspect ROS2RAG {
   {{> tokenComponent}}
   {{/TokenComponents}}
 }
+
+{{#incrementalOptionActive}}
+aspect RagConnectObserver {
+  class RagConnectObserver implements ASTState.Trace.Receiver {
+    ASTState.Trace.Receiver oldReceiver;
+    class RagConnectObserverEntry {
+      final ConnectToken connectToken;
+      final ASTNode node;
+      final String attributeString;
+      final Runnable attributeCall;
+      RagConnectObserverEntry(ConnectToken connectToken, ASTNode node, String attributeString, Runnable attributeCall) {
+        this.connectToken = connectToken;
+        this.node = node;
+        this.attributeString = attributeString;
+        this.attributeCall = attributeCall;
+      }
+    }
+    java.util.List<RagConnectObserverEntry> observedNodes = new java.util.ArrayList<>();
+    RagConnectObserver(ASTNode node) {
+      // set the receiver. potentially dangerous because overriding existing receiver!
+      oldReceiver = node.trace().getReceiver();
+      node.trace().setReceiver(this);
+    }
+    void add(ConnectToken connectToken, ASTNode node, String attributeString, Runnable attributeCall) {
+      System.out.println("** observer add " + node + " on " + attributeString);
+      observedNodes.add(new RagConnectObserverEntry(connectToken, node, attributeString, attributeCall));
+    }
+    void remove(ConnectToken connectToken) {
+      observedNodes.removeIf(entry -> entry.connectToken.equals(connectToken));
+    }
+    @Override
+    public void accept(ASTState.Trace.Event event, ASTNode node, String attribute, Object params, Object value) {
+      oldReceiver.accept(event, node, attribute, params, value);
+      // ignore all events but INC_FLUSH_ATTR
+      if (event != ASTState.Trace.Event.INC_FLUSH_ATTR) {
+        return;
+      }
+      System.out.println("** observer check INC_FLUSH_ATTR event");
+      // iterate through list, if matching pair. could maybe be more efficient.
+      for (RagConnectObserverEntry entry : observedNodes) {
+        if (entry.node.equals(node) && entry.attributeString.equals(attribute)) {
+          // hit. call the attribute/nta-token
+          System.out.println("** observer hit " + entry.node + " on " + entry.attributeString);
+          entry.attributeCall.run();
+        }
+      }
+    }
+  }
+
+  private static RagConnectObserver ASTNode._ragConnectObserverInstance;
+  RagConnectObserver ASTNode._ragConnectObserver() {
+    if (_ragConnectObserverInstance == null) {
+      // does not matter, which node is used to create the observer as ASTState/tracing is also static
+      _ragConnectObserverInstance = new RagConnectObserver(this);
+    }
+    return _ragConnectObserverInstance;
+  }
+}
+{{/incrementalOptionActive}}
diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache
index 44db8f7..bee941f 100644
--- a/ragconnect.base/src/main/resources/sendDefinition.mustache
+++ b/ragconnect.base/src/main/resources/sendDefinition.mustache
@@ -3,6 +3,12 @@ private byte[] {{parentTypeName}}.{{lastValue}} = null;
 
 public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterName}}, boolean writeCurrentValue) throws java.io.IOException {
   {{>handleUri}}
+  ConnectToken connectToken;
+  if (connectTokens.computeIfAbsent(this, astNode -> new java.util.HashMap<java.net.URI, ConnectToken>())
+                   .get(uri) != null) {
+    System.err.println("Already connected for " + uri + " on " + this + "!");
+    return true;
+  }
   switch (scheme) {
   {{#usesMqtt}}
     case "mqtt":
@@ -18,35 +24,45 @@ public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterNam
       if (writeCurrentValue) {
         {{writeMethod}}();
       }
+      connectToken = new ConnectToken(uri);
       break;
   {{/usesMqtt}}
   {{#usesRest}}
     case "rest":
-      ConnectToken connectToken = {{restHandlerAttribute}}().newGETConnection(uri, () -> {
+      connectToken = {{restHandlerAttribute}}().newGETConnection(uri, () -> {
         {{updateMethod}}();
         return new String({{lastValue}});
       });
       if (connectToken == null) {
         return false;
       }
-      connectTokens.computeIfAbsent(this, astNode -> new java.util.HashMap<java.net.URI, ConnectToken>())
-                   .put(uri, connectToken);
       break;
   {{/usesRest}}
     default:
       System.err.println("Unknown protocol '" + scheme + "'.");
       return false;
   }
-  _ragConnectObserver().add(this, "{{parentTypeName}}.get{{tokenName}}()", () -> {
+  connectTokens.computeIfAbsent(this, astNode -> new java.util.HashMap<java.net.URI, ConnectToken>())
+               .put(uri, connectToken);
+  {{#incrementalOptionActive}}
+  _ragConnectObserver().add(connectToken, this, "{{parentTypeName}}.get{{tokenName}}()", () -> {
     if (this.{{updateMethod}}()) {
       this.{{writeMethod}}();
     }
   });
+  {{/incrementalOptionActive}}
   return true;
 }
 
 public boolean {{parentTypeName}}.{{disconnectMethod}}(String {{connectParameterName}}) throws java.io.IOException {
   {{>handleUri}}
+  ConnectToken connectToken = connectTokens.get(this).remove(uri);
+  if (connectToken == null) {
+    System.err.println("Disconnect without connect for " + uri + " on " + this + "!");
+  }
+  {{#incrementalOptionActive}}
+  _ragConnectObserver().remove(connectToken);
+  {{/incrementalOptionActive}}
   switch (scheme) {
   {{#usesMqtt}}
     case "mqtt":
@@ -56,7 +72,7 @@ public boolean {{parentTypeName}}.{{disconnectMethod}}(String {{connectParameter
   {{/usesMqtt}}
   {{#usesRest}}
     case "rest":
-      {{restHandlerAttribute}}().disconnect(connectTokens.get(this).get(uri));
+      {{restHandlerAttribute}}().disconnect(connectToken);
       break;
   {{/usesRest}}
     default:
diff --git a/ragconnect.tests/build.gradle b/ragconnect.tests/build.gradle
index 9af1e5b..0788d66 100644
--- a/ragconnect.tests/build.gradle
+++ b/ragconnect.tests/build.gradle
@@ -1,8 +1,14 @@
 buildscript {
-    repositories.mavenCentral()
+    repositories {
+        mavenCentral()
+        maven {
+            name "gitlab-maven"
+            url "https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven"
+        }
+    }
     dependencies {
         classpath 'org.jastadd:jastaddgradle:1.13.3'
-        classpath fileTree(include: ['buildSrc.jar'], dir: '../libs')
+        classpath 'org.jastadd.relast:relast-test:0.2.4'
     }
 }
 
@@ -24,7 +30,6 @@ group = 'de.tudresden.inf.st'
 
 repositories {
     mavenCentral()
-    jcenter()
 }
 
 dependencies {
@@ -82,7 +87,9 @@ 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/*/'
+    delete fileTree(dir: 'src/test/02-after-ragconnect/', exclude: '.gitignore')
+    delete fileTree(dir: 'src/test/03-after-relast/', exclude: '.gitignore')
+    delete fileTree(dir: 'src/test/java-gen/', exclude: '.gitignore')
 }
 
 // --- Test: Example ---
@@ -332,6 +339,7 @@ task compileTutorialTest(type: RelastTest) {
     moreInputFiles 'src/test/01-input/tutorial/Test.jadd',
             'src/test/02-after-ragconnect/tutorial/MqttHandler.jadd',
             'src/test/02-after-ragconnect/tutorial/RagConnect.jadd'
+//    extraJastAddOptions "--tracing=cache,flush"
 }
 
 compileTestJava.dependsOn compileTutorialTest
-- 
GitLab