From ec1229b9d3995f8b517e7e70c4adc30c4d07dc39 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Mon, 29 Nov 2021 11:57:11 +0100
Subject: [PATCH] working on concise grammar

- remove automatic boxing of collections
- fix a couple of errors
---
 .../src/main/jastadd/NameResolution.jrag      |  2 +-
 .../src/main/jastadd/Navigation.jrag          |  4 +-
 ragconnect.base/src/main/jastadd/Util.jadd    |  2 +
 .../main/jastadd/intermediate/Generation.jadd | 26 +++----------
 .../main/jastadd/intermediate/Mappings.jrag   |  6 +--
 .../src/main/resources/handler.mustache       |  2 +-
 .../resources/mappingApplication.mustache     |  4 +-
 .../src/main/resources/ragconnect.mustache    | 31 ++++++---------
 .../main/resources/receiveDefinition.mustache | 38 +++++++++----------
 .../main/resources/tokenComponent.mustache    |  4 +-
 10 files changed, 50 insertions(+), 69 deletions(-)

diff --git a/ragconnect.base/src/main/jastadd/NameResolution.jrag b/ragconnect.base/src/main/jastadd/NameResolution.jrag
index 80525b5..47ae57a 100644
--- a/ragconnect.base/src/main/jastadd/NameResolution.jrag
+++ b/ragconnect.base/src/main/jastadd/NameResolution.jrag
@@ -9,7 +9,7 @@ aspect RagConnectNameResolution {
     return result;
   }
   syn MappingDefinition EndpointDefinition.tryResolveMappingByToken(String id) {
-    for (MappingDefinition mappingDefinition : ragconnect().allMappingDefinitionList()) {
+    for (MappingDefinition mappingDefinition : ragconnect().givenMappingDefinitionList()) {
       if (mappingDefinition.getID().equals(id)) {
         return mappingDefinition;
       }
diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
index 615c671..d09444c 100644
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -99,8 +99,8 @@ aspect RagConnectNavigation {
     return result;
   }
 
-  //--- allMappingDefinitionList ---
-  syn List<MappingDefinition> RagConnect.allMappingDefinitionList() {
+  //--- givenMappingDefinitionList ---
+  syn List<MappingDefinition> RagConnect.givenMappingDefinitionList() {
     List<MappingDefinition> result = new ArrayList<>();
     for (ConnectSpecification spec : getConnectSpecificationFileList()) {
       spec.getMappingDefinitionList().forEach(result::add);
diff --git a/ragconnect.base/src/main/jastadd/Util.jadd b/ragconnect.base/src/main/jastadd/Util.jadd
index 3b59b13..81b820c 100644
--- a/ragconnect.base/src/main/jastadd/Util.jadd
+++ b/ragconnect.base/src/main/jastadd/Util.jadd
@@ -2,4 +2,6 @@ aspect Util {
   static String ASTNode.capitalize(String s) {
     return Character.toUpperCase(s.charAt(0)) + s.substring(1);
   }
+  protected T JastAddList.firstChild() { return getChild(0); }
+  protected T JastAddList.lastChild() { return getChild(getNumChild() - 1); }
 }
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
index 83a89d6..3b0137e 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
@@ -4,7 +4,7 @@ Design considerations
 - [NEW in 1.0.0] no complete intermediate structure, but instead single nodes where applicable
 */
 aspect NewStuff {
-  syn List<TypeComponent> RagConnect.rootTypeComponentList() {
+  syn List<TypeComponent> RagConnect.rootTypeComponents() {
     List<TypeComponent> result = new ArrayList<>();
     for (Component child : rootNode.getComponentList()) {
       if (child.isTypeComponent()) {
@@ -13,6 +13,7 @@ aspect NewStuff {
     }
     return result;
   }
+  syn boolean RagConnect.hasRootTypeComponents() = !rootTypeComponents().isEmpty();
 
 //  inh boolean TypeComponent.isFirst();
 //  eq RagConnect.getRootTypeComponentList(int i).isFirst() = i == 0;
@@ -172,14 +173,14 @@ aspect NewStuff {
       } else {
         result = new MTokenReceiveDefinition();
       }
-    } else if (getEndpointTarget().isTokenEndpointTarget()) {
+    } else if (getEndpointTarget().isTypeEndpointTarget()) {
       if (getSend()) {
         result = new MTypeSendDefinition();
       } else {
         result = new MTypeReceiveDefinition();
       }
     } else {
-      throw new RuntimeException("Unknown endpoint target type for " + this);
+      throw new RuntimeException("Unknown endpoint target type: " + getEndpointTarget());
     }
     result.setEndpointDefinition(this);
     for (MappingDefinition def : effectiveMappings()) {
@@ -200,16 +201,8 @@ aspect NewStuff {
     return result;
   }
 
-  syn List<TypeComponent> RagConnect.rootTypeComponents() {
-    List<TypeComponent> result = new ArrayList<>();
-    for (Component child : rootNode.getComponentList()) {
-      if (child.isTypeComponent()) {
-        result.add(child.asTypeComponent());
-      }
-    }
-    return result;
-  }
-
+  syn JastAddList<MInnerMappingDefinition> EndpointDefinition.innerMappingDefinitions() = toMustache().getInnerMappingDefinitionList();
+  syn boolean EndpointDefinition.hasTypeEndpointTarget() = getEndpointTarget().isTypeEndpointTarget();
 }
 
 aspect OldStuff { // copied unchanged, but should work
@@ -292,13 +285,6 @@ aspect AspectGeneration {
           }
         };
       }
-      @Override
-      public Object coerce(Object object) {
-        if (object instanceof Collection) {
-          return new com.github.mustachejava.util.DecoratedCollection((Collection) object);
-        }
-        return super.coerce(object);
-      }
     };
     com.github.mustachejava.DefaultMustacheFactory mf = new com.github.mustachejava.DefaultMustacheFactory();
     mf.setObjectHandler(roh);
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
index afdcb10..82ca5a5 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
+++ b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
@@ -263,9 +263,9 @@ aspect Mappings {
       return getEndpointTarget().targetTypeName();
     } else {
       if (getSend()) {
-        return getMappingList().get(0).getFromType().prettyPrint();
-      } else {
         return getMappingList().get(getMappingList().size() - 1).getToType().prettyPrint();
+      } else {
+        return getMappingList().get(0).getFromType().prettyPrint();
       }
     }
   }
@@ -326,7 +326,7 @@ aspect Mappings {
   syn java.util.List<MappingDefinition> RagConnect.allMappingDefinitions() {
     java.util.List<MappingDefinition> result = new java.util.ArrayList<>();
     // user-defined mappings
-    allMappingDefinitionList().iterator().forEachRemaining(result::add);
+    givenMappingDefinitionList().iterator().forEachRemaining(result::add);
     // byte[] <-> primitive conversion
     result.add(defaultBytesToBooleanMapping());
     result.add(defaultBytesToIntMapping());
diff --git a/ragconnect.base/src/main/resources/handler.mustache b/ragconnect.base/src/main/resources/handler.mustache
index fe8d945..24a87dc 100644
--- a/ragconnect.base/src/main/resources/handler.mustache
+++ b/ragconnect.base/src/main/resources/handler.mustache
@@ -2,8 +2,8 @@ aspect RagConnectHandler {
 {{#Handlers}}
   {{#InUse}}
   private {{ClassName}} {{rootNodeName}}.{{FieldName}} = {{{Construction}}};
+  {{#hasRootTypeComponents}}inh {{ClassName}} ASTNode.{{AttributeName}}();{{/hasRootTypeComponents}}
   {{#rootTypeComponents}}
-  {{#first}}inh {{ClassName}} ASTNode.{{AttributeName}}();{{/first}}
   eq {{rootNodeName}}.get{{name}}().{{AttributeName}}() = {{FieldName}};
   {{/rootTypeComponents}}
   syn {{ClassName}} {{rootNodeName}}.{{AttributeName}}() = {{FieldName}};
diff --git a/ragconnect.base/src/main/resources/mappingApplication.mustache b/ragconnect.base/src/main/resources/mappingApplication.mustache
index bc59e0b..934e45c 100644
--- a/ragconnect.base/src/main/resources/mappingApplication.mustache
+++ b/ragconnect.base/src/main/resources/mappingApplication.mustache
@@ -1,8 +1,8 @@
 {{{lastDefinitionToType}}} {{lastResult}};
 try {
-  {{#InnerMappingDefinitions}}
+  {{#innerMappingDefinitions}}
   {{^last}}{{{toType}}} {{/last}}{{outputVarName}} = {{methodName}}({{inputVarName}});
-  {{/InnerMappingDefinitions}}
+  {{/innerMappingDefinitions}}
 } catch (RagConnectRejectMappingException e) {
   // do not print message in case of rejection
   {{preemptiveReturn}}
diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache
index 8b3ae7d..f53cb2f 100644
--- a/ragconnect.base/src/main/resources/ragconnect.mustache
+++ b/ragconnect.base/src/main/resources/ragconnect.mustache
@@ -1,36 +1,29 @@
 {{#usesMqtt}}{{> mqtt}}{{/usesMqtt}}
 {{> handler}}
 aspect RagConnect {
-  {{#TokenReceiveDefinitions}}
-  {{> receiveDefinition}}
-  {{/TokenReceiveDefinitions}}
-
-  {{#TokenSendDefinitions}}
-  {{> sendDefinition}}
-  {{/TokenSendDefinitions}}
-
-  {{#TypeReceiveDefinitions}}
-  {{> receiveDefinition}}
-  {{/TypeReceiveDefinitions}}
-
-  {{#TypeSendDefinitions}}
-  {{> sendDefinition}}
-  {{/TypeSendDefinitions}}
+  {{#allEndpointDefinitionList}}
+    {{#Send}}
+      {{> sendDefinition}}
+    {{/Send}}
+    {{^Send}}
+      {{> receiveDefinition}}
+    {{/Send}}
+  {{/allEndpointDefinitionList}}
 
   class RagConnectRejectMappingException extends RuntimeException {}
   private static void ASTNode.reject() {
     throw new RagConnectRejectMappingException();
   }
 
-  {{#MappingDefinitions}}
+  {{#allMappingDefinitions}}
   {{#isUsed}}
   {{> mappingDefinition}}
   {{/isUsed}}
-  {{/MappingDefinitions}}
+  {{/allMappingDefinitions}}
 
-  {{#DependencyDefinitions}}
+  {{#allDependencyDefinitionList}}
   {{> dependencyDefinition}}
-  {{/DependencyDefinitions}}
+  {{/allDependencyDefinitionList}}
 
   {{#tokenComponentsThatNeedProxy}}
   {{> tokenComponent}}
diff --git a/ragconnect.base/src/main/resources/receiveDefinition.mustache b/ragconnect.base/src/main/resources/receiveDefinition.mustache
index 2fd0ea2..347d3d1 100644
--- a/ragconnect.base/src/main/resources/receiveDefinition.mustache
+++ b/ragconnect.base/src/main/resources/receiveDefinition.mustache
@@ -13,55 +13,55 @@ private int {{parentTypeName}}.{{resolveInListMethodName}}(String topic) {
 
 /**
  * Connects the receive endpoint {{entityName}}.
-{{#typeIsList}}{{#isWithAdd}}
+{{#typeIsList}}{{#WithAdd}}
  * New values are appended to the end of the list.
-{{/isWithAdd}}{{/typeIsList}}
+{{/WithAdd}}{{/typeIsList}}
  * @param {{connectParameterName}} string describing protocol and path as an URI
-{{#typeIsList}}{{#IndexBasedListAccess}}{{^isWithAdd}}
+{{#typeIsList}}{{#IndexBasedListAccess}}{{^WithAdd}}
  * @param index index of node in list to connect (the list is expected to have enough elements)
-{{/isWithAdd}}{{/IndexBasedListAccess}}{{/typeIsList}}
+{{/WithAdd}}{{/IndexBasedListAccess}}{{/typeIsList}}
  * @return true if connect was successful, false otherwise
  * @throws java.io.IOException if connect failed
  */
-public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterName}}{{#typeIsList}}{{#IndexBasedListAccess}}{{^isWithAdd}}, int index{{/isWithAdd}}{{/IndexBasedListAccess}}{{/typeIsList}}) throws java.io.IOException {
+public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterName}}{{#typeIsList}}{{#IndexBasedListAccess}}{{^WithAdd}}, int index{{/WithAdd}}{{/IndexBasedListAccess}}{{/typeIsList}}) throws java.io.IOException {
   java.util.function.BiConsumer<String, byte[]> consumer = (topic, message) -> {
     {{> mappingApplication}}
 {{#loggingEnabledForReads}}
     System.out.println("[Receive] " + {{connectParameterName}} + " -> {{entityName}} = " + {{lastResult}});
 {{/loggingEnabledForReads}}
-{{#isTypeEndpointDefinition}}
+{{#hasTypeEndpointTarget}}
     {{lastResult}}.treeResolveAll();
  {{#typeIsList}}
   {{^IndexBasedListAccess}}
-   {{#isWithAdd}}
+   {{#WithAdd}}
     {{getterMethod}}().addAll({{lastResult}});
-   {{/isWithAdd}}
-   {{^isWithAdd}}
+   {{/WithAdd}}
+   {{^WithAdd}}
     set{{entityName}}({{lastResult}});
-   {{/isWithAdd}}
+   {{/WithAdd}}
   {{/IndexBasedListAccess}}
   {{#IndexBasedListAccess}}
     {{lastResult}}.set{{idTokenName}}(topic);
-   {{#isWithAdd}}
+   {{#WithAdd}}
     {{getterMethod}}().add({{lastResult}});
-   {{/isWithAdd}}
-   {{^isWithAdd}}
+   {{/WithAdd}}
+   {{^WithAdd}}
     set{{entityName}}({{lastResult}}, index);
-   {{/isWithAdd}}
+   {{/WithAdd}}
   {{/IndexBasedListAccess}}
  {{/typeIsList}}
  {{^typeIsList}}
     set{{entityName}}({{lastResult}});
  {{/typeIsList}}
-{{/isTypeEndpointDefinition}}
-{{^isTypeEndpointDefinition}}
+{{/hasTypeEndpointTarget}}
+{{^hasTypeEndpointTarget}}
     set{{entityName}}({{lastResult}});
-{{/isTypeEndpointDefinition}}
+{{/hasTypeEndpointTarget}}
   };
   return {{internalConnectMethod}}({{connectParameterName}}, consumer);
 }
 
-{{#typeIsList}}{{#IndexBasedListAccess}}{{^isWithAdd}}
+{{#typeIsList}}{{#IndexBasedListAccess}}{{^WithAdd}}
 /**
  * Connects the receive endpoint {{entityName}} using a "wildcard" URI (if supported by the chosen protocol).
  * @param {{connectParameterName}} string describing protocol and path as an URI
@@ -84,7 +84,7 @@ public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterNam
   };
   return {{internalConnectMethod}}({{connectParameterName}}, consumer);
 }
-{{/isWithAdd}}{{/IndexBasedListAccess}}{{/typeIsList}}
+{{/WithAdd}}{{/IndexBasedListAccess}}{{/typeIsList}}
 
 private boolean {{parentTypeName}}.{{internalConnectMethod}}(String {{connectParameterName}},
     java.util.function.BiConsumer<String, byte[]> consumer) throws java.io.IOException {
diff --git a/ragconnect.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache
index 169f5f6..bbf364a 100644
--- a/ragconnect.base/src/main/resources/tokenComponent.mustache
+++ b/ragconnect.base/src/main/resources/tokenComponent.mustache
@@ -1,6 +1,6 @@
 public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) {
   set{{internalName}}(value);
-  {{#DependencyDefinitions}}
+  {{#DependencySourceDefinitions}}
   for ({{targetParentTypeName}} target : get{{internalRelationPrefix}}TargetList()) {
     {{#targetEndpointDefinition}}
     if (target.{{updateMethod}}()) {
@@ -8,7 +8,7 @@ public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) {
     }
     {{/targetEndpointDefinition}}
   }
-  {{/DependencyDefinitions}}
+  {{/DependencySourceDefinitions}}
   {{#normalTokenSendDef}}
   if ({{updateMethod}}()) {
     {{writeMethod}}();
-- 
GitLab