From 70506fc333a8e2b205e4ebd643cf484c23523876 Mon Sep 17 00:00:00 2001 From: rschoene <rene.schoene@tu-dresden.de> Date: Thu, 2 Dec 2021 14:26:50 +0100 Subject: [PATCH] working on concise grammar - reorder attributes in Generation.jadd to match mustache files and types - fixed yaml generation (tested locally only) --- .../src/main/jastadd/Analysis.jrag | 10 - .../src/main/jastadd/Configuration.jadd | 6 - .../src/main/jastadd/Navigation.jrag | 36 -- .../main/jastadd/intermediate/Generation.jadd | 428 ++++++++++++------ .../main/jastadd/intermediate/Mappings.jrag | 6 +- .../MustacheNodesToYAML.jrag | 390 ++++++++-------- .../src/main/resources/ListAspect.mustache | 8 +- .../src/main/resources/handler.mustache | 14 +- .../resources/mappingApplication.mustache | 4 +- .../main/resources/mappingDefinition.mustache | 4 +- .../src/main/resources/ragconnect.mustache | 48 +- .../main/resources/receiveDefinition.mustache | 16 +- .../main/resources/sendDefinition.mustache | 20 +- .../main/resources/tokenComponent.mustache | 4 +- 14 files changed, 546 insertions(+), 448 deletions(-) diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag index c968752..66e6a5a 100644 --- a/ragconnect.base/src/main/jastadd/Analysis.jrag +++ b/ragconnect.base/src/main/jastadd/Analysis.jrag @@ -58,9 +58,6 @@ aspect Analysis { } } - // --- shouldSendValue --- - syn boolean EndpointDefinition.shouldSendValue() = getSend() && getEndpointTarget().entityIsNormalAttribute(); - syn boolean EndpointTarget.entityIsNormalAttribute(); eq TokenEndpointTarget.entityIsNormalAttribute() = !getToken().getNTA(); eq TypeEndpointTarget.entityIsNormalAttribute() = !getType().getNTA(); @@ -76,11 +73,4 @@ aspect Analysis { to MappingDefinition.effectiveUsedAt() for each effectiveMappings(); - // --- typeIsList --- - syn boolean EndpointDefinition.typeIsList() = getEndpointTarget().typeIsList(); - syn boolean EndpointTarget.typeIsList() = false; - eq TypeEndpointTarget.typeIsList() { - return getType().isListComponent(); - } - } diff --git a/ragconnect.base/src/main/jastadd/Configuration.jadd b/ragconnect.base/src/main/jastadd/Configuration.jadd index 72a3e9d..9a4645b 100644 --- a/ragconnect.base/src/main/jastadd/Configuration.jadd +++ b/ragconnect.base/src/main/jastadd/Configuration.jadd @@ -1,9 +1,3 @@ aspect ConfigurationShortcuts { - syn boolean RagConnect.loggingEnabledForReads() = getConfiguration().getLoggingEnabledForReads(); - syn boolean RagConnect.loggingEnabledForWrites() = getConfiguration().getLoggingEnabledForWrites(); - syn boolean RagConnect.loggingEnabledForIncremental() = getConfiguration().getLoggingEnabledForIncremental(); syn TypeDecl RagConnect.rootNode() = getConfiguration().getRootNode(); - syn String RagConnect.JastAddList() = getConfiguration().getJastAddList(); - syn boolean RagConnect.incrementalOptionActive() = getConfiguration().getIncrementalOptionActive(); - syn boolean RagConnect.experimentalJastAdd329() = getConfiguration().getExperimentalJastAdd329(); } diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag index 369ba4f..7419f3d 100644 --- a/ragconnect.base/src/main/jastadd/Navigation.jrag +++ b/ragconnect.base/src/main/jastadd/Navigation.jrag @@ -72,14 +72,6 @@ aspect RagConnectNavigation { // return containedFile().getFileName(); } - //--- allEndpointDefinitionList --- - syn List<EndpointDefinition> RagConnect.allEndpointDefinitionList() { - List<EndpointDefinition> result = new ArrayList<>(); - for (ConnectSpecification spec : getConnectSpecificationFileList()) { - spec.getEndpointDefinitionList().forEach(result::add); - } - return result; - } //--- allEndpointTargetList --- syn List<EndpointTarget> RagConnect.allEndpointTargetList() { @@ -90,14 +82,6 @@ aspect RagConnectNavigation { return result; } - //--- allDependencyDefinitionList --- - syn List<DependencyDefinition> RagConnect.allDependencyDefinitionList() { - List<DependencyDefinition> result = new ArrayList<>(); - for (ConnectSpecification spec : getConnectSpecificationFileList()) { - spec.getDependencyDefinitionList().forEach(result::add); - } - return result; - } //--- givenMappingDefinitionList --- syn List<MappingDefinition> RagConnect.givenMappingDefinitionList() { @@ -108,26 +92,6 @@ aspect RagConnectNavigation { return result; } - // --- targetEndpointDefinition --- - syn EndpointDefinition DependencyDefinition.targetEndpointDefinition() { - // resolve definition in here, as we do not need resolveMethod in any other place (yet) - for (EndpointDefinition endpointDefinition : ragconnect().allEndpointDefinitionList()) { - if (!endpointDefinition.getSend()) { - continue; - } - EndpointTarget endpointTarget = endpointDefinition.getEndpointTarget(); - if (endpointTarget.isTokenEndpointTarget() && - endpointTarget.asTokenEndpointTarget().getToken().equals(this.getTarget())) { - return endpointDefinition; - } - if (endpointTarget.isTypeEndpointTarget() && - endpointTarget.asTypeEndpointTarget().getType().equals(this.getTarget())) { - return endpointDefinition; - } - } - return null; - } - // --- effectiveJavaTypeUse (should be in preprocessor) --- syn lazy JavaTypeUse TokenComponent.effectiveJavaTypeUse() = hasJavaTypeUse() ? getJavaTypeUse() : new SimpleJavaTypeUse("String"); diff --git a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd index 2e0c4a9..3729453 100644 --- a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd +++ b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd @@ -3,7 +3,37 @@ Design considerations - InnerMappingDefinition needed for iteration attribute (first, last) - not possible with list-relation - no complete intermediate structure, but instead single nodes where applicable/needed */ -aspect AttributesForMustache { +aspect SharedMustache { + // === RagConnect === + syn boolean RagConnect.configIncrementalOptionActive() = getConfiguration().getIncrementalOptionActive(); + + syn boolean RagConnect.configLoggingEnabledForIncremental() = getConfiguration().getLoggingEnabledForIncremental(); + + syn boolean RagConnect.configExperimentalJastAdd329() = getConfiguration().getExperimentalJastAdd329(); + + syn String RagConnect.rootNodeName() = getConfiguration().getRootNode().getName(); + + // === EndpointDefinition === + syn String EndpointDefinition.lastResult() = lastDefinition().outputVarName(); +} + +aspect MustacheDependencyDefinition { + // === DependencyDefinition === + syn String DependencyDefinition.dependencyMethodName() = "add" + capitalize(getID()); + + syn String DependencyDefinition.internalRelationPrefix() = "_internal_" + getID(); + + syn String DependencyDefinition.sourceParentTypeName() = getSource().containingTypeDecl().getName(); + + syn String DependencyDefinition.targetParentTypeName() = getTarget().containingTypeDecl().getName(); +} + +aspect MustacheHandler { + // === RagConnect === + syn String RagConnect.closeMethodName() = "ragconnectCloseConnections"; + + syn boolean RagConnect.hasRootTypeComponents() = !rootTypeComponents().isEmpty(); + syn List<TypeComponent> RagConnect.rootTypeComponents() { List<TypeComponent> result = new ArrayList<>(); for (Component child : rootNode().getComponentList()) { @@ -13,14 +43,22 @@ aspect AttributesForMustache { } return result; } - syn boolean RagConnect.hasRootTypeComponents() = !rootTypeComponents().isEmpty(); - syn String RagConnect.closeMethodName() = "ragconnectCloseConnections"; + // === Handler === + syn String Handler.attributeName() = "_" + getUniqueName() + "Handler"; + + syn String Handler.constructionSnippet() = "new " + getClassName() + "(\"Handler for " + ragconnect().rootNodeName() + ".\" + this.hashCode())"; - syn String Handler.AttributeName() = "_" + getUniqueName() + "Handler"; - syn String Handler.FieldName() = "_" + getUniqueName() + "Handler"; - syn String Handler.SetupWaitUntilReadyMethodName() = "ragconnectSetup" + capitalize(getUniqueName()) + "WaitUntilReady"; - syn String Handler.ConstructionSnippet() = "new " + getClassName() + "(\"Handler for " + ragconnect().rootNodeName() + ".\" + this.hashCode())"; + syn String Handler.fieldName() = "_" + getUniqueName() + "Handler"; + + syn String Handler.setupWaitUntilReadyMethodName() = "ragconnectSetup" + capitalize(getUniqueName()) + "WaitUntilReady"; +} + +aspect MustacheHandleUri { /* empty */ } + +aspect MustacheListAspect { + // === RagConnect === + syn String RagConnect.configJastAddList() = getConfiguration().getJastAddList(); syn boolean RagConnect.hasTreeListEndpoints() { for (EndpointDefinition endpointDef : allEndpointDefinitionList()) { @@ -30,6 +68,7 @@ aspect AttributesForMustache { } return false; } + syn Set<TypeDecl> RagConnect.typesForReceivingListEndpoints() { Set<TypeDecl> result = new HashSet<>(); for (EndpointDefinition endpointDef : allEndpointDefinitionList()) { @@ -39,53 +78,10 @@ aspect AttributesForMustache { } return result; } +} - syn String EndpointDefinition.preemptiveExpectedValue() = toMustache().preemptiveExpectedValue(); - syn String EndpointDefinition.preemptiveReturn() = toMustache().preemptiveReturn(); - syn String EndpointDefinition.firstInputVarName() = toMustache().firstInputVarName(); - syn String EndpointDefinition.updateMethodName() = toMustache().updateMethodName(); - syn String EndpointDefinition.writeMethodName() = toMustache().writeMethodName(); - - syn String EndpointDefinition.parentTypeName() = getEndpointTarget().parentTypeName(); - syn String EndpointDefinition.entityName() = getEndpointTarget().entityName(); - syn String EndpointDefinition.getterMethodName() = getEndpointTarget().getterMethodName(); - - syn String EndpointDefinition.uniqueSuffix() = getSend() ? "Send" : "Receive"; - - syn String EndpointDefinition.connectParameterName() = "uriString"; - syn String EndpointDefinition.connectMethodName() = "connect" + entityName(); - syn String EndpointDefinition.internalConnectMethodName() = "_internal_" + connectMethodName(); - - syn String EndpointDefinition.disconnectMethodName() { - // if both (send and receive) are defined for an endpoint, ensure methods with different names - String extra; - if (getEndpointTarget().isTokenEndpointTarget()) { - extra = lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : ""; - } else if (getEndpointTarget().isTypeEndpointTarget()) { - extra = lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : ""; - } else { - extra = ""; - } - return "disconnect" + extra + entityName(); - } - // token and type are potentially dangerous because asXEndpointTarget can return null - syn TokenComponent EndpointDefinition.token() = getEndpointTarget().asTokenEndpointTarget().getToken(); - syn TypeComponent EndpointDefinition.type() = getEndpointTarget().asTypeEndpointTarget().getType(); - syn String EndpointDefinition.tokenName() = token().getName(); - syn String MEndpointDefinition.tokenName() = getEndpointDefinition().tokenName(); - syn String EndpointDefinition.typeName() = type().getName(); - syn String MEndpointDefinition.typeName() = getEndpointDefinition().typeName(); - syn String EndpointDefinition.typeDeclName() = type().getTypeDecl().getName(); - - syn MInnerMappingDefinition EndpointDefinition.lastDefinition() = toMustache().lastDefinition(); - syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1); - syn String EndpointDefinition.lastDefinitionToType() = lastDefinition().toType(); - syn String EndpointDefinition.lastResult() = lastDefinition().outputVarName(); - - inh boolean MInnerMappingDefinition.isLast(); - eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1; - eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName(); - +aspect MustacheMappingApplicationAndDefinition { + // === EndpointDefinition === syn String EndpointDefinition.condition() { // TODO [OLD] probably, this has to be structured in a better way if (lastDefinition().getMappingDefinition().getToType().isArray()) { @@ -108,46 +104,215 @@ aspect AttributesForMustache { return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null"; } - syn String EndpointDefinition.senderName() = getEndpointTarget().senderName(); // only needed for send endpoints - syn String EndpointTarget.senderName(); - eq TokenEndpointTarget.senderName() = "_sender_" + getToken().getName(); - eq TypeEndpointTarget.senderName() = "_sender_" + getType().getName(); - syn String EndpointDefinition.lastValue() = senderName() + ".lastValue"; // only needed for send endpoints - syn String MEndpointDefinition.lastValue() = getEndpointDefinition().lastValue(); + syn JastAddList<MInnerMappingDefinition> EndpointDefinition.innerMappingDefinitions() = toMustache().getInnerMappingDefinitionList(); + + syn String EndpointDefinition.lastDefinitionToType() = lastDefinition().toType(); + + syn String EndpointDefinition.preemptiveReturn() = toMustache().preemptiveReturn(); + + // === (MInner)MappingDefinition === + syn String MappingDefinition.fromType() = getFromType().prettyPrint(); + + inh boolean MInnerMappingDefinition.isLast(); + eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() { + return i == getNumInnerMappingDefinition() - 1; + } + + inh String MInnerMappingDefinition.inputVarName(); + eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() { + return i == 0 + ? firstInputVarName() + : getInnerMappingDefinition(i - 1).outputVarName(); + } + + syn String MInnerMappingDefinition.methodName() = getMappingDefinition().methodName(); + syn String MappingDefinition.methodName() = "_apply_" + getID(); + + syn String MInnerMappingDefinition.outputVarName() = "result" + methodName(); // we do not need "_" in between here, because methodName begins with one + + syn String MInnerMappingDefinition.toType() = getMappingDefinition().toType(); + syn String MappingDefinition.toType() = getToType().prettyPrint(); + + // === attributes needed for computing above ones === + syn String EndpointDefinition.preemptiveExpectedValue() = toMustache().preemptiveExpectedValue(); + syn String EndpointDefinition.firstInputVarName() = toMustache().firstInputVarName(); + + syn String MEndpointDefinition.preemptiveExpectedValue(); + syn String MEndpointDefinition.preemptiveReturn(); + syn String MEndpointDefinition.firstInputVarName(); + + eq MTokenReceiveDefinition.firstInputVarName() = "message"; + eq MTokenReceiveDefinition.preemptiveExpectedValue() = getterMethodName() + "()"; + eq MTokenReceiveDefinition.preemptiveReturn() = "return;"; + + eq MTokenSendDefinition.firstInputVarName() = getterMethodName() + "()"; + eq MTokenSendDefinition.preemptiveExpectedValue() = lastValue(); + eq MTokenSendDefinition.preemptiveReturn() = "return false;"; + + eq MTypeReceiveDefinition.firstInputVarName() = "message"; + eq MTypeReceiveDefinition.preemptiveExpectedValue() = getterMethodName() + "()"; + eq MTypeReceiveDefinition.preemptiveReturn() = "return;"; + + eq MTypeSendDefinition.firstInputVarName() = getterMethodName() + "()"; + eq MTypeSendDefinition.preemptiveExpectedValue() = lastValue(); + eq MTypeSendDefinition.preemptiveReturn() = "return false;"; + + syn String MEndpointDefinition.parentTypeName() = getEndpointDefinition().parentTypeName(); + + syn String MEndpointDefinition.getterMethodName() = getEndpointDefinition().getterMethodName(); +} + +aspect MustacheRagConnect { + // === RagConnect === + syn List<DependencyDefinition> RagConnect.allDependencyDefinitionList() { + List<DependencyDefinition> result = new ArrayList<>(); + for (ConnectSpecification spec : getConnectSpecificationFileList()) { + spec.getDependencyDefinitionList().forEach(result::add); + } + return result; + } + + syn List<EndpointDefinition> RagConnect.allEndpointDefinitionList() { + List<EndpointDefinition> result = new ArrayList<>(); + for (ConnectSpecification spec : getConnectSpecificationFileList()) { + spec.getEndpointDefinitionList().forEach(result::add); + } + return result; + } + + // > allMappingDefinitions in Mappings.jrag + + syn List<TokenComponent> RagConnect.tokenComponentsThatNeedProxy() { + List<TokenComponent> result = new ArrayList<>(); + for (TokenComponent token : getProgram().allTokenComponents()) { + if (token.needProxyToken()) { + result.add(token); + } + } + return result; + } + + // === MappingDefinition === + syn boolean MappingDefinition.isUsed() = !effectiveUsedAt().isEmpty(); +} + +aspect MustacheReceiveAndSendAndHandleUri { + // === EndpointDefinition === + syn String EndpointDefinition.connectMethodName() = "connect" + entityName(); + + syn String EndpointDefinition.connectParameterName() = "uriString"; + + syn String EndpointDefinition.disconnectMethodName() { + // if both (send and receive) are defined for an endpoint, ensure methods with different names + String extra; + if (getEndpointTarget().isTokenEndpointTarget()) { + extra = lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : ""; + } else if (getEndpointTarget().isTypeEndpointTarget()) { + extra = lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : ""; + } else { + extra = ""; + } + return "disconnect" + extra + entityName(); + } + + syn String EndpointDefinition.entityName() = getEndpointTarget().entityName(); + syn String EndpointDefinition.getterMethodName() = getEndpointTarget().getterMethodName(); + + syn String EndpointDefinition.parentTypeName() = getEndpointTarget().parentTypeName(); + + // === attributes needed for computing above ones === syn String EndpointTarget.getterMethodName(); syn String EndpointTarget.parentTypeName(); syn String EndpointTarget.entityName(); + eq TokenEndpointTarget.getterMethodName() = "get" + getToken().getName(); eq TokenEndpointTarget.parentTypeName() = getToken().containingTypeDecl().getName(); eq TokenEndpointTarget.entityName() = getToken().getName(); + eq TypeEndpointTarget.getterMethodName() = "get" + getType().getName() + (typeIsList() ? "List" : ""); eq TypeEndpointTarget.parentTypeName() = getType().containingTypeDecl().getName(); eq TypeEndpointTarget.entityName() = getType().getName() + (typeIsList() && !containingEndpointDefinition().getIndexBasedListAccess() ? "List" : ""); - // only for token + send - syn String EndpointDefinition.tokenResetMethodName() = getterMethodName() + "_reset"; +} + +aspect MustacheReceiveDefinition { + // === RagConnect === + syn boolean RagConnect.configLoggingEnabledForReads() = getConfiguration().getLoggingEnabledForReads(); + + // === EndpointDefinition === + syn boolean EndpointDefinition.hasTypeEndpointTarget() = getEndpointTarget().isTypeEndpointTarget(); + + syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList"; + + syn String EndpointDefinition.internalConnectMethodName() = "_internal_" + connectMethodName(); - // only for type + receive syn String EndpointDefinition.resolveInListMethodName() = "_ragconnect_resolve" + entityName() + "InList"; - // --- MappingDefinition --- - syn String MappingDefinition.toType() = getToType().prettyPrint(); - syn String MappingDefinition.methodName() = "_apply_" + getID(); - syn String MappingDefinition.fromType() = getFromType().prettyPrint(); - syn boolean MappingDefinition.isUsed() = !effectiveUsedAt().isEmpty(); + syn boolean EndpointDefinition.typeIsList() = getEndpointTarget().typeIsList(); - // --- DependencyDefinition --- - syn String DependencyDefinition.targetParentTypeName() = getTarget().containingTypeDecl().getName(); - syn String DependencyDefinition.dependencyMethodName() = "add" + capitalize(getID()); - syn String DependencyDefinition.sourceParentTypeName() = getSource().containingTypeDecl().getName(); - syn String DependencyDefinition.internalRelationPrefix() = "_internal_" + getID(); + // === attributes needed for computing above ones === + syn boolean EndpointTarget.typeIsList() = false; + eq TypeEndpointTarget.typeIsList() { + return getType().isListComponent(); + } + + syn String EndpointDefinition.uniqueSuffix() = getSend() ? "Send" : "Receive"; +} + +aspect MustacheSendDefinition { + // === RagConnect === + syn boolean RagConnect.configLoggingEnabledForWrites() = getConfiguration().getLoggingEnabledForWrites(); + + // === EndpointDefinition === + syn String EndpointDefinition.lastValue() = senderName() + ".lastValue"; + + syn String EndpointDefinition.senderName() = getEndpointTarget().senderName(); + + syn boolean EndpointDefinition.shouldSendValue() = getSend() && getEndpointTarget().entityIsNormalAttribute(); + + syn String EndpointDefinition.tokenResetMethodName() = getterMethodName() + "_reset"; + + syn String EndpointDefinition.updateMethodName() = toMustache().updateMethodName(); + + syn String EndpointDefinition.writeMethodName() = toMustache().writeMethodName(); + + // === attributes needed for computing above ones === + syn String EndpointTarget.senderName(); + eq TokenEndpointTarget.senderName() = "_sender_" + getToken().getName(); + eq TypeEndpointTarget.senderName() = "_sender_" + getType().getName(); + + syn String MEndpointDefinition.updateMethodName(); + syn String MEndpointDefinition.writeMethodName(); + + // MTokenReceiveDefinition + eq MTokenReceiveDefinition.updateMethodName() = null; + eq MTokenReceiveDefinition.writeMethodName() = null; + + // MTokenSendDefinition + eq MTokenSendDefinition.updateMethodName() = "_update_" + tokenName(); + eq MTokenSendDefinition.writeMethodName() = "_writeLastValue_" + tokenName(); + + // MTypeReceiveDefinition + eq MTypeReceiveDefinition.updateMethodName() = null; + eq MTypeReceiveDefinition.writeMethodName() = null; + + // MTypeSendDefinition + eq MTypeSendDefinition.updateMethodName() = "_update_" + typeName(); + eq MTypeSendDefinition.writeMethodName() = "_writeLastValue_" + typeName(); + + syn String EndpointDefinition.tokenName() = token().getName(); + syn String MEndpointDefinition.tokenName() = getEndpointDefinition().tokenName(); + + syn String EndpointDefinition.typeName() = type().getName(); + syn String MEndpointDefinition.typeName() = getEndpointDefinition().typeName(); +} + +aspect MustacheTokenComponent { + // === TokenComponent === + syn String TokenComponent.internalName() = needProxyToken() ? "_internal_" + getName() : getName(); - // --- TokenComponent --- - syn String TokenComponent.parentTypeName() = containingTypeDecl().getName(); syn String TokenComponent.javaType() = effectiveJavaTypeUse().prettyPrint(); - syn String TokenComponent.internalName() = needProxyToken() ? "_internal_" + getName() : externalName(); - syn String TokenComponent.externalName() = getName(); syn EndpointDefinition TokenComponent.normalTokenSendDef() { for (EndpointTarget target : getTokenEndpointTargetList()) { @@ -158,6 +323,43 @@ aspect AttributesForMustache { return null; } + syn String TokenComponent.parentTypeName() = containingTypeDecl().getName(); + + // > see MustacheDependencyDefinition for internalRelationPrefix, targetParentTypeName + + // === DependencyDefinition === + syn EndpointDefinition DependencyDefinition.targetEndpointDefinition() { + // resolve definition in here, as we do not need resolveMethod in any other place (yet) + for (EndpointDefinition endpointDefinition : ragconnect().allEndpointDefinitionList()) { + if (!endpointDefinition.getSend()) { + continue; + } + EndpointTarget endpointTarget = endpointDefinition.getEndpointTarget(); + if (endpointTarget.isTokenEndpointTarget() && + endpointTarget.asTokenEndpointTarget().getToken().equals(this.getTarget())) { + return endpointDefinition; + } + if (endpointTarget.isTypeEndpointTarget() && + endpointTarget.asTypeEndpointTarget().getType().equals(this.getTarget())) { + return endpointDefinition; + } + } + return null; + } + + // > see MustacheSend for updateMethodName, writeMethodName +} + +aspect AttributesForMustache { + syn String MEndpointDefinition.lastValue() = getEndpointDefinition().lastValue(); + + // token and type are potentially dangerous because asXEndpointTarget can return null + syn TokenComponent EndpointDefinition.token() = getEndpointTarget().asTokenEndpointTarget().getToken(); + syn TypeComponent EndpointDefinition.type() = getEndpointTarget().asTypeEndpointTarget().getType(); + + syn MInnerMappingDefinition EndpointDefinition.lastDefinition() = toMustache().lastDefinition(); + syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1); + syn nta MEndpointDefinition EndpointDefinition.toMustache() { final MEndpointDefinition result; if (getEndpointTarget().isTokenEndpointTarget()) { @@ -183,72 +385,6 @@ aspect AttributesForMustache { } return result; } - - syn List<TokenComponent> RagConnect.tokenComponentsThatNeedProxy() { - List<TokenComponent> result = new ArrayList<>(); - for (TokenComponent token : getProgram().allTokenComponents()) { - if (token.needProxyToken()) { - result.add(token); - } - } - return result; - } - - syn JastAddList<MInnerMappingDefinition> EndpointDefinition.innerMappingDefinitions() = toMustache().getInnerMappingDefinitionList(); - syn boolean EndpointDefinition.hasTypeEndpointTarget() = getEndpointTarget().isTypeEndpointTarget(); - - // === OldStuff (copied unchanged, but should work) === - // --- EndpointDefinition --- - syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList"; - - // --- MEndpointDefinition --- - syn String MEndpointDefinition.preemptiveExpectedValue(); - syn String MEndpointDefinition.preemptiveReturn(); - syn String MEndpointDefinition.firstInputVarName(); - syn String MEndpointDefinition.parentTypeName() = getEndpointDefinition().parentTypeName(); - syn String MEndpointDefinition.entityName() = getEndpointDefinition().entityName(); - syn String MEndpointDefinition.updateMethodName(); - syn String MEndpointDefinition.writeMethodName(); - syn String MEndpointDefinition.getterMethodName() = getEndpointDefinition().getterMethodName(); - - // --- MInnerMappingDefinition --- - inh String MInnerMappingDefinition.inputVarName(); - syn String MInnerMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint(); - syn String MInnerMappingDefinition.methodName() = getMappingDefinition().methodName(); - syn String MInnerMappingDefinition.outputVarName() = "result" + methodName(); // we do not need "_" in between here, because methodName begins with one - - // --- MTokenReceiveDefinition --- - eq MTokenReceiveDefinition.preemptiveExpectedValue() = getterMethodName() + "()"; - eq MTokenReceiveDefinition.preemptiveReturn() = "return;"; - eq MTokenReceiveDefinition.firstInputVarName() = "message"; - eq MTokenReceiveDefinition.updateMethodName() = null; - eq MTokenReceiveDefinition.writeMethodName() = null; - - // --- MTokenSendDefinition --- - eq MTokenSendDefinition.preemptiveExpectedValue() = lastValue(); - eq MTokenSendDefinition.preemptiveReturn() = "return false;"; - eq MTokenSendDefinition.firstInputVarName() = getterMethodName() + "()"; - eq MTokenSendDefinition.updateMethodName() = "_update_" + tokenName(); - eq MTokenSendDefinition.writeMethodName() = "_writeLastValue_" + tokenName(); - - // MTypeReceiveDefinition - eq MTypeReceiveDefinition.preemptiveExpectedValue() = getterMethodName() + "()"; - eq MTypeReceiveDefinition.preemptiveReturn() = "return;"; - eq MTypeReceiveDefinition.firstInputVarName() = "message"; - eq MTypeReceiveDefinition.updateMethodName() = null; - eq MTypeReceiveDefinition.writeMethodName() = null; - - // MTypeSendDefinition - eq MTypeSendDefinition.preemptiveExpectedValue() = lastValue(); - eq MTypeSendDefinition.preemptiveReturn() = "return false;"; - eq MTypeSendDefinition.firstInputVarName() = getterMethodName() + "()"; - eq MTypeSendDefinition.updateMethodName() = "_update_" + typeName(); - eq MTypeSendDefinition.writeMethodName() = "_writeLastValue_" + typeName(); -} - -aspect AspectGeneration { - // --- rootNodeName --- - syn String RagConnect.rootNodeName() = getConfiguration().getRootNode().getName(); } aspect GrammarGeneration { @@ -272,14 +408,6 @@ aspect GrammarGeneration { return result; } - // coll java.util.Map<TypeDecl, TokenComponent> RagConnect.additionalTokens() [new java.util.HashMap<>()] with put root RagConnect; - - // TypeEndpointDefinition contributes getTokenToCreate() - // when typeIsList() && !getUseList() - // to RagConnect.additionalTokens() - //// for ragconnect() - // ; - syn java.util.Map<TypeDecl, TokenComponent> RagConnect.additionalTokens() { java.util.Map<TypeDecl, TokenComponent> result = new java.util.HashMap<>(); for (EndpointDefinition def : allEndpointDefinitionList()) { diff --git a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag index e41821f..093f4cc 100644 --- a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag +++ b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag @@ -68,18 +68,18 @@ aspect DefaultMappings { } syn nta DefaultMappingDefinition RagConnect.defaultBytesToListTreeMapping(String typeName) { - return treeDefaultMappingDefinition("byte[]", JastAddList() + "<" + typeName + ">", + return treeDefaultMappingDefinition("byte[]", configJastAddList() + "<" + typeName + ">", "String content = new String(input);\n" + "com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();\n" + "com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory();\n" + "com.fasterxml.jackson.core.JsonParser parser = factory.createParser(content);\n" + - JastAddList() + "<" + typeName + ">" + " result = " + typeName + ".deserializeList((com.fasterxml.jackson.databind.node.ArrayNode)mapper.readTree(parser));\n" + + configJastAddList() + "<" + typeName + ">" + " result = " + typeName + ".deserializeList((com.fasterxml.jackson.databind.node.ArrayNode)mapper.readTree(parser));\n" + "parser.close();\n" + "return result;" ); } syn nta DefaultMappingDefinition RagConnect.defaultListTreeToBytesMapping() { - return treeDefaultMappingDefinition(JastAddList(), "byte[]", + return treeDefaultMappingDefinition(configJastAddList(), "byte[]", "java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream();\n" + "com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory();\n" + "com.fasterxml.jackson.core.JsonGenerator generator = factory.createGenerator(outputStream, com.fasterxml.jackson.core.JsonEncoding.UTF8);\n" + diff --git a/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag b/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag index 07a27c5..cfe83bb 100644 --- a/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag +++ b/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag @@ -1,184 +1,206 @@ - aspect MustacheNodesToYAML { - syn Document RagConnect.toYAML() { - Document doc = new Document(); - MappingElement root = new MappingElement(); - root.put("rootNodeName", rootNodeName()); - root.put("closeMethodName", closeMethodName()); - root.put("loggingEnabledForReads", loggingEnabledForReads()); - root.put("loggingEnabledForWrites", loggingEnabledForWrites()); - - // rootTypeComponents - ListElement rootTypeComponents = new ListElement(); - for (TypeComponent comp : rootTypeComponents()) { - MappingElement inner = new MappingElement(); - rootTypeComponents.addElement(inner); - } - root.put("RootTypeComponents", rootTypeComponents); - - // allEndpointDefinitionList - ListElement endpointDefinitions = new ListElement(); - for (EndpointDefinition def : allEndpointDefinitionList()) { - endpointDefinitions.addElement(def.toYAML()); - } - root.put("allEndpointDefinitionList", endpointDefinitions); - - // allMappingDefinitions - ListElement mappingDefinitions = new ListElement(); - for (MappingDefinition def : allMappingDefinitions()) { - mappingDefinitions.addElement(def.toYAML()); - } - root.put("allMappingDefinitions", mappingDefinitions); - - // allDependencyDefinitionList - ListElement dependencyDefinitions = new ListElement(); - for (DependencyDefinition def : allDependencyDefinitionList()) { - dependencyDefinitions.addElement(def.toYAML()); - } - root.put("allDependencyDefinitionList", dependencyDefinitions); - - // tokenComponentsThatNeedProxy - ListElement tokenComponents = new ListElement(); - for (TokenComponent comp : tokenComponentsThatNeedProxy()) { - tokenComponents.addElement(comp.toYAML()); - } - root.put("tokenComponentsThatNeedProxy", tokenComponents); - - // Handlers - ListElement handlers = new ListElement(); - for (Handler handler : getHandlerList()) { - handlers.add(handler.toYAML() -// .put("rootTypeComponents", rootTypeComponents.treeCopy()) -// .put("hasRootTypeComponents", hasRootTypeComponents()) - ); - } - root.put("Handlers", handlers); - root.put("mqttHandler", mqttHandler().toYAML()); - root.put("restHandler", restHandler().toYAML()); - - doc.setRootElement(root); - return doc; - } - - syn MappingElement EndpointDefinition.toYAML() { - MappingElement result = new MappingElement(); - result.put("AlwaysApply", getAlwaysApply()); - result.put("IndexBasedListAccess", getIndexBasedListAccess()); - result.put("WithAdd", getWithAdd()); - result.put("Send", getSend()); - result.put("preemptiveExpectedValue", preemptiveExpectedValue()); - result.put("preemptiveReturn", preemptiveReturn()); - result.put("firstInputVarName", firstInputVarName()); - result.put("updateMethodName", updateMethodName()); - result.put("writeMethodName", writeMethodName()); - result.put("parentTypeName", parentTypeName()); - result.put("entityName", entityName()); - result.put("getterMethodName", getterMethodName()); - result.put("uniqueSuffix", uniqueSuffix()); - result.put("connectParameterName", connectParameterName()); - result.put("connectMethodName", connectMethodName()); - result.put("internalConnectMethodName", internalConnectMethodName()); - result.put("disconnectMethodName", disconnectMethodName()); - result.put("typeDeclName", typeDeclName()); - result.put("lastDefinition", lastDefinition().getMappingDefinition().toYAML().treeCopy()); - result.put("lastDefinitionToType", lastDefinitionToType()); - result.put("lastResult", lastResult()); - result.put("condition", sanitizeValueForYAML(condition())); - result.put("senderName", senderName()); - result.put("lastValue", lastValue()); - result.put("tokenResetMethodName", tokenResetMethodName()); - result.put("resolveInListMethodName", resolveInListMethodName()); - result.put("idTokenName", idTokenName()); - result.put("InnerMappingDefinitions", innerMappingDefinitionsAsListElement()); - getEndpointTarget().addToYAML(result); - return result; - } - - abstract void EndpointTarget.addToYAML(MappingElement result); - - void TokenEndpointTarget.addToYAML(MappingElement result) { - result.put("tokenName", containingEndpointDefinition().tokenName()); - } - - void TypeEndpointTarget.addToYAML(MappingElement result) { - result.put("typeName", containingEndpointDefinition().typeName()); - result.put("typeIsList", typeIsList()); - } - - void UntypedEndpointTarget.addToYAML(MappingElement result) { - } - - syn Element MappingDefinition.toYAML() { - MappingElement result = new MappingElement(); - result.put("toType", toType()); - result.put("methodName", methodName()); - result.put("fromType", fromType()); - result.put("fromVariableName", getFromVariableName()); - result.put("content", sanitizeValueForYAML(getContent())); - return result; - } - - syn Element DependencyDefinition.toYAML() { - MappingElement result = new MappingElement(); - result.put("targetParentTypeName", targetParentTypeName()); - result.put("dependencyMethodName", dependencyMethodName()); - result.put("sourceParentTypeName", sourceParentTypeName()); - result.put("internalRelationPrefix", internalRelationPrefix()); - return result; - } - - syn Element TokenComponent.toYAML() { - MappingElement result = new MappingElement(); - result.put("parentTypeName", parentTypeName()); - result.put("name", getName()); - result.put("javaType", javaType()); - result.put("internalName", internalName()); - ListElement dependencyDefinitions = new ListElement(); - for (DependencyDefinition def : getDependencySourceDefinitionList()) { - MappingElement inner = new MappingElement(); - inner.put("targetParentTypeName", def.targetParentTypeName()); - inner.put("internalRelationPrefix", def.internalRelationPrefix()); - MappingElement targetEndpointDefinition = new MappingElement(); - targetEndpointDefinition.put("updateMethodName", def.targetEndpointDefinition().updateMethodName()); - targetEndpointDefinition.put("writeMethodName", def.targetEndpointDefinition().writeMethodName()); - inner.put("targetEndpointDefinition", targetEndpointDefinition); - dependencyDefinitions.addElement(inner); - } - result.put("DependencyDefinitions", dependencyDefinitions); - return result; - } - - ListElement EndpointDefinition.innerMappingDefinitionsAsListElement() { - ListElement innerMappingDefinitions = new ListElement(); - for (MInnerMappingDefinition def : innerMappingDefinitions()) { - MappingElement inner = new MappingElement(); - inner.put("toType", def.toType()); - inner.put("methodName", def.methodName()); - inner.put("inputVarName", def.inputVarName()); - inner.put("outputVarName", def.outputVarName()); - inner.put("last", def.isLast()); - innerMappingDefinitions.addElement(inner); - } - return innerMappingDefinitions; - } - - syn MappingElement Handler.toYAML() { - MappingElement result = new MappingElement(); - result.put("ClassName", getClassName()); - result.put("ConstructionSnippet", ConstructionSnippet()); - result.put("AttributeName", AttributeName()); - result.put("FieldName", FieldName()); - result.put("InUse", getInUse()); - return result; - } - - protected String ASTNode.sanitizeValueForYAML(String value) { - return value.replace("\"", "\\\"").replace("\n", "\\n"); - } - } - - aspect Navigation { - eq Document.getChild().program() = null; - eq Document.getChild().ragconnect() = null; - eq Document.getChild().containedFile() = null; - eq Document.containedFileName() = getFileName(); - } +aspect MustacheNodesToYAML { + syn Document RagConnect.toYAML() { + Document doc = new Document(); + MappingElement root = new MappingElement(); + // grammar children + ListElement handlersElement = new ListElement(); + for (Handler handler : getHandlerList()) { + handlersElement.add(handler.toYAML()); + } + root.put("Handlers" , handlersElement); + + // shared + root.put("configIncrementalOptionActive" , configIncrementalOptionActive()); + root.put("configLoggingEnabledForIncremental" , configLoggingEnabledForIncremental()); + root.put("configExperimentalJastAdd329" , configExperimentalJastAdd329()); + root.put("rootNodeName" , rootNodeName()); + + // handler + root.put("closeMethodName" , closeMethodName()); + root.put("hasRootTypeComponents" , hasRootTypeComponents()); + ListElement rootTypeComponentsElement = new ListElement(); + for (TypeComponent comp : rootTypeComponents()) { + rootTypeComponentsElement.addElement(comp.toYAML()); + } + root.put("rootTypeComponents" , rootTypeComponentsElement); + + // listAspect + root.put("configJastAddList" , configJastAddList()); + root.put("hasTreeListEndpoints" , hasTreeListEndpoints()); + ListElement typesForReceivingListEndpointsElement = new ListElement(); + for (TypeDecl typeDecl : typesForReceivingListEndpoints()) { + typesForReceivingListEndpointsElement.addElement(typeDecl.toYAML()); + } + root.put("typesForReceivingListEndpoints" , typesForReceivingListEndpointsElement); + + // ragconnect + ListElement dependencyDefinitionsElement = new ListElement(); + for (DependencyDefinition def : allDependencyDefinitionList()) { + dependencyDefinitionsElement.addElement(def.toYAML()); + } + root.put("allDependencyDefinitionList" , dependencyDefinitionsElement); + ListElement endpointDefinitionsElement = new ListElement(); + for (EndpointDefinition def : allEndpointDefinitionList()) { + endpointDefinitionsElement.addElement(def.toYAML()); + } + root.put("allEndpointDefinitionList" , endpointDefinitionsElement); + ListElement mappingDefinitionsElement = new ListElement(); + for (MappingDefinition def : allMappingDefinitions()) { + mappingDefinitionsElement.addElement(def.toYAML()); + } + root.put("allMappingDefinitions" , mappingDefinitionsElement); + ListElement tokenComponentsElement = new ListElement(); + for (TokenComponent comp : tokenComponentsThatNeedProxy()) { + tokenComponentsElement.addElement(comp.toYAML()); + } + root.put("tokenComponentsThatNeedProxy" , tokenComponentsElement); + + // receive + root.put("configLoggingEnabledForReads" , configLoggingEnabledForReads()); + + // send + root.put("configLoggingEnabledForWrites" , configLoggingEnabledForWrites()); + + // from Handlers.jrag + root.put("mqttHandler" , mqttHandler().toYAML()); + root.put("restHandler" , restHandler().toYAML()); + + doc.setRootElement(root); + return doc; + } + + syn MappingElement EndpointDefinition.toYAML() { + MappingElement result = new MappingElement(); + // grammar children + result.put("AlwaysApply" , getAlwaysApply()); + result.put("IndexBasedListAccess" , getIndexBasedListAccess()); + result.put("WithAdd" , getWithAdd()); + result.put("Send" , getSend()); + + // shared + result.put("lastResult" , lastResult()); + + // mapping + result.put("condition" , sanitizeValueForYAML(condition())); + ListElement innerMappingDefinitions = new ListElement(); + for (MInnerMappingDefinition def : innerMappingDefinitions()) { + innerMappingDefinitions.addElement(def.toYAML()); + } + result.put("innerMappingDefinitions" , innerMappingDefinitions); + result.put("lastDefinitionToType" , lastDefinitionToType()); + result.put("preemptiveReturn" , preemptiveReturn()); + + // receive + send + result.put("connectMethodName" , connectMethodName()); + result.put("connectParameterName" , connectParameterName()); + result.put("disconnectMethodName" , disconnectMethodName()); + result.put("entityName" , entityName()); + result.put("getterMethodName" , getterMethodName()); + result.put("parentTypeName" , parentTypeName()); + + if (getSend()) { + result.put("lastValue" , lastValue()); + result.put("senderName" , senderName()); + result.put("shouldSendValue" , shouldSendValue()); + result.put("tokenResetMethodName" , tokenResetMethodName()); + result.put("updateMethodName" , updateMethodName()); + result.put("writeMethodName" , writeMethodName()); + } else { + result.put("hasTypeEndpointTarget" , hasTypeEndpointTarget()); + result.put("idTokenName" , idTokenName()); + result.put("internalConnectMethodName" , internalConnectMethodName()); + result.put("resolveInListMethodName" , resolveInListMethodName()); + result.put("typeIsList" , getEndpointTarget().typeIsList()); + } + return result; + } + + void UntypedEndpointTarget.addToYAML(MappingElement result) { + // empty + } + + syn Element MInnerMappingDefinition.toYAML() { + MappingElement result = new MappingElement(); + result.put("last" , isLast()); + result.put("inputVarName" , inputVarName()); + result.put("methodName" , methodName()); + result.put("outputVarName" , outputVarName()); + result.put("toType" , toType()); + return result; + } + + syn Element MappingDefinition.toYAML() { + MappingElement result = new MappingElement(); + // grammar children + result.put("FromVariableName" , getFromVariableName()); + result.put("Content" , sanitizeValueForYAML(getContent())); + + // mapping + result.put("fromType" , fromType()); + result.put("methodName" , methodName()); + result.put("toType" , toType()); + + // ragconnect + result.put("isUsed" , isUsed()); + return result; + } + + syn Element DependencyDefinition.toYAML() { + MappingElement result = new MappingElement(); + // dependencyDefinition + result.put("dependencyMethodName" , dependencyMethodName()); + result.put("internalRelationPrefix" , internalRelationPrefix()); + result.put("sourceParentTypeName" , sourceParentTypeName()); + result.put("targetParentTypeName" , targetParentTypeName()); + + // tokenComponent + result.put("targetEndpointDefinition" , targetEndpointDefinition().toYAML()); + return result; + } + + syn Element TokenComponent.toYAML() { + MappingElement result = new MappingElement(); + result.put("Name" , getName()); + ListElement dependencySourceDefinitions = new ListElement(); + for (DependencyDefinition def : getDependencySourceDefinitionList()) { + dependencySourceDefinitions.add(def.toYAML()); + } + result.put("DependencySourceDefinitions" , dependencySourceDefinitions); + + result.put("javaType" , javaType()); + result.put("normalTokenSendDef" , normalTokenSendDef().toYAML()); + result.put("parentTypeName" , parentTypeName()); + return result; + } + + syn MappingElement Handler.toYAML() { + MappingElement result = new MappingElement(); + result.put("ClassName" , getClassName()); + result.put("InUse" , getInUse()); + + result.put("attributeName" , attributeName()); + result.put("constructionSnippet" , constructionSnippet()); + result.put("fieldName" , fieldName()); + result.put("setupWaitUntilReadyMethodName" , setupWaitUntilReadyMethodName()); + return result; + } + + syn MappingElement TypeComponent.toYAML() { + return new MappingElement().put("Name", getName()); + } + + syn MappingElement TypeDecl.toYAML() { + return new MappingElement().put("Name", getName()); + } + + protected StringElement ASTNode.sanitizeValueForYAML(String value) { + return StringElement.of(value.replace("\"" , "\\\"").replace("\n" , "\\n")); + } +} + +aspect Navigation { + eq Document.getChild().program() = null; + eq Document.getChild().ragconnect() = null; + eq Document.getChild().containedFile() = null; + eq Document.containedFileName() = getFileName(); +} diff --git a/ragconnect.base/src/main/resources/ListAspect.mustache b/ragconnect.base/src/main/resources/ListAspect.mustache index 764b544..31eaf5a 100644 --- a/ragconnect.base/src/main/resources/ListAspect.mustache +++ b/ragconnect.base/src/main/resources/ListAspect.mustache @@ -1,5 +1,5 @@ {{#hasTreeListEndpoints}} -public void {{JastAddList}}.serialize(com.fasterxml.jackson.core.JsonGenerator g) throws SerializationException { +public void {{configJastAddList}}.serialize(com.fasterxml.jackson.core.JsonGenerator g) throws SerializationException { try { g.writeStartArray(); for (T child : this) { @@ -7,13 +7,13 @@ public void {{JastAddList}}.serialize(com.fasterxml.jackson.core.JsonGenerator g } g.writeEndArray(); } catch (java.io.IOException e) { - throw new SerializationException("unable to serialize {{JastAddList}}", e); + throw new SerializationException("unable to serialize {{configJastAddList}}", e); } } {{#typesForReceivingListEndpoints}} -public static {{JastAddList}}<{{Name}}> {{Name}}.deserializeList(com.fasterxml.jackson.databind.node.ArrayNode node) throws DeserializationException { - {{JastAddList}}<{{Name}}> result = new {{JastAddList}}<>(); +public static {{configJastAddList}}<{{Name}}> {{Name}}.deserializeList(com.fasterxml.jackson.databind.node.ArrayNode node) throws DeserializationException { + {{configJastAddList}}<{{Name}}> result = new {{configJastAddList}}<>(); for (java.util.Iterator<com.fasterxml.jackson.databind.JsonNode> it = node.elements(); it.hasNext();) { com.fasterxml.jackson.databind.JsonNode element = it.next(); result.add(deserialize(element)); diff --git a/ragconnect.base/src/main/resources/handler.mustache b/ragconnect.base/src/main/resources/handler.mustache index 32d7986..37923f4 100644 --- a/ragconnect.base/src/main/resources/handler.mustache +++ b/ragconnect.base/src/main/resources/handler.mustache @@ -1,24 +1,24 @@ aspect RagConnectHandler { {{#Handlers}} {{#InUse}} - private {{ClassName}} {{rootNodeName}}.{{FieldName}} = {{{ConstructionSnippet}}}; - {{#hasRootTypeComponents}}inh {{ClassName}} ASTNode.{{AttributeName}}();{{/hasRootTypeComponents}} + private {{ClassName}} {{rootNodeName}}.{{fieldName}} = {{{constructionSnippet}}}; + {{#hasRootTypeComponents}}inh {{ClassName}} ASTNode.{{attributeName}}();{{/hasRootTypeComponents}} {{#rootTypeComponents}} - eq {{rootNodeName}}.get{{name}}().{{AttributeName}}() = {{FieldName}}; + eq {{rootNodeName}}.get{{Name}}().{{attributeName}}() = {{fieldName}}; {{/rootTypeComponents}} - syn {{ClassName}} {{rootNodeName}}.{{AttributeName}}() = {{FieldName}}; + syn {{ClassName}} {{rootNodeName}}.{{attributeName}}() = {{fieldName}}; {{/InUse}} {{/Handlers}} public void {{rootNodeName}}.{{closeMethodName}}() { {{#Handlers}} - {{#InUse}}{{FieldName}}.close();{{/InUse}} + {{#InUse}}{{fieldName}}.close();{{/InUse}} {{/Handlers}} } {{#mqttHandler}} {{#InUse}} - public void {{rootNodeName}}.{{SetupWaitUntilReadyMethodName}}(long time, java.util.concurrent.TimeUnit unit) { - {{FieldName}}.setupWaitUntilReady(time, unit); + public void {{rootNodeName}}.{{setupWaitUntilReadyMethodName}}(long time, java.util.concurrent.TimeUnit unit) { + {{fieldName}}.setupWaitUntilReady(time, unit); } {{/InUse}} {{/mqttHandler}} diff --git a/ragconnect.base/src/main/resources/mappingApplication.mustache b/ragconnect.base/src/main/resources/mappingApplication.mustache index 934e45c..836e8d4 100644 --- a/ragconnect.base/src/main/resources/mappingApplication.mustache +++ b/ragconnect.base/src/main/resources/mappingApplication.mustache @@ -10,8 +10,8 @@ try { e.printStackTrace(); {{preemptiveReturn}} } -{{^alwaysApply}} +{{^AlwaysApply}} if ({{{condition}}}) { {{preemptiveReturn}} } -{{/alwaysApply}} +{{/AlwaysApply}} diff --git a/ragconnect.base/src/main/resources/mappingDefinition.mustache b/ragconnect.base/src/main/resources/mappingDefinition.mustache index 09f161f..5be93e4 100644 --- a/ragconnect.base/src/main/resources/mappingDefinition.mustache +++ b/ragconnect.base/src/main/resources/mappingDefinition.mustache @@ -1,3 +1,3 @@ -protected static {{{toType}}} ASTNode.{{methodName}}({{{fromType}}} {{fromVariableName}}) throws Exception { - {{{content}}} +protected static {{{toType}}} ASTNode.{{methodName}}({{{fromType}}} {{FromVariableName}}) throws Exception { + {{{Content}}} } diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache index b1ee1b2..c3b5071 100644 --- a/ragconnect.base/src/main/resources/ragconnect.mustache +++ b/ragconnect.base/src/main/resources/ragconnect.mustache @@ -31,7 +31,7 @@ aspect RagConnect { {{> ListAspect}} public void {{rootNodeName}}.ragconnectCheckIncremental() { - {{#incrementalOptionActive}} + {{#configIncrementalOptionActive}} // check if --tracing is active trace().getReceiver(); // check if tracing of INC_FLUSH_ATTR is possible, i.e., if --tracing=flush @@ -40,11 +40,11 @@ aspect RagConnect { mayHaveRewrite(); // check if --incremental is active Object checkIncremental = inc_throwAway_visited; - {{/incrementalOptionActive}} + {{/configIncrementalOptionActive}} } } -{{#incrementalOptionActive}} +{{#configIncrementalOptionActive}} aspect RagConnectObserver { class RagConnectObserver implements ASTState.Trace.Receiver { @@ -63,7 +63,7 @@ aspect RagConnectObserver { } } -{{#experimentalJastAdd329}} +{{#configExperimentalJastAdd329}} class RagConnectObserverStartEntry { final ASTNode node; final String attributeString; @@ -74,16 +74,16 @@ aspect RagConnectObserver { this.flushIncToken = flushIncToken; } } -{{/experimentalJastAdd329}} +{{/configExperimentalJastAdd329}} ASTState.Trace.Receiver oldReceiver; java.util.List<RagConnectObserverEntry> observedNodes = new java.util.ArrayList<>(); -{{#experimentalJastAdd329}} +{{#configExperimentalJastAdd329}} java.util.Set<RagConnectObserverEntry> entryQueue = new java.util.HashSet<>(); RagConnectObserverStartEntry startEntry = null; -{{/experimentalJastAdd329}} +{{/configExperimentalJastAdd329}} RagConnectObserver(ASTNode node) { // set the receiver. potentially dangerous because overriding existing receiver! @@ -92,9 +92,9 @@ aspect RagConnectObserver { } void add(RagConnectToken connectToken, ASTNode node, String attributeString, Runnable attributeCall) { - {{#loggingEnabledForIncremental}} + {{#configLoggingEnabledForIncremental}} System.out.println("** observer add: " + node + " on " + attributeString); - {{/loggingEnabledForIncremental}} + {{/configLoggingEnabledForIncremental}} observedNodes.add(new RagConnectObserverEntry(connectToken, node, attributeString, attributeCall)); } void remove(RagConnectToken connectToken) { @@ -103,12 +103,12 @@ aspect RagConnectObserver { @Override public void accept(ASTState.Trace.Event event, ASTNode node, String attribute, Object params, Object value) { oldReceiver.accept(event, node, attribute, params, value); -{{#experimentalJastAdd329}} +{{#configExperimentalJastAdd329}} // react to INC_FLUSH_START and remember entry if (event == ASTState.Trace.Event.INC_FLUSH_START && startEntry == null) { - {{#loggingEnabledForIncremental}} + {{#configLoggingEnabledForIncremental}} System.out.println("** observer start: " + node + " on " + attribute); - {{/loggingEnabledForIncremental}} + {{/configLoggingEnabledForIncremental}} startEntry = new RagConnectObserverStartEntry(node, attribute, value); return; } @@ -122,37 +122,37 @@ aspect RagConnectObserver { RagConnectObserverEntry[] entriesToProcess = entryQueue.toArray(new RagConnectObserverEntry[entryQueue.size()]); entryQueue.clear(); startEntry = null; - {{#loggingEnabledForIncremental}} + {{#configLoggingEnabledForIncremental}} System.out.println("** observer process (" + entriesToProcess.length + "): " + node + " on " + attribute); - {{/loggingEnabledForIncremental}} + {{/configLoggingEnabledForIncremental}} for (RagConnectObserverEntry entry : entriesToProcess) { entry.attributeCall.run(); } return; } -{{/experimentalJastAdd329}} +{{/configExperimentalJastAdd329}} // ignore all other events but INC_FLUSH_ATTR if (event != ASTState.Trace.Event.INC_FLUSH_ATTR) { return; } - {{#loggingEnabledForIncremental}} + {{#configLoggingEnabledForIncremental}} System.out.println("** observer check INC_FLUSH_ATTR event: " + node + " on " + attribute); - {{/loggingEnabledForIncremental}} + {{/configLoggingEnabledForIncremental}} // iterate through list, if matching pair. could maybe be more efficient. for (RagConnectObserverEntry entry : observedNodes) { if (entry.node.equals(node) && entry.attributeString.equals(attribute)) { // hit. call the attribute/nta-token - {{#loggingEnabledForIncremental}} + {{#configLoggingEnabledForIncremental}} System.out.println("** observer hit: " + entry.node + " on " + entry.attributeString); - {{/loggingEnabledForIncremental}} -{{#experimentalJastAdd329}} + {{/configLoggingEnabledForIncremental}} +{{#configExperimentalJastAdd329}} entryQueue.add(entry); -{{/experimentalJastAdd329}} -{{^experimentalJastAdd329}} +{{/configExperimentalJastAdd329}} +{{^configExperimentalJastAdd329}} entry.attributeCall.run(); -{{/experimentalJastAdd329}} +{{/configExperimentalJastAdd329}} } } } @@ -167,4 +167,4 @@ aspect RagConnectObserver { return _ragConnectObserverInstance; } } -{{/incrementalOptionActive}} +{{/configIncrementalOptionActive}} diff --git a/ragconnect.base/src/main/resources/receiveDefinition.mustache b/ragconnect.base/src/main/resources/receiveDefinition.mustache index e457306..25dd2a4 100644 --- a/ragconnect.base/src/main/resources/receiveDefinition.mustache +++ b/ragconnect.base/src/main/resources/receiveDefinition.mustache @@ -26,9 +26,9 @@ private int {{parentTypeName}}.{{resolveInListMethodName}}(String topic) { public boolean {{parentTypeName}}.{{connectMethodName}}(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}} +{{#configLoggingEnabledForReads}} System.out.println("[Receive] " + {{connectParameterName}} + " -> {{entityName}} = " + {{lastResult}}); -{{/loggingEnabledForReads}} +{{/configLoggingEnabledForReads}} {{#hasTypeEndpointTarget}} {{lastResult}}.treeResolveAll(); {{#typeIsList}} @@ -71,9 +71,9 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParameterName}}) throws java.io.IOException { java.util.function.BiConsumer<String, byte[]> consumer = (topic, message) -> { {{> mappingApplication}} -{{#loggingEnabledForReads}} +{{#configLoggingEnabledForReads}} System.out.println("[Receive] " + {{connectParameterName}} + " (" + topic + ") -> {{entityName}} = " + {{lastResult}}); -{{/loggingEnabledForReads}} +{{/configLoggingEnabledForReads}} {{lastResult}}.set{{idTokenName}}(topic); int resolvedIndex = {{resolveInListMethodName}}(topic); if (resolvedIndex == -1) { @@ -95,14 +95,14 @@ private boolean {{parentTypeName}}.{{internalConnectMethodName}}(String {{connec {{#mqttHandler}} {{#InUse}} case "mqtt": - success = {{AttributeName}}().newConnection(connectToken, consumer); + success = {{attributeName}}().newConnection(connectToken, consumer); break; {{/InUse}} {{/mqttHandler}} {{#restHandler}} {{#InUse}} case "rest": - success = {{AttributeName}}().newPUTConnection(connectToken, input -> { + success = {{attributeName}}().newPUTConnection(connectToken, input -> { // TODO wildcard-topic not supported yet consumer.accept("", input.getBytes()); }); @@ -130,13 +130,13 @@ public boolean {{parentTypeName}}.{{disconnectMethodName}}(String {{connectParam switch (scheme) { {{#mqttHandler}} {{#InUse}} - case "mqtt": disconnectingMethod = {{AttributeName}}()::disconnect; + case "mqtt": disconnectingMethod = {{attributeName}}()::disconnect; break; {{/InUse}} {{/mqttHandler}} {{#restHandler}} {{#InUse}} - case "rest": disconnectingMethod = {{AttributeName}}()::disconnect; + case "rest": disconnectingMethod = {{attributeName}}()::disconnect; break; {{/InUse}} {{/restHandler}} diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache index bc7bc5a..3c29e92 100644 --- a/ragconnect.base/src/main/resources/sendDefinition.mustache +++ b/ragconnect.base/src/main/resources/sendDefinition.mustache @@ -8,12 +8,12 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete {{#mqttHandler}} {{#InUse}} case "mqtt": - final MqttHandler handler = {{AttributeName}}().resolveHandler(uri); - final String topic = {{AttributeName}}().extractTopic(uri); + final MqttHandler handler = {{attributeName}}().resolveHandler(uri); + final String topic = {{attributeName}}().extractTopic(uri); {{senderName}}.add(() -> { - {{#loggingEnabledForWrites}} + {{#configLoggingEnabledForWrites}} System.out.println("[Send] {{entityName}} = " + {{getterMethodName}}() + " -> " + {{connectParameterName}}); - {{/loggingEnabledForWrites}} + {{/configLoggingEnabledForWrites}} handler.publish(topic, {{lastValue}}); }, connectToken); {{updateMethodName}}(); @@ -27,7 +27,7 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete {{#restHandler}} {{#InUse}} case "rest": - success = {{AttributeName}}().newGETConnection(connectToken, () -> { + success = {{attributeName}}().newGETConnection(connectToken, () -> { {{updateMethodName}}(); return new String({{lastValue}}); }); @@ -40,13 +40,13 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete } if (success) { connectTokenMap.add(this, false, connectToken); - {{#incrementalOptionActive}} + {{#configIncrementalOptionActive}} _ragConnectObserver().add(connectToken, this, "{{getterMethodName}}", () -> { if (this.{{updateMethodName}}()) { this.{{writeMethodName}}(); } }); - {{/incrementalOptionActive}} + {{/configIncrementalOptionActive}} } return success; } @@ -58,9 +58,9 @@ public boolean {{parentTypeName}}.{{disconnectMethodName}}(String {{connectParam System.err.println("Disconnect called without connection for sending " + this + ".{{entityName}} to '" + {{connectParameterName}} + "'!"); return false; } - {{#incrementalOptionActive}} + {{#configIncrementalOptionActive}} connectTokens.forEach(token -> _ragConnectObserver().remove(token)); - {{/incrementalOptionActive}} + {{/configIncrementalOptionActive}} RagConnectDisconnectHandlerMethod disconnectingMethod; switch (scheme) { {{#mqttHandler}} @@ -73,7 +73,7 @@ public boolean {{parentTypeName}}.{{disconnectMethodName}}(String {{connectParam {{#restHandler}} {{#InUse}} case "rest": - disconnectingMethod = {{AttributeName}}()::disconnect; + disconnectingMethod = {{attributeName}}()::disconnect; break; {{/InUse}} {{/restHandler}} diff --git a/ragconnect.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache index f0a79a8..3b0ae62 100644 --- a/ragconnect.base/src/main/resources/tokenComponent.mustache +++ b/ragconnect.base/src/main/resources/tokenComponent.mustache @@ -1,4 +1,4 @@ -public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) { +public {{parentTypeName}} {{parentTypeName}}.set{{Name}}({{javaType}} value) { set{{internalName}}(value); {{#DependencySourceDefinitions}} for ({{targetParentTypeName}} target : get{{internalRelationPrefix}}TargetList()) { @@ -17,6 +17,6 @@ public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) { return this; } -public {{javaType}} {{parentTypeName}}.get{{name}}() { +public {{javaType}} {{parentTypeName}}.get{{Name}}() { return get{{internalName}}(); } -- GitLab