Skip to content
Snippets Groups Projects
Commit d613fb71 authored by René Schöne's avatar René Schöne
Browse files

converting to new grammar, fixing errors

parent a82df0f9
No related branches found
No related tags found
2 merge requests!22Resolve "Feature: Add context-free connect",!21Resolve "Make grammar(s) more concise"
Pipeline #11987 failed
Showing
with 557 additions and 681 deletions
aspect Analysis { aspect Analysis {
// --- lookupTokenEndpointDefinition --- // --- lookupTokenEndpointDefinition ---
inh java.util.List<TokenEndpointDefinition> TokenEndpointDefinition.lookupTokenEndpointDefinitions(TokenComponent token); inh java.util.List<EndpointDefinition> EndpointDefinition.lookupTokenEndpointDefinitions(TokenComponent token);
inh java.util.List<EndpointDefinition> EndpointTarget.lookupTokenEndpointDefinitions(TokenComponent token);
eq RagConnect.getConnectSpecificationFile().lookupTokenEndpointDefinitions(TokenComponent token) = lookupTokenEndpointDefinitions(token); eq RagConnect.getConnectSpecificationFile().lookupTokenEndpointDefinitions(TokenComponent token) = lookupTokenEndpointDefinitions(token);
syn java.util.List<TokenEndpointDefinition> RagConnect.lookupTokenEndpointDefinitions(TokenComponent token) { syn java.util.List<EndpointDefinition> RagConnect.lookupTokenEndpointDefinitions(TokenComponent token) {
java.util.List<TokenEndpointDefinition> result = new java.util.ArrayList<>(); java.util.List<EndpointDefinition> result = new java.util.ArrayList<>();
for (EndpointDefinition def : allEndpointDefinitionList()) { for (EndpointTarget target : allEndpointTargetList()) {
if (def.isTokenEndpointDefinition() && def.asTokenEndpointDefinition().getToken().equals(token)) { if (target.isTokenEndpointTarget() && target.asTokenEndpointTarget().getToken().equals(token)) {
result.add(def.asTokenEndpointDefinition()); result.add(target.containingEndpointDefinition());
} }
} }
return result; return result;
} }
// --- lookupTypeEndpointDefinition --- // --- lookupTypeEndpointDefinition ---
inh java.util.List<TypeEndpointDefinition> TypeEndpointDefinition.lookupTypeEndpointDefinitions(TypeComponent type); inh java.util.List<EndpointDefinition> EndpointDefinition.lookupTypeEndpointDefinitions(TypeComponent type);
inh java.util.List<EndpointDefinition> EndpointTarget.lookupTypeEndpointDefinitions(TypeComponent type);
eq RagConnect.getConnectSpecificationFile().lookupTypeEndpointDefinitions(TypeComponent type) = lookupTypeEndpointDefinitions(type); eq RagConnect.getConnectSpecificationFile().lookupTypeEndpointDefinitions(TypeComponent type) = lookupTypeEndpointDefinitions(type);
syn java.util.List<TypeEndpointDefinition> RagConnect.lookupTypeEndpointDefinitions(TypeComponent type) { syn java.util.List<EndpointDefinition> RagConnect.lookupTypeEndpointDefinitions(TypeComponent type) {
java.util.List<TypeEndpointDefinition> result = new java.util.ArrayList<>(); java.util.List<EndpointDefinition> result = new java.util.ArrayList<>();
for (EndpointDefinition def : allEndpointDefinitionList()) { for (EndpointTarget target : allEndpointTargetList()) {
if (def.isTypeEndpointDefinition() && def.asTypeEndpointDefinition().getType().equals(type)) { if (target.isTypeEndpointTarget() && target.asTypeEndpointTarget().getType().equals(type)) {
result.add(def.asTypeEndpointDefinition()); result.add(target.containingEndpointDefinition());
} }
} }
return result; return result;
...@@ -37,17 +39,22 @@ aspect Analysis { ...@@ -37,17 +39,22 @@ aspect Analysis {
} }
// --- isAlreadyDefined --- // --- isAlreadyDefined ---
syn boolean TokenEndpointDefinition.isAlreadyDefined() { syn boolean EndpointDefinition.isAlreadyDefined() = getEndpointTarget().isAlreadyDefined();
syn boolean EndpointTarget.isAlreadyDefined();
eq TokenEndpointTarget.isAlreadyDefined() {
return lookupTokenEndpointDefinitions(getToken()).stream() return lookupTokenEndpointDefinitions(getToken()).stream()
.filter(this::matchesType) .filter(containingEndpointDefinition()::matchesType)
.count() > 1;
}
eq TypeEndpointTarget.isAlreadyDefined() {
return lookupTypeEndpointDefinitions(getType()).stream()
.filter(containingEndpointDefinition()::matchesType)
.count() > 1; .count() > 1;
} }
syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this; syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this;
// --- matchesType --- // --- matchesType ---
syn boolean TokenEndpointDefinition.matchesType(TokenEndpointDefinition other); syn boolean EndpointDefinition.matchesType(EndpointDefinition other) = this.getSend() == other.getSend();
eq ReceiveTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isReceiveTokenEndpointDefinition();
eq SendTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isSendTokenEndpointDefinition();
// --- assignableTo --- // --- assignableTo ---
syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target); syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target);
...@@ -81,11 +88,14 @@ aspect Analysis { ...@@ -81,11 +88,14 @@ aspect Analysis {
} }
// --- shouldSendValue --- // --- shouldSendValue ---
syn boolean TokenEndpointDefinition.shouldSendValue() = isSendTokenEndpointDefinition() && !getToken().getNTA(); syn boolean EndpointDefinition.shouldSendValue() = getSend() && getEndpointTarget().entityIsNormalAttribute();
syn boolean TypeEndpointDefinition.shouldSendValue() = isSendTypeEndpointDefinition() && !getType().getNTA();
syn boolean EndpointTarget.entityIsNormalAttribute();
eq TokenEndpointTarget.entityIsNormalAttribute() = !getToken().getNTA();
eq TypeEndpointTarget.entityIsNormalAttribute() = !getType().getNTA();
// --- needProxyToken --- // --- needProxyToken ---
syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() || getTokenEndpointDefinitionList().stream().anyMatch(TokenEndpointDefinition::shouldSendValue); syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() || getTokenEndpointTargetList().stream().map(EndpointTarget::containingEndpointDefinition).anyMatch(EndpointDefinition::shouldSendValue);
// --- effectiveUsedAt --- // --- effectiveUsedAt ---
coll Set<EndpointDefinition> MappingDefinition.effectiveUsedAt() coll Set<EndpointDefinition> MappingDefinition.effectiveUsedAt()
...@@ -96,8 +106,9 @@ aspect Analysis { ...@@ -96,8 +106,9 @@ aspect Analysis {
for each effectiveMappings(); for each effectiveMappings();
// --- typeIsList --- // --- typeIsList ---
syn boolean EndpointDefinition.typeIsList() = false; syn boolean EndpointDefinition.typeIsList() = getEndpointTarget().typeIsList();
eq TypeEndpointDefinition.typeIsList() { syn boolean EndpointTarget.typeIsList() = false;
eq TypeEndpointTarget.typeIsList() {
return getType().isListComponent(); return getType().isListComponent();
} }
......
...@@ -3,29 +3,27 @@ aspect Errors { ...@@ -3,29 +3,27 @@ aspect Errors {
[new TreeSet<ErrorMessage>()] [new TreeSet<ErrorMessage>()]
root RagConnect; root RagConnect;
ReceiveTokenEndpointDefinition contributes error("Receive definition already defined for " + getToken().getName()) EndpointDefinition contributes error("Endpoint definition already defined for " + parentTypeName() + "." + entityName())
when isAlreadyDefined() when isAlreadyDefined()
to RagConnect.errors(); to RagConnect.errors();
ReceiveTokenEndpointDefinition contributes error("Receiving target token must not be an NTA token!") EndpointDefinition contributes error("Receiving target token must not be an NTA token!")
when getToken().getNTA() when !getSend() && getEndpointTarget().isTokenEndpointTarget() && token().getNTA()
to RagConnect.errors(); to RagConnect.errors();
// if first mapping is null, then suitableDefaultMapping() == null // if first mapping is null, then suitableDefaultMapping() == null
ReceiveTokenEndpointDefinition contributes error("No suitable default mapping found for type " + EndpointDefinition contributes error("No suitable default mapping found for type " +
((getMappingList().isEmpty()) ((getMappingList().isEmpty())
? getToken().effectiveJavaTypeUse().prettyPrint() ? token().effectiveJavaTypeUse().prettyPrint()
: getMappingList().get(0).getFromType().prettyPrint())) : getMappingList().get(0).getFromType().prettyPrint()))
when effectiveMappings().get(0) == null when !getSend() && getEndpointTarget().isTokenEndpointTarget() && effectiveMappings().get(0) == null
to RagConnect.errors(); to RagConnect.errors();
ReceiveTokenEndpointDefinition contributes error("to-type of last mapping (" + effectiveMappings().get(effectiveMappings().size() - 1).getToType().prettyPrint() + ") not assignable to type of the Token (" + getToken().effectiveJavaTypeUse().prettyPrint() + ")!") // TODO copy for type endpoint target
when !effectiveMappings().get(effectiveMappings().size() - 1).getToType().assignableTo( EndpointDefinition contributes error("to-type of last mapping (" + effectiveMappings().get(effectiveMappings().size() - 1).getToType().prettyPrint() + ") not assignable to type of the token (" + token().effectiveJavaTypeUse().prettyPrint() + ")!")
getToken().effectiveJavaTypeUse()) when !getSend() && getEndpointTarget().isTokenEndpointTarget() &&
to RagConnect.errors(); !effectiveMappings().get(effectiveMappings().size() - 1).getToType().assignableTo(
token().effectiveJavaTypeUse())
SendTokenEndpointDefinition contributes error("Send definition already defined for " + getToken().getName())
when isAlreadyDefined()
to RagConnect.errors(); to RagConnect.errors();
DependencyDefinition contributes error("Dependency definition already defined for " + getSource().containingTypeDecl().getName() + " with name " + getID()) DependencyDefinition contributes error("Dependency definition already defined for " + getSource().containingTypeDecl().getName() + " with name " + getID())
...@@ -46,7 +44,6 @@ aspect ErrorHelpers { ...@@ -46,7 +44,6 @@ aspect ErrorHelpers {
} }
return false; return false;
} }
syn String TokenComponent.parentTypeDeclAndName() = containingTypeDecl().getName() + "." + getName();
} }
aspect ErrorMessage { aspect ErrorMessage {
......
...@@ -43,24 +43,24 @@ aspect RagConnectNavigation { ...@@ -43,24 +43,24 @@ aspect RagConnectNavigation {
// --- program --- // --- program ---
eq RagConnect.getChild().program() = getProgram(); eq RagConnect.getChild().program() = getProgram();
eq MRagConnect.getChild().program() = getRagConnect().program();
// --- ragconnect --- // --- ragconnect ---
inh RagConnect ASTNode.ragconnect(); inh RagConnect ASTNode.ragconnect();
eq RagConnect.getChild().ragconnect() = this; eq RagConnect.getChild().ragconnect() = this;
eq MRagConnect.getChild().ragconnect() = getRagConnect();
// --- containedConnectSpecification --- // --- containedConnectSpecification ---
inh ConnectSpecification ASTNode.containedConnectSpecification(); inh ConnectSpecification ASTNode.containedConnectSpecification();
eq RagConnect.getChild().containedConnectSpecification() = null; eq RagConnect.getChild().containedConnectSpecification() = null;
eq MRagConnect.getChild().containedConnectSpecification() = null;
eq Document.getChild().containedConnectSpecification() = null; eq Document.getChild().containedConnectSpecification() = null;
eq Program.getChild().containedConnectSpecification() = null; eq Program.getChild().containedConnectSpecification() = null;
eq ConnectSpecification.getChild().containedConnectSpecification() = this; eq ConnectSpecification.getChild().containedConnectSpecification() = this;
// --- containingEndpointDefinition ---
inh EndpointDefinition EndpointTarget.containingEndpointDefinition();
eq EndpointDefinition.getEndpointTarget().containingEndpointDefinition() = this;
// --- containedFile // --- containedFile
eq RagConnect.getChild().containedFile() = null; eq RagConnect.getChild().containedFile() = null;
eq MRagConnect.getChild().containedFile() = null;
// --- containedFileName --- // --- containedFileName ---
eq ConnectSpecificationFile.containedFileName() = getFileName(); eq ConnectSpecificationFile.containedFileName() = getFileName();
...@@ -75,16 +75,25 @@ aspect RagConnectNavigation { ...@@ -75,16 +75,25 @@ aspect RagConnectNavigation {
//--- allEndpointDefinitionList --- //--- allEndpointDefinitionList ---
syn List<EndpointDefinition> RagConnect.allEndpointDefinitionList() { syn List<EndpointDefinition> RagConnect.allEndpointDefinitionList() {
List<EndpointDefinition> result = new ArrayList<>(); List<EndpointDefinition> result = new ArrayList<>();
for (var spec : getConnectSpecificationFileList()) { for (ConnectSpecification spec : getConnectSpecificationFileList()) {
spec.getEndpointDefinitionList().forEach(result::add); spec.getEndpointDefinitionList().forEach(result::add);
} }
return result; return result;
} }
//--- allEndpointTargetList ---
syn List<EndpointTarget> RagConnect.allEndpointTargetList() {
List<EndpointTarget> result = new ArrayList<>();
for (ConnectSpecification spec : getConnectSpecificationFileList()) {
spec.getEndpointDefinitionList().forEach(endpointDef -> result.add(endpointDef.getEndpointTarget()));
}
return result;
}
//--- allDependencyDefinitionList --- //--- allDependencyDefinitionList ---
syn List<DependencyDefinition> RagConnect.allDependencyDefinitionList() { syn List<DependencyDefinition> RagConnect.allDependencyDefinitionList() {
List<DependencyDefinition> result = new ArrayList<>(); List<DependencyDefinition> result = new ArrayList<>();
for (var spec : getConnectSpecificationFileList()) { for (ConnectSpecification spec : getConnectSpecificationFileList()) {
spec.getDependencyDefinitionList().forEach(result::add); spec.getDependencyDefinitionList().forEach(result::add);
} }
return result; return result;
...@@ -93,70 +102,24 @@ aspect RagConnectNavigation { ...@@ -93,70 +102,24 @@ aspect RagConnectNavigation {
//--- allMappingDefinitionList --- //--- allMappingDefinitionList ---
syn List<MappingDefinition> RagConnect.allMappingDefinitionList() { syn List<MappingDefinition> RagConnect.allMappingDefinitionList() {
List<MappingDefinition> result = new ArrayList<>(); List<MappingDefinition> result = new ArrayList<>();
for (var spec : getConnectSpecificationFileList()) { for (ConnectSpecification spec : getConnectSpecificationFileList()) {
spec.getMappingDefinitionList().forEach(result::add); spec.getMappingDefinitionList().forEach(result::add);
} }
return result; return result;
} }
// --- isTokenEndpointDefinition ---
syn boolean EndpointDefinition.isTokenEndpointDefinition() = false;
eq TokenEndpointDefinition.isTokenEndpointDefinition() = true;
// --- asTokenEndpointDefinition ---
syn TokenEndpointDefinition EndpointDefinition.asTokenEndpointDefinition() = null;
eq TokenEndpointDefinition.asTokenEndpointDefinition() = this;
// --- isTypeEndpointDefinition ---
syn boolean EndpointDefinition.isTypeEndpointDefinition() = false;
eq TypeEndpointDefinition.isTypeEndpointDefinition() = true;
// --- asTypeEndpointDefinition ---
syn TypeEndpointDefinition EndpointDefinition.asTypeEndpointDefinition() = null;
eq TypeEndpointDefinition.asTypeEndpointDefinition() = this;
// --- isReceiveTokenEndpointDefinition ---
syn boolean EndpointDefinition.isReceiveTokenEndpointDefinition() = false;
eq ReceiveTokenEndpointDefinition.isReceiveTokenEndpointDefinition() = true;
// --- asReceiveTokenEndpointDefinition ---
syn ReceiveTokenEndpointDefinition EndpointDefinition.asReceiveTokenEndpointDefinition() = null;
eq ReceiveTokenEndpointDefinition.asReceiveTokenEndpointDefinition() = this;
// --- isSendTokenEndpointDefinition ---
syn boolean EndpointDefinition.isSendTokenEndpointDefinition() = false;
eq SendTokenEndpointDefinition.isSendTokenEndpointDefinition() = true;
// --- asSendTokenEndpointDefinition ---
syn SendTokenEndpointDefinition EndpointDefinition.asSendTokenEndpointDefinition() = null;
eq SendTokenEndpointDefinition.asSendTokenEndpointDefinition() = this;
// --- isReceiveTypeEndpointDefinition ---
syn boolean EndpointDefinition.isReceiveTypeEndpointDefinition() = false;
eq ReceiveTypeEndpointDefinition.isReceiveTypeEndpointDefinition() = true;
// --- asReceiveTypeEndpointDefinition ---
syn ReceiveTypeEndpointDefinition EndpointDefinition.asReceiveTypeEndpointDefinition() = null;
eq ReceiveTypeEndpointDefinition.asReceiveTypeEndpointDefinition() = this;
// --- isSendTypeEndpointDefinition ---
syn boolean EndpointDefinition.isSendTypeEndpointDefinition() = false;
eq SendTypeEndpointDefinition.isSendTypeEndpointDefinition() = true;
// --- asSendTypeEndpointDefinition ---
syn SendTypeEndpointDefinition EndpointDefinition.asSendTypeEndpointDefinition() = null;
eq SendTypeEndpointDefinition.asSendTypeEndpointDefinition() = this;
// --- targetEndpointDefinition --- // --- targetEndpointDefinition ---
syn EndpointDefinition DependencyDefinition.targetEndpointDefinition() { syn EndpointDefinition DependencyDefinition.targetEndpointDefinition() {
// resolve definition in here, as we do not need resolveMethod in any other place (yet) // resolve definition in here, as we do not need resolveMethod in any other place (yet)
for (EndpointDefinition endpointDefinition : ragconnect().allEndpointDefinitionList()) { for (EndpointDefinition endpointDefinition : ragconnect().allEndpointDefinitionList()) {
if (endpointDefinition.isSendTokenEndpointDefinition() && if (!endpointDefinition.getSend()) { continue; }
endpointDefinition.asSendTokenEndpointDefinition().getToken().equals(this.getTarget())) { EndpointTarget endpointTarget = endpointDefinition.getEndpointTarget();
if (endpointTarget.isTokenEndpointTarget() &&
endpointTarget.asTokenEndpointTarget().getToken().equals(this.getTarget())) {
return endpointDefinition; return endpointDefinition;
} }
if (endpointDefinition.isSendTypeEndpointDefinition() && if (endpointTarget.isTypeEndpointTarget() &&
endpointDefinition.asSendTypeEndpointDefinition().getType().equals(this.getTarget())) { endpointTarget.asTypeEndpointTarget().getType().equals(this.getTarget())) {
return endpointDefinition; return endpointDefinition;
} }
} }
...@@ -170,13 +133,6 @@ aspect RagConnectNavigation { ...@@ -170,13 +133,6 @@ aspect RagConnectNavigation {
syn boolean MappingDefinition.isDefaultMappingDefinition() = false; syn boolean MappingDefinition.isDefaultMappingDefinition() = false;
eq DefaultMappingDefinition.isDefaultMappingDefinition() = true; eq DefaultMappingDefinition.isDefaultMappingDefinition() = true;
// --- mragconnect ---
inh MRagConnect MHandler.mragconnect();
eq MRagConnect.getHandler().mragconnect() = this;
// --- rootTypeComponents ---
syn JastAddList<MTypeComponent> MHandler.rootTypeComponents() = mragconnect().getRootTypeComponents();
// --- isListComponent --- (defined in PP, but only on TypeComponent) // --- isListComponent --- (defined in PP, but only on TypeComponent)
syn boolean Component.isListComponent() = false; syn boolean Component.isListComponent() = false;
} }
RagConnect ::= ConnectSpecificationFile* Program ; RagConnect ::= ConnectSpecificationFile* Handler* Program ;
abstract ConnectSpecification ::= EndpointDefinition* DependencyDefinition* MappingDefinition* ; abstract ConnectSpecification ::= EndpointDefinition* DependencyDefinition* MappingDefinition* ;
ConnectSpecificationFile : ConnectSpecification ::= <FileName> ; ConnectSpecificationFile : ConnectSpecification ::= <FileName> ;
abstract EndpointDefinition ::= <AlwaysApply:boolean> ; EndpointDefinition ::= <AlwaysApply:boolean> <IndexBasedListAccess:boolean> <WithAdd:boolean> <Send:boolean> EndpointTarget ;
rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*; rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*;
abstract TokenEndpointDefinition : EndpointDefinition; abstract EndpointTarget ;
rel TokenEndpointDefinition.Token <-> TokenComponent.TokenEndpointDefinition*; TokenEndpointTarget : EndpointTarget ;
rel TokenEndpointTarget.Token <-> TokenComponent.TokenEndpointTarget* ;
ReceiveTokenEndpointDefinition : TokenEndpointDefinition; TypeEndpointTarget : EndpointTarget ;
SendTokenEndpointDefinition : TokenEndpointDefinition; rel TypeEndpointTarget.Type <-> TypeComponent.TypeEndpointTarget* ;
UntypedEndpointTarget : EndpointTarget ::= <TokenOrType> ; // only used by parser
abstract TypeEndpointDefinition : EndpointDefinition ::= <IndexBasedListAccess:boolean> ; // to be integrated:
rel TypeEndpointDefinition.Type <-> TypeComponent.TypeEndpointDefinition*; //AttributeEndpointTarget : EndpointTarget ::= <Name> ;
//RelationEndpointTarget : EndpointTarget ;
ReceiveTypeEndpointDefinition : TypeEndpointDefinition ::= <WithAdd:boolean>; //rel RelationEndpointTarget.Role <-> Role.RelationEndpointTarget* ;
SendTypeEndpointDefinition : TypeEndpointDefinition;
DependencyDefinition ::= <ID>; DependencyDefinition ::= <ID>;
rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*; rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*;
...@@ -29,7 +27,4 @@ JavaMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ; ...@@ -29,7 +27,4 @@ JavaMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ;
JavaArrayMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ; JavaArrayMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ;
DefaultMappingDefinition : MappingDefinition ; DefaultMappingDefinition : MappingDefinition ;
// only used by parser Handler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boolean>;
abstract UntypedEndpointDefinition : EndpointDefinition ::= <TokenOrType> <Indexed:boolean> <WithAdd:boolean> ;
ReceiveUntypedEndpointDefinition : UntypedEndpointDefinition;
SendUntypedEndpointDefinition : UntypedEndpointDefinition;
...@@ -3,19 +3,21 @@ RagConnect ::= ConnectSpecificationFile* Program ; ...@@ -3,19 +3,21 @@ RagConnect ::= ConnectSpecificationFile* Program ;
abstract ConnectSpecification ::= EndpointDefinition* DependencyDefinition* MappingDefinition* ; abstract ConnectSpecification ::= EndpointDefinition* DependencyDefinition* MappingDefinition* ;
ConnectSpecificationFile : ConnectSpecification ::= <FileName> ; ConnectSpecificationFile : ConnectSpecification ::= <FileName> ;
EndpointDefinition ::= <AlwaysApply:boolean> <IndexBasedListAccess:boolean> <WithAdd:boolean> <Send:boolean> EndpointTarget ; abstract EndpointDefinition ::= <AlwaysApply:boolean> ;
rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*; rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*;
abstract EndpointTarget ; abstract TokenEndpointDefinition : EndpointDefinition;
TokenEndpointTarget : EndpointTarget ; rel TokenEndpointDefinition.Token <-> TokenComponent.TokenEndpointDefinition*;
rel TokenEndpointTarget.Token <-> TokenComponent.TokenEndpointTarget* ;
TypeEndpointTarget : EndpointTarget ; ReceiveTokenEndpointDefinition : TokenEndpointDefinition;
rel TypeEndpointTarget.Type <-> TypeComponent.TypeEndpointTarget* ; SendTokenEndpointDefinition : TokenEndpointDefinition;
UntypedEndpointTarget : EndpointTarget ::= <TokenOrType> ; // only used by parser
// to be integrated: abstract TypeEndpointDefinition : EndpointDefinition ::= <IndexBasedListAccess:boolean> ;
//AttributeEndpointTarget : EndpointTarget ::= <Name> ; rel TypeEndpointDefinition.Type <-> TypeComponent.TypeEndpointDefinition*;
//RelationEndpointTarget : EndpointTarget ;
//rel RelationEndpointTarget.Role <-> Role.RelationEndpointTarget* ; ReceiveTypeEndpointDefinition : TypeEndpointDefinition ::= <WithAdd:boolean>;
SendTypeEndpointDefinition : TypeEndpointDefinition;
DependencyDefinition ::= <ID>; DependencyDefinition ::= <ID>;
rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*; rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*;
...@@ -26,3 +28,8 @@ abstract MappingDefinitionType ::= ; ...@@ -26,3 +28,8 @@ abstract MappingDefinitionType ::= ;
JavaMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ; JavaMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ;
JavaArrayMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ; JavaArrayMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ;
DefaultMappingDefinition : MappingDefinition ; DefaultMappingDefinition : MappingDefinition ;
// only used by parser
abstract UntypedEndpointDefinition : EndpointDefinition ::= <TokenOrType> <Indexed:boolean> <WithAdd:boolean> ;
ReceiveUntypedEndpointDefinition : UntypedEndpointDefinition;
SendUntypedEndpointDefinition : UntypedEndpointDefinition;
...@@ -4,18 +4,18 @@ Design considerations ...@@ -4,18 +4,18 @@ Design considerations
- [NEW in 1.0.0] no complete intermediate structure, but instead single nodes where applicable - [NEW in 1.0.0] no complete intermediate structure, but instead single nodes where applicable
*/ */
aspect NewStuff { aspect NewStuff {
syn nta JastAddList<MTypeComponent> RagConnect.getRootTypeComponentList() { syn List<TypeComponent> RagConnect.rootTypeComponentList() {
JastAddList<MTypeComponent> result = new JastAddList<>(); List<TypeComponent> result = new ArrayList<>();
for (Component child : rootNode.getComponentList()) { for (Component child : rootNode.getComponentList()) {
if (child.isTypeComponent()) { if (child.isTypeComponent()) {
result.add(child.asTypeComponent().toMustache()); result.add(child.asTypeComponent());
} }
} }
return result; return result;
} }
inh boolean MTypeComponent.isFirst(); // inh boolean TypeComponent.isFirst();
eq RagConnect.getRootTypeComponentList(int i).isFirst() = i == 0; // eq RagConnect.getRootTypeComponentList(int i).isFirst() = i == 0;
syn String RagConnect.closeMethod() = "ragconnectCloseConnections"; syn String RagConnect.closeMethod() = "ragconnectCloseConnections";
syn String RagConnect.mqttHandlerAttribute() = "_mqttHandler"; syn String RagConnect.mqttHandlerAttribute() = "_mqttHandler";
...@@ -26,7 +26,7 @@ aspect NewStuff { ...@@ -26,7 +26,7 @@ aspect NewStuff {
syn String RagConnect.restHandlerField() = "_restHandler"; syn String RagConnect.restHandlerField() = "_restHandler";
syn boolean RagConnect.hasTreeListEndpoints() { syn boolean RagConnect.hasTreeListEndpoints() {
for (EndpointDefinition endpointDef : getEndpointDefinitionList()) { for (EndpointDefinition endpointDef : allEndpointDefinitionList()) {
if (endpointDef.typeIsList()) { if (endpointDef.typeIsList()) {
return true; return true;
} }
...@@ -35,7 +35,7 @@ aspect NewStuff { ...@@ -35,7 +35,7 @@ aspect NewStuff {
} }
syn Set<TypeDecl> RagConnect.typesForReceivingListEndpoints() { syn Set<TypeDecl> RagConnect.typesForReceivingListEndpoints() {
Set<TypeDecl> result = new HashSet<>(); Set<TypeDecl> result = new HashSet<>();
for (EndpointDefinition endpointDef : getEndpointDefinitionList()) { for (EndpointDefinition endpointDef : allEndpointDefinitionList()) {
if (endpointDef.typeIsList() && !endpointDef.getSend()) { if (endpointDef.typeIsList() && !endpointDef.getSend()) {
result.add(endpointDef.type().getTypeDecl()); result.add(endpointDef.type().getTypeDecl());
} }
...@@ -46,290 +46,219 @@ aspect NewStuff { ...@@ -46,290 +46,219 @@ aspect NewStuff {
syn String EndpointDefinition.preemptiveExpectedValue() = toMustache().preemptiveExpectedValue(); syn String EndpointDefinition.preemptiveExpectedValue() = toMustache().preemptiveExpectedValue();
syn String EndpointDefinition.preemptiveReturn() = toMustache().preemptiveReturn(); syn String EndpointDefinition.preemptiveReturn() = toMustache().preemptiveReturn();
syn String EndpointDefinition.firstInputVarName() = toMustache().firstInputVarName(); syn String EndpointDefinition.firstInputVarName() = toMustache().firstInputVarName();
syn String EndpointDefinition.parentTypeName() = toMustache().parentTypeName();
syn String EndpointDefinition.entityName() = toMustache().entityName();
syn String EndpointDefinition.updateMethod() = toMustache().updateMethod(); syn String EndpointDefinition.updateMethod() = toMustache().updateMethod();
syn String EndpointDefinition.writeMethod() = toMustache().writeMethod(); syn String EndpointDefinition.writeMethod() = toMustache().writeMethod();
syn String EndpointDefinition.getterMethod() = toMustache().getterMethod();
syn String EndpointDefinition.parentTypeName() = getEndpointTarget().parentTypeName();
syn String EndpointDefinition.entityName() = getEndpointTarget().entityName();
syn String EndpointDefinition.getterMethod() = getEndpointTarget().getterMethod();
syn String EndpointDefinition.uniqueSuffix() = getSend() ? "Send" : "Receive"; syn String EndpointDefinition.uniqueSuffix() = getSend() ? "Send" : "Receive";
syn String EndpointDefinition.connectParameterName() = "uriString"; syn String EndpointDefinition.connectParameterName() = "uriString";
syn String EndpointDefinition.connectMethod() = "connect" + entityName(); syn String EndpointDefinition.connectMethod() = "connect" + entityName();
syn String EndpointDefinition.internalConnectMethod() = "_internal_" + connectMethod(); syn String EndpointDefinition.internalConnectMethod() = "_internal_" + connectMethod();
syn boolean EndpointDefinition.isTypeEndpointDefinition() = endpointDef().isTypeEndpointDefinition();
syn String EndpointDefinition.disconnectMethod() { syn String EndpointDefinition.disconnectMethod() {
// TODO unclear. rework, when lookup methods are done.
// if both (send and receive) are defined for an endpoint, ensure methods with different names // if both (send and receive) are defined for an endpoint, ensure methods with different names
String extra; String extra;
if (endpointDef().isTokenEndpointDefinition()) { if (getEndpointTarget().isTokenEndpointTarget()) {
extra = endpointDef().asTokenEndpointDefinition().lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : ""; extra = lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : "";
} else if (endpointDef().isTypeEndpointDefinition()) { } else if (getEndpointTarget().isTypeEndpointTarget()) {
extra = endpointDef().asTypeEndpointDefinition().lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : ""; extra = lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : "";
} else { } else {
extra = ""; extra = "";
} }
return "disconnect" + extra + entityName(); return "disconnect" + extra + entityName();
} }
// TODO potentially dangerous because asXEndpointDefinition can return null // TODO [OLD] potentially dangerous because asXEndpointDefinition can return null
syn TokenComponent EndpointDefinition.token() = getEndpointTarget().asTokenEndpointTarget().getToken(); syn TokenComponent EndpointDefinition.token() = getEndpointTarget().asTokenEndpointTarget().getToken();
syn TypeComponent EndpointDefinition.type() = getEndpointTarget().asTypeEndpointTarget().getType(); syn TypeComponent EndpointDefinition.type() = getEndpointTarget().asTypeEndpointTarget().getType();
syn String EndpointDefinition.tokenName() = token().getName(); syn String EndpointDefinition.tokenName() = token().getName();
syn String MEndpointDefinition.tokenName() = getEndpointDefinition().tokenName();
syn String EndpointDefinition.typeName() = type().getName(); syn String EndpointDefinition.typeName() = type().getName();
syn String MEndpointDefinition.typeName() = getEndpointDefinition().typeName();
syn String EndpointDefinition.typeDeclName() = type().getTypeDecl().getName(); syn String EndpointDefinition.typeDeclName() = type().getTypeDecl().getName();
}
aspect OldStuff {
// --- EndpointDefinition ---
syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList";
// --- MEndpointDefinition ---
syn String MEndpointDefinition.preemptiveExpectedValue();
syn String MEndpointDefinition.preemptiveReturn();
syn EndpointDefinition MEndpointDefinition.endpointDef();
syn String MEndpointDefinition.firstInputVarName();
syn String MEndpointDefinition.parentTypeName();
syn String MEndpointDefinition.entityName();
syn String MEndpointDefinition.updateMethod();
syn String MEndpointDefinition.writeMethod();
syn String MEndpointDefinition.getterMethod();
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();
// TODO check, whether this works
inh boolean MInnerMappingDefinition.isLast();
eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1; eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1;
eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName(); eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName();
} syn String EndpointDefinition.condition() {
// TODO [OLD] probably, this has to be structured in a better way
aspect AttributesForMustache { if (lastDefinition().getMappingDefinition().getToType().isArray()) {
syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1);
syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName();
syn String MEndpointDefinition.condition() {
// TODO probably, this has to be structured in a better way
if (lastDefinition().mappingDef().getToType().isArray()) {
return "java.util.Arrays.equals(" + preemptiveExpectedValue() + ", " + lastResult() + ")"; return "java.util.Arrays.equals(" + preemptiveExpectedValue() + ", " + lastResult() + ")";
} }
if (endpointDef().isTokenEndpointDefinition() && token().isPrimitiveType() && lastDefinition().mappingDef().getToType().isPrimitiveType()) { if (getEndpointTarget().isTokenEndpointTarget() && token().isPrimitiveType() && lastDefinition().getMappingDefinition().getToType().isPrimitiveType()) {
return preemptiveExpectedValue() + " == " + lastResult(); return preemptiveExpectedValue() + " == " + lastResult();
} }
if (endpointDef().isReceiveTypeEndpointDefinition() && endpointDef().asReceiveTypeEndpointDefinition().getWithAdd()) { if (!getSend() && getEndpointTarget().isTypeEndpointTarget() && getWithAdd()) {
// only check if received list is not null // only check if received list is not null
return lastResult() + " == null"; return lastResult() + " == null";
} }
if (endpointDef().isTypeEndpointDefinition() && type().isOptComponent()) { if (getEndpointTarget().isTypeEndpointTarget() && type().isOptComponent()) {
// use "hasX()" instead of "getX() != null" for optionals // use "hasX()" instead of "getX() != null" for optionals
return "has" + typeName() + "()" + " && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")"; return "has" + typeName() + "()" + " && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")";
} }
if (lastDefinition().mappingDef().getToType().isPrimitiveType() || lastDefinition().mappingDef().isDefaultMappingDefinition()) { if (lastDefinition().getMappingDefinition().getToType().isPrimitiveType() || lastDefinition().getMappingDefinition().isDefaultMappingDefinition()) {
return preemptiveExpectedValue() + " != null && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")"; return preemptiveExpectedValue() + " != null && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")";
} }
return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null"; return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null";
} }
syn String MEndpointDefinition.sender() = null; // only for M*SendDefinitions
syn String MEndpointDefinition.lastValue() = sender() + ".lastValue"; // only for M*SendDefinitions
// --- MTokenEndpointDefinition ---
eq MTokenEndpointDefinition.getterMethod() = "get" + tokenName();
eq MTokenEndpointDefinition.parentTypeName() = token().containingTypeDecl().getName();
eq MTokenEndpointDefinition.entityName() = tokenName();
// --- MTypeEndpointDefinition ---
syn boolean MTypeEndpointDefinition.isWithAdd() = endpointDef().isReceiveTypeEndpointDefinition() ? endpointDef().asReceiveTypeEndpointDefinition().getWithAdd() : false;
syn boolean MTypeEndpointDefinition.isIndexBasedListAccess() = endpointDef().asTypeEndpointDefinition().getIndexBasedListAccess();
eq MTypeEndpointDefinition.getterMethod() = "get" + typeName() + (typeIsList() ? "List" : "");
eq MTypeEndpointDefinition.parentTypeName() = type().containingTypeDecl().getName();
eq MTypeEndpointDefinition.entityName() = typeName() + (typeIsList() && !isIndexBasedListAccess() ? "List" : "");
// --- MInnerMappingDefinition ---
inh boolean MInnerMappingDefinition.isLast();
inh String MInnerMappingDefinition.inputVarName();
syn String MInnerMappingDefinition.toType() = mappingDef().getToType().prettyPrint();
syn String MInnerMappingDefinition.methodName() = getMMappingDefinition().methodName();
syn MappingDefinition MInnerMappingDefinition.mappingDef() = getMMappingDefinition().getMappingDefinition();
syn String MInnerMappingDefinition.outputVarName() = "result" + methodName(); // we do not need "_" in between here, because methodName begins with one
// --- MTokenReceiveDefinition --- // TODO rename sender to senderName
eq MTokenReceiveDefinition.preemptiveExpectedValue() = getterMethod() + "()"; syn String EndpointDefinition.sender() = getEndpointTarget().senderName(); // only needed for send endpoints
eq MTokenReceiveDefinition.preemptiveReturn() = "return;"; syn String EndpointTarget.senderName();
eq MTokenReceiveDefinition.endpointDef() = getReceiveTokenEndpointDefinition(); eq TokenEndpointTarget.senderName() = "_sender_" + getToken().getName();
eq MTokenReceiveDefinition.firstInputVarName() = "message"; eq TypeEndpointTarget.senderName() = "_sender_" + getType().getName();
eq MTokenReceiveDefinition.updateMethod() = null; syn String EndpointDefinition.lastValue() = sender() + ".lastValue"; // only needed for send endpoints
eq MTokenReceiveDefinition.writeMethod() = null; syn String MEndpointDefinition.lastValue() = getEndpointDefinition().lastValue();
// --- MTokenSendDefinition --- // TODO rename getterMethod to getterMethodName
eq MTokenSendDefinition.preemptiveExpectedValue() = lastValue(); syn String EndpointTarget.getterMethod();
eq MTokenSendDefinition.preemptiveReturn() = "return false;"; syn String EndpointTarget.parentTypeName();
eq MTokenSendDefinition.endpointDef() = getSendTokenEndpointDefinition(); syn String EndpointTarget.entityName();
eq MTokenSendDefinition.firstInputVarName() = getterMethod() + "()"; eq TokenEndpointTarget.getterMethod() = "get" + getToken().getName();
eq MTokenSendDefinition.updateMethod() = "_update_" + tokenName(); eq TokenEndpointTarget.parentTypeName() = getToken().containingTypeDecl().getName();
eq MTokenSendDefinition.writeMethod() = "_writeLastValue_" + tokenName(); eq TokenEndpointTarget.entityName() = getToken().getName();
eq TypeEndpointTarget.getterMethod() = "get" + getType().getName() + (typeIsList() ? "List" : "");
eq MTokenSendDefinition.sender() = "_sender_" + tokenName(); eq TypeEndpointTarget.parentTypeName() = getType().containingTypeDecl().getName();
syn String MTokenSendDefinition.tokenResetMethod() = getterMethod() + "_reset"; eq TypeEndpointTarget.entityName() = getType().getName() + (typeIsList() && !containingEndpointDefinition().getIndexBasedListAccess() ? "List" : "");
syn boolean MTokenSendDefinition.shouldSendValue() = endpointDef().asTokenEndpointDefinition().shouldSendValue();
// only for token + send
// MTypeReceiveDefinition // TODO rename tokenResetMethod to tokenResetMethodName
eq MTypeReceiveDefinition.preemptiveExpectedValue() = getterMethod() + "()"; syn String EndpointDefinition.tokenResetMethod() = getterMethod() + "_reset";
eq MTypeReceiveDefinition.preemptiveReturn() = "return;";
eq MTypeReceiveDefinition.endpointDef() = getReceiveTypeEndpointDefinition(); // only for type + receive
eq MTypeReceiveDefinition.firstInputVarName() = "message"; syn String EndpointDefinition.resolveInListMethodName() = "_ragconnect_resolve" + entityName() + "InList";
eq MTypeReceiveDefinition.updateMethod() = null;
eq MTypeReceiveDefinition.writeMethod() = null;
syn String MTypeReceiveDefinition.resolveInListMethodName() = "_ragconnect_resolve" + entityName() + "InList";
syn String MTypeReceiveDefinition.idTokenName() = endpointDef().idTokenName();
// MTypeSendDefinition
eq MTypeSendDefinition.preemptiveExpectedValue() = lastValue();
eq MTypeSendDefinition.preemptiveReturn() = "return false;";
eq MTypeSendDefinition.endpointDef() = getSendTypeEndpointDefinition();
eq MTypeSendDefinition.firstInputVarName() = getterMethod() + "()";
eq MTypeSendDefinition.updateMethod() = "_update_" + typeName();
eq MTypeSendDefinition.writeMethod() = "_writeLastValue_" + typeName();
eq MTypeSendDefinition.sender() = "_sender_" + typeName();
syn String MTypeSendDefinition.tokenResetMethod() = getterMethod() + "_reset";
syn boolean MTypeSendDefinition.shouldSendValue() = endpointDef().asTypeEndpointDefinition().shouldSendValue();
// --- MMappingDefinition --- // --- MMappingDefinition ---
syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint(); syn String MappingDefinition.toType() = getToType().prettyPrint();
syn String MMappingDefinition.methodName() = "_apply_" + getMappingDefinition().getID(); syn String MappingDefinition.methodName() = "_apply_" + getID();
syn String MMappingDefinition.fromType() = getMappingDefinition().getFromType().prettyPrint(); syn String MappingDefinition.fromType() = getFromType().prettyPrint();
syn String MMappingDefinition.fromVariableName() = getMappingDefinition().getFromVariableName(); syn boolean MappingDefinition.isUsed() = !effectiveUsedAt().isEmpty();
syn String MMappingDefinition.content() = getMappingDefinition().getContent();
syn boolean MMappingDefinition.isUsed() = !getMappingDefinition().effectiveUsedAt().isEmpty();
// --- MDependencyDefinition --- // --- MDependencyDefinition ---
syn String MDependencyDefinition.targetParentTypeName() = getDependencyDefinition().getTarget().containingTypeDecl().getName(); syn String DependencyDefinition.targetParentTypeName() = getTarget().containingTypeDecl().getName();
syn String MDependencyDefinition.dependencyMethod() = "add" + capitalize(getDependencyDefinition().getID()); syn String DependencyDefinition.dependencyMethod() = "add" + capitalize(getID());
syn String MDependencyDefinition.sourceParentTypeName() = getDependencyDefinition().getSource().containingTypeDecl().getName(); syn String DependencyDefinition.sourceParentTypeName() = getSource().containingTypeDecl().getName();
syn String MDependencyDefinition.internalRelationPrefix() = "_internal_" + getDependencyDefinition().getID(); syn String DependencyDefinition.internalRelationPrefix() = "_internal_" + getID();
syn nta MEndpointDefinition MDependencyDefinition.targetEndpointDefinition() {
return getDependencyDefinition().targetEndpointDefinition().toMustache();
}
// --- MTypeComponent ---
syn String MTypeComponent.name() = getTypeComponent().getName();
// --- MTokenComponent --- // --- MTokenComponent ---
syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName(); syn String TokenComponent.parentTypeName() = containingTypeDecl().getName();
syn String MTokenComponent.name() = getTokenComponent().getName(); syn String TokenComponent.javaType() = effectiveJavaTypeUse().prettyPrint();
syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint(); syn String TokenComponent.internalName() = needProxyToken() ? "_internal_" + getName() : externalName();
syn String MTokenComponent.internalName() = getTokenComponent().needProxyToken() ? "_internal_" + name() : externalName(); syn String TokenComponent.externalName() = getName();
syn String MTokenComponent.externalName() = name();
syn MTokenSendDefinition MTokenComponent.normalTokenSendDef() { syn EndpointDefinition TokenComponent.normalTokenSendDef() {
for (TokenEndpointDefinition endpointDef : getTokenComponent().getTokenEndpointDefinitionList()) { for (EndpointTarget target : getTokenEndpointTargetList()) {
if (endpointDef.shouldSendValue()) { if (target.isTokenEndpointTarget() && target.containingEndpointDefinition().shouldSendValue()) {
return endpointDef.asSendTokenEndpointDefinition().toMustache(); return target.containingEndpointDefinition();
} }
} }
return null; return null;
} }
// --- toMustache --- syn nta MEndpointDefinition EndpointDefinition.toMustache() {
syn lazy MRagConnect RagConnect.toMustache() { final MEndpointDefinition result;
MRagConnect result = new MRagConnect(); if (getEndpointTarget().isTokenEndpointTarget()) {
result.setRagConnect(this); if (getSend()) {
for (EndpointDefinition def : allEndpointDefinitionList()) { result = new MTokenSendDefinition();
if (def.isReceiveTokenEndpointDefinition()) {
result.addTokenReceiveDefinition(def.asReceiveTokenEndpointDefinition().toMustache());
} else if (def.isSendTokenEndpointDefinition()) {
result.addTokenSendDefinition(def.asSendTokenEndpointDefinition().toMustache());
} else if (def.isReceiveTypeEndpointDefinition()) {
result.addTypeReceiveDefinition(def.asReceiveTypeEndpointDefinition().toMustache());
} else if (def.isSendTypeEndpointDefinition()) {
result.addTypeSendDefinition(def.asSendTypeEndpointDefinition().toMustache());
} else { } else {
throw new RuntimeException("Unknown endpoint definition: " + def); result = new MTokenReceiveDefinition();
} }
} else if (getEndpointTarget().isTokenEndpointTarget()) {
if (getSend()) {
result = new MTypeSendDefinition();
} else {
result = new MTypeReceiveDefinition();
} }
for (MappingDefinition def : allMappingDefinitions()) { } else {
result.addMappingDefinition(def.toMustache()); throw new RuntimeException("Unknown endpoint target type for " + this);
} }
for (DependencyDefinition def : allDependencyDefinitionList()) { result.setEndpointDefinition(this);
result.addDependencyDefinition(def.toMustache()); for (MappingDefinition def : effectiveMappings()) {
MInnerMappingDefinition inner = new MInnerMappingDefinition();
inner.setMappingDefinition(def);
result.addInnerMappingDefinition(inner);
}
return result;
} }
syn List<TokenComponent> RagConnect.tokenComponentsThatNeedProxy() {
List<TokenComponent> result = new ArrayList<>();
for (TokenComponent token : getProgram().allTokenComponents()) { for (TokenComponent token : getProgram().allTokenComponents()) {
if (token.needProxyToken()) { if (token.needProxyToken()) {
result.addTokenComponent(token.toMustache()); result.add(token);
}
}
for (Component child : rootNode.getComponentList()) {
if (child.isTypeComponent()) {
result.addRootTypeComponent(child.asTypeComponent().toMustache());
} }
} }
// MHandler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boolean>;
result.addHandler(new MHandler("MqttServerHandler", "new MqttServerHandler(\"RagConnectMQTT\")",
result.mqttHandlerAttribute(), result.mqttHandlerField(), usesMqtt));
result.addHandler(new MHandler("RestServerHandler", "new RestServerHandler(\"RagConnectREST\")",
result.restHandlerAttribute(), result.restHandlerField(), usesRest));
return result; return result;
} }
protected void MEndpointDefinition.addInnerMappings() { syn List<TypeComponent> RagConnect.rootTypeComponents() {
for (MappingDefinition def : endpointDef().effectiveMappings()) { List<TypeComponent> result = new ArrayList<>();
MInnerMappingDefinition inner = new MInnerMappingDefinition(); for (Component child : rootNode.getComponentList()) {
inner.setMMappingDefinition(def.toMustache()); if (child.isTypeComponent()) {
addInnerMappingDefinition(inner); result.add(child.asTypeComponent());
} }
} }
public abstract MEndpointDefinition EndpointDefinition.toMustache();
syn lazy MTokenReceiveDefinition ReceiveTokenEndpointDefinition.toMustache() {
MTokenReceiveDefinition result = new MTokenReceiveDefinition();
result.setReceiveTokenEndpointDefinition(this);
result.addInnerMappings();
return result; return result;
} }
syn lazy MTokenSendDefinition SendTokenEndpointDefinition.toMustache() {
MTokenSendDefinition result = new MTokenSendDefinition();
result.setSendTokenEndpointDefinition(this);
result.addInnerMappings();
return result;
} }
syn lazy MTypeReceiveDefinition ReceiveTypeEndpointDefinition.toMustache() { aspect OldStuff { // copied unchanged, but should work
MTypeReceiveDefinition result = new MTypeReceiveDefinition(); // --- EndpointDefinition ---
result.setReceiveTypeEndpointDefinition(this); syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList";
result.addInnerMappings();
return result;
}
syn lazy MTypeSendDefinition SendTypeEndpointDefinition.toMustache() { // --- MEndpointDefinition ---
MTypeSendDefinition result = new MTypeSendDefinition(); syn String MEndpointDefinition.preemptiveExpectedValue();
result.setSendTypeEndpointDefinition(this); syn String MEndpointDefinition.preemptiveReturn();
result.addInnerMappings(); syn String MEndpointDefinition.firstInputVarName();
return result; syn String MEndpointDefinition.parentTypeName() = getEndpointDefinition().parentTypeName();
} syn String MEndpointDefinition.entityName() = getEndpointDefinition().entityName();
syn String MEndpointDefinition.updateMethod();
syn String MEndpointDefinition.writeMethod();
syn String MEndpointDefinition.getterMethod() = getEndpointDefinition().getterMethod();
syn lazy MMappingDefinition MappingDefinition.toMustache() { // --- MInnerMappingDefinition ---
MMappingDefinition result = new MMappingDefinition(); inh String MInnerMappingDefinition.inputVarName();
result.setMappingDefinition(this); syn String MInnerMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint();
return result; syn String MInnerMappingDefinition.methodName() = getMappingDefinition().methodName();
} syn String MInnerMappingDefinition.outputVarName() = "result" + methodName(); // we do not need "_" in between here, because methodName begins with one
syn lazy MDependencyDefinition DependencyDefinition.toMustache() { // --- MTokenReceiveDefinition ---
MDependencyDefinition result = new MDependencyDefinition(); eq MTokenReceiveDefinition.preemptiveExpectedValue() = getterMethod() + "()";
result.setDependencyDefinition(this); eq MTokenReceiveDefinition.preemptiveReturn() = "return;";
return result; eq MTokenReceiveDefinition.firstInputVarName() = "message";
} eq MTokenReceiveDefinition.updateMethod() = null;
eq MTokenReceiveDefinition.writeMethod() = null;
syn lazy MTypeComponent TypeComponent.toMustache() { // --- MTokenSendDefinition ---
MTypeComponent result = new MTypeComponent(); eq MTokenSendDefinition.preemptiveExpectedValue() = lastValue();
result.setTypeComponent(this); eq MTokenSendDefinition.preemptiveReturn() = "return false;";
return result; eq MTokenSendDefinition.firstInputVarName() = getterMethod() + "()";
} eq MTokenSendDefinition.updateMethod() = "_update_" + tokenName();
eq MTokenSendDefinition.writeMethod() = "_writeLastValue_" + tokenName();
syn lazy MTokenComponent TokenComponent.toMustache() { // MTypeReceiveDefinition
MTokenComponent result = new MTokenComponent(); eq MTypeReceiveDefinition.preemptiveExpectedValue() = getterMethod() + "()";
result.setTokenComponent(this); eq MTypeReceiveDefinition.preemptiveReturn() = "return;";
for (DependencyDefinition def : getDependencySourceDefinitionList()) { eq MTypeReceiveDefinition.firstInputVarName() = "message";
result.addDependencyDefinition(def.toMustache()); eq MTypeReceiveDefinition.updateMethod() = null;
} eq MTypeReceiveDefinition.writeMethod() = null;
return result;
} // MTypeSendDefinition
eq MTypeSendDefinition.preemptiveExpectedValue() = lastValue();
eq MTypeSendDefinition.preemptiveReturn() = "return false;";
eq MTypeSendDefinition.firstInputVarName() = getterMethod() + "()";
eq MTypeSendDefinition.updateMethod() = "_update_" + typeName();
eq MTypeSendDefinition.writeMethod() = "_writeLastValue_" + typeName();
} }
aspect AspectGeneration { aspect AspectGeneration {
...@@ -338,10 +267,16 @@ aspect AspectGeneration { ...@@ -338,10 +267,16 @@ aspect AspectGeneration {
public String RagConnect.generateAspect(String rootNodeName) { public String RagConnect.generateAspect(String rootNodeName) {
rootNode = getProgram().resolveTypeDecl(rootNodeName); rootNode = getProgram().resolveTypeDecl(rootNodeName);
return toMustache().generateAspect(); return generateAspect();
} }
public String MRagConnect.generateAspect() { public String RagConnect.generateAspect() {
// TODO move this to Compiler.java
// Handler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boolean>;
this.addHandler(new Handler("MqttServerHandler", "new MqttServerHandler(\"RagConnectMQTT\")",
mqttHandlerAttribute(), mqttHandlerField(), usesMqtt));
this.addHandler(new Handler("RestServerHandler", "new RestServerHandler(\"RagConnectREST\")",
restHandlerAttribute(), restHandlerField(), usesRest));
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
com.github.mustachejava.reflect.ReflectionObjectHandler roh = new com.github.mustachejava.reflect.ReflectionObjectHandler() { com.github.mustachejava.reflect.ReflectionObjectHandler roh = new com.github.mustachejava.reflect.ReflectionObjectHandler() {
@Override @Override
...@@ -357,6 +292,13 @@ aspect AspectGeneration { ...@@ -357,6 +292,13 @@ 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(); com.github.mustachejava.DefaultMustacheFactory mf = new com.github.mustachejava.DefaultMustacheFactory();
mf.setObjectHandler(roh); mf.setObjectHandler(roh);
...@@ -376,11 +318,10 @@ aspect GrammarGeneration { ...@@ -376,11 +318,10 @@ aspect GrammarGeneration {
} }
syn nta Relation DependencyDefinition.getRelationToCreate() { syn nta Relation DependencyDefinition.getRelationToCreate() {
String internalRelationPrefix = toMustache().internalRelationPrefix();
BidirectionalRelation result = new BidirectionalRelation(); BidirectionalRelation result = new BidirectionalRelation();
NavigableRole left = new ListRole(internalRelationPrefix + "Source"); NavigableRole left = new ListRole(internalRelationPrefix() + "Source");
left.setType(getTarget().containingTypeDecl()); left.setType(getTarget().containingTypeDecl());
NavigableRole right = new ListRole(internalRelationPrefix + "Target"); NavigableRole right = new ListRole(internalRelationPrefix() + "Target");
right.setType(getSource().containingTypeDecl()); right.setType(getSource().containingTypeDecl());
result.setLeft(left); result.setLeft(left);
result.setRight(right); result.setRight(right);
...@@ -399,15 +340,14 @@ aspect GrammarGeneration { ...@@ -399,15 +340,14 @@ aspect GrammarGeneration {
syn java.util.Map<TypeDecl, TokenComponent> RagConnect.additionalTokens() { syn java.util.Map<TypeDecl, TokenComponent> RagConnect.additionalTokens() {
java.util.Map<TypeDecl, TokenComponent> result = new java.util.HashMap<>(); java.util.Map<TypeDecl, TokenComponent> result = new java.util.HashMap<>();
for (EndpointDefinition def : allEndpointDefinitionList()) { for (EndpointDefinition def : allEndpointDefinitionList()) {
if (def.isTypeEndpointDefinition() && def.getTokenToCreate() != null) { if (def.getTokenToCreate() != null) {
result.put(def.asTypeEndpointDefinition().getType().getTypeDecl(), def.getTokenToCreate()); result.put(def.type().getTypeDecl(), def.getTokenToCreate());
} }
} }
return result; return result;
} }
syn TokenComponent EndpointDefinition.getTokenToCreate() = null; syn TokenComponent EndpointDefinition.getTokenToCreate() {
eq TypeEndpointDefinition.getTokenToCreate() {
if (typeIsList() && getIndexBasedListAccess()) { if (typeIsList() && getIndexBasedListAccess()) {
TokenComponent result = new TokenComponent(); TokenComponent result = new TokenComponent();
result.setName(idTokenName()); result.setName(idTokenName());
...@@ -427,7 +367,7 @@ aspect GrammarExtension { ...@@ -427,7 +367,7 @@ aspect GrammarExtension {
} }
b.append("<"); b.append("<");
if (!getName().equals("")) { if (!getName().equals("")) {
b.append(toMustache().internalName()).append(":"); b.append(internalName()).append(":");
} }
effectiveJavaTypeUse().generateAbstractGrammar(b); effectiveJavaTypeUse().generateAbstractGrammar(b);
b.append(">"); b.append(">");
......
...@@ -141,7 +141,7 @@ aspect Mappings { ...@@ -141,7 +141,7 @@ aspect Mappings {
// --- effectiveMappings --- // --- effectiveMappings ---
syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings() { syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings() {
java.util.List<MappingDefinition> result; java.util.List<MappingDefinition> result;
if (isReceiveTokenEndpointDefinition() || isReceiveTypeEndpointDefinition()) { if (!getSend()) {
// if no mappings are specified, or if first mapping is not suitable. // if no mappings are specified, or if first mapping is not suitable.
// then prepend the suitable default mapping // then prepend the suitable default mapping
if (getMappingList().isEmpty() || !getMappingList().get(0).getFromType().isByteArray()) { if (getMappingList().isEmpty() || !getMappingList().get(0).getFromType().isByteArray()) {
...@@ -151,7 +151,7 @@ aspect Mappings { ...@@ -151,7 +151,7 @@ aspect Mappings {
} else { } else {
result = getMappingList(); result = getMappingList();
} }
} else if (isSendTokenEndpointDefinition() || isSendTypeEndpointDefinition()) { } else {
// if no mappings are specified, or if last mapping is not suitable // if no mappings are specified, or if last mapping is not suitable
// then append the suitable default mapping // then append the suitable default mapping
if (getMappingList().isEmpty() || !getMappingList().get(getMappingList().size() - 1).getToType().isByteArray()) { if (getMappingList().isEmpty() || !getMappingList().get(getMappingList().size() - 1).getToType().isByteArray()) {
...@@ -160,8 +160,6 @@ aspect Mappings { ...@@ -160,8 +160,6 @@ aspect Mappings {
} else { } else {
result = getMappingList(); result = getMappingList();
} }
} else {
throw new RuntimeException("Unknown endpoint definition: " + this);
} }
return result; return result;
} }
...@@ -191,6 +189,12 @@ aspect Mappings { ...@@ -191,6 +189,12 @@ aspect Mappings {
// --- suitableReceiveDefaultMapping --- // --- suitableReceiveDefaultMapping ---
syn DefaultMappingDefinition EndpointDefinition.suitableReceiveDefaultMapping() { syn DefaultMappingDefinition EndpointDefinition.suitableReceiveDefaultMapping() {
if (getEndpointTarget().isTypeEndpointTarget()) {
try {
TypeDecl typeDecl = program().resolveTypeDecl(targetTypeName());
return typeIsList() && !getIndexBasedListAccess() ? ragconnect().defaultBytesToListTreeMapping(typeDecl.getName()) : ragconnect().defaultBytesToTreeMapping(typeDecl.getName());
} catch (Exception ignore) {}
}
switch (targetTypeName()) { switch (targetTypeName()) {
case "boolean": case "boolean":
case "Boolean": return ragconnect().defaultBytesToBooleanMapping(); case "Boolean": return ragconnect().defaultBytesToBooleanMapping();
...@@ -217,16 +221,15 @@ aspect Mappings { ...@@ -217,16 +221,15 @@ aspect Mappings {
return null; return null;
} }
} }
eq TypeEndpointDefinition.suitableReceiveDefaultMapping() {
// --- suitableSendDefaultMapping ---
syn DefaultMappingDefinition EndpointDefinition.suitableSendDefaultMapping() {
if (getEndpointTarget().isTypeEndpointTarget()) {
try { try {
TypeDecl typeDecl = program().resolveTypeDecl(targetTypeName()); TypeDecl typeDecl = program().resolveTypeDecl(targetTypeName());
return typeIsList() && !getIndexBasedListAccess() ? ragconnect().defaultBytesToListTreeMapping(typeDecl.getName()) : ragconnect().defaultBytesToTreeMapping(typeDecl.getName()); return typeIsList() && !getIndexBasedListAccess() ? ragconnect().defaultListTreeToBytesMapping() : ragconnect().defaultTreeToBytesMapping(typeDecl.getName());
} catch (Exception ignore) {} } catch (Exception ignore) {}
return super.suitableReceiveDefaultMapping();
} }
// --- suitableSendDefaultMapping ---
syn DefaultMappingDefinition EndpointDefinition.suitableSendDefaultMapping() {
switch (targetTypeName()) { switch (targetTypeName()) {
case "boolean": case "boolean":
case "Boolean": return ragconnect().defaultBooleanToBytesMapping(); case "Boolean": return ragconnect().defaultBooleanToBytesMapping();
...@@ -253,36 +256,22 @@ aspect Mappings { ...@@ -253,36 +256,22 @@ aspect Mappings {
return null; return null;
} }
} }
eq TypeEndpointDefinition.suitableSendDefaultMapping() {
try {
TypeDecl typeDecl = program().resolveTypeDecl(targetTypeName());
return typeIsList() && !getIndexBasedListAccess() ? ragconnect().defaultListTreeToBytesMapping() : ragconnect().defaultTreeToBytesMapping(typeDecl.getName());
} catch (Exception ignore) {}
return super.suitableSendDefaultMapping();
}
// --- targetTypeName --- // --- targetTypeName ---
syn String EndpointDefinition.targetTypeName(); syn String EndpointDefinition.targetTypeName() {
eq ReceiveTokenEndpointDefinition.targetTypeName() { if (getMappingList().isEmpty()) {
return getMappingList().isEmpty() ? return getEndpointTarget().targetTypeName();
getToken().effectiveJavaTypeUse().getName() : } else {
getMappingList().get(0).getFromType().prettyPrint(); if (getSend()) {
} return getMappingList().get(0).getFromType().prettyPrint();
eq ReceiveTypeEndpointDefinition.targetTypeName() { } else {
return getMappingList().isEmpty() ? return getMappingList().get(getMappingList().size() - 1).getToType().prettyPrint();
getType().getTypeDecl().getName() :
getMappingList().get(0).getFromType().prettyPrint();
} }
eq SendTokenEndpointDefinition.targetTypeName() {
return getMappingList().isEmpty() ?
getToken().effectiveJavaTypeUse().getName() :
getMappingList().get(getMappingList().size() - 1).getToType().prettyPrint();
} }
eq SendTypeEndpointDefinition.targetTypeName() {
return getMappingList().isEmpty() ?
getType().getTypeDecl().getName() :
getMappingList().get(getMappingList().size() - 1).getToType().prettyPrint();
} }
syn String EndpointTarget.targetTypeName();
eq TokenEndpointTarget.targetTypeName() = getToken().effectiveJavaTypeUse().getName();
eq TypeEndpointTarget.targetTypeName() = getType().getTypeDecl().getName();
// eq ReceiveFromRestDefinition.suitableDefaultMapping() { // eq ReceiveFromRestDefinition.suitableDefaultMapping() {
// String typeName = getMappingList().isEmpty() ? // String typeName = getMappingList().isEmpty() ?
......
MRagConnect ::= TokenReceiveDefinition:MTokenReceiveDefinition* TokenSendDefinition:MTokenSendDefinition* TypeReceiveDefinition:MTypeReceiveDefinition* TypeSendDefinition:MTypeSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent* Handler:MHandler*; //MRagConnect ::= TokenReceiveDefinition:MTokenReceiveDefinition* TokenSendDefinition:MTokenSendDefinition* TypeReceiveDefinition:MTypeReceiveDefinition* TypeSendDefinition:MTypeSendDefinition* ;
abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*; abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*;
abstract MTokenEndpointDefinition : MEndpointDefinition; abstract MTokenEndpointDefinition : MEndpointDefinition;
...@@ -8,21 +8,17 @@ abstract MTypeEndpointDefinition : MEndpointDefinition; ...@@ -8,21 +8,17 @@ abstract MTypeEndpointDefinition : MEndpointDefinition;
MTypeReceiveDefinition : MTypeEndpointDefinition; MTypeReceiveDefinition : MTypeEndpointDefinition;
MTypeSendDefinition : MTypeEndpointDefinition; MTypeSendDefinition : MTypeEndpointDefinition;
MMappingDefinition; //MMappingDefinition;
MInnerMappingDefinition; MInnerMappingDefinition;
MDependencyDefinition; //MDependencyDefinition;
MTypeComponent; //MTypeComponent;
MTokenComponent; //MTokenComponent;
MHandler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boolean>;
rel MRagConnect.RagConnect -> RagConnect; //rel MRagConnect.RagConnect -> RagConnect;
rel MInnerMappingDefinition.MMappingDefinition -> MMappingDefinition; rel MInnerMappingDefinition.MappingDefinition -> MappingDefinition;
rel MTokenReceiveDefinition.ReceiveTokenEndpointDefinition -> ReceiveTokenEndpointDefinition; rel MEndpointDefinition.EndpointDefinition -> EndpointDefinition;
rel MTokenSendDefinition.SendTokenEndpointDefinition -> SendTokenEndpointDefinition; //rel MMappingDefinition.MappingDefinition -> MappingDefinition;
rel MTypeReceiveDefinition.ReceiveTypeEndpointDefinition -> ReceiveTypeEndpointDefinition; //rel MDependencyDefinition.DependencyDefinition -> DependencyDefinition;
rel MTypeSendDefinition.SendTypeEndpointDefinition -> SendTypeEndpointDefinition; //rel MTypeComponent.TypeComponent -> TypeComponent;
rel MMappingDefinition.MappingDefinition -> MappingDefinition; //rel MTokenComponent.TokenComponent -> TokenComponent;
rel MDependencyDefinition.DependencyDefinition -> DependencyDefinition; //rel MTokenComponent.DependencyDefinition* -> MDependencyDefinition;
rel MTypeComponent.TypeComponent -> TypeComponent;
rel MTokenComponent.TokenComponent -> TokenComponent;
rel MTokenComponent.DependencyDefinition* -> MDependencyDefinition;
aspect MustacheNodesToYAML { // aspect MustacheNodesToYAML {
syn Document MRagConnect.toYAML() { // syn Document MRagConnect.toYAML() {
Document doc = new Document(); // Document doc = new Document();
MappingElement root = new MappingElement(); // MappingElement root = new MappingElement();
root.put("rootNodeName", rootNodeName()); // root.put("rootNodeName", rootNodeName());
root.put("closeMethod", closeMethod()); // root.put("closeMethod", closeMethod());
root.put("usesMqtt", usesMqtt); // root.put("usesMqtt", usesMqtt);
root.put("usesRest", usesRest); // root.put("usesRest", usesRest);
// mqtt // // mqtt
root.put("mqttHandlerField", mqttHandlerField()); // root.put("mqttHandlerField", mqttHandlerField());
root.put("mqttHandlerAttribute", mqttHandlerAttribute()); // root.put("mqttHandlerAttribute", mqttHandlerAttribute());
root.put("mqttSetupWaitUntilReadyMethod", mqttSetupWaitUntilReadyMethod()); // root.put("mqttSetupWaitUntilReadyMethod", mqttSetupWaitUntilReadyMethod());
//
// rootTypeComponents // // rootTypeComponents
ListElement rootTypeComponents = new ListElement(); // ListElement rootTypeComponents = new ListElement();
for (MTypeComponent comp : getRootTypeComponentList()) { // for (MTypeComponent comp : getRootTypeComponentList()) {
MappingElement inner = new MappingElement(); // MappingElement inner = new MappingElement();
inner.put("first", comp.isFirst()); // inner.put("first", comp.isFirst());
inner.put("name", comp.name()); // inner.put("name", comp.name());
rootTypeComponents.addElement(inner); // rootTypeComponents.addElement(inner);
} // }
root.put("RootTypeComponents", rootTypeComponents); // root.put("RootTypeComponents", rootTypeComponents);
//
// rest // // rest
root.put("restHandlerField", restHandlerField()); // root.put("restHandlerField", restHandlerField());
root.put("restHandlerAttribute", restHandlerAttribute()); // root.put("restHandlerAttribute", restHandlerAttribute());
//
// TokenReceiveDefinitions // // TokenReceiveDefinitions
ListElement receiveDefinitions = new ListElement(); // ListElement receiveDefinitions = new ListElement();
for (MTokenReceiveDefinition def : getTokenReceiveDefinitionList()) { // for (MTokenReceiveDefinition def : getTokenReceiveDefinitionList()) {
receiveDefinitions.addElement(def.toYAML()); // receiveDefinitions.addElement(def.toYAML());
} // }
root.put("TokenReceiveDefinitions", receiveDefinitions); // root.put("TokenReceiveDefinitions", receiveDefinitions);
//
// TokenSendDefinitions // // TokenSendDefinitions
ListElement sendDefinitions = new ListElement(); // ListElement sendDefinitions = new ListElement();
for (MTokenSendDefinition def : getTokenSendDefinitionList()) { // for (MTokenSendDefinition def : getTokenSendDefinitionList()) {
sendDefinitions.addElement(def.toYAML()); // sendDefinitions.addElement(def.toYAML());
} // }
root.put("TokenSendDefinitions", sendDefinitions); // root.put("TokenSendDefinitions", sendDefinitions);
//
// TypeReceiveDefinitions // // TypeReceiveDefinitions
ListElement typeReceiveDefinitions = new ListElement(); // ListElement typeReceiveDefinitions = new ListElement();
for (MTypeReceiveDefinition def : getTypeReceiveDefinitionList()) { // for (MTypeReceiveDefinition def : getTypeReceiveDefinitionList()) {
typeReceiveDefinitions.addElement(def.toYAML()); // typeReceiveDefinitions.addElement(def.toYAML());
} // }
root.put("TypeReceiveDefinitions", typeReceiveDefinitions); // root.put("TypeReceiveDefinitions", typeReceiveDefinitions);
//
// TypeSendDefinitions // // TypeSendDefinitions
ListElement typeSendDefinitions = new ListElement(); // ListElement typeSendDefinitions = new ListElement();
for (MTypeSendDefinition def : getTypeSendDefinitionList()) { // for (MTypeSendDefinition def : getTypeSendDefinitionList()) {
typeSendDefinitions.addElement(def.toYAML()); // typeSendDefinitions.addElement(def.toYAML());
} // }
root.put("TypeSendDefinitions", typeSendDefinitions); // root.put("TypeSendDefinitions", typeSendDefinitions);
//
// MappingDefinitions // // MappingDefinitions
ListElement mappingDefinitions = new ListElement(); // ListElement mappingDefinitions = new ListElement();
for (MMappingDefinition def : getMappingDefinitionList()) { // for (MMappingDefinition def : getMappingDefinitionList()) {
mappingDefinitions.addElement(def.toYAML()); // mappingDefinitions.addElement(def.toYAML());
} // }
root.put("MappingDefinitions", mappingDefinitions); // root.put("MappingDefinitions", mappingDefinitions);
//
// DependencyDefinitions // // DependencyDefinitions
ListElement dependencyDefinitions = new ListElement(); // ListElement dependencyDefinitions = new ListElement();
for (MDependencyDefinition def : getDependencyDefinitionList()) { // for (MDependencyDefinition def : getDependencyDefinitionList()) {
dependencyDefinitions.addElement(def.toYAML()); // dependencyDefinitions.addElement(def.toYAML());
} // }
root.put("DependencyDefinitions", dependencyDefinitions); // root.put("DependencyDefinitions", dependencyDefinitions);
//
// TokenComponents // // TokenComponents
ListElement tokenComponents = new ListElement(); // ListElement tokenComponents = new ListElement();
for (MTokenComponent comp : getTokenComponentList()) { // for (MTokenComponent comp : getTokenComponentList()) {
tokenComponents.addElement(comp.toYAML()); // tokenComponents.addElement(comp.toYAML());
} // }
root.put("TokenComponents", tokenComponents); // root.put("TokenComponents", tokenComponents);
//
// Handlers // // Handlers
ListElement handlers = new ListElement(); // ListElement handlers = new ListElement();
for (MHandler handler : getHandlerList()) { // for (MHandler handler : getHandlerList()) {
handlers.add(handler.toYAML() // handlers.add(handler.toYAML()
.put("rootTokenComponents", rootTypeComponents.treeCopy()) ); // .put("rootTokenComponents", rootTypeComponents.treeCopy()) );
} // }
root.put("Handlers", handlers); // root.put("Handlers", handlers);
//
doc.setRootElement(root); // doc.setRootElement(root);
return doc; // return doc;
} // }
//
syn MappingElement MEndpointDefinition.toYAML() { // syn MappingElement MEndpointDefinition.toYAML() {
MappingElement result = new MappingElement(); // MappingElement result = new MappingElement();
result.put("parentTypeName", parentTypeName()); // result.put("parentTypeName", parentTypeName());
result.put("connectMethod", connectMethod()); // result.put("connectMethod", connectMethod());
result.put("connectParameterName", connectParameterName()); // result.put("connectParameterName", connectParameterName());
result.put("lastDefinitionToType", lastDefinitionToType()); // result.put("lastDefinitionToType", lastDefinitionToType());
result.put("preemptiveReturn", preemptiveReturn()); // result.put("preemptiveReturn", preemptiveReturn());
result.put("alwaysApply", alwaysApply()); // result.put("alwaysApply", alwaysApply());
result.put("condition", // result.put("condition",
condition().replace("\"", "\\\"").replace("\n", "\\n")); // condition().replace("\"", "\\\"").replace("\n", "\\n"));
result.put("lastResult", lastResult()); // result.put("lastResult", lastResult());
result.put("tokenName", tokenName()); // result.put("tokenName", tokenName());
result.put("InnerMappingDefinitions", innerMappingDefinitionsAsListElement()); // result.put("InnerMappingDefinitions", innerMappingDefinitionsAsListElement());
return result; // return result;
} // }
//
syn MappingElement MTokenReceiveDefinition.toYAML() { // syn MappingElement MTokenReceiveDefinition.toYAML() {
MappingElement result = super.toYAML(); // MappingElement result = super.toYAML();
result.put("loggingEnabledForReads", loggingEnabledForReads); // result.put("loggingEnabledForReads", loggingEnabledForReads);
return result; // return result;
} // }
//
syn MappingElement MTokenSendDefinition.toYAML() { // syn MappingElement MTokenSendDefinition.toYAML() {
MappingElement result = super.toYAML(); // MappingElement result = super.toYAML();
result.put("sender", sender()); // result.put("sender", sender());
result.put("lastValue", lastValue()); // result.put("lastValue", lastValue());
result.put("loggingEnabledForWrites", loggingEnabledForWrites); // result.put("loggingEnabledForWrites", loggingEnabledForWrites);
result.put("updateMethod", updateMethod()); // result.put("updateMethod", updateMethod());
result.put("writeMethod", writeMethod()); // result.put("writeMethod", writeMethod());
result.put("tokenResetMethod", tokenResetMethod()); // result.put("tokenResetMethod", tokenResetMethod());
return result; // return result;
} // }
//
syn MappingElement MTypeReceiveDefinition.toYAML() { // syn MappingElement MTypeReceiveDefinition.toYAML() {
MappingElement result = super.toYAML(); // MappingElement result = super.toYAML();
result.put("typeIsList", typeIsList()); // result.put("typeIsList", typeIsList());
result.put("loggingEnabledForReads", loggingEnabledForReads); // result.put("loggingEnabledForReads", loggingEnabledForReads);
return result; // return result;
} // }
//
syn MappingElement MTypeSendDefinition.toYAML() { // syn MappingElement MTypeSendDefinition.toYAML() {
MappingElement result = super.toYAML(); // MappingElement result = super.toYAML();
result.put("typeIsList", typeIsList()); // result.put("typeIsList", typeIsList());
result.put("sender", sender()); // result.put("sender", sender());
result.put("lastValue", lastValue()); // result.put("lastValue", lastValue());
result.put("loggingEnabledForWrites", loggingEnabledForWrites); // result.put("loggingEnabledForWrites", loggingEnabledForWrites);
result.put("updateMethod", updateMethod()); // result.put("updateMethod", updateMethod());
result.put("writeMethod", writeMethod()); // result.put("writeMethod", writeMethod());
result.put("tokenResetMethod", tokenResetMethod()); // result.put("tokenResetMethod", tokenResetMethod());
return result; // return result;
} // }
//
syn Element MMappingDefinition.toYAML() { // syn Element MMappingDefinition.toYAML() {
MappingElement result = new MappingElement(); // MappingElement result = new MappingElement();
result.put("toType", toType()); // result.put("toType", toType());
result.put("methodName", methodName()); // result.put("methodName", methodName());
result.put("fromType", fromType()); // result.put("fromType", fromType());
result.put("fromVariableName", fromVariableName()); // result.put("fromVariableName", fromVariableName());
result.put("content", // result.put("content",
content().replace("\"", "\\\"").replace("\n", "\\n")); // content().replace("\"", "\\\"").replace("\n", "\\n"));
return result; // return result;
} // }
//
syn Element MDependencyDefinition.toYAML() { // syn Element MDependencyDefinition.toYAML() {
MappingElement result = new MappingElement(); // MappingElement result = new MappingElement();
result.put("targetParentTypeName", targetParentTypeName()); // result.put("targetParentTypeName", targetParentTypeName());
result.put("dependencyMethod", dependencyMethod()); // result.put("dependencyMethod", dependencyMethod());
result.put("sourceParentTypeName", sourceParentTypeName()); // result.put("sourceParentTypeName", sourceParentTypeName());
result.put("internalRelationPrefix", internalRelationPrefix()); // result.put("internalRelationPrefix", internalRelationPrefix());
return result; // return result;
} // }
//
syn Element MTokenComponent.toYAML() { // syn Element MTokenComponent.toYAML() {
MappingElement result = new MappingElement(); // MappingElement result = new MappingElement();
result.put("parentTypeName", parentTypeName()); // result.put("parentTypeName", parentTypeName());
result.put("name", name()); // result.put("name", name());
result.put("javaType", javaType()); // result.put("javaType", javaType());
result.put("internalName", internalName()); // result.put("internalName", internalName());
ListElement dependencyDefinitions = new ListElement(); // ListElement dependencyDefinitions = new ListElement();
for (MDependencyDefinition def : getDependencyDefinitionList()) { // for (MDependencyDefinition def : getDependencyDefinitionList()) {
MappingElement inner = new MappingElement(); // MappingElement inner = new MappingElement();
inner.put("targetParentTypeName", def.targetParentTypeName()); // inner.put("targetParentTypeName", def.targetParentTypeName());
inner.put("internalRelationPrefix", def.internalRelationPrefix()); // inner.put("internalRelationPrefix", def.internalRelationPrefix());
MappingElement targetEndpointDefinition = new MappingElement(); // MappingElement targetEndpointDefinition = new MappingElement();
targetEndpointDefinition.put("updateMethod", def.targetEndpointDefinition().updateMethod()); // targetEndpointDefinition.put("updateMethod", def.targetEndpointDefinition().updateMethod());
targetEndpointDefinition.put("writeMethod", def.targetEndpointDefinition().writeMethod()); // targetEndpointDefinition.put("writeMethod", def.targetEndpointDefinition().writeMethod());
inner.put("targetEndpointDefinition", targetEndpointDefinition); // inner.put("targetEndpointDefinition", targetEndpointDefinition);
dependencyDefinitions.addElement(inner); // dependencyDefinitions.addElement(inner);
} // }
result.put("DependencyDefinitions", dependencyDefinitions); // result.put("DependencyDefinitions", dependencyDefinitions);
return result; // return result;
} // }
//
ListElement MEndpointDefinition.innerMappingDefinitionsAsListElement() { // ListElement MEndpointDefinition.innerMappingDefinitionsAsListElement() {
ListElement innerMappingDefinitions = new ListElement(); // ListElement innerMappingDefinitions = new ListElement();
for (MInnerMappingDefinition def : getInnerMappingDefinitionList()) { // for (MInnerMappingDefinition def : getInnerMappingDefinitionList()) {
MappingElement inner = new MappingElement(); // MappingElement inner = new MappingElement();
inner.put("toType", def.toType()); // inner.put("toType", def.toType());
inner.put("methodName", def.methodName()); // inner.put("methodName", def.methodName());
inner.put("inputVarName", def.inputVarName()); // inner.put("inputVarName", def.inputVarName());
inner.put("outputVarName", def.outputVarName()); // inner.put("outputVarName", def.outputVarName());
inner.put("last", def.isLast()); // inner.put("last", def.isLast());
innerMappingDefinitions.addElement(inner); // innerMappingDefinitions.addElement(inner);
} // }
return innerMappingDefinitions; // return innerMappingDefinitions;
} // }
//
syn MappingElement MHandler.toYAML() { // syn MappingElement MHandler.toYAML() {
MappingElement result = new MappingElement(); // MappingElement result = new MappingElement();
result.put("ClassName", getClassName()); // result.put("ClassName", getClassName());
result.put("Construction", getConstruction()); // result.put("Construction", getConstruction());
result.put("AttributeName", getAttributeName()); // result.put("AttributeName", getAttributeName());
result.put("FieldName", getFieldName()); // result.put("FieldName", getFieldName());
result.put("InUse", getInUse()); // result.put("InUse", getInUse());
return result; // return result;
} // }
} // }
//
aspect Navigation { // aspect Navigation {
eq Document.getChild().program() = null; // eq Document.getChild().program() = null;
eq Document.getChild().ragconnect() = null; // eq Document.getChild().ragconnect() = null;
eq Document.getChild().containedFile() = null; // eq Document.getChild().containedFile() = null;
eq Document.containedFileName() = getFileName(); // eq Document.containedFileName() = getFileName();
} // }
aspect ParserRewrites { aspect ParserRewrites {
rewrite SendUntypedEndpointDefinition { rewrite UntypedEndpointTarget {
when (tryGloballyResolveTypeComponentByToken(getTokenOrType()) != null) when (tryGloballyResolveTypeComponentByToken(getTokenOrType()) != null)
to SendTypeEndpointDefinition { to TypeEndpointTarget {
SendTypeEndpointDefinition result = new SendTypeEndpointDefinition(); TypeEndpointTarget result = new TypeEndpointTarget();
result.applyFrom(this); result.setType(TypeComponent.createRef(this.getTokenOrType()));
result.setIndexBasedListAccess(this.getIndexed());
return result; return result;
} }
}
rewrite ReceiveUntypedEndpointDefinition {
when (tryGloballyResolveTypeComponentByToken(getTokenOrType()) != null)
to ReceiveTypeEndpointDefinition {
ReceiveTypeEndpointDefinition result = new ReceiveTypeEndpointDefinition();
result.applyFrom(this);
result.setWithAdd(this.getWithAdd());
result.setIndexBasedListAccess(this.getIndexed());
return result;
}
}
rewrite SendUntypedEndpointDefinition {
when (tryGloballyResolveTokenComponentByToken(getTokenOrType()) != null)
to SendTokenEndpointDefinition {
SendTokenEndpointDefinition result = new SendTokenEndpointDefinition();
result.applyFrom(this);
return result;
}
}
rewrite ReceiveUntypedEndpointDefinition {
when (tryGloballyResolveTokenComponentByToken(getTokenOrType()) != null) when (tryGloballyResolveTokenComponentByToken(getTokenOrType()) != null)
to ReceiveTokenEndpointDefinition { to TokenEndpointTarget {
ReceiveTokenEndpointDefinition result = new ReceiveTokenEndpointDefinition(); TokenEndpointTarget result = new TokenEndpointTarget();
result.applyFrom(this); result.setToken(TokenComponent.createRef(this.getTokenOrType()));
return result; return result;
} }
} }
protected void TypeEndpointDefinition.applyFrom(UntypedEndpointDefinition def) { eq UntypedEndpointTarget.senderName() = "<untyped.senderName>";
this.setAlwaysApply(def.getAlwaysApply()); eq UntypedEndpointTarget.getterMethod() = "<untyped.getterMethod>";
this.setType(TypeComponent.createRef(def.getTokenOrType())); eq UntypedEndpointTarget.parentTypeName() = "<untyped.parentTypeName>";
this.moveMappingsFrom(def); eq UntypedEndpointTarget.entityName() = "<untyped.entityName>";
} eq UntypedEndpointTarget.isAlreadyDefined() = false;
eq UntypedEndpointTarget.entityIsNormalAttribute() = false;
protected void TokenEndpointDefinition.applyFrom(UntypedEndpointDefinition def) { eq UntypedEndpointTarget.targetTypeName() = "<untyped.targetTypeName>";
this.setAlwaysApply(def.getAlwaysApply());
this.setToken(TokenComponent.createRef(def.getTokenOrType()));
this.moveMappingsFrom(def);
}
protected void EndpointDefinition.moveMappingsFrom(UntypedEndpointDefinition def) {
// can safely iterate over list as we get an unmodifyable list
for (MappingDefinition mapping : def.getMappingList().toArray(new MappingDefinition[0])) {
def.removeMapping(mapping);
this.addMapping(mapping);
}
}
private void UntypedEndpointDefinition.clearMappings() {
}
eq UntypedEndpointDefinition.targetTypeName() = "<unknown>";
syn MEndpointDefinition UntypedEndpointDefinition.toMustache() {
throw new RuntimeException("UntypedEndpoint can not be transformed using toMustache!");
}
} }
...@@ -31,9 +31,9 @@ ConnectSpecificationFile connect_specification_file ...@@ -31,9 +31,9 @@ ConnectSpecificationFile connect_specification_file
boolean indexBasedListAccess, boolean withAdd) { boolean indexBasedListAccess, boolean withAdd) {
EndpointDefinition result = new EndpointDefinition(); EndpointDefinition result = new EndpointDefinition();
result.setSend(send); result.setSend(send);
result.setIndexedBasedListAccess(indexBasedListAccess); result.setIndexBasedListAccess(indexBasedListAccess);
result.setWithAdd(withAdd); result.setWithAdd(withAdd);
result.setTarget(new UntypedEndpointTarget(type_name + "." + child_name)); result.setEndpointTarget(new UntypedEndpointTarget(type_name + "." + child_name));
return result; return result;
} }
:} ; :} ;
......
...@@ -79,11 +79,12 @@ public class Compiler extends AbstractCompiler { ...@@ -79,11 +79,12 @@ public class Compiler extends AbstractCompiler {
} }
if (optionPrintYaml.value()) { if (optionPrintYaml.value()) {
ASTNode.rootNode = ragConnect.getProgram().resolveTypeDecl(optionRootNode.value()); System.err.println("Currently unsupported option!");
String yamlContent = ragConnect.toMustache().toYAML().prettyPrint(); // ASTNode.rootNode = ragConnect.getProgram().resolveTypeDecl(optionRootNode.value());
System.out.println(yamlContent); // String yamlContent = ragConnect.toMustache().toYAML().prettyPrint();
writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.yml"), yamlContent); // System.out.println(yamlContent);
return 0; // writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.yml"), yamlContent);
return 1;
} }
LOGGER.fine("Writing output files"); LOGGER.fine("Writing output files");
......
...@@ -32,9 +32,9 @@ aspect RagConnect { ...@@ -32,9 +32,9 @@ aspect RagConnect {
{{> dependencyDefinition}} {{> dependencyDefinition}}
{{/DependencyDefinitions}} {{/DependencyDefinitions}}
{{#TokenComponents}} {{#tokenComponentsThatNeedProxy}}
{{> tokenComponent}} {{> tokenComponent}}
{{/TokenComponents}} {{/tokenComponentsThatNeedProxy}}
{{> ListAspect}} {{> ListAspect}}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment