From 22751792bc7139263e8501fa01227f457f1f529f Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Mon, 15 Jun 2020 16:34:28 +0200
Subject: [PATCH] Extracting mqtt aspect for tiny template.

---
 ros2rag.base/build.gradle                     |  2 +-
 .../main/jastadd/backend/Configuration.jadd   |  1 +
 .../src/main/jastadd/backend/Generation.jadd  | 60 +++++++------------
 ros2rag.base/src/main/resources/mqtt.tt       | 26 ++++++++
 4 files changed, 51 insertions(+), 38 deletions(-)
 create mode 100644 ros2rag.base/src/main/resources/mqtt.tt

diff --git a/ros2rag.base/build.gradle b/ros2rag.base/build.gradle
index 9e0bde2..dc5f986 100644
--- a/ros2rag.base/build.gradle
+++ b/ros2rag.base/build.gradle
@@ -20,7 +20,7 @@ dependencies {
     implementation 'com.fasterxml.jackson.core:jackson-core:2.9.8'
     implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
 //    api 'org.jastadd:jastadd:2.3.4'
-    runtime 'org.jastadd:jastadd:2.3.4'
+    implementation 'org.jastadd:jastadd:2.3.4'
     api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
 }
 
diff --git a/ros2rag.base/src/main/jastadd/backend/Configuration.jadd b/ros2rag.base/src/main/jastadd/backend/Configuration.jadd
index 711ba25..ff33b45 100644
--- a/ros2rag.base/src/main/jastadd/backend/Configuration.jadd
+++ b/ros2rag.base/src/main/jastadd/backend/Configuration.jadd
@@ -1,4 +1,5 @@
 aspect Configuration {
   public static boolean ASTNode.loggingEnabledForReads = false;
   public static boolean ASTNode.loggingEnabledForWrites = false;
+  protected static TypeDecl ASTNode.rootNode;
 }
diff --git a/ros2rag.base/src/main/jastadd/backend/Generation.jadd b/ros2rag.base/src/main/jastadd/backend/Generation.jadd
index e698e40..9156a20 100644
--- a/ros2rag.base/src/main/jastadd/backend/Generation.jadd
+++ b/ros2rag.base/src/main/jastadd/backend/Generation.jadd
@@ -52,52 +52,38 @@ aspect AspectGeneration {
 
   public String Ros2Rag.generateAspect(String rootNodeName) {
     StringBuilder sb = new StringBuilder();
-    TypeDecl rootNode = getProgram().resolveTypeDecl(rootNodeName);
-    generateMqttAspect(sb, rootNode);
+    rootNode = getProgram().resolveTypeDecl(rootNodeName);
+    generateMqttAspect(sb);
     generateGrammarExtension(sb);
     return sb.toString();
   }
 
-  public void Ros2Rag.generateMqttAspect(StringBuilder sb, TypeDecl rootNode) {
-    String rootNodeName = rootNode.getName();
-    sb.append("aspect MQTT {\n");
-    sb.append(ind(1)).append("private MqttUpdater ").append(rootNodeName)
-      .append(".").append(mqttUpdaterField()).append(" = new MqttUpdater();\n");
-
-    // mqttSetHost(String host)
-    sb.append(ind(1)).append("public void ").append(rootNodeName).append(".")
-      .append(mqttSetHostMethod()).append("(String host) throws java.io.IOException {\n");
-    sb.append(ind(2)).append(mqttUpdaterField()).append(".setHost(host);\n");
-    sb.append(ind(1)).append("}\n");
-
-    // mqttSetHost(String host, int port)
-    sb.append(ind(1)).append("public void ").append(rootNodeName).append(".")
-      .append(mqttSetHostMethod()).append("(String host, int port) throws java.io.IOException {\n");
-    sb.append(ind(2)).append(mqttUpdaterField()).append(".setHost(host, port);\n");
-    sb.append(ind(1)).append("}\n\n");
-
-    // mqttWaitUntilReady
-    sb.append(ind(1)).append("public boolean ").append(rootNodeName).append(".")
-      .append(mqttWaitUntilReadyMethod()).append("(long time, java.util.concurrent.TimeUnit unit) {\n");
-    sb.append(ind(2)).append("return ").append(mqttUpdaterField()).append(".waitUntilReady(time, unit);\n");
-    sb.append(ind(1)).append("}\n\n");
-
-    // mqttClose
-    sb.append(ind(1)).append("public void ").append(rootNodeName).append(".")
-      .append(mqttCloseMethod()).append("() {\n");
-    sb.append(ind(2)).append(mqttUpdaterField()).append(".close();\n");
-    sb.append(ind(1)).append("}\n\n");
+  public void Ros2Rag.generateMqttAspect(StringBuilder sb) {
+    org.jastadd.tinytemplate.TinyTemplate tt;
+    try {
+      tt = new org.jastadd.tinytemplate.TinyTemplate();
+      tt.loadTemplates(Ros2Rag.class.getClassLoader().getResourceAsStream("mqtt.tt"));
+    } catch (org.jastadd.tinytemplate.TemplateParser.SyntaxError e) {
+      e.printStackTrace();
+      return;
+    }
+    org.jastadd.tinytemplate.SimpleContext context = new org.jastadd.tinytemplate.SimpleContext(tt, this);
+    context.bind("rootNodeName", rootNode.getName());
+    context.bind("RootTypeChildrenMqtt", emitRootTypeChildrenMqtt(tt));
+    context.expand(context, "Ros2Rag.mqtt", sb);
+  }
 
-    // mqttUpdater
-    sb.append(ind(1)).append("inh MqttUpdater ASTNode.").append(mqttUpdaterAttribute()).append("();\n");
+  public String Ros2Rag.emitRootTypeChildrenMqtt(org.jastadd.tinytemplate.TinyTemplate tt) {
+    StringBuilder sb = new StringBuilder();
+    org.jastadd.tinytemplate.SimpleContext context = new org.jastadd.tinytemplate.SimpleContext(tt, this);
+    context.bind("rootNodeName", rootNode.getName());
     for (Component child : rootNode.getComponentList()) {
       if (child.isTypeComponent()) {
-        sb.append(ind(1)).append("eq ").append(rootNodeName)
-          .append(".get").append(child.getName()).append("().")
-          .append(mqttUpdaterAttribute()).append("() = ").append(mqttUpdaterField()).append(";\n");
+        context.bind("Name", child.getName());
+        context.expand(context, "TypeComponent.mqtt", sb);
       }
     }
-    sb.append("}\n\n");
+    return sb.toString();
   }
 
   public void Ros2Rag.generateGrammarExtension(StringBuilder sb) {
diff --git a/ros2rag.base/src/main/resources/mqtt.tt b/ros2rag.base/src/main/resources/mqtt.tt
new file mode 100644
index 0000000..3dd63ef
--- /dev/null
+++ b/ros2rag.base/src/main/resources/mqtt.tt
@@ -0,0 +1,26 @@
+Ros2Rag.mqtt [[
+aspect MQTT {
+  private MqttUpdater $rootNodeName.#(mqttUpdaterField) = new MqttUpdater();
+  public void $rootNodeName.#(mqttSetHostMethod)(String host) throws java.io.IOException {
+    #(mqttUpdaterField).setHost(host);
+  }
+  public void $rootNodeName.#(mqttSetHostMethod)(String host, int port) throws java.io.IOException {
+    #(mqttUpdaterField).setHost(host, port);
+  }
+
+  public boolean $rootNodeName.#(mqttWaitUntilReadyMethod)(long time, java.util.concurrent.TimeUnit unit) {
+    return #(mqttUpdaterField).waitUntilReady(time, unit);
+  }
+
+  public void $rootNodeName.#(mqttCloseMethod)() {
+    #(mqttUpdaterField).close();
+  }
+
+  inh MqttUpdater ASTNode.#(mqttUpdaterAttribute)();
+  $RootTypeChildrenMqtt
+}
+]]
+
+TypeComponent.mqtt [[
+  eq $rootNodeName.get$(Name)().#(mqttUpdaterAttribute)() = #(mqttUpdaterField);
+]]
-- 
GitLab