diff --git a/ragconnect.base/src/main/jastadd/NameResolution.jrag b/ragconnect.base/src/main/jastadd/NameResolution.jrag index 80525b590d886af4db3c0dd1916a73d356df2244..47ae57ae996330a8e45411d8b0b92b8af755e2dd 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 615c671928b42eaaa074c2514bf158a8390d3509..d09444c50803dddf8ecf9a5ff18506c51b0139f4 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 3b59b13c53a8d0e1ca2a05feba43294797a4577e..81b820c0b4610e17f82aa31f97c44c97405443e0 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 83a89d6d2ca9d24d77457ec400a27e3f73f22890..3b0137e6caa4e9e6cab6d8b2d155569291014e9b 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 afdcb102577727ac649a045d5f7f0910a9df30fe..82ca5a58a330393cdb7ee1a722afa0209a2c047c 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 fe8d9459a0d1b977f7416da85ba3fb1c4d3e6b8f..24a87dc8fed956fc342b3120ad3ad7b7b903fb0a 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 bc59e0b318dcd430b5f21fd0a67d157b35a4bb7c..934e45c178ca9bcd580c1f7bc9b88b2b169ad7e3 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 8b3ae7d799f7da27ca7be4117056e1cb74299ebd..f53cb2f54ffb8c058f37e996f3a1e932074ce6a9 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 2fd0ea21f1dc6072941b99d6bfa6238f1c0f4f90..347d3d160204fb88e141b18dd811ce19daff5d68 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 169f5f64fff01ef2c34abeea34266b5a82deaf3a..bbf364ab36ab17ed4a667d1f5b77fc00cb8adc3d 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}}();