diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index 75e5dce..f4e94dd 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -235,6 +235,20 @@ } } + protected void fillGetterMethodToReturnComponentOfStateField(MethodDeclaration getter, Type containerStateType, ILanguageSpecific langSpec) { + if (DataConstraintModel.typeList.isAncestorOf(containerStateType)) { + Term selector = new Term(DataConstraintModel.get); + selector.addChild(new Variable(langSpec.getFieldAccessor(fieldOfResourceState))); + selector.addChild(new Variable(getter.getParameters().get(getter.getParameters().size() - 1).getName())); + getter.addStatement(langSpec.getReturnStatement(selector.toImplementation(new String[] {})) + langSpec.getStatementDelimiter()); + } else if (DataConstraintModel.typeMap.isAncestorOf(containerStateType)) { + Term selector = new Term(DataConstraintModel.lookup); + selector.addChild(new Variable(langSpec.getFieldAccessor(fieldOfResourceState))); + selector.addChild(new Variable(getter.getParameters().get(getter.getParameters().size() - 1).getName())); + getter.addStatement(langSpec.getReturnStatement(selector.toImplementation(new String[] {})) + langSpec.getStatementDelimiter()); + } + } + protected void declareAccessorInMainComponent(TypeDeclaration mainComponent, ResourceNode accessRes, MethodDeclaration getter, ILanguageSpecific langSpec) { List mainParams = new ArrayList<>(); for (Selector selector: accessRes.getAllSelectors()) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index b3b4340..19e3083 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -83,6 +83,7 @@ // Declare the accessor method in the main component to call the getter method. declareAccessorInMainComponent(mainComponent, resourceNode, getter, langSpec); + // Declare cache fields and update methods in this resource. List updates = declareCacheFieldsAndUpdateMethods(resourceNode, component, langSpec); @@ -154,8 +155,10 @@ component.addMethod(getter); if (((StoreAttribute) resourceNode.getAttribute()).isStored()) { - if (resourceNode.getNumberOfParameters() == 0) { + if (resourceNode.getResourceHierarchy().getNumParameters() == 0) { fillGetterMethodToReturnStateField(getter, resStateType, langSpec); + } else { + fillGetterMethodToReturnComponentOfStateField(getter, resourceNode.getParent().getResourceStateType(), langSpec); } } else { // invocations to other getter methods when at least one incoming data-flow edges is PULL-style. diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java index d8dbe5d..78a440e 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java @@ -15,6 +15,7 @@ import models.Edge; import models.Node; import models.algebra.Expression; +import models.algebra.Field; import models.algebra.InvalidMessage; import models.algebra.ParameterizedIdentifierIsFutureWork; import models.algebra.Term; @@ -92,11 +93,11 @@ } } if (((StoreAttribute) dst.getAttribute()).isStored()) { - if (dst.getNumberOfParameters() == 0) { - // returns the current state stored in a field. - MethodDeclaration getter = getGetterMethod(dstType, null); - if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { - Type resourceType = dst.getResourceStateType(); + // returns the current state stored in a field. + MethodDeclaration getter = getGetterMethod(dstType, null); + if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { + Type resourceType = dst.getResourceStateType(); + if (dst.getResourceHierarchy().getNumParameters() == 0) { if (model.isPrimitiveType(resourceType)) { getter.addStatement("return value;"); } else { @@ -113,6 +114,18 @@ // } getter.addStatement("return new " + implTypeName + "(value);"); } + } else { + if (DataConstraintModel.typeList.isAncestorOf(dst.getParent().getResourceStateType())) { + Term selector = new Term(DataConstraintModel.get); + selector.addChild(new Field("value")); + selector.addChild(dst.getSelectors().get(dst.getSelectors().size() - 1).getExpression()); + getter.addStatement("return " + selector.toImplementation(new String[] {}) + ";"); + } else if (DataConstraintModel.typeMap.isAncestorOf(dst.getParent().getResourceStateType())) { + Term selector = new Term(DataConstraintModel.lookup); + selector.addChild(new Field("value")); + selector.addChild(dst.getSelectors().get(dst.getSelectors().size() - 1).getExpression()); + getter.addStatement("return " + selector.toImplementation(new String[] {}) + ";"); + } } } } @@ -217,7 +230,7 @@ TypeDeclaration type = typeMap.get(resourceName); if (type != null) { // getter method - if (resource.getTotalNumParameters() == 0) { + if (resource.getNumParameters() == 0) { MethodDeclaration getter = getGetterMethod(type, null); if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { Type resourceType = resource.getResourceStateType(); @@ -238,6 +251,19 @@ getter.addStatement("return new " + implTypeName + "(value);"); } } + } else { + MethodDeclaration getter = getGetterMethod(type, resource.getNumParameters()); + if (DataConstraintModel.typeList.isAncestorOf(resource.getParent().getResourceStateType())) { + Term selector = new Term(DataConstraintModel.get); + selector.addChild(new Field("value")); + selector.addChild(new Variable(getter.getParameters().get(getter.getParameters().size() - 1).getName())); + getter.addStatement("return " + selector.toImplementation(new String[] {}) + ";"); + } else if (DataConstraintModel.typeMap.isAncestorOf(resource.getParent().getResourceStateType())) { + Term selector = new Term(DataConstraintModel.lookup); + selector.addChild(new Field("value")); + selector.addChild(new Variable(getter.getParameters().get(getter.getParameters().size() - 1).getName())); + getter.addStatement("return " + selector.toImplementation(new String[] {}) + ";"); + } } // methods for input events Map> ioChannelsAndMembers = getIOChannelsAndMembers(resource, model); @@ -314,6 +340,16 @@ return updates; } + private static MethodDeclaration getGetterMethod(TypeDeclaration type, int numParams) { + for (MethodDeclaration m: type.getMethods()) { + if (m.getName().startsWith("get")) { + if (m.getParameters() == null && numParams == 0) return m; + if (m.getParameters() != null && m.getParameters().size() == numParams) return m; + } + } + return null; + } + private static MethodDeclaration getGetterMethod(TypeDeclaration type, List params) { for (MethodDeclaration m: type.getMethods()) { if (m.getName().startsWith("get")) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java index c919fc1..822481a 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java @@ -17,6 +17,7 @@ import models.Edge; import models.Node; import models.algebra.Expression; +import models.algebra.Field; import models.algebra.InvalidMessage; import models.algebra.ParameterizedIdentifierIsFutureWork; import models.algebra.Term; @@ -177,11 +178,23 @@ if (paramConverter.length() > 0) update.addFirstStatement(paramConverter); } if (((StoreAttribute) dst.getAttribute()).isStored()) { - if (dst.getNumberOfParameters() == 0) { - // returns the state stored in a field. - MethodDeclaration getter = getGetterMethod(dstType, null); - if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { + // returns the state stored in a field. + MethodDeclaration getter = getGetterMethod(dstType, null); + if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { + if (dst.getResourceHierarchy().getNumParameters() == 0) { getter.addStatement("return value;"); + } else { + if (DataConstraintModel.typeList.isAncestorOf(dst.getParent().getResourceStateType())) { + Term selector = new Term(DataConstraintModel.get); + selector.addChild(new Field("value")); + selector.addChild(dst.getSelectors().get(dst.getSelectors().size() - 1).getExpression()); + getter.addStatement("return " + selector.toImplementation(new String[] {}) + ";"); + } else if (DataConstraintModel.typeMap.isAncestorOf(dst.getParent().getResourceStateType())) { + Term selector = new Term(DataConstraintModel.lookup); + selector.addChild(new Field("value")); + selector.addChild(dst.getSelectors().get(dst.getSelectors().size() - 1).getExpression()); + getter.addStatement("return " + selector.toImplementation(new String[] {}) + ";"); + } } } } @@ -310,11 +323,24 @@ TypeDeclaration type = typeMap.get(resourceName); if (type != null) { // getter method - if (resource.getTotalNumParameters() == 0) { + if (resource.getNumParameters() == 0) { MethodDeclaration getter = getGetterMethod(type, null); if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { getter.addStatement("return value;"); } + } else { + MethodDeclaration getter = getGetterMethod(type, resource.getNumParameters()); + if (DataConstraintModel.typeList.isAncestorOf(resource.getParent().getResourceStateType())) { + Term selector = new Term(DataConstraintModel.get); + selector.addChild(new Field("value")); + selector.addChild(new Variable(getter.getParameters().get(getter.getParameters().size() - 1).getName())); + getter.addStatement("return " + selector.toImplementation(new String[] {}) + ";"); + } else if (DataConstraintModel.typeMap.isAncestorOf(resource.getParent().getResourceStateType())) { + Term selector = new Term(DataConstraintModel.lookup); + selector.addChild(new Field("value")); + selector.addChild(new Variable(getter.getParameters().get(getter.getParameters().size() - 1).getName())); + getter.addStatement("return " + selector.toImplementation(new String[] {}) + ";"); + } } // methods for input events Map> ioChannelsAndMembers = getIOChannelsAndMembers(resource, model); @@ -547,6 +573,16 @@ } return updates; } + + private static MethodDeclaration getGetterMethod(TypeDeclaration type, int numParams) { + for (MethodDeclaration m: type.getMethods()) { + if (m.getName().startsWith("get")) { + if (m.getParameters() == null && numParams == 0) return m; + if (m.getParameters() != null && m.getParameters().size() == numParams) return m; + } + } + return null; + } private static MethodDeclaration getGetterMethod(TypeDeclaration type, List params) { for (MethodDeclaration m: type.getMethods()) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java index b083477..79137dc 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java @@ -302,16 +302,22 @@ public void addResourcePath(ResourcePath resourcePath) { resourcePaths.add(resourcePath); - ResourceHierarchy hierarchy = resourcePath.getResourceHierarchy(); + ResourceHierarchy childHierarchy = null; + ResourceHierarchy hierarchy = null; do { - if (resourceHierarchies.get(hierarchy.toString()) == null) { + hierarchy = resourcePath.getResourceHierarchy(); + if (hierarchy != null && resourceHierarchies.get(hierarchy.toString()) == null) { resourceHierarchies.put(hierarchy.toString(), hierarchy); } else { - resourcePath.setResourceHierarchy(resourceHierarchies.get(hierarchy.toString())); + hierarchy = resourceHierarchies.get(hierarchy.toString()); + resourcePath.setResourceHierarchy(hierarchy); + if (childHierarchy != null) { + childHierarchy.setParent(hierarchy); + } } resourcePath = resourcePath.getParent(); - hierarchy = hierarchy.getParent(); - } while (hierarchy != null); + childHierarchy = hierarchy; + } while (resourcePath != null); } public void setResourcePaths(List resourcePaths) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourcePath.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourcePath.java index 390f80e..cc427ef 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourcePath.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourcePath.java @@ -103,13 +103,13 @@ public String toString() { return resourceHierarchy.toString(pathParams); } - - public boolean equals(Object another) { - if (!(another instanceof ResourcePath)) return false; - return toString().equals(((ResourcePath) another).toString()); - } - - public int hashCode() { - return toString().hashCode(); - } +// +// public boolean equals(Object another) { +// if (!(another instanceof ResourcePath)) return false; +// return toString().equals(((ResourcePath) another).toString()); +// } +// +// public int hashCode() { +// return toString().hashCode(); +// } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowGraph.java index 28288c9..b241023 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowGraph.java @@ -28,8 +28,8 @@ ResourcePath outSideResource) { ResourceNode node = resourceNodeMap.get(outSideResource); if (node != null) return node; - node = new ResourceNode(parent, outSideChannel, outSideResource); - addNode(node); + node = new ResourceNode(parent, outSideChannel, outSideResource); + addNode(node); if (parent == null) { rootResourceNodes.add(node); } else {