diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java b/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java index 5f7e67d..665d4a9 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java @@ -89,6 +89,10 @@ public ResourceState getState() { return state; } + + public void changeState(ResourceState state) { + this.state = state; + } public Constant getParameter() { return parameter; @@ -99,22 +103,26 @@ if (resourceHierarchy.getChildren().size() > 0) { children = new ArrayList<>(); ResourceHierarchy childRes = resourceHierarchy.getChildren().iterator().next(); - Map childStates = ((CompositeResourceState) state).getChildStates(); if (childRes.getNumParameters() > 0) { // List or Map type. - for (Map.Entry childEnt: childStates.entrySet()) { - String childParam = childEnt.getKey(); - ResourceState childState = childEnt.getValue(); - Type thisType = resourceHierarchy.getResourceStateType(); - if (DataConstraintModel.typeList.isAncestorOf(thisType)) { - children.add(new Resource(childRes, this, new Constant(childParam, DataConstraintModel.typeInt), childState)); - } else if (DataConstraintModel.typeMap.isAncestorOf(thisType)) { - children.add(new Resource(childRes, this, new Constant(childParam, DataConstraintModel.typeString), childState)); + if (state instanceof CompositeResourceState) { + // If the list or map is not nil. + Map childStates = ((CompositeResourceState) state).getChildStates(); + for (Map.Entry childEnt: childStates.entrySet()) { + String childParam = childEnt.getKey(); + ResourceState childState = childEnt.getValue(); + Type thisType = resourceHierarchy.getResourceStateType(); + if (DataConstraintModel.typeList.isAncestorOf(thisType)) { + children.add(new Resource(childRes, this, new Constant(childParam, DataConstraintModel.typeInt), childState)); + } else if (DataConstraintModel.typeMap.isAncestorOf(thisType)) { + children.add(new Resource(childRes, this, new Constant(childParam, DataConstraintModel.typeString), childState)); + } } } } else { // Json type. if (this.children == null) { + Map childStates = ((CompositeResourceState) state).getChildStates(); for (Map.Entry childEnt: childStates.entrySet()) { String childParam = childEnt.getKey(); ResourceState childState = childEnt.getValue(); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java index 9e331e5..4adf78d 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java @@ -13,7 +13,9 @@ import models.algebra.Term; import models.algebra.Type; import models.dataConstraintModel.DataConstraintModel; +import models.dataConstraintModel.ResourceHierarchy; import models.dataFlowModel.DataTransferChannel; +import simulator.states.CompositeResourceState; import simulator.states.JsonResourceState; import simulator.states.ListResourceState; import simulator.states.MapResourceState; @@ -66,10 +68,27 @@ if (listValue.getSymbol().equals(DataConstraintModel.append)) { Resource res = getResource(resourceIdentifier); ResourceState state = res.getState(); - Expression childExp = new Constant(Integer.toString(((ListResourceState) state).getChildStates().size())); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + Expression childExp = null; + if (state instanceof ListResourceState) { + childExp = new Constant(Integer.toString(((ListResourceState) state).getChildStates().size())); + } else if (state instanceof PrimitiveResourceState && ((PrimitiveResourceState) state).getValue().getSymbol().equals(DataConstraintModel.nil)) { + // If the value of state is nil. + childExp = new Constant("0"); + ResourceState parentState = res.getParent().getState(); + ResourceState newState = new ListResourceState(); + if (parentState instanceof CompositeResourceState) { + ((CompositeResourceState) parentState).replaceChildState(state, newState); + } + state = newState; + res.changeState(state); + } + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, listValue.getChild(1)); ((ListResourceState) state).addChildState(childInfo.getKey()); return childInfo.getValue(); @@ -84,9 +103,23 @@ if (childExp instanceof Constant) { Resource res = getResource(resourceIdentifier); ResourceState state = res.getState(); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + if (state instanceof PrimitiveResourceState && ((PrimitiveResourceState) state).getValue().getSymbol().equals(DataConstraintModel.nil)) { + // If the value of state is nil. + ResourceState parentState = res.getParent().getState(); + ResourceState newState = new MapResourceState(); + if (parentState instanceof CompositeResourceState) { + ((CompositeResourceState) parentState).replaceChildState(state, newState); + } + state = newState; + res.changeState(state); + } + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); String childId = ((Constant) childExp).toString(); Map.Entry childInfo = createResourceState(childResourceIdentifier, mapValue.getChild(2)); ((MapResourceState) state).addChildState(childId, childInfo.getKey()); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/CompositeResourceState.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/CompositeResourceState.java index 3cc29ca..5e6311f 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/CompositeResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/CompositeResourceState.java @@ -2,11 +2,13 @@ import java.util.Map; -abstract public class CompositeResourceState extends ResourceState { +public abstract class CompositeResourceState extends ResourceState { @Override boolean hasChildren() { return true; } - abstract public Map getChildStates(); + public abstract Map getChildStates(); + + public abstract void replaceChildState(ResourceState state, ResourceState newState); } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/JsonResourceState.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/JsonResourceState.java index 327da4f..afd1c20 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/JsonResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/JsonResourceState.java @@ -33,4 +33,13 @@ public void addChildState(String param, ResourceState childState) { children.put(param, childState); } + + @Override + public void replaceChildState(ResourceState state, ResourceState newState) { + for (Map.Entry childEnt: children.entrySet()) { + if (childEnt.getValue().equals(state)) { + children.put(childEnt.getKey(), newState); + } + } + } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/ListResourceState.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/ListResourceState.java index e49bd72..83367e0 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/ListResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/ListResourceState.java @@ -29,13 +29,23 @@ @Override public Map getChildStates() { Map childParams = new HashMap<>(); - for (int i = 1; i <= children.size(); i++) { + for (int i = 0; i < children.size(); i++) { childParams.put(Integer.toString(i), children.get(i)); } - return null; + return childParams; } public void addChildState(ResourceState childState) { children.add(childState); } + + + @Override + public void replaceChildState(ResourceState state, ResourceState newState) { + for (int i = 0; i < children.size(); i++) { + if (children.get(i).equals(state)) { + children.set(i, newState); + } + } + } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/MapResourceState.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/MapResourceState.java index 1f36406..5bd2fc7 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/MapResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/MapResourceState.java @@ -33,4 +33,13 @@ public void addChildState(String param, ResourceState childState) { children.put(param, childState); } + + @Override + public void replaceChildState(ResourceState state, ResourceState newState) { + for (Map.Entry childEnt: children.entrySet()) { + if (childEnt.getValue().equals(state)) { + children.put(childEnt.getKey(), newState); + } + } + } }