diff --git a/AlgebraicDataflowArchitectureModel/models/Citrus.model b/AlgebraicDataflowArchitectureModel/models/Citrus.model index a4cd25b..356405a 100644 --- a/AlgebraicDataflowArchitectureModel/models/Citrus.model +++ b/AlgebraicDataflowArchitectureModel/models/Citrus.model @@ -19,18 +19,24 @@ } channel DeleteBook(aid:Str) { - out accounts.{aid}.books(bookList:List, deleteBook(bid:int)) = if(bid < length(bookList), remove(bookList, bid), bookList) + out accounts.{aid}.books(bookList:List, deleteBook(bid:Int)) = if(bid < length(bookList), remove(bookList, bid), bookList) } channel CreateToDo(aid:Str, bid:Int) { - out accounts.{aid}.books.{bid}.todos(toDoDB:Map, createtodo(year:Str, month:Str, day:Str, title:Str)) = insert(toDoDB, - year, - insert(lookup(toDoDB, year), - month, - insert(lookup(lookup(toDoDB, year), month), - day, - append(lookup(lookup(lookup(toDoDB, year), month), day), - {"title": title, "check": false})))) + out accounts.{aid}.books.{bid}.todos(toDoDB:Map, createtodo(year:Str, month:Str, day:Str, title:Str)) = + if( + contains(toDoDB,year), + if( + contains(lookup(toDoDB,year),month), + if( + contains(lookup(lookup(toDoDB,year),month),day), + insert(toDoDB,year,insert(lookup(toDoDB,year),month,insert(lookup(lookup(toDoDB,year),month),day,append(lookup(lookup(lookup(toDoDB,year),month),day),{"title":title,"check":false})))), + insert(toDoDB,year,insert(lookup(toDoDB,year),month,insert(lookup(lookup(toDoDB,year),month),day,append(nil,{"title":title,"check":false})))) + ), + insert(toDoDB,year,insert(lookup(toDoDB,year),month,insert(nil,day,append(nil,{"title":title,"check":false})))) + ), + insert(toDoDB,year,insert(nil,month,insert(nil,day,append(nil,{"title":title,"check":false})))) + ) } channel ChangeToDoName(aid:Str, bid:Int, year:Str, month:Str, day:Str, tid:Int) { @@ -42,7 +48,7 @@ } channel DeleteToDo(aid:Str, bid:Int) { - out accounts.{aid}.books.{bid}.todos(toDoDB:Map, deleteToDo(year:Str, month:Str, day:Str, tid:int)) = insert(toDoDB, + out accounts.{aid}.books.{bid}.todos(toDoDB:Map, deleteToDo(year:Str, month:Str, day:Str, tid:Int)) = insert(toDoDB, year, insert(lookup(toDoDB, year), month, diff --git a/AlgebraicDataflowArchitectureModel/models/NemophilaAccounts.model b/AlgebraicDataflowArchitectureModel/models/NemophilaAccounts.model index c2cc23a..0158d26 100644 --- a/AlgebraicDataflowArchitectureModel/models/NemophilaAccounts.model +++ b/AlgebraicDataflowArchitectureModel/models/NemophilaAccounts.model @@ -36,7 +36,7 @@ out accounts.{sendId}.requesting(sendRequesting:Map, sync1(recvId:Str, sendRequested:Map, recvRequesting:Map, sendFriends:Map)) = if(contains(sendFriends:Map, recvId) == true, sendRequesting, insert(sendRequesting:Map, recvId:Str, true)) - out accounts.{recvId}.requested(recvRequested:Map, sync1(recvId:Str, sendRequested:Map, recvRequesting:Map, sendFriends:Map)) = if(ontains(sendFriends:Map, recvId) == true, + out accounts.{recvId}.requested(recvRequested:Map, sync1(recvId:Str, sendRequested:Map, recvRequesting:Map, sendFriends:Map)) = if(contains(sendFriends:Map, recvId) == true, recvRequested, insert(recvRequested:Map, sendId:Str, true)) } diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/TypeInference.java b/AlgebraicDataflowArchitectureModel/src/algorithms/TypeInference.java index 1be6a1d..45a82b9 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/TypeInference.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/TypeInference.java @@ -379,7 +379,7 @@ } for (Term t : terms) { Symbol symbol = t.getSymbol(); - if (symbol.equals(DataConstraintModel.cons) || symbol.equals(DataConstraintModel.set)) { + if (symbol.equals(DataConstraintModel.cons) || symbol.equals(DataConstraintModel.set) || symbol.equals(DataConstraintModel.append)) { // If the root symbol of the term is cons or set. List consExps = new ArrayList<>(); consExps.add(t); // list term @@ -390,10 +390,18 @@ consExps.add(e); updateExpressionBelonging(expToConsOrSet, e, consExps); } + } else if (symbol.equals(DataConstraintModel.append)) { + // If the root symbol of the term is append. + Expression e = t.getChildren().get(1); + consExps.add(e); // list element + updateExpressionBelonging(expToConsOrSet, e, consExps); + e = t.getChildren().get(0); + consExps.add(e); // list argument + updateExpressionBelonging(expToConsOrSet, e, consExps); } else { // If the root symbol of the term is set. Expression e = t.getChildren().get(2); - consExps.add(e); // list component + consExps.add(e); // list element updateExpressionBelonging(expToConsOrSet, e, consExps); e = t.getChildren().get(0); consExps.add(e); // list argument @@ -401,7 +409,7 @@ } Type newType = getExpTypeIfUpdatable(t.getType(), consExps.get(2)); if (newType != null) { - // If the type of the 2nd argument of cons (1st argument of set) is more concrete than the type of the term. + // If the type of the 2nd argument of cons (1st argument of set/append) is more concrete than the type of the term. t.setType(newType); Map updateCons = getUpdateSet(updateFromConsOrSet, consExps); updateCons.put(System.identityHashCode(t), t); @@ -410,7 +418,7 @@ if (consExps.get(2) != null && consExps.get(2) instanceof Variable) { arg2Type = ((Variable) consExps.get(2)).getType(); if (compareTypes(arg2Type, t.getType())) { - // If the type of the term is more concrete than the type of the 2nd argument of cons (1st argument of set). + // If the type of the term is more concrete than the type of the 2nd argument of cons (1st argument of set/append). ((Variable) consExps.get(2)).setType(t.getType()); Map updateCons = getUpdateSet(updateFromConsOrSet, consExps); updateCons.put(System.identityHashCode(consExps.get(2)), consExps.get(2)); @@ -418,7 +426,7 @@ } else if (consExps.get(2) != null && consExps.get(2) instanceof Term) { arg2Type = ((Term) consExps.get(2)).getType(); if (compareTypes(arg2Type, t.getType())) { - // If the type of the term is more concrete than the type of the 2nd argument of cons (1st argument of set). + // If the type of the term is more concrete than the type of the 2nd argument of cons (1st argument of set/append). ((Term) consExps.get(2)).setType(t.getType()); Map updateCons = getUpdateSet(updateFromConsOrSet, consExps); updateCons.put(System.identityHashCode(consExps.get(2)), consExps.get(2)); @@ -815,6 +823,33 @@ } else { newCompTypeList.add(null); } + Type newTermType = getExpTypeIfUpdatable(termType, mapExps.get(3)); + if (newTermType != null) { + // If the type of the 1st argument of insert is more concrete than the type of the term. + t.setType(newTermType); + termType = newTermType; + Map updateExps = getUpdateSet(updateFromMap, mapExps); + updateExps.put(System.identityHashCode(t), t); + } else { + Type arg3Type = null; + if (mapExps.get(3) != null && mapExps.get(3) instanceof Variable) { + arg3Type = ((Variable) mapExps.get(3)).getType(); + if (compareTypes(arg3Type, t.getType())) { + // If the type of the term is more concrete than the type of the 1st argument of insert. + ((Variable) mapExps.get(3)).setType(t.getType()); + Map updateExps = getUpdateSet(updateFromMap, mapExps); + updateExps.put(System.identityHashCode(mapExps.get(3)), mapExps.get(3)); + } + } else if (mapExps.get(3) != null && mapExps.get(3) instanceof Term) { + arg3Type = ((Term) mapExps.get(3)).getType(); + if (compareTypes(arg3Type, t.getType())) { + // If the type of the term is more concrete than the type of the 1st argument of insert. + ((Term) mapExps.get(3)).setType(t.getType()); + Map updateExps = getUpdateSet(updateFromMap, mapExps); + updateExps.put(System.identityHashCode(mapExps.get(3)), mapExps.get(3)); + } + } + } if (termType == DataConstraintModel.typeMap || termType == null) { Type newMapType = mapTypes.get(newCompTypeList); if (newMapType == null) { @@ -823,9 +858,16 @@ } // Update the type of the map term and record the updated expression. t.setType(newMapType); - termType = newMapType; Map updateExps = getUpdateSet(updateFromMap, mapExps); updateExps.put(System.identityHashCode(t), t); + if (mapExps.get(3) != null && mapExps.get(3) instanceof Variable) { + ((Variable) mapExps.get(3)).setType(newMapType); + updateExps.put(System.identityHashCode(mapExps.get(3)), mapExps.get(3)); + } else if (mapExps.get(3) != null && mapExps.get(3) instanceof Term) { + ((Term) mapExps.get(3)).setType(newMapType); + updateExps.put(System.identityHashCode(mapExps.get(3)), mapExps.get(3)); + } + termType = newMapType; } map.put(System.identityHashCode(mapExps), termType); } else if (symbol.equals(DataConstraintModel.addMember)) { diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAsAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAsAction.java index 1a38b08..9542cdb 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAsAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAsAction.java @@ -65,9 +65,7 @@ lastDir = fc.getSelectedFile().getParent(); String fileName = fc.getSelectedFile().getAbsolutePath() + extension; - - // checking file duplicates - if(! (fc.getSelectedFile().exists())) editor.setCurFilePath(fileName); + editor.setCurFilePath(fileName); // overwriting file editor.save(); diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java index 66107cf..b0db12f 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java @@ -235,15 +235,11 @@ return; } File file = new File(curFilePath); - if (!file.exists()) { - return; - } // get a file's extension String extension = file.getName().substring(file.getName().lastIndexOf(".")); if (extension.contains(".model")) { saveModel(file); - } - if (extension.contains(".dtram")) { + } else if (extension.contains(".dtram")) { saveDTRAM(file); } } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index 7792b4f..2a7db3b 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -466,7 +466,7 @@ protected static List getGetterMethods(TypeDeclaration component, String resourceName) { List getters = new ArrayList<>(); for (MethodDeclaration m: component.getMethods()) { - if (m.getName().startsWith(getterPrefix + resourceName)) { + if (m.getName().equals(getterPrefix + resourceName)) { getters.add(m); } } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index 14182ed..2586162 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -60,7 +60,7 @@ Map resourceConstructors = new HashMap<>(); List> constructorParams = new ArrayList<>(); List> constructorStatements = new ArrayList<>(); - Map> updateStatements = new HashMap<>(); + Map>> updateStatements = new HashMap<>(); Map> descendantGetters = new HashMap<>(); // For each components (1st pass). @@ -131,14 +131,14 @@ } // Declare cache fields and update methods in this resource. - Map.Entry, Map>> initStatementsAndUpdateUpdates = declareCacheFieldsAndUpdateMethods(resourceNode, component, parentComponent, langSpec); + Map.Entry, Map>>> initStatementsAndUpdateUpdates = declareCacheFieldsAndUpdateMethods(resourceNode, component, parentComponent, langSpec); if (component == null) { // Constructor statements were not added to any component because no component had been generated. for (String statement: initStatementsAndUpdateUpdates.getKey()) { constructorStatements.add(new AbstractMap.SimpleEntry<>(resourceNode.getResourceHierarchy().getParent(), statement)); } } - for (Map.Entry> entry: initStatementsAndUpdateUpdates.getValue().entrySet()) { + for (Map.Entry>> entry: initStatementsAndUpdateUpdates.getValue().entrySet()) { updateStatements.put(entry.getKey(), entry.getValue()); } @@ -156,14 +156,14 @@ } // Declare input methods in this component and the main component. - Map.Entry, Map>> initStatementsAndInputUpdates = declareInputMethodsInThisAndMainComponents(resourceNode, component, parentComponent, mainComponent, model, langSpec); + Map.Entry, Map>>> initStatementsAndInputUpdates = declareInputMethodsInThisAndMainComponents(resourceNode, component, parentComponent, mainComponent, model, langSpec); if (component == null) { // Constructor statements were not added to any component because no component had been generated. for (String statement: initStatementsAndInputUpdates.getKey()) { constructorStatements.add(new AbstractMap.SimpleEntry<>(resourceNode.getResourceHierarchy().getParent(), statement)); } } - for (Map.Entry> entry: initStatementsAndInputUpdates.getValue().entrySet()) { + for (Map.Entry>> entry: initStatementsAndInputUpdates.getValue().entrySet()) { updateStatements.put(entry.getKey(), entry.getValue()); } } @@ -181,14 +181,10 @@ // Add update statements. for (MethodDeclaration method: updateStatements.keySet()) { Expression updateExp = updateStatements.get(method).getKey(); - ResourceHierarchy descendantRes = updateStatements.get(method).getValue(); - Set children; - do { - if (JavaCodeGenerator.generatesComponent(descendantRes)) break; - children = descendantRes.getChildren(); - } while (children != null && children.size() == 1 && (descendantRes = children.iterator().next()) != null); - TypeDeclaration descendanttComponent = resourceComponents.get(descendantRes); - addUpdateStatementWithConstructorInvocationToMethod(method, updateExp, descendantRes, descendanttComponent, langSpec); + ResourceHierarchy resource = updateStatements.get(method).getValue().getKey(); + ResourceHierarchy descendantRes = updateStatements.get(method).getValue().getValue(); + TypeDeclaration descendantComponent = resourceComponents.get(descendantRes); + addUpdateStatementWithConstructorInvocationToMethod(method, updateExp, resource, descendantRes, descendantComponent, langSpec); } } @@ -237,46 +233,60 @@ return params; } - private void addUpdateStatementWithConstructorInvocationToMethod(MethodDeclaration method, Expression exp, ResourceHierarchy childRes, TypeDeclaration childComponent, ILanguageSpecific langSpec) { - Type replacedJsonType = childRes.getResourceStateType(); - String replacingClassName = getComponentName(childRes, langSpec); + private void addUpdateStatementWithConstructorInvocationToMethod(MethodDeclaration method, Expression exp, ResourceHierarchy resource, ResourceHierarchy descendantRes, TypeDeclaration descendantComponent, ILanguageSpecific langSpec) { + Type replacedJsonType = descendantRes.getResourceStateType(); + String replacingClassName = getComponentName(descendantRes, langSpec); + Type descendantType = new Type(replacingClassName, replacingClassName); Map subTerms = ((Term) exp).getSubTerms(Term.class); Iterator> termEntItr = subTerms.entrySet().iterator(); while (termEntItr.hasNext()) { Entry termEnt = termEntItr.next(); Term jsonTerm = termEnt.getValue(); - if (jsonTerm.getType() != null && jsonTerm.getType().equals(replacedJsonType)) { - if (jsonTerm instanceof JsonTerm || jsonTerm.getSymbol().equals(DataConstraintModel.addMember)) { - MethodDeclaration childConstructor = getConstructor(childComponent); - List params = new ArrayList<>(); - for (VariableDeclaration var: childConstructor.getParameters()) { - JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); - jsonMember.addChild(jsonTerm); - jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); - Expression param = jsonMember.reduce(); - if (param != null) { - if (param instanceof Term) { - if (((Term) param).getType() == null) { - ((Term) param).setType(var.getType()); + if (jsonTerm.getType() != null) { + if (jsonTerm.getType().equals(replacedJsonType)) { + if (jsonTerm instanceof JsonTerm || jsonTerm.getSymbol().equals(DataConstraintModel.addMember)) { + MethodDeclaration childConstructor = getConstructor(descendantComponent); + List params = new ArrayList<>(); + for (VariableDeclaration var: childConstructor.getParameters()) { + JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); + jsonMember.addChild(jsonTerm); + jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); + Expression param = jsonMember.reduce(); + if (param != null) { + if (param instanceof Term) { + if (((Term) param).getType() == null) { + ((Term) param).setType(var.getType()); + } + } else if (param instanceof Variable) { + if (((Variable) param).getType() == null) { + ((Variable) param).setType(var.getType()); + } } - } else if (param instanceof Variable) { - if (((Variable) param).getType() == null) { - ((Variable) param).setType(var.getType()); - } + params.add(param.toImplementation(new String[] {""})); + } else { + params.add(var.getName()); } - params.add(param.toImplementation(null)); - } else { - params.add(var.getName()); } + ((Term) exp).replaceSubTerm(termEnt.getKey(), new Constant(langSpec.getConstructorInvocation(replacingClassName, params))); + subTerms = ((Term) exp).getSubTerms(Term.class); + termEntItr = subTerms.entrySet().iterator(); + } else { + jsonTerm.setType(descendantType); } - ((Term) exp).replaceSubTerm(termEnt.getKey(), new Constant(langSpec.getConstructorInvocation(replacingClassName, params))); - subTerms = ((Term) exp).getSubTerms(Term.class); - termEntItr = subTerms.entrySet().iterator(); + } else { + Type oldType = jsonTerm.getType(); + Type newType = new Type(oldType.getTypeName(), + oldType.getImplementationTypeName().replace(replacedJsonType.getInterfaceTypeName(), replacingClassName), + oldType.getInterfaceTypeName().replace(replacedJsonType.getInterfaceTypeName(), replacingClassName)); + for (Type parent: oldType.getParentTypes()) { + newType.addParentType(parent); + } + jsonTerm.setType(newType); } } } // Replace the type of the state field. - Type fieldType = getImplStateType(childRes.getParent(), langSpec); + Type fieldType = getImplStateType(resource, langSpec); if (exp instanceof Term) { ((Term) exp).setType(fieldType); for (Map.Entry varEnt: ((Term) exp).getVariables().entrySet()) { @@ -795,11 +805,11 @@ } } - private Map.Entry, Map>> declareCacheFieldsAndUpdateMethods(ResourceNode resourceNode, TypeDeclaration component, TypeDeclaration parentComponent, ILanguageSpecific langSpec) { + private Map.Entry, Map>>> declareCacheFieldsAndUpdateMethods(ResourceNode resourceNode, TypeDeclaration component, TypeDeclaration parentComponent, ILanguageSpecific langSpec) { // Declare cash fields and update methods in the component. String resComponentName = getComponentName(resourceNode.getResourceHierarchy(), langSpec); List constructorStatements = new ArrayList<>(); - Map> updateStatements = new HashMap<>(); + Map>> updateStatements = new HashMap<>(); for (Edge chToRes: resourceNode.getInEdges()) { for (Edge resToCh: chToRes.getSource().getInEdges()) { DataTransferChannel ch = ((ChannelNode) resToCh.getDestination()).getChannel(); @@ -904,12 +914,17 @@ // Replace Json constructor with a constructor of the child resource. ResourceHierarchy outRes = out.getResource().getResourceHierarchy(); if (outRes.getChildren().size() == 1 && outRes.getChildren().iterator().next().getNumParameters() > 0) { - ResourceHierarchy childRes = outRes.getChildren().iterator().next(); - Type childStateType = childRes.getResourceStateType(); - if (DataConstraintModel.typeJson.isAncestorOf(childStateType)) { - updateStatements.put(update, new AbstractMap.SimpleEntry<>(updateExp, childRes)); - break; - } + ResourceHierarchy descendantRes = outRes; + Set children = descendantRes.getChildren(); + do { + descendantRes = children.iterator().next(); + if (generatesComponent(descendantRes)) { + updateStatements.put(update, new AbstractMap.SimpleEntry<>(updateExp, new AbstractMap.SimpleEntry<>(outRes, descendantRes))); + updateExp = null; + break; + } + children = descendantRes.getChildren(); + } while (children != null && children.size() == 1); } // Add statements to the update method. String[] sideEffects = new String[] {""}; @@ -1250,15 +1265,15 @@ return new AbstractMap.SimpleEntry<>(constructorStatements, updateStatements); } - private Map.Entry, Map>> declareInputMethodsInThisAndMainComponents(ResourceNode resourceNode, TypeDeclaration component, + private Map.Entry, Map>>> declareInputMethodsInThisAndMainComponents(ResourceNode resourceNode, TypeDeclaration component, TypeDeclaration parentComponent, TypeDeclaration mainComponent, DataTransferModel model, ILanguageSpecific langSpec) { // Declare input methods. String resName = resourceNode.getResourceName(); String resComponentName = langSpec.toComponentName(resName); List constructorStatements = new ArrayList<>(); - Map> inputStatements = new HashMap<>(); - for (Channel ch : model.getInputChannels()) { - for (ChannelMember out : ((DataTransferChannel) ch).getOutputChannelMembers()) { + Map>> inputStatements = new HashMap<>(); + for (Channel ch: model.getInputChannels()) { + for (ChannelMember out: ((DataTransferChannel) ch).getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(out.getResource())) { Expression message = out.getStateTransition().getMessageExpression(); MethodDeclaration input = null; @@ -1481,7 +1496,7 @@ } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {null}); + String resourceAccess = resExp.toImplementation(new String[] {""}); // Values of channel parameters. for (Selector selector: ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { @@ -1518,15 +1533,20 @@ // Add a statement to update the state field to the input method. try { Expression updateExp = ((DataTransferChannel) ch).deriveUpdateExpressionOf(out, getRefAccessor()).getKey(); - // Replace Json constructor with a constructor of the child resource. + // Replace Json constructor with a constructor of a descendant resource. ResourceHierarchy outRes = out.getResource().getResourceHierarchy(); if (outRes.getChildren().size() == 1 && outRes.getChildren().iterator().next().getNumParameters() > 0) { - ResourceHierarchy childRes = outRes.getChildren().iterator().next(); - Type childStateType = childRes.getResourceStateType(); - if (DataConstraintModel.typeJson.isAncestorOf(childStateType)) { - inputStatements.put(input, new AbstractMap.SimpleEntry<>(updateExp, childRes)); - updateExp = null; - } + ResourceHierarchy descendantRes = outRes; + Set children = descendantRes.getChildren(); + do { + descendantRes = children.iterator().next(); + if (generatesComponent(descendantRes)) { + inputStatements.put(input, new AbstractMap.SimpleEntry<>(updateExp, new AbstractMap.SimpleEntry<>(outRes, descendantRes))); + updateExp = null; + break; + } + children = descendantRes.getChildren(); + } while (children != null && children.size() == 1); } // Add statements to the input method. if (updateExp != null) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java index 41c68e4..c56d194 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java @@ -216,7 +216,7 @@ } v++; } - String ifStatement = "if (" + conditions.toImplementation(new String[] {})+ ") {\n"; + String ifStatement = "if (" + conditions.toImplementation(new String[] {""})+ ") {\n"; update.addFirstStatement(ifStatement + "\t" + updateStatement.replace("\n", "\n\t") + "\n}"); } } @@ -587,118 +587,120 @@ for (ResourceHierarchy resource: model.getResourceHierarchies()) { String resourceName = JavaCodeGenerator.getComponentName(resource); TypeDeclaration component = componentMap.get(resourceName); - if (component != null) { - // state getter method - Type resourceType = JavaCodeGenerator.getImplStateType(resource); - MethodDeclaration stateGetter = getMethod(component, "getValue"); - if (stateGetter != null && (stateGetter.getBody() == null || stateGetter.getBody().getStatements().size() == 0)) { - if (model.isPrimitiveType(resourceType)) { - // primitive type - stateGetter.addStatement("return value;"); - } else { - if (resource.getChildren() != null && resource.getChildren().size() == 1 && resource.getChildren().iterator().next().getNumParameters() > 0) { - // list or map - String implTypeName = resourceType.getImplementationTypeName(); - // copy the current state to be returned as a 'value' - stateGetter.addStatement("return new " + implTypeName + "(value);"); + if (JavaCodeGenerator.generatesComponent(resource)) { + if (component != null) { + // state getter method + Type resourceType = JavaCodeGenerator.getImplStateType(resource); + MethodDeclaration stateGetter = getMethod(component, "getValue"); + if (stateGetter != null && (stateGetter.getBody() == null || stateGetter.getBody().getStatements().size() == 0)) { + if (model.isPrimitiveType(resourceType)) { + // primitive type + stateGetter.addStatement("return value;"); } else { - if (resource.getChildren() == null || resource.getChildren().size() == 0) { - // a leaf resource + if (resource.getChildren() != null && resource.getChildren().size() == 1 && resource.getChildren().iterator().next().getNumParameters() > 0) { + // list or map String implTypeName = resourceType.getImplementationTypeName(); + // copy the current state to be returned as a 'value' stateGetter.addStatement("return new " + implTypeName + "(value);"); } else { - Term composer = null; - Term composerSub = new Constant(DataConstraintModel.nil); - composerSub.setType(DataConstraintModel.typeMap); - for (ResourceHierarchy child: resource.getChildren()) { - String childTypeName = JavaCodeGenerator.getComponentName(child); - String fieldName = JavaCodeGenerator.toVariableName(childTypeName); - Term childGetter = null; - if ((child.getChildren() == null || child.getChildren().size() == 0) && child.getNumParameters() == 0) { - // the child is not a class - childGetter = new Term(new Symbol("get" + childTypeName, 1, Symbol.Type.METHOD)); - childGetter.addChild(new Constant("this")); - } else { - // the child is a class - childGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); - childGetter.addChild(new Field(fieldName, JavaCodeGenerator.getImplStateType(child))); - } - composer = new Term(DataConstraintModel.insert); - composer.addChild(composerSub); - composer.addChild(new Constant(fieldName, DataConstraintModel.typeString)); // key - composer.addChild(childGetter); // value - composer.setType(DataConstraintModel.typeMap); - composerSub = composer; - } - composer.setType(stateGetter.getReturnType()); - String[] sideEffects = new String[] {null}; - String returnValue = composer.toImplementation(sideEffects); - if (sideEffects[0] != null) { - stateGetter.addStatement(sideEffects[0] + "return " + returnValue+ ";"); + if (resource.getChildren() == null || resource.getChildren().size() == 0) { + // a leaf resource + String implTypeName = resourceType.getImplementationTypeName(); + stateGetter.addStatement("return new " + implTypeName + "(value);"); } else { - stateGetter.addStatement("return " + returnValue+ ";"); + Term composer = null; + Term composerSub = new Constant(DataConstraintModel.nil); + composerSub.setType(DataConstraintModel.typeMap); + for (ResourceHierarchy child: resource.getChildren()) { + String childTypeName = JavaCodeGenerator.getComponentName(child); + String fieldName = JavaCodeGenerator.toVariableName(childTypeName); + Term childGetter = null; + if ((child.getChildren() == null || child.getChildren().size() == 0) && child.getNumParameters() == 0) { + // the child is not a class + childGetter = new Term(new Symbol("get" + childTypeName, 1, Symbol.Type.METHOD)); + childGetter.addChild(new Constant("this")); + } else { + // the child is a class + childGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); + childGetter.addChild(new Field(fieldName, JavaCodeGenerator.getImplStateType(child))); + } + composer = new Term(DataConstraintModel.insert); + composer.addChild(composerSub); + composer.addChild(new Constant(fieldName, DataConstraintModel.typeString)); // key + composer.addChild(childGetter); // value + composer.setType(DataConstraintModel.typeMap); + composerSub = composer; + } + composer.setType(stateGetter.getReturnType()); + String[] sideEffects = new String[] {""}; + String returnValue = composer.toImplementation(sideEffects); + if (sideEffects[0] != null) { + stateGetter.addStatement(sideEffects[0] + "return " + returnValue+ ";"); + } else { + stateGetter.addStatement("return " + returnValue+ ";"); + } } } } } - } - - // descendant getter method - if (resource.getChildren().size() > 0) { - for (ResourceHierarchy child: resource.getChildren()) { - ResourceHierarchy parent = resource; - ResourceHierarchy descendant = child; - Set children; - Expression selector; - int params = 0; - if (DataConstraintModel.typeList.isAncestorOf(parent.getResourceStateType())) { - selector = new Field("value"); - params++; - } else if (DataConstraintModel.typeMap.isAncestorOf(parent.getResourceStateType())) { - selector = new Field("value"); - params++; - } else { - String fieldName = JavaCodeGenerator.getComponentName(descendant); - selector = new Field(JavaCodeGenerator.toVariableName(fieldName)); + + // descendant getter method + if (resource.getChildren().size() > 0) { + for (ResourceHierarchy child: resource.getChildren()) { + ResourceHierarchy parent = resource; + ResourceHierarchy descendant = child; + Set children; + Expression selector; + int params = 0; + if (DataConstraintModel.typeList.isAncestorOf(parent.getResourceStateType())) { + selector = new Field("value"); + params++; + } else if (DataConstraintModel.typeMap.isAncestorOf(parent.getResourceStateType())) { + selector = new Field("value"); + params++; + } else { + String fieldName = JavaCodeGenerator.getComponentName(descendant); + selector = new Field(JavaCodeGenerator.toVariableName(fieldName)); + } + do { + String methodName = JavaCodeGenerator.getComponentName(descendant); + MethodDeclaration descendantGetter = null; + for (MethodDeclaration getter: getGetterMethods(component, methodName)) { + if ((getter.getParameters() == null && params == 0) || (getter.getParameters() != null && getter.getParameters().size() == params)) { + descendantGetter = getter; + } + } + if (descendantGetter != null) { + if (DataConstraintModel.typeList.isAncestorOf(parent.getResourceStateType())) { + Term newSelector = new Term(DataConstraintModel.get); + newSelector.addChild(selector); + newSelector.addChild(new Variable(descendantGetter.getParameters().get(descendantGetter.getParameters().size() - 1).getName())); + newSelector.setType(descendantGetter.getReturnType()); + selector = newSelector; + params++; + } else if (DataConstraintModel.typeMap.isAncestorOf(parent.getResourceStateType())) { + Term newSelector = new Term(DataConstraintModel.lookup); + newSelector.addChild(selector); + newSelector.addChild(new Variable(descendantGetter.getParameters().get(descendantGetter.getParameters().size() - 1).getName())); + newSelector.setType(descendantGetter.getReturnType()); + selector = newSelector; + params++; + } + if (descendantGetter != null && (descendantGetter.getBody() == null || descendantGetter.getBody().getStatements().size() == 0)) { + String[] sideEffects = new String[] {null}; + String returnValue = selector.toImplementation(sideEffects); + if (sideEffects[0] != null) descendantGetter.addStatement(sideEffects[0]); + descendantGetter.addStatement("return " + returnValue + ";"); + } + } + if (JavaCodeGenerator.generatesComponent(descendant)) { + // If the descendant generates a component. + break; + } + parent = descendant; + children = descendant.getChildren(); + } while (children != null && children.size() == 1 && (descendant = children.iterator().next()) != null); } - do { - String methodName = JavaCodeGenerator.getComponentName(descendant); - MethodDeclaration descendantGetter = null; - for (MethodDeclaration getter: getGetterMethods(component, methodName)) { - if ((getter.getParameters() == null && params == 0) || (getter.getParameters() != null && getter.getParameters().size() == params)) { - descendantGetter = getter; - } - } - if (descendantGetter != null) { - if (DataConstraintModel.typeList.isAncestorOf(parent.getResourceStateType())) { - Term newSelector = new Term(DataConstraintModel.get); - newSelector.addChild(selector); - newSelector.addChild(new Variable(descendantGetter.getParameters().get(descendantGetter.getParameters().size() - 1).getName())); - newSelector.setType(descendantGetter.getReturnType()); - selector = newSelector; - params++; - } else if (DataConstraintModel.typeMap.isAncestorOf(parent.getResourceStateType())) { - Term newSelector = new Term(DataConstraintModel.lookup); - newSelector.addChild(selector); - newSelector.addChild(new Variable(descendantGetter.getParameters().get(descendantGetter.getParameters().size() - 1).getName())); - newSelector.setType(descendantGetter.getReturnType()); - selector = newSelector; - params++; - } - if (descendantGetter != null && (descendantGetter.getBody() == null || descendantGetter.getBody().getStatements().size() == 0)) { - String[] sideEffects = new String[] {null}; - String returnValue = selector.toImplementation(sideEffects); - if (sideEffects[0] != null) descendantGetter.addStatement(sideEffects[0]); - descendantGetter.addStatement("return " + returnValue + ";"); - } - } - if (JavaCodeGenerator.generatesComponent(descendant)) { - // If the descendant generates a component. - break; - } - parent = descendant; - children = descendant.getChildren(); - } while (children != null && children.size() == 1 && (descendant = children.iterator().next()) != null); } } } @@ -887,42 +889,56 @@ return codes; } - private static void replaceJsonTermWithConstructorInvocation(Expression exp, Type replacedJsonType, String replacingClassName, TypeDeclaration childComponent) { + private static void replaceJsonTermWithConstructorInvocation(Expression exp, Type replacedJsonType, String replacingClassName, TypeDeclaration descendantComponent) { + Type descendantType = new Type(replacingClassName, replacingClassName); Map subTerms = ((Term) exp).getSubTerms(Term.class); Iterator> termEntItr = subTerms.entrySet().iterator(); while (termEntItr.hasNext()) { Entry termEnt = termEntItr.next(); Term jsonTerm = termEnt.getValue(); - if (jsonTerm.getType() != null && jsonTerm.getType().equals(replacedJsonType)) { - if (jsonTerm instanceof JsonTerm || jsonTerm.getSymbol().equals(DataConstraintModel.addMember)) { - String constructorInvocation = "new " + replacingClassName + "("; - MethodDeclaration childConstructor = getConstructor(childComponent); - String delimiter = ""; - for (VariableDeclaration var: childConstructor.getParameters()) { - JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); - jsonMember.addChild(jsonTerm); - jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); - Expression param = jsonMember.reduce(); - if (param != null) { - if (param instanceof Term) { - if (((Term) param).getType() == null) { - ((Term) param).setType(var.getType()); + if (jsonTerm.getType() != null) { + if (jsonTerm.getType().equals(replacedJsonType)) { + if (jsonTerm instanceof JsonTerm || jsonTerm.getSymbol().equals(DataConstraintModel.addMember)) { + String constructorInvocation = "new " + replacingClassName + "("; + MethodDeclaration descendantConstructor = getConstructor(descendantComponent); + String delimiter = ""; + for (VariableDeclaration var: descendantConstructor.getParameters()) { + JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); + jsonMember.addChild(jsonTerm); + jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); + Expression param = jsonMember.reduce(); + if (param != null) { + if (param instanceof Term) { + if (((Term) param).getType() == null) { + ((Term) param).setType(var.getType()); + } + } else if (param instanceof Variable) { + if (((Variable) param).getType() == null) { + ((Variable) param).setType(var.getType()); + } } - } else if (param instanceof Variable) { - if (((Variable) param).getType() == null) { - ((Variable) param).setType(var.getType()); - } + constructorInvocation = constructorInvocation + delimiter + param.toImplementation(null); + } else { + constructorInvocation = constructorInvocation + delimiter + var.getName(); } - constructorInvocation = constructorInvocation + delimiter + param.toImplementation(null); - } else { - constructorInvocation = constructorInvocation + delimiter + var.getName(); + delimiter = ", "; } - delimiter = ", "; + constructorInvocation += ")"; + ((Term) exp).replaceSubTerm(termEnt.getKey(), new Constant(constructorInvocation, descendantType)); + subTerms = ((Term) exp).getSubTerms(Term.class); + termEntItr = subTerms.entrySet().iterator(); + } else { + jsonTerm.setType(descendantType); } - constructorInvocation += ")"; - ((Term) exp).replaceSubTerm(termEnt.getKey(), new Constant(constructorInvocation)); - subTerms = ((Term) exp).getSubTerms(Term.class); - termEntItr = subTerms.entrySet().iterator(); + } else { + Type oldType = jsonTerm.getType(); + Type newType = new Type(oldType.getTypeName(), + oldType.getImplementationTypeName().replace(replacedJsonType.getInterfaceTypeName(), replacingClassName), + oldType.getInterfaceTypeName().replace(replacedJsonType.getInterfaceTypeName(), replacingClassName)); + for (Type parent: oldType.getParentTypes()) { + newType.addParentType(parent); + } + jsonTerm.setType(newType); } } } @@ -972,7 +988,7 @@ private static List getGetterMethods(TypeDeclaration component, String resourceName) { List getters = new ArrayList<>(); for (MethodDeclaration m: component.getMethods()) { - if (m.getName().startsWith("get" + resourceName)) { + if (m.getName().equals("get" + resourceName)) { getters.add(m); } } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java index 3070f23..72d79a9 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java @@ -47,7 +47,7 @@ @Override public MethodDeclaration newMethodDeclaration(String methodName, boolean isConstructor, Type returnType, List parameters) { - if (returnType == null) { + if (returnType == null && !isConstructor) { returnType = typeVoid; } return new MethodDeclaration(methodName, isConstructor, returnType, parameters); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java index ffcc360..65d2dd7 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java @@ -237,7 +237,7 @@ } v++; } - String ifStatement = "if (" + conditions.toImplementation(new String[] {})+ ") {\n"; + String ifStatement = "if (" + conditions.toImplementation(new String[] {""})+ ") {\n"; update.addFirstStatement(ifStatement + "\t" + updateStatement.replace("\n", "\n\t") + "\n}"); } } @@ -281,7 +281,7 @@ } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {null}); + String resourceAccess = resExp.toImplementation(new String[] {""}); int v = 0; for (VariableDeclaration var: update2.getParameters()) { if (v < out.getResource().getPathParams().size()) { @@ -711,120 +711,122 @@ for (ResourceHierarchy resource: model.getResourceHierarchies()) { String resourceName = JerseyCodeGenerator.getComponentName(resource); TypeDeclaration component = componentMap.get(resourceName); - if (component != null) { - // state getter method - Type resourceType = JerseyCodeGenerator.getImplStateType(resource); - MethodDeclaration stateGetter = getMethod(component, "getValue"); - if (stateGetter.getBody() == null || stateGetter.getBody().getStatements().size() == 0) { - if (model.isPrimitiveType(resourceType)) { - // primitive type - stateGetter.addStatement("return value;"); - } else { - if (resource.getChildren() != null && resource.getChildren().size() == 1 && resource.getChildren().iterator().next().getNumParameters() > 0) { - // list or map - String implTypeName = resourceType.getImplementationTypeName(); - // copy the current state to be returned as a 'value' - stateGetter.addStatement("return new " + implTypeName + "(value);"); + if (JavaCodeGenerator.generatesComponent(resource)) { + if (component != null) { + // state getter method + Type resourceType = JerseyCodeGenerator.getImplStateType(resource); + MethodDeclaration stateGetter = getMethod(component, "getValue"); + if (stateGetter.getBody() == null || stateGetter.getBody().getStatements().size() == 0) { + if (model.isPrimitiveType(resourceType)) { + // primitive type + stateGetter.addStatement("return value;"); } else { - if (resource.getChildren() == null || resource.getChildren().size() == 0) { - // a leaf resource + if (resource.getChildren() != null && resource.getChildren().size() == 1 && resource.getChildren().iterator().next().getNumParameters() > 0) { + // list or map String implTypeName = resourceType.getImplementationTypeName(); + // copy the current state to be returned as a 'value' stateGetter.addStatement("return new " + implTypeName + "(value);"); } else { - Term composer = null; - Term composerSub = new Constant(DataConstraintModel.nil); - composerSub.setType(DataConstraintModel.typeMap); - for (ResourceHierarchy child: resource.getChildren()) { - String childTypeName = JerseyCodeGenerator.getComponentName(child); - String fieldName = JerseyCodeGenerator.toVariableName(childTypeName); - Term childGetter = null; - if ((child.getChildren() == null || child.getChildren().size() == 0) && child.getNumParameters() == 0) { - // the child is not a class - childGetter = new Term(new Symbol("get" + childTypeName, 1, Symbol.Type.METHOD)); - childGetter.addChild(new Constant("this")); - } else { - // the child is a class - childGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); - childGetter.addChild(new Field(fieldName, JerseyCodeGenerator.getImplStateType(child))); - } - composer = new Term(DataConstraintModel.insert); - composer.addChild(composerSub); - composer.addChild(new Constant(fieldName, DataConstraintModel.typeString)); // key - composer.addChild(childGetter); // value - composer.setType(DataConstraintModel.typeMap); - composerSub = composer; - } - composer.setType(stateGetter.getReturnType()); - String[] sideEffects = new String[] {null}; - String returnValue = composer.toImplementation(sideEffects); - if (sideEffects[0] != null) { - stateGetter.addStatement(sideEffects[0] + "return " + returnValue+ ";"); + if (resource.getChildren() == null || resource.getChildren().size() == 0) { + // a leaf resource + String implTypeName = resourceType.getImplementationTypeName(); + stateGetter.addStatement("return new " + implTypeName + "(value);"); } else { - stateGetter.addStatement("return " + returnValue+ ";"); - } - } - } - } - } - - // descendant getter method - if (resource.getChildren().size() > 0) { - for (ResourceHierarchy child: resource.getChildren()) { - ResourceHierarchy parent = resource; - ResourceHierarchy descendant = child; - Set children; - Expression selector; - int params = 0; - if (DataConstraintModel.typeList.isAncestorOf(parent.getResourceStateType())) { - selector = new Field("value"); - params++; - } else if (DataConstraintModel.typeMap.isAncestorOf(parent.getResourceStateType())) { - selector = new Field("value"); - params++; - } else { - String fieldName = JerseyCodeGenerator.getComponentName(descendant); - selector = new Field(JerseyCodeGenerator.toVariableName(fieldName)); - } - do { - String methodName = JerseyCodeGenerator.getComponentName(descendant); - MethodDeclaration descendantGetter = null; - for (MethodDeclaration getter: getGetterMethods(component, methodName)) { - if ((getter.getParameters() == null && params == 0) || (getter.getParameters() != null && getter.getParameters().size() == params)) { - descendantGetter = getter; - } - } - if (descendantGetter != null) { - if (DataConstraintModel.typeList.isAncestorOf(parent.getResourceStateType())) { - Term newSelector = new Term(DataConstraintModel.get); - newSelector.addChild(selector); - newSelector.addChild(new Variable(descendantGetter.getParameters().get(descendantGetter.getParameters().size() - 1).getName())); - newSelector.setType(descendantGetter.getReturnType()); - selector = newSelector; - params++; - } else if (DataConstraintModel.typeMap.isAncestorOf(parent.getResourceStateType())) { - Term newSelector = new Term(DataConstraintModel.lookup); - newSelector.addChild(selector); - newSelector.addChild(new Variable(descendantGetter.getParameters().get(descendantGetter.getParameters().size() - 1).getName())); - newSelector.setType(descendantGetter.getReturnType()); - selector = newSelector; - params++; - } - if (descendantGetter != null && (descendantGetter.getBody() == null || descendantGetter.getBody().getStatements().size() == 0)) { + Term composer = null; + Term composerSub = new Constant(DataConstraintModel.nil); + composerSub.setType(DataConstraintModel.typeMap); + for (ResourceHierarchy child: resource.getChildren()) { + String childTypeName = JerseyCodeGenerator.getComponentName(child); + String fieldName = JerseyCodeGenerator.toVariableName(childTypeName); + Term childGetter = null; + if ((child.getChildren() == null || child.getChildren().size() == 0) && child.getNumParameters() == 0) { + // the child is not a class + childGetter = new Term(new Symbol("get" + childTypeName, 1, Symbol.Type.METHOD)); + childGetter.addChild(new Constant("this")); + } else { + // the child is a class + childGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); + childGetter.addChild(new Field(fieldName, JerseyCodeGenerator.getImplStateType(child))); + } + composer = new Term(DataConstraintModel.insert); + composer.addChild(composerSub); + composer.addChild(new Constant(fieldName, DataConstraintModel.typeString)); // key + composer.addChild(childGetter); // value + composer.setType(DataConstraintModel.typeMap); + composerSub = composer; + } + composer.setType(stateGetter.getReturnType()); String[] sideEffects = new String[] {null}; - String returnValue = selector.toImplementation(sideEffects); - if (sideEffects[0] != null) descendantGetter.addStatement(sideEffects[0]); - descendantGetter.addStatement("return " + returnValue + ";"); + String returnValue = composer.toImplementation(sideEffects); + if (sideEffects[0] != null) { + stateGetter.addStatement(sideEffects[0] + "return " + returnValue+ ";"); + } else { + stateGetter.addStatement("return " + returnValue+ ";"); + } } } - if (JerseyCodeGenerator.generatesComponent(descendant)) { - // If the descendant generates a component. - break; - } - parent = descendant; - children = descendant.getChildren(); - } while (children != null && children.size() == 1 && (descendant = children.iterator().next()) != null); + } } - } + + // descendant getter method + if (resource.getChildren().size() > 0) { + for (ResourceHierarchy child: resource.getChildren()) { + ResourceHierarchy parent = resource; + ResourceHierarchy descendant = child; + Set children; + Expression selector; + int params = 0; + if (DataConstraintModel.typeList.isAncestorOf(parent.getResourceStateType())) { + selector = new Field("value"); + params++; + } else if (DataConstraintModel.typeMap.isAncestorOf(parent.getResourceStateType())) { + selector = new Field("value"); + params++; + } else { + String fieldName = JerseyCodeGenerator.getComponentName(descendant); + selector = new Field(JerseyCodeGenerator.toVariableName(fieldName)); + } + do { + String methodName = JerseyCodeGenerator.getComponentName(descendant); + MethodDeclaration descendantGetter = null; + for (MethodDeclaration getter: getGetterMethods(component, methodName)) { + if ((getter.getParameters() == null && params == 0) || (getter.getParameters() != null && getter.getParameters().size() == params)) { + descendantGetter = getter; + } + } + if (descendantGetter != null) { + if (DataConstraintModel.typeList.isAncestorOf(parent.getResourceStateType())) { + Term newSelector = new Term(DataConstraintModel.get); + newSelector.addChild(selector); + newSelector.addChild(new Variable(descendantGetter.getParameters().get(descendantGetter.getParameters().size() - 1).getName())); + newSelector.setType(descendantGetter.getReturnType()); + selector = newSelector; + params++; + } else if (DataConstraintModel.typeMap.isAncestorOf(parent.getResourceStateType())) { + Term newSelector = new Term(DataConstraintModel.lookup); + newSelector.addChild(selector); + newSelector.addChild(new Variable(descendantGetter.getParameters().get(descendantGetter.getParameters().size() - 1).getName())); + newSelector.setType(descendantGetter.getReturnType()); + selector = newSelector; + params++; + } + if (descendantGetter != null && (descendantGetter.getBody() == null || descendantGetter.getBody().getStatements().size() == 0)) { + String[] sideEffects = new String[] {null}; + String returnValue = selector.toImplementation(sideEffects); + if (sideEffects[0] != null) descendantGetter.addStatement(sideEffects[0]); + descendantGetter.addStatement("return " + returnValue + ";"); + } + } + if (JerseyCodeGenerator.generatesComponent(descendant)) { + // If the descendant generates a component. + break; + } + parent = descendant; + children = descendant.getChildren(); + } while (children != null && children.size() == 1 && (descendant = children.iterator().next()) != null); + } + } + } } // methods for input events @@ -975,7 +977,7 @@ } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {null}); + String resourceAccess = resExp.toImplementation(new String[] {""}); // Values of channel parameters. for (Selector selector: ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { @@ -1008,42 +1010,56 @@ return codes; } - private static void replaceJsonTermWithConstructorInvocation(Expression exp, Type replacedJsonType, String replacingClassName, TypeDeclaration childComponent) { + private static void replaceJsonTermWithConstructorInvocation(Expression exp, Type replacedJsonType, String replacingClassName, TypeDeclaration descendantComponent) { + Type descendantType = new Type(replacingClassName, replacingClassName); Map subTerms = ((Term) exp).getSubTerms(Term.class); Iterator> termEntItr = subTerms.entrySet().iterator(); while (termEntItr.hasNext()) { Entry termEnt = termEntItr.next(); Term jsonTerm = termEnt.getValue(); - if (jsonTerm.getType() != null && jsonTerm.getType().equals(replacedJsonType)) { - if (jsonTerm instanceof JsonTerm || jsonTerm.getSymbol().equals(DataConstraintModel.addMember)) { - String constructorInvocation = "new " + replacingClassName + "("; - MethodDeclaration childConstructor = getConstructor(childComponent); - String delimiter = ""; - for (VariableDeclaration var: childConstructor.getParameters()) { - JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); - jsonMember.addChild(jsonTerm); - jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); - Expression param = jsonMember.reduce(); - if (param != null) { - if (param instanceof Term) { - if (((Term) param).getType() == null) { - ((Term) param).setType(var.getType()); + if (jsonTerm.getType() != null) { + if (jsonTerm.getType().equals(replacedJsonType)) { + if (jsonTerm instanceof JsonTerm || jsonTerm.getSymbol().equals(DataConstraintModel.addMember)) { + String constructorInvocation = "new " + replacingClassName + "("; + MethodDeclaration descendantConstructor = getConstructor(descendantComponent); + String delimiter = ""; + for (VariableDeclaration var: descendantConstructor.getParameters()) { + JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); + jsonMember.addChild(jsonTerm); + jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); + Expression param = jsonMember.reduce(); + if (param != null) { + if (param instanceof Term) { + if (((Term) param).getType() == null) { + ((Term) param).setType(var.getType()); + } + } else if (param instanceof Variable) { + if (((Variable) param).getType() == null) { + ((Variable) param).setType(var.getType()); + } } - } else if (param instanceof Variable) { - if (((Variable) param).getType() == null) { - ((Variable) param).setType(var.getType()); - } + constructorInvocation = constructorInvocation + delimiter + param.toImplementation(null); + } else { + constructorInvocation = constructorInvocation + delimiter + var.getName(); } - constructorInvocation = constructorInvocation + delimiter + param.toImplementation(null); - } else { - constructorInvocation = constructorInvocation + delimiter + var.getName(); + delimiter = ", "; } - delimiter = ", "; + constructorInvocation += ")"; + ((Term) exp).replaceSubTerm(termEnt.getKey(), new Constant(constructorInvocation)); + subTerms = ((Term) exp).getSubTerms(Term.class); + termEntItr = subTerms.entrySet().iterator(); + } else { + jsonTerm.setType(descendantType); } - constructorInvocation += ")"; - ((Term) exp).replaceSubTerm(termEnt.getKey(), new Constant(constructorInvocation)); - subTerms = ((Term) exp).getSubTerms(Term.class); - termEntItr = subTerms.entrySet().iterator(); + } else { + Type oldType = jsonTerm.getType(); + Type newType = new Type(oldType.getTypeName(), + oldType.getImplementationTypeName().replace(replacedJsonType.getInterfaceTypeName(), replacingClassName), + oldType.getInterfaceTypeName().replace(replacedJsonType.getInterfaceTypeName(), replacingClassName)); + for (Type parent: oldType.getParentTypes()) { + newType.addParentType(parent); + } + jsonTerm.setType(newType); } } } @@ -1275,7 +1291,7 @@ private static List getGetterMethods(TypeDeclaration component, String resourceName) { List getters = new ArrayList<>(); for (MethodDeclaration m: component.getMethods()) { - if (m.getName().startsWith("get" + resourceName)) { + if (m.getName().equals("get" + resourceName)) { getters.add(m); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java index f51b3c4..6702d3f 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java @@ -14,7 +14,8 @@ } public Field(String name, Type type) { - super(name, type); + super(name); + symbol.setSignature(new Type[] {type}); } public Field(Symbol symbol) { @@ -22,7 +23,7 @@ } public Type getType() { - if (symbol.getSignature().length >= 1) { + if (symbol.getSignature() != null && symbol.getSignature().length >= 1) { return symbol.getSignature()[0]; } return null; diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Parameter.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Parameter.java index 739ab80..ab84998 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Parameter.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Parameter.java @@ -12,7 +12,8 @@ } public Parameter(String name, Type type) { - super(name, type); + super(name); + symbol.setSignature(new Type[] {type}); } public Parameter(Symbol symbol) { @@ -20,7 +21,7 @@ } public Type getType() { - if (symbol.getSignature().length >= 1) { + if (symbol.getSignature() != null && symbol.getSignature().length >= 1) { return symbol.getSignature()[0]; } return null; diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java index 95c2b47..ac41269 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java @@ -295,22 +295,23 @@ String component0 = components[0].replace("(", "").replace(")", ""); String[] params = component0.split(","); String exp = components[1]; + String receiver = ""; if (implParamOrder == null) { - for (int i = 0; i < params.length; i++) { + receiver = children.get(0).toImplementation(sideEffects); + exp = exp.replace(params[0], receiver); + for (int i = 1; i < params.length; i++) { exp = exp.replace(params[i], children.get(i).toImplementation(sideEffects)); } } else { - for (int i = 0; i < params.length; i++) { + receiver = children.get(implParamOrder[0]).toImplementation(sideEffects); + exp = exp.replace(params[0], receiver); + for (int i = 1; i < params.length; i++) { exp = exp.replace(params[i], children.get(implParamOrder[i]).toImplementation(sideEffects)); } } if (symbol.isImplWithSideEffect()) { sideEffects[0] = sideEffects[0] + exp + ";\n"; - if (implParamOrder == null) { - exp = children.get(0).toImplementation(new String[] {""}); - } else { - exp = children.get(implParamOrder[0]).toImplementation(new String[] {""}); - } + exp = receiver; } return exp; } @@ -333,7 +334,7 @@ String exp = symbol.generate(getType(), childrenTypes, childrenImpl, childrenSideEffects, sideEffects); if (symbol.isImplWithSideEffect()) { sideEffects[0] = sideEffects[0] + exp; - exp = children.get(0).toImplementation(new String[] {""}); // the value of this term + exp = childrenImpl[0]; // the value of this term } return exp; } else { @@ -351,7 +352,7 @@ String exp = symbol.generate(getType(), childrenTypes, childrenImpl, childrenSideEffects, sideEffects); if (symbol.isImplWithSideEffect()) { sideEffects[0] = sideEffects[0] + exp; - exp = children.get(implParamOrder[0]).toImplementation(new String[] {""}); // the value of this term + exp = childrenImpl[0]; // the value of this term } return exp; } @@ -360,14 +361,16 @@ if (implParamOrder == null) { return "(" + children.get(0).toImplementation(sideEffects) + symbol.toImplementation() + children.get(1).toImplementation(sideEffects) + ")"; } else { - return "(" + children.get(implParamOrder[0]).toImplementation(sideEffects) + symbol.toImplementation() + children.get(implParamOrder[1]).toImplementation(sideEffects) + ")"; + return "(" + children.get(implParamOrder[0]).toImplementation(sideEffects) + symbol.toImplementation() + children.get(implParamOrder[1]).toImplementation(sideEffects) + ")"; } } if ((getArity() >= 1 || getArity() == -1) && symbol.isImplMethod()) { if (implParamOrder == null) { String exp = null; + String receiver = ""; if (children.get(0) != null) { - exp = children.get(0).toImplementation(sideEffects) + "." + symbol.toImplementation() + "("; + receiver = children.get(0).toImplementation(sideEffects); + exp = receiver + "." + symbol.toImplementation() + "("; } else { exp = symbol.toImplementation() + "("; } @@ -380,15 +383,12 @@ exp += ")"; if (symbol.isImplWithSideEffect()) { sideEffects[0] = sideEffects[0] + exp + ";\n"; - if (children.get(0) != null) { - exp = children.get(0).toImplementation(new String[] {""}); - } else { - exp = ""; - } + exp = receiver; } return exp; } else { - String exp = children.get(implParamOrder[0]).toImplementation(sideEffects) + "." + symbol.toImplementation() + "("; + String receiver = children.get(implParamOrder[0]).toImplementation(sideEffects); + String exp = receiver + "." + symbol.toImplementation() + "("; String delimiter = ""; for (int i = 1; i < children.size(); i++) { Expression e = children.get(implParamOrder[i]); @@ -398,7 +398,7 @@ exp += ")"; if (symbol.isImplWithSideEffect()) { sideEffects[0] = sideEffects[0] + exp + ";\n"; - exp = children.get(implParamOrder[0]).toImplementation(new String[] {""}); + exp = receiver; } return exp; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java index 3bdb1dd..3a3de81 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java @@ -67,16 +67,22 @@ Constant arg1 = (Constant) args.get(1); String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); - if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { + if (arg0.getType() != null && arg1.getType() != null) { + if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { + return new Constant(Double.toString(Double.parseDouble(sArg0) + Double.parseDouble(sArg1)), typeDouble); + } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { + return new Constant(Float.toString(Float.parseFloat(sArg0) + Float.parseFloat(sArg1)), typeFloat); + } else if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { + return new Constant(Long.toString(Long.parseLong(sArg0) + Long.parseLong(sArg1)), typeLong); + } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + return new Constant(Integer.toString(Integer.parseInt(sArg0) + Integer.parseInt(sArg1)), typeInt); + } + } + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { return new Constant(Double.toString(Double.parseDouble(sArg0) + Double.parseDouble(sArg1)), typeDouble); - } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { - return new Constant(Float.toString(Float.parseFloat(sArg0) + Float.parseFloat(sArg1)), typeFloat); - } else if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { - return new Constant(Long.toString(Long.parseLong(sArg0) + Long.parseLong(sArg1)), typeLong); - } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + } else { return new Constant(Integer.toString(Integer.parseInt(sArg0) + Integer.parseInt(sArg1)), typeInt); } - return new Constant(Integer.toString(Integer.parseInt(sArg0) + Integer.parseInt(sArg1))); } }); public static final Symbol mul = new Symbol(Parser.MUL, 2, Symbol.Type.INFIX, new Symbol.ICalculator() { @@ -92,16 +98,22 @@ Constant arg1 = (Constant) args.get(1); String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); - if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { + if (arg0.getType() != null && arg1.getType() != null) { + if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { + return new Constant(Double.toString(Double.parseDouble(sArg0) * Double.parseDouble(sArg1)), typeDouble); + } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { + return new Constant(Float.toString(Float.parseFloat(sArg0) * Float.parseFloat(sArg1)), typeFloat); + } else if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { + return new Constant(Long.toString(Long.parseLong(sArg0) * Long.parseLong(sArg1)), typeLong); + } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + return new Constant(Integer.toString(Integer.parseInt(sArg0) * Integer.parseInt(sArg1)), typeInt); + } + } + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { return new Constant(Double.toString(Double.parseDouble(sArg0) * Double.parseDouble(sArg1)), typeDouble); - } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { - return new Constant(Float.toString(Float.parseFloat(sArg0) * Float.parseFloat(sArg1)), typeFloat); - } else if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { - return new Constant(Long.toString(Long.parseLong(sArg0) * Long.parseLong(sArg1)), typeLong); - } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + } else { return new Constant(Integer.toString(Integer.parseInt(sArg0) * Integer.parseInt(sArg1)), typeInt); } - return new Constant(Integer.toString(Integer.parseInt(sArg0) * Integer.parseInt(sArg1))); } }); public static final Symbol sub = new Symbol(Parser.SUB, 2, Symbol.Type.INFIX, new Symbol.ICalculator() { @@ -117,16 +129,22 @@ Constant arg1 = (Constant) args.get(1); String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); - if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { + if (arg0.getType() != null && arg1.getType() != null) { + if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { + return new Constant(Double.toString(Double.parseDouble(sArg0) - Double.parseDouble(sArg1)), typeDouble); + } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { + return new Constant(Float.toString(Float.parseFloat(sArg0) - Float.parseFloat(sArg1)), typeFloat); + } else if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { + return new Constant(Long.toString(Long.parseLong(sArg0) - Long.parseLong(sArg1)), typeLong); + } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + return new Constant(Integer.toString(Integer.parseInt(sArg0) - Integer.parseInt(sArg1)), typeInt); + } + } + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { return new Constant(Double.toString(Double.parseDouble(sArg0) - Double.parseDouble(sArg1)), typeDouble); - } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { - return new Constant(Float.toString(Float.parseFloat(sArg0) - Float.parseFloat(sArg1)), typeFloat); - } else if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { - return new Constant(Long.toString(Long.parseLong(sArg0) - Long.parseLong(sArg1)), typeLong); - } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + } else { return new Constant(Integer.toString(Integer.parseInt(sArg0) - Integer.parseInt(sArg1)), typeInt); } - return new Constant(Integer.toString(Integer.parseInt(sArg0) - Integer.parseInt(sArg1))); } }); public static final Symbol div = new Symbol(Parser.DIV, 2, Symbol.Type.INFIX, new Symbol.ICalculator() { @@ -142,16 +160,22 @@ Constant arg1 = (Constant) args.get(1); String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); - if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { + if (arg0.getType() != null && arg1.getType() != null) { + if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { + return new Constant(Double.toString(Double.parseDouble(sArg0) / Double.parseDouble(sArg1)), typeDouble); + } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { + return new Constant(Float.toString(Float.parseFloat(sArg0) / Float.parseFloat(sArg1)), typeFloat); + } else if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { + return new Constant(Long.toString(Long.parseLong(sArg0) / Long.parseLong(sArg1)), typeLong); + } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + return new Constant(Integer.toString(Integer.parseInt(sArg0) / Integer.parseInt(sArg1)), typeInt); + } + } + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { return new Constant(Double.toString(Double.parseDouble(sArg0) / Double.parseDouble(sArg1)), typeDouble); - } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { - return new Constant(Float.toString(Float.parseFloat(sArg0) / Float.parseFloat(sArg1)), typeFloat); - } else if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { - return new Constant(Long.toString(Long.parseLong(sArg0) / Long.parseLong(sArg1)), typeLong); - } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + } else { return new Constant(Integer.toString(Integer.parseInt(sArg0) / Integer.parseInt(sArg1)), typeInt); } - return new Constant(Integer.toString(Integer.parseInt(sArg0) / Integer.parseInt(sArg1))); } }); public static final Symbol mod = new Symbol(Parser.MOD, 2, Symbol.Type.INFIX, "%", Symbol.Type.INFIX, new Symbol.ICalculator() { @@ -167,10 +191,12 @@ Constant arg1 = (Constant) args.get(1); String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); - if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { - return new Constant(Long.toString(Long.parseLong(sArg0) % Long.parseLong(sArg1)), typeLong); - } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { - return new Constant(Integer.toString(Integer.parseInt(sArg0) % Integer.parseInt(sArg1)), typeInt); + if (arg0.getType() != null && arg1.getType() != null) { + if (arg0.getType().equals(typeLong) || arg1.getType().equals(typeLong)) { + return new Constant(Long.toString(Long.parseLong(sArg0) % Long.parseLong(sArg1)), typeLong); + } else if (arg0.getType().equals(typeInt) || arg1.getType().equals(typeInt)) { + return new Constant(Integer.toString(Integer.parseInt(sArg0) % Integer.parseInt(sArg1)), typeInt); + } } return new Constant(Integer.toString(Integer.parseInt(sArg0) % Integer.parseInt(sArg1))); } @@ -183,16 +209,22 @@ } Constant arg = (Constant) args.get(0); String sArg = arg.getSymbol().toString(); - if (arg.getType().equals(typeDouble)) { + if (arg.getType() != null) { + if (arg.getType().equals(typeDouble)) { + return new Constant(Double.toString(-Double.parseDouble(sArg)), typeDouble); + } else if (arg.getType().equals(typeFloat)) { + return new Constant(Float.toString(-Float.parseFloat(sArg)), typeFloat); + } else if (arg.getType().equals(typeLong)) { + return new Constant(Long.toString(-Long.parseLong(sArg)), typeLong); + } else if (arg.getType().equals(typeInt)) { + return new Constant(Integer.toString(-Integer.parseInt(sArg)), typeInt); + } + } + if (sArg.contains(Parser.DOT)) { return new Constant(Double.toString(-Double.parseDouble(sArg)), typeDouble); - } else if (arg.getType().equals(typeFloat)) { - return new Constant(Float.toString(-Float.parseFloat(sArg)), typeFloat); - } else if (arg.getType().equals(typeLong)) { - return new Constant(Long.toString(-Long.parseLong(sArg)), typeLong); - } else if (arg.getType().equals(typeInt)) { + } else { return new Constant(Integer.toString(-Integer.parseInt(sArg)), typeInt); } - return new Constant(Integer.toString(-Integer.parseInt(sArg))); } }); public static final Symbol eq = new Symbol(Parser.EQ, 2, Symbol.Type.INFIX, new Symbol.IImplGenerator() { @@ -201,11 +233,12 @@ for (String s: childrenSideEffects) { sideEffect[0] += s; } - if (childrenTypes[0].equals(typeString) && childrenTypes[1].equals(typeString)) { + if (childrenTypes[0] != null && childrenTypes[0].equals(typeString) + && childrenTypes[1] != null && childrenTypes[1].equals(typeString)) { return children[0] + ".equals(" + children[1] + ")"; } return "(" + children[0] + "==" + children[1] + ")"; - } + } }, new Symbol.ICalculator() { @Override public Expression calculate(List args) { @@ -220,6 +253,13 @@ String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null || arg1.getType() == null) { + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { + result = Double.parseDouble(sArg0) == Double.parseDouble(sArg1); + } else { + result = Integer.parseInt(sArg0) == Integer.parseInt(sArg1); + } + } if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { result = (Double.parseDouble(sArg0) == Double.parseDouble(sArg1)); } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { @@ -244,7 +284,8 @@ for (String s: childrenSideEffects) { sideEffect[0] += s; } - if (childrenTypes[0].equals(typeString) && childrenTypes[1].equals(typeString)) { + if (childrenTypes[0] != null && childrenTypes[0].equals(typeString) + && childrenTypes[1] != null && childrenTypes[1].equals(typeString)) { return "!" + children[0] + ".equals(" + children[1] + ")"; } return "(" + children[0] + "!=" + children[1] + ")"; @@ -263,6 +304,13 @@ String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null || arg1.getType() == null) { + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { + result = Double.parseDouble(sArg0) != Double.parseDouble(sArg1); + } else { + result = Integer.parseInt(sArg0) != Integer.parseInt(sArg1); + } + } if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { result = (Double.parseDouble(sArg0) != Double.parseDouble(sArg1)); } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { @@ -295,6 +343,13 @@ String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null || arg1.getType() == null) { + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { + result = Double.parseDouble(sArg0) > Double.parseDouble(sArg1); + } else { + result = Integer.parseInt(sArg0) > Integer.parseInt(sArg1); + } + } if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { result = (Double.parseDouble(sArg0) > Double.parseDouble(sArg1)); } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { @@ -325,6 +380,13 @@ String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null || arg1.getType() == null) { + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { + result = Double.parseDouble(sArg0) < Double.parseDouble(sArg1); + } else { + result = Integer.parseInt(sArg0) < Integer.parseInt(sArg1); + } + } if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { result = (Double.parseDouble(sArg0) < Double.parseDouble(sArg1)); } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { @@ -355,6 +417,13 @@ String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null || arg1.getType() == null) { + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { + result = Double.parseDouble(sArg0) >= Double.parseDouble(sArg1); + } else { + result = Integer.parseInt(sArg0) >= Integer.parseInt(sArg1); + } + } if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { result = (Double.parseDouble(sArg0) >= Double.parseDouble(sArg1)); } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { @@ -385,6 +454,13 @@ String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null || arg1.getType() == null) { + if (sArg0.contains(Parser.DOT) || sArg1.contains(Parser.DOT)) { + result = Double.parseDouble(sArg0) <= Double.parseDouble(sArg1); + } else { + result = Integer.parseInt(sArg0) <= Integer.parseInt(sArg1); + } + } if (arg0.getType().equals(typeDouble) || arg1.getType().equals(typeDouble)) { result = (Double.parseDouble(sArg0) <= Double.parseDouble(sArg1)); } else if (arg0.getType().equals(typeFloat) || arg1.getType().equals(typeFloat)) { @@ -415,6 +491,7 @@ String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null || arg1.getType() == null) return null; if (arg0.getType().equals(typeBoolean) || arg1.getType().equals(typeBoolean)) { result = (Boolean.parseBoolean(sArg0) && Boolean.parseBoolean(sArg1)); } @@ -439,6 +516,7 @@ String sArg0 = arg0.getSymbol().toString(); String sArg1 = arg1.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null || arg1.getType() == null) return null; if (arg0.getType().equals(typeBoolean) || arg1.getType().equals(typeBoolean)) { result = (Boolean.parseBoolean(sArg0) || Boolean.parseBoolean(sArg1)); } @@ -458,6 +536,7 @@ Constant arg0 = (Constant) args.get(0); String sArg0 = arg0.getSymbol().toString(); boolean result = false; + if (arg0.getType() == null) return null; if (arg0.getType().equals(typeBoolean)) { result = !Boolean.parseBoolean(sArg0); } @@ -676,6 +755,7 @@ } }); public static final Symbol nil = new Symbol("nil", 0, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { + final int count[] = {0}; @Override public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, String[] sideEffect) { String compType = ""; @@ -691,14 +771,18 @@ if (sideEffect == null) { return "new " + implType + "<>()"; } else { - String temp = "temp_nil"; - sideEffect[0] = interfaceType + " " + temp + " = " + "new " + implType + "<" + compType + ">();\n"; + String temp = "temp_nil" + count[0]; + if (sideEffect[0] == null) { + sideEffect[0] = ""; + } + sideEffect[0] += interfaceType + " " + temp + " = " + "new " + implType + "<" + compType + ">();\n"; + count[0]++; return temp; } } return "new ArrayList<" + compType + ">()"; } - }); + }, true); public static final Symbol null_ = new Symbol("null", 0, Symbol.Type.PREFIX, "null", Symbol.Type.PREFIX); public static final Symbol true_ = new Symbol("true", 0, Symbol.Type.PREFIX, "true", Symbol.Type.PREFIX); public static final Symbol false_ = new Symbol("false", 0, Symbol.Type.PREFIX, "false", Symbol.Type.PREFIX); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java index 90a4546..e078ccb 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java @@ -1,5 +1,5 @@ package simulator; - + import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; @@ -7,7 +7,7 @@ import java.util.List; import java.util.Map; import java.util.Set; - + import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -25,7 +25,7 @@ import simulator.states.MapResourceState; import simulator.states.PrimitiveResourceState; import simulator.states.ResourceState; - + public class SystemState { private Set rootResources = new HashSet<>(); private Map channelStates = new HashMap<>(); @@ -70,7 +70,7 @@ } return null; } - + /** * update the state of a specified resource * @@ -545,7 +545,7 @@ } return null; } - + public Map.Entry> createResourceState(ResourceIdentifier resourceIdentifier, Variable curResVar, Expression resCurStateVal, Expression resStateValue) { Type resType = resourceIdentifier.getResourceStateType(); if (resType == null && resStateValue instanceof Term) { @@ -1001,13 +1001,18 @@ createInfo.getValue().addAll(childInfo.getValue()); createInfo = new AbstractMap.SimpleEntry<>(state, createInfo.getValue()); } - } - + } } return createInfo; } } } + if (curResVar != null && resCurStateVal != null) { + if (resStateValue instanceof Term) { + resStateValue = ((Term) resStateValue).substitute(curResVar, resCurStateVal); + resStateValue = ((Term) resStateValue).reduce(); + } + } if (resStateValue instanceof Constant) { Resource res = getResource(resourceIdentifier); ResourceState state = null; @@ -1039,7 +1044,7 @@ public void updateChannelState(DataTransferChannel channel, ChannelState channelState) { channelStates.put(channel, channelState); } - + public List getEvents() { return events; } @@ -1047,4 +1052,4 @@ public void addEvent(Event event) { events.add(event); } -} +} \ No newline at end of file