diff --git a/AlgebraicDataflowArchitectureModel/models/InventoryManagement.model b/AlgebraicDataflowArchitectureModel/models/InventoryManagement.model index 31bcdad..424e589 100644 --- a/AlgebraicDataflowArchitectureModel/models/InventoryManagement.model +++ b/AlgebraicDataflowArchitectureModel/models/InventoryManagement.model @@ -4,7 +4,7 @@ } channel ReceivingOrShipping(itemId:Str) { - out inventory.{itemId}.count(prev_quantity:Int, receiveOrShip(quantity:Int)) = if(prev_quantity + quantity >= 0, + out inventory.{itemId}.count(prev_quantity:Int, receiveOrShip(quantity:Int)) = if((prev_quantity + quantity) >= 0, prev_quantity + quantity, prev_quantity) } diff --git a/AlgebraicDataflowArchitectureModel/models/SimpleTwitter.model b/AlgebraicDataflowArchitectureModel/models/SimpleTwitter.model index 5e0d048..509b68a 100644 --- a/AlgebraicDataflowArchitectureModel/models/SimpleTwitter.model +++ b/AlgebraicDataflowArchitectureModel/models/SimpleTwitter.model @@ -4,5 +4,5 @@ } channel Tweet(accountId:Str) { - out accounts.{accountId}.tweets(tweetDB:Map, tweet(tweetId:Str, contents:Str)) = insert(tweetDB, tweetId, contents) + out accounts.{accountId}.tweets(tweetList:List, tweet(contents:Str)) = append(tweetList, contents) } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java b/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java index 665d4a9..f3bd6d9 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java @@ -121,12 +121,18 @@ } } else { // Json type. - if (this.children == null) { - Map childStates = ((CompositeResourceState) state).getChildStates(); + Map childStates = ((CompositeResourceState) state).getChildStates(); + if (this.children == null || this.children.size() < childStates.size()) { for (Map.Entry childEnt: childStates.entrySet()) { String childParam = childEnt.getKey(); ResourceState childState = childEnt.getValue(); Type thisType = resourceHierarchy.getResourceStateType(); + for (ResourceHierarchy c: resourceHierarchy.getChildren()) { + if (c.getResourceName().equals(childParam.replace("\"", ""))) { + childRes = c; + break; + } + } if (DataConstraintModel.typeJson.isAncestorOf(thisType)) { children.add(new Resource(childRes, this, new Constant(childParam, DataConstraintModel.typeString), childState)); } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java index 494ac79..fc671d8 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java @@ -217,19 +217,32 @@ if (resStateValue instanceof Constant) { } else if (resStateValue instanceof Term) { Term jsonValue = (Term) resStateValue; - if (jsonValue.getSymbol().equals(DataConstraintModel.addMember)) { + Map.Entry createInfo = null; + JsonResourceState state = new JsonResourceState(); + while (jsonValue.getSymbol().equals(DataConstraintModel.addMember)) { Expression childExp = jsonValue.getChild(1); if (childExp instanceof Constant) { - JsonResourceState state = new JsonResourceState(); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - ((Constant) childExp).getSymbol().getName(), - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + String memberName = ((Constant) childExp).getSymbol().getName().replace("\"", ""); + ResourceHierarchy childResourceHierarchy = null; + for (ResourceHierarchy childRes: resourceIdentifier.getResourceHierarchy().getChildren()) { + if (childRes.getResourceName().equals(memberName)) { + childResourceHierarchy = childRes; + break; + } + } + if (childResourceHierarchy == null) { + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, memberName, childResourceHierarchy); String childId = ((Constant) childExp).toString(); Map.Entry childInfo = createResourceState(childResourceIdentifier, jsonValue.getChild(2)); state.addChildState(childId, childInfo.getKey()); - return new AbstractMap.SimpleEntry<>(state, childInfo.getValue()); + createInfo = new AbstractMap.SimpleEntry<>(state, childInfo.getValue()); } + if (!(jsonValue.getChild(0) instanceof Term)) break; + jsonValue = (Term) jsonValue.getChild(0); } + return createInfo; } } }