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