From b9c399cb09c19451ed6c3b2fcff574adee5e21e2 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Mon, 2 May 2022 18:47:49 +0200
Subject: [PATCH] fixed errors in JavaHandler

---
 .../src/main/resources/JavaHandler.mustache   | 67 ++++++++-----------
 .../main/resources/receiveDefinition.mustache |  5 +-
 .../main/resources/sendDefinition.mustache    |  1 +
 ragconnect.tests/build.gradle                 |  7 ++
 .../tests/relation/RelationTest.java          |  1 -
 5 files changed, 40 insertions(+), 41 deletions(-)

diff --git a/ragconnect.base/src/main/resources/JavaHandler.mustache b/ragconnect.base/src/main/resources/JavaHandler.mustache
index bc73c91..9efd0ba 100644
--- a/ragconnect.base/src/main/resources/JavaHandler.mustache
+++ b/ragconnect.base/src/main/resources/JavaHandler.mustache
@@ -3,7 +3,8 @@
  */
 public class JavaHandler {
   public static JavaHandler JAVA_HANDLER_INSTANCE = null;
-  private java.util.Map<String, java.util.List<Pair<String, java.util.function.BiConsumer<String, byte[]>>>> callbackList = new java.util.concurrent.ConcurrentHashMap<>();
+  private java.util.Map<String, java.util.List<java.util.function.BiConsumer<String, byte[]>>> callbackList = new java.util.concurrent.ConcurrentHashMap<>();
+  private final java.util.Map<RagConnectToken, java.util.function.BiConsumer<String, byte[]>> tokensForRemoval = new java.util.HashMap<>();
   private String name;
 
   private JavaHandler() {
@@ -21,68 +22,58 @@ public class JavaHandler {
     return JAVA_HANDLER_INSTANCE;
   }
 
-  public String registerCallback(String topic, java.util.function.BiConsumer<String, byte[]> callback) {
-    {{logInfo}}("[JAVA_HANDLER] Registering new callback for {{log_}}.", topic);
+  private static String extractPath(java.net.URI uri) {
+    String path = uri.getPath();
+    if (path.charAt(0) == '/') {
+      path = path.substring(1);
+    }
+    return path;
+  }
+
 
-    String callbackUUID = java.util.UUID.randomUUID().toString();
+  public boolean registerCallback(RagConnectToken connectToken, java.util.function.BiConsumer<String, byte[]> callback) {
+    String path = extractPath(connectToken.uri);
+    {{logInfo}}("[JAVA_HANDLER] Registering new callback for {{log_}}.", path);
 
-    java.util.List<Pair<String, java.util.function.BiConsumer<String, byte[]>>> registeredCallbacks = getAllCallbacks().get(topic);
+    java.util.List<java.util.function.BiConsumer<String, byte[]>> registeredCallbacks = callbackList.get(path);
 
     if (registeredCallbacks == null) {
-      java.util.List<Pair<String, java.util.function.BiConsumer<String, byte[]>>> newCallbackList = java.util.Collections.synchronizedList(new java.util.ArrayList<>());
-      newCallbackList.add(new Pair<>(callbackUUID, callback));
-      callbackList.put(topic, newCallbackList);
-    } else {
-      registeredCallbacks.add(new Pair<>(callbackUUID, callback));
+      registeredCallbacks = java.util.Collections.synchronizedList(new java.util.ArrayList<>());
+      callbackList.put(path, registeredCallbacks);
     }
+    registeredCallbacks.add(callback);
+    tokensForRemoval.put(connectToken, callback);
 
-    return callbackUUID;
+    return true;
   }
 
-  public boolean unregisterCallback(String path, String uuid) {
-    {{logInfo}}("[JAVA_HANDLER] Unregistering callback with uuid: {{log_}}", uuid + " on path: {{log_}}", path);
-
-    java.util.List<Pair<String, java.util.function.BiConsumer<String, byte[]>>> callbacks = getAllCallbacks().get(path);
+  public boolean unregisterCallback(RagConnectToken connectToken) {
+    String path = extractPath(connectToken.uri);
+    java.util.function.BiConsumer<String, byte[]> callback = tokensForRemoval.get(connectToken);
+    {{logInfo}}("[JAVA_HANDLER] Unregistering callback with uuid: on path: {{log_}}", path);
 
-    int count = 0;
-
-    if (callbacks != null) {
-      for (Pair<String, java.util.function.BiConsumer<String, byte[]>> callbackPair : callbacks) {
-        if (callbackPair._1.equals(uuid)) {
-          callbacks.remove(count);
-          return true;
-        } else {
-          count++;
-        }
-      }
-    }
-    return false;
+    return callbackList.get(path).remove(callback);
   }
 
   public void close() {
   }
 
-  public boolean push(String topic, byte[] data) {
+  public boolean push(String path, byte[] data) {
     {{logDebug}}("[JAVA_HANDLER] Pushing a message.");
     String dataString = new String(data);
     {{logDebug}}("[JAVA_HANDLER] Data: {{log_}}", dataString);
 
-    java.util.List<Pair<String, java.util.function.BiConsumer<String, byte[]>>> callbacks = getAllCallbacks().get(topic);
+    java.util.List<java.util.function.BiConsumer<String, byte[]>> callbacks = callbackList.get(path);
 
     if (callbacks == null) {
-      {{logError}}("[JAVA_HANDLER] Could not publish message. No callback registered for topic {{log_}}", topic);
+      {{logError}}("[JAVA_HANDLER] Could not publish message. No callback registered for path {{log_}}", path);
       return false;
     }
 
-    for (Pair<String, java.util.function.BiConsumer<String, byte[]>> callbackPair : callbacks) {
-      {{logDebug}}("[JAVA_HANDLER] Calling callback: {{log_}}", callbackPair._1);
-      callbackPair._2.accept(topic, data);
+    for (java.util.function.BiConsumer<String, byte[]> callback : callbacks) {
+      callback.accept(path, data);
     }
 
     return true;
   }
-
-  public java.util.Map<String, java.util.List<Pair<String, java.util.function.BiConsumer<String, byte[]>>>> getAllCallbacks() {
-    return callbackList;
-  }
 }
diff --git a/ragconnect.base/src/main/resources/receiveDefinition.mustache b/ragconnect.base/src/main/resources/receiveDefinition.mustache
index c4f070c..28a9bb5 100644
--- a/ragconnect.base/src/main/resources/receiveDefinition.mustache
+++ b/ragconnect.base/src/main/resources/receiveDefinition.mustache
@@ -96,7 +96,7 @@ private boolean {{parentTypeName}}.{{internalConnectMethodName}}(String {{connec
   {{#javaHandler}}
   {{#InUse}}
     case "java":
-      success = {{attributeName}}().registerCallback(path, consumer, connectToken);
+      success = {{attributeName}}().registerCallback(connectToken, consumer);
       break;
   {{/InUse}}
   {{/javaHandler}}
@@ -139,7 +139,8 @@ public boolean {{parentTypeName}}.{{disconnectMethodName}}(String {{connectParam
   switch (scheme) {
   {{#javaHandler}}
   {{#InUse}}
-    case "java": return {{attributeName}}().unregisterCallback(uri.getPath(), connectTokens.get(this).get(uri).globalId);
+    case "java": disconnectingMethod = {{attributeName}}()::unregisterCallback;
+    break;
   {{/InUse}}
   {{/javaHandler}}
   {{#mqttHandler}}
diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache
index 1485c17..fae0fd2 100644
--- a/ragconnect.base/src/main/resources/sendDefinition.mustache
+++ b/ragconnect.base/src/main/resources/sendDefinition.mustache
@@ -17,6 +17,7 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete
     if (writeCurrentValue) {
       {{writeMethodName}}({{#IndexBasedListAccess}}index, {{/IndexBasedListAccess}}connectToken);
     }
+    success = true;
     break;
   {{/InUse}}
   {{/javaHandler}}
diff --git a/ragconnect.tests/build.gradle b/ragconnect.tests/build.gradle
index d41a73c..5a2a82a 100644
--- a/ragconnect.tests/build.gradle
+++ b/ragconnect.tests/build.gradle
@@ -691,7 +691,14 @@ task compileJavaIncremental(type: RagConnectTest) {
 
 // --- Task order ---
 classes.dependsOn(':ragconnect.base:jar')
+// TODO remove special handling of compileJavaIncremental once finished
+compileJavaIncremental {
+    doFirst {
+        fileTree(dir: 'src/test/java-gen/javaInc/ast/', exclude: '.gitignore')
+    }
+}
 compileJavaIncremental.outputs.upToDateWhen { false }
+compileJavaIncremental.dependsOn(':ragconnect.base:assemble')
 
 // --- Misc ---
 static ArrayList<String> defaultRagConnectOptionsAnd(ArrayList<String> options = []) {
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/relation/RelationTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/relation/RelationTest.java
index a88f97f..d9c4979 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/relation/RelationTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/relation/RelationTest.java
@@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.*;
  * @author rschoene - Initial contribution
  */
 @Tag("Incremental")
-@Tag("New")
 public class RelationTest extends AbstractMqttTest {
 
   private static final String TOPIC_WILDCARD = "rel/#";
-- 
GitLab