diff --git a/src/main/jastadd/Analysis.jrag b/src/main/jastadd/Analysis.jrag index 30159bc3149d419953be27e9a0801faa46acdde3..769d283301b8fb29064c8030bfee6f9fb5e433da 100644 --- a/src/main/jastadd/Analysis.jrag +++ b/src/main/jastadd/Analysis.jrag @@ -1,7 +1,8 @@ aspect Analysis { // --- lookupTokenEndpointDefinition --- inh java.util.List<TokenEndpointDefinition> TokenEndpointDefinition.lookupTokenEndpointDefinitions(TokenComponent token); - eq RagConnect.getEndpointDefinition().lookupTokenEndpointDefinitions(TokenComponent token) { + eq RagConnect.getEndpointDefinition().lookupTokenEndpointDefinitions(TokenComponent token) = lookupTokenEndpointDefinitions(token); + syn java.util.List<TokenEndpointDefinition> RagConnect.lookupTokenEndpointDefinitions(TokenComponent token) { java.util.List<TokenEndpointDefinition> result = new java.util.ArrayList<>(); for (EndpointDefinition def : getEndpointDefinitionList()) { if (def.isTokenEndpointDefinition() && def.asTokenEndpointDefinition().getToken().equals(token)) { diff --git a/src/main/jastadd/MustacheNodes.relast b/src/main/jastadd/MustacheNodes.relast index 73d1b318e03c68d2bd243264b3d9863548657e02..d2d611798005c45e810ebfeddfa6c767b36167e4 100644 --- a/src/main/jastadd/MustacheNodes.relast +++ b/src/main/jastadd/MustacheNodes.relast @@ -12,7 +12,8 @@ MTypeComponent; MTokenComponent; rel MRagConnect.RagConnect -> RagConnect; -rel MInnerMappingDefinition.MappingDefinition -> MappingDefinition; +// useless comment +rel MInnerMappingDefinition.MMappingDefinition -> MMappingDefinition; rel MReceiveDefinition.ReceiveTokenEndpointDefinition -> ReceiveTokenEndpointDefinition; rel MSendDefinition.SendTokenEndpointDefinition -> SendTokenEndpointDefinition; rel MMappingDefinition.MappingDefinition -> MappingDefinition; diff --git a/src/main/jastadd/backend/Generation.jadd b/src/main/jastadd/backend/Generation.jadd index 35d1fcd6c65b37e0f6344df233310a371fbabb60..ff948334b793fc4930585ee5705285187b7c2606 100644 --- a/src/main/jastadd/backend/Generation.jadd +++ b/src/main/jastadd/backend/Generation.jadd @@ -23,60 +23,76 @@ aspect GenerationUtils { /* Open questions - Should all string constants be defined on the normal AST, or on the special mustache AST? +Design considerations +- InnerMappingDefinition needed for iteration attribute (first, last) - not easily possible with list-relation */ aspect AttributesForMustache { // --- MRagConnect --- eq MRagConnect.getChild().mqttHandlerAttribute() = mqttHandlerAttribute(); + eq MRagConnect.getChild().restHandlerAttribute() = restHandlerAttribute(); eq MRagConnect.getChild().mqttHandlerField() = mqttHandlerField(); eq MRagConnect.getRootTypeComponent(int i).isFirst() = i == 0; syn boolean MRagConnect.usesMqtt() = getRagConnect().usesMqtt(); - syn String MRagConnect.mqttHandlerAttribute() = getRagConnect().mqttHandlerAttribute(); - syn String MRagConnect.mqttHandlerField() = getRagConnect().mqttHandlerField(); - syn String MRagConnect.mqttSetHostMethod() = getRagConnect().mqttSetHostMethod(); - syn String MRagConnect.mqttWaitUntilReadyMethod() = getRagConnect().mqttWaitUntilReadyMethod(); - syn String MRagConnect.mqttCloseMethod() = getRagConnect().mqttCloseMethod(); + syn String MRagConnect.mqttHandlerAttribute() = "_mqttHandler"; + syn String MRagConnect.mqttHandlerField() = "_mqttHandler"; + syn String MRagConnect.mqttSetHostMethod() = "MqttSetHost"; + syn String MRagConnect.mqttWaitUntilReadyMethod() = "MqttWaitUntilReady"; + syn String MRagConnect.mqttCloseMethod() = "MqttCloseConnections"; syn boolean MRagConnect.usesRest() = getRagConnect().usesRest(); - syn String MRagConnect.restHandlerAttribute() = getRagConnect().restHandlerAttribute(); - syn String MRagConnect.restHandlerField() = getRagConnect().restHandlerField(); - syn String MRagConnect.restSetPortMethod() = getRagConnect().restSetPortMethod(); - syn String MRagConnect.restCloseMethod() = getRagConnect().restCloseMethod(); + syn String MRagConnect.restHandlerAttribute() = "_restHandler"; + syn String MRagConnect.restHandlerField() = "_restHandler"; + syn String MRagConnect.restSetPortMethod() = "RestSetPort"; + syn String MRagConnect.restCloseMethod() = "RestCloseConnections"; // --- MEndpointDefinition --- syn String MEndpointDefinition.preemptiveExpectedValue(); syn String MEndpointDefinition.preemptiveReturn(); syn TokenEndpointDefinition MEndpointDefinition.endpointDef(); syn String MEndpointDefinition.firstInputVarName(); + syn String MEndpointDefinition.newConnectionMethod(); eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1; eq MEndpointDefinition.getInnerMappingDefinition().resultVarPrefix() = resultVarPrefix(); - eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : resultVarPrefix() + getInnerMappingDefinition(i - 1).getMappingDefinition().methodName(); + eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : resultVarPrefix() + getInnerMappingDefinition(i - 1).methodName(); inh String MEndpointDefinition.mqttHandlerAttribute(); + inh String MEndpointDefinition.restHandlerAttribute(); - syn String MEndpointDefinition.connectParameterName() = endpointDef().connectParameterName(); - syn String MEndpointDefinition.newConnectionMethod() = endpointDef().newConnectionMethod(); - syn String MEndpointDefinition.handlerAttribute() = endpointDef().handlerAttribute(); - syn String MEndpointDefinition.connectMethod() = endpointDef().connectMethod(); + syn String MEndpointDefinition.connectParameterName() { + switch (endpointDef().protocol()) { + case "mqtt": return "topic"; + case "rest": return "path"; + default: return null; + } + } + syn String MEndpointDefinition.handlerAttribute() { + switch (endpointDef().protocol()) { + case "mqtt": return mqttHandlerAttribute(); + case "rest": return restHandlerAttribute(); + default: return null; + } + } + syn String MEndpointDefinition.connectMethod() = "connect" + tokenName() + (ragconnect().lookupTokenEndpointDefinitions(token()).size() > 1 ? "Via" + capitalize(endpointDef().protocol()) : ""); syn TokenComponent MEndpointDefinition.token() = endpointDef().getToken(); syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply(); syn String MEndpointDefinition.resultVarPrefix() = "result"; // we do not need "_" here, because methodName begins with one syn String MEndpointDefinition.parentTypeName() = token().containingTypeDecl().getName(); syn String MEndpointDefinition.tokenName() = token().getName(); syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1); - syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().ToType(); + syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType(); syn String MEndpointDefinition.lastDefinitionName() = lastDefinition().methodName(); syn String MEndpointDefinition.lastResult() = resultVarPrefix() + lastDefinitionName(); syn String MEndpointDefinition.condition() { - if (lastDefinition().getMappingDefinition().getToType().isArray()) { + if (lastDefinition().mappingDef().getToType().isArray()) { return "java.util.Arrays.equals(" + preemptiveExpectedValue() + ", " + lastResult() + ")"; } - if (token().isPrimitiveType() && lastDefinition().getMappingDefinition().getToType().isPrimitiveType()) { + if (token().isPrimitiveType() && lastDefinition().mappingDef().getToType().isPrimitiveType()) { return preemptiveExpectedValue() + " == " + lastResult(); } - if (lastDefinition().getMappingDefinition().isDefaultMappingDefinition()) { + if (lastDefinition().mappingDef().isDefaultMappingDefinition()) { return preemptiveExpectedValue() + " != null && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")"; } return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null"; @@ -85,9 +101,10 @@ aspect AttributesForMustache { // --- MInnerMappingDefinition --- inh boolean MInnerMappingDefinition.isLast(); inh String MInnerMappingDefinition.resultVarPrefix(); - syn String MInnerMappingDefinition.ToType() = getMappingDefinition().getToType().prettyPrint(); - syn String MInnerMappingDefinition.methodName() = getMappingDefinition().methodName(); inh String MInnerMappingDefinition.inputVarName(); + syn String MInnerMappingDefinition.toType() = mappingDef().getToType().prettyPrint(); + syn String MInnerMappingDefinition.methodName() = getMMappingDefinition().methodName(); + syn MappingDefinition MInnerMappingDefinition.mappingDef() = getMMappingDefinition().getMappingDefinition(); // --- MReceiveDefinition --- eq MReceiveDefinition.preemptiveExpectedValue() = "get" + tokenName() + "()"; @@ -95,34 +112,52 @@ aspect AttributesForMustache { eq MReceiveDefinition.endpointDef() = getReceiveTokenEndpointDefinition(); eq MReceiveDefinition.firstInputVarName() = "message"; - syn String MReceiveDefinition.newConnectionMethod() = getReceiveTokenEndpointDefinition().newConnectionMethod(); - syn String MReceiveDefinition.connectParameterName() = getReceiveTokenEndpointDefinition().connectParameterName(); + syn String MReceiveDefinition.newConnectionMethod() { + switch (endpointDef().protocol()) { + case "mqtt": return "newConnection"; + case "rest": return "newPUTConnection"; + default: return null; + } + } // --- MSendDefinition --- eq MSendDefinition.preemptiveExpectedValue() = lastValue(); - eq MSendDefinition.preemptiveReturn() = getSendTokenEndpointDefinition().preemptiveReturn(); + eq MSendDefinition.preemptiveReturn() { + switch (endpointDef().protocol()) { + case "mqtt": return "return false;"; + case "rest": return "throw e;"; // e is Exception variable + default: return null; + } + } eq MSendDefinition.endpointDef() = getSendTokenEndpointDefinition(); eq MSendDefinition.firstInputVarName() = "get" + tokenName() + "()"; - syn String MSendDefinition.sendTopic() = getSendTokenEndpointDefinition().sendTopic(); - syn String MSendDefinition.lastValue() = getSendTokenEndpointDefinition().lastValue(); - syn String MSendDefinition.updateMethod() = getSendTokenEndpointDefinition().updateMethod(); - syn String MSendDefinition.writeMethod() = getSendTokenEndpointDefinition().writeMethod(); - syn String MSendDefinition.tokenResetMethod() = getSendTokenEndpointDefinition().tokenResetMethod(); + syn String MSendDefinition.sendTopic() = "_topic_" + tokenName(); + syn String MSendDefinition.lastValue() = "_lastValue" + tokenName(); + syn String MSendDefinition.updateMethod() = "_update_" + tokenName(); + syn String MSendDefinition.writeMethod() = "_writeLastValue_" + tokenName(); + syn String MSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset"; syn boolean MSendDefinition.isPush() = getSendTokenEndpointDefinition().isPush(); + syn String MSendDefinition.newConnectionMethod() { + switch (endpointDef().protocol()) { + case "mqtt": return null; + case "rest": return "newGETConnection"; + default: return null; + } + } // --- MMappingDefinition --- syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint(); - syn String MMappingDefinition.methodName() = getMappingDefinition().methodName(); + syn String MMappingDefinition.methodName() = "_apply_" + getMappingDefinition().getID(); syn String MMappingDefinition.fromType() = getMappingDefinition().getFromType().prettyPrint(); syn String MMappingDefinition.fromVariableName() = getMappingDefinition().getFromVariableName(); syn String MMappingDefinition.content() = getMappingDefinition().getContent(); // --- MDependencyDefinition --- syn String MDependencyDefinition.targetParentTypeName() = getDependencyDefinition().getTarget().containingTypeDecl().getName(); - syn String MDependencyDefinition.dependencyMethod() = getDependencyDefinition().dependencyMethod(); + syn String MDependencyDefinition.dependencyMethod() = "add" + capitalize(getDependencyDefinition().getID()); syn String MDependencyDefinition.sourceParentTypeName() = getDependencyDefinition().getSource().containingTypeDecl().getName(); - syn String MDependencyDefinition.internalRelationPrefix() = getDependencyDefinition().internalRelationPrefix(); + syn String MDependencyDefinition.internalRelationPrefix() = "_internal_" + getDependencyDefinition().getID(); syn nta MSendDefinition MDependencyDefinition.targetEndpointDefinition() { return getDependencyDefinition().targetEndpointDefinition().toMustache(); } @@ -137,7 +172,8 @@ aspect AttributesForMustache { syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName(); syn String MTokenComponent.name() = getTokenComponent().getName(); syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint(); - syn String MTokenComponent.internalName() = getTokenComponent().internalName(); + syn String MTokenComponent.internalName() = getTokenComponent().getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + name(); + syn String MTokenComponent.externalName() = name(); // --- toMustache --- syn lazy MRagConnect RagConnect.toMustache() { @@ -178,7 +214,7 @@ aspect AttributesForMustache { protected void MEndpointDefinition.addInnerMappings() { for (MappingDefinition def : endpointDef().effectiveMappings()) { MInnerMappingDefinition inner = new MInnerMappingDefinition(); - inner.setMappingDefinition(def); + inner.setMMappingDefinition(def.toMustache()); addInnerMappingDefinition(inner); } } @@ -220,74 +256,11 @@ aspect AttributesForMustache { } aspect AspectGeneration { - // naming convention attributes - syn String TokenComponent.internalName() = getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + getName(); - syn String TokenComponent.externalName() = getName(); - - syn String TokenEndpointDefinition.connectMethod() = "connect" + getToken().getName() + (lookupTokenEndpointDefinitions(getToken()).size() > 1 ? "Via" + capitalize(protocol()) : ""); - syn String SendTokenEndpointDefinition.sendTopic() = "_topic_" + getToken().getName(); - syn String SendTokenEndpointDefinition.lastValue() = "_lastValue" + getToken().getName(); - syn String SendTokenEndpointDefinition.updateMethod() = "_update_" + getToken().getName(); - syn String SendTokenEndpointDefinition.writeMethod() = "_writeLastValue_" + getToken().getName(); - syn String SendTokenEndpointDefinition.tokenResetMethod() = "get" + getToken().getName() + "_reset"; - syn String MappingDefinition.methodName() = "_apply_" + getID(); - syn String DependencyDefinition.dependencyMethod() = "add" + - Character.toUpperCase(getID().charAt(0)) + - getID().substring(1); - syn String DependencyDefinition.internalRelationPrefix() = "_internal_" + getID(); - syn String DependencyDefinition.internalTokenName() = getSource().internalName(); - - // -- MQTT names -- - syn String RagConnect.mqttHandlerAttribute() = "_mqttHandler"; - syn String RagConnect.mqttHandlerField() = "_mqttHandler"; - - syn String RagConnect.mqttSetHostMethod() = "MqttSetHost"; - syn String RagConnect.mqttWaitUntilReadyMethod() = "MqttWaitUntilReady"; - syn String RagConnect.mqttCloseMethod() = "MqttCloseConnections"; - - // -- REST names -- - syn String RagConnect.restSetPortMethod() = "RestSetPort"; - syn String RagConnect.restCloseMethod() = "RestCloseConnections"; - - syn String RagConnect.restHandlerAttribute() = "_restHandler"; - syn String RagConnect.restHandlerField() = "_restHandler"; - - // -- endpoint names -- - syn String TokenEndpointDefinition.handlerAttribute(); - eq ReceiveFromMqttDefinition.handlerAttribute() = mqttHandlerAttribute(); - eq SendToMqttDefinition.handlerAttribute() = mqttHandlerAttribute(); - eq ReceiveFromRestDefinition.handlerAttribute() = restHandlerAttribute(); - eq SendToRestDefinition.handlerAttribute() = restHandlerAttribute(); - - syn String TokenEndpointDefinition.newConnectionMethod(); - eq ReceiveFromMqttDefinition.newConnectionMethod() = "newConnection"; - eq SendToMqttDefinition.newConnectionMethod() = null; - eq ReceiveFromRestDefinition.newConnectionMethod() = "newPUTConnection"; - eq SendToRestDefinition.newConnectionMethod() = "newGETConnection"; - - syn String TokenEndpointDefinition.connectParameterName(); - eq ReceiveFromMqttDefinition.connectParameterName() = "topic"; - eq SendToMqttDefinition.connectParameterName() = "topic"; - eq ReceiveFromRestDefinition.connectParameterName() = "path"; - eq SendToRestDefinition.connectParameterName() = "path"; - - syn String SendTokenEndpointDefinition.preemptiveReturn(); - eq SendToMqttDefinition.preemptiveReturn() = "return false;"; - eq SendToRestDefinition.preemptiveReturn() = "throw e;"; // e is Exception variable syn boolean SendTokenEndpointDefinition.isPush(); eq SendToMqttDefinition.isPush() = true; eq SendToRestDefinition.isPush() = false; - // naming copy attributes - // --- mqttHandlerAttribute --- - inh String EndpointDefinition.mqttHandlerAttribute(); - eq RagConnect.getChild().mqttHandlerAttribute() = mqttHandlerAttribute(); - - // --- restHandlerAttribute --- - inh String EndpointDefinition.restHandlerAttribute(); - eq RagConnect.getChild().restHandlerAttribute() = restHandlerAttribute(); - // --- rootNodeName --- syn String ASTNode.rootNodeName() = rootNode.getName(); @@ -331,10 +304,11 @@ aspect RelationGeneration { } syn nta Relation DependencyDefinition.getRelationToCreate() { + String internalRelationPrefix = toMustache().internalRelationPrefix(); BidirectionalRelation result = new BidirectionalRelation(); - NavigableRole left = new ListRole(internalRelationPrefix() + "Source"); + NavigableRole left = new ListRole(internalRelationPrefix + "Source"); left.setType(getTarget().containingTypeDecl()); - NavigableRole right = new ListRole(internalRelationPrefix() + "Target"); + NavigableRole right = new ListRole(internalRelationPrefix + "Target"); right.setType(getSource().containingTypeDecl()); result.setLeft(left); result.setRight(right); @@ -350,7 +324,7 @@ aspect GrammarExtension { } b.append("<"); if (!getName().equals("")) { - b.append(internalName()).append(":"); + b.append(toMustache().internalName()).append(":"); } effectiveJavaTypeUse().generateAbstractGrammar(b); b.append(">"); diff --git a/src/main/resources/mappingApplication.mustache b/src/main/resources/mappingApplication.mustache index cbfac221a210037dce1f9881699edad5c68776a2..7b0d6fba198b4a7b8b291318bf8a2d24b5ecc787 100644 --- a/src/main/resources/mappingApplication.mustache +++ b/src/main/resources/mappingApplication.mustache @@ -1,7 +1,7 @@ {{lastDefinitionToType}} {{resultVarPrefix}}{{lastDefinitionName}}; try { {{#InnerMappingDefinitions}} - {{^last}}{{ToType}} {{/last}}{{resultVarPrefix}}{{methodName}} = {{methodName}}({{inputVarName}}); + {{^last}}{{toType}} {{/last}}{{resultVarPrefix}}{{methodName}} = {{methodName}}({{inputVarName}}); {{/InnerMappingDefinitions}} } catch (Exception e) { e.printStackTrace();