From 841cea4ec046aed6b762846c8e2bfb61901ff320 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 14 Jan 2021 11:34:32 +0100
Subject: [PATCH] Simplify handler creation.

---
 .../src/main/jastadd/Navigation.jrag          |  7 +++++++
 .../main/jastadd/intermediate/Generation.jadd |  5 +++++
 .../jastadd/intermediate/MustacheNodes.relast |  3 ++-
 .../src/main/resources/MqttHandler.jadd       |  4 +++-
 .../src/main/resources/handler.mustache       | 20 ++++++++++++++-----
 .../src/main/resources/mqtt.mustache          |  9 ---------
 .../src/main/resources/ragconnect.mustache    |  6 +-----
 .../src/main/resources/rest.mustache          | 12 -----------
 8 files changed, 33 insertions(+), 33 deletions(-)
 delete mode 100644 ragconnect.base/src/main/resources/rest.mustache

diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
index f6fc20b..1c2c4af 100644
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -61,4 +61,11 @@ aspect Navigation {
   // --- isDefaultMappingDefinition ---
   syn boolean MappingDefinition.isDefaultMappingDefinition() = false;
   eq DefaultMappingDefinition.isDefaultMappingDefinition() = true;
+
+  // --- mragconnect ---
+  inh MRagConnect MHandler.mragconnect();
+  eq MRagConnect.getHandler().mragconnect() = this;
+
+  // --- rootTypeComponents ---
+  syn JastAddList<MTypeComponent> MHandler.rootTypeComponents() = mragconnect().getRootTypeComponents();
 }
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
index 6b63992..607f960 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
@@ -136,6 +136,11 @@ aspect AttributesForMustache {
         result.addRootTypeComponent(child.asTypeComponent().toMustache());
       }
     }
+    // MHandler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boolean>;
+    result.addHandler(new MHandler("MqttServerHandler", "new MqttServerHandler(\"RagConnectMQTT\")",
+                                   result.mqttHandlerAttribute(), result.mqttHandlerField(), usesMqtt));
+    result.addHandler(new MHandler("RestServerHandler", "new RestServerHandler(\"RagConnectREST\")",
+                                   result.restHandlerAttribute(), result.restHandlerField(), usesRest));
     return result;
   }
 
diff --git a/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast b/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast
index 62ecdb6..0684317 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast
+++ b/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast
@@ -1,4 +1,4 @@
-MRagConnect ::= ReceiveDefinition:MReceiveDefinition* SendDefinition:MSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent*;
+MRagConnect ::= ReceiveDefinition:MReceiveDefinition* SendDefinition:MSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent* Handler:MHandler*;
 abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*;
 MReceiveDefinition : MEndpointDefinition;
 MSendDefinition : MEndpointDefinition;
@@ -7,6 +7,7 @@ MInnerMappingDefinition;
 MDependencyDefinition;
 MTypeComponent;
 MTokenComponent;
+MHandler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boolean>;
 
 rel MRagConnect.RagConnect -> RagConnect;
 rel MInnerMappingDefinition.MMappingDefinition -> MMappingDefinition;
diff --git a/ragconnect.base/src/main/resources/MqttHandler.jadd b/ragconnect.base/src/main/resources/MqttHandler.jadd
index d9f99fb..b675026 100644
--- a/ragconnect.base/src/main/resources/MqttHandler.jadd
+++ b/ragconnect.base/src/main/resources/MqttHandler.jadd
@@ -1,5 +1,7 @@
 import java.io.IOException;
-import java.util.concurrent.TimeUnit;aspect MqttHandler {
+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;
diff --git a/ragconnect.base/src/main/resources/handler.mustache b/ragconnect.base/src/main/resources/handler.mustache
index e89c451..796f760 100644
--- a/ragconnect.base/src/main/resources/handler.mustache
+++ b/ragconnect.base/src/main/resources/handler.mustache
@@ -1,7 +1,17 @@
 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);
-}
+{{#Handlers}}
+  {{#InUse}}
+  private {{ClassName}} {{rootNodeName}}.{{FieldName}} = {{{Construction}}};
+  {{#rootTypeComponents}}
+  {{#first}}inh {{ClassName}} ASTNode.{{AttributeName}}();{{/first}}
+  eq {{rootNodeName}}.get{{name}}().{{AttributeName}}() = {{FieldName}};
+  {{/rootTypeComponents}}
+  syn {{ClassName}} {{rootNodeName}}.{{AttributeName}}() = {{FieldName}};
+  {{/InUse}}
+{{/Handlers}}
+  public void {{rootNodeName}}.{{closeMethod}}() {
+    {{#Handlers}}
+    {{#InUse}}{{FieldName}}.close();{{/InUse}}
+    {{/Handlers}}
+  }
 }
diff --git a/ragconnect.base/src/main/resources/mqtt.mustache b/ragconnect.base/src/main/resources/mqtt.mustache
index 8de0b5a..f12cb89 100644
--- a/ragconnect.base/src/main/resources/mqtt.mustache
+++ b/ragconnect.base/src/main/resources/mqtt.mustache
@@ -1,14 +1,5 @@
 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}}
-  syn MqttServerHandler {{rootNodeName}}.{{mqttHandlerAttribute}}() = {{mqttHandlerField}};
 }
diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache
index a39510d..49d1721 100644
--- a/ragconnect.base/src/main/resources/ragconnect.mustache
+++ b/ragconnect.base/src/main/resources/ragconnect.mustache
@@ -1,10 +1,6 @@
 {{#usesMqtt}}{{> mqtt}}{{/usesMqtt}}
-{{#usesRest}}{{> rest}}{{/usesRest}}
+{{> handler}}
 aspect ROS2RAG {
-  public void {{rootNodeName}}.{{closeMethod}}() {
-    {{#usesMqtt}}{{mqttHandlerField}}.close();{{/usesMqtt}}
-    {{#usesRest}}{{restHandlerField}}.close();{{/usesRest}}
-  }
   {{#ReceiveDefinitions}}
   {{> receiveDefinition}}
   {{/ReceiveDefinitions}}
diff --git a/ragconnect.base/src/main/resources/rest.mustache b/ragconnect.base/src/main/resources/rest.mustache
deleted file mode 100644
index 6bbde2b..0000000
--- 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}}
-}
-- 
GitLab