diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java index 41ec4d5..82f6fe3 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java @@ -194,7 +194,7 @@ if (((DataTransferChannel)ch).getInputResources().size() == 0) {//ioch Or normalch for (ChannelMember out: ((DataTransferChannel)ch).getOutputChannelMembers()) { ResourcePath resPath = out.getResource(); - if (resId.isInstanceOf(resPath)) {//account.uid == acounts.123 + if (!out.isOutside() && resId.isInstanceOf(resPath)) {//account.uid == acounts.123 eventResPath = resPath; eventChs.add(((DataTransferChannel)ch)); String message = null; diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Type.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Type.java index e408a54..3b573d2 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Type.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Type.java @@ -73,7 +73,7 @@ public boolean isAncestorOf(Type another) { if (this.equals(another)) return true; - if (another.getParentTypes() == null) return false; + if (another == null || another.getParentTypes() == null) return false; for (Type anothersParentType: another.getParentTypes()) { if (isAncestorOf(anothersParentType)) return true; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourceHierarchy.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourceHierarchy.java index 7412266..be99827 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourceHierarchy.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourceHierarchy.java @@ -97,6 +97,7 @@ public ResourceHierarchy(ResourceHierarchy parent, Expression parameterExp, Type resourceStateType) { this.parent = parent; + if (this.children == null) this.children = new HashSet<>(); this.resourceName = null; this.numParameters = 1; this.resourceStateType = resourceStateType; @@ -120,6 +121,7 @@ public ResourceHierarchy(ResourceHierarchy parent, int numParameters, Type resourceStateType) { this.parent = parent; + if (this.children == null) this.children = new HashSet<>(); this.resourceName = null; this.numParameters = numParameters; this.resourceStateType = resourceStateType; diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Event.java b/AlgebraicDataflowArchitectureModel/src/simulator/Event.java index 58a9df8..b0feb2b 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Event.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Event.java @@ -235,8 +235,11 @@ for (ChannelMember depending: dependency.keySet()) { toResolve.remove(depending); } + Expression messageConstraint = null; + if ((messageConstraint = getMessage()) instanceof Term) { + unifiedMessage = (Term) messageConstraint; + } for (ChannelMember leafMember: toResolve) { - Expression messageConstraint = null; if (channel.getInputChannelMembers().contains(leafMember)) { // Calculate message constraint from an input state transition messageConstraint = channel.calcMessageConstraintForInputMember(leafMember, null, resouceStateAccessor, null, substitutedPositionsInMessageFromChannels); @@ -287,7 +290,6 @@ } // Calculate message constraint - Expression messageConstraint = null; if (channel.getInputChannelMembers().contains(dependingMem)) { // Calculate message constraint from an input state transition messageConstraint = channel.calcMessageConstraintForInputMember(dependingMem, null, resouceStateAccessor, null, substitutedPositionsInMessageFromChannels); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java b/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java index 6197b03..57f5a35 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java @@ -84,6 +84,7 @@ public SystemState transition(Event inputEvent) throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { SystemState nextSystemState = new SystemState(curState); + inputEvent.updateDependingParameters(new ResourceStateValueProvider(curState, nextSystemState)); nextSystemState.addEvent(inputEvent); fireEvent(inputEvent, curState, nextSystemState); @@ -174,16 +175,25 @@ if (channel.getOutputResources().size() > 0) { // For each output resource, calculate the next state. for (ChannelMember out: channel.getOutputChannelMembers()) { + // Calculate the next state expression. Expression nextResState = null; if (!event.isInput()) { nextResState = channel.deriveUpdateExpressionOf(out, resouceStateAccessor).getKey(); } else { nextResState = channel.deriveUpdateExpressionOf(out, (Term) event.getMessage(), resouceStateAccessor); } - ResourceIdentifier outResId = event.getOutputResourceIdentifier(out.getResource()); + // Substitute each channel selector in the expression to a value. + for (Map.Entry selestorAndVal: event.getChannelSelectorAndValues()) { + Expression selExp = selestorAndVal.getKey().getExpression(); + if (nextResState instanceof Term && selExp instanceof Variable) { + nextResState = ((Term) nextResState).substitute((Variable) selExp, selestorAndVal.getValue()); + } + } if (nextResState instanceof Term) { nextResState = ((Term) nextResState).reduce(); } + // Update the resource state. + ResourceIdentifier outResId = event.getOutputResourceIdentifier(out.getResource()); ResourceIdentifier updatedOutResId = nextSystemState.updateResourceState(outResId, nextResState); while (updatedOutResId != null) { // In addition to the target state, its descendants' states are also changed. for (Event nextEvent: getNextEvents(updatedOutResId, curSystemState, nextSystemState)) { @@ -203,22 +213,10 @@ } } - private Set getNextEvents(ResourceIdentifier inResId, final SystemState curSystemState, final SystemState nextSystemState) + private Set getNextEvents(ResourceIdentifier inResId, SystemState curSystemState, SystemState nextSystemState) throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { Set nextEvents = new HashSet<>(); - IResourceStateValueProvider resourceStateValueProvider = new IResourceStateValueProvider() { - @Override - public Expression getCurrentStateValueOf(ResourceIdentifier resId) { - if (curSystemState.getResource(resId) == null) return null; - return curSystemState.getResource(resId).getState().getValue(); - } - - @Override - public Expression getNextStateValueOf(ResourceIdentifier resId) { - if (nextSystemState.getResource(resId) == null) return null; - return nextSystemState.getResource(resId).getState().getValue(); - } - }; + IResourceStateValueProvider resourceStateValueProvider = new ResourceStateValueProvider(curSystemState, nextSystemState); for (Map.Entry chEntry: nextSystemState.getChannelStates().entrySet()) { DataTransferChannel channel = chEntry.getKey(); ChannelState nextChState = chEntry.getValue(); @@ -316,4 +314,26 @@ } return nextEvents; } + + private static class ResourceStateValueProvider implements IResourceStateValueProvider { + SystemState curSystemState; + SystemState nextSystemState; + + public ResourceStateValueProvider(SystemState curSystemState, SystemState nextSystemState) { + this.curSystemState = curSystemState; + this.nextSystemState = nextSystemState; + } + + @Override + public Expression getCurrentStateValueOf(ResourceIdentifier resId) { + if (curSystemState.getResource(resId) == null) return null; + return curSystemState.getResource(resId).getState().getValue(); + } + + @Override + public Expression getNextStateValueOf(ResourceIdentifier resId) { + if (nextSystemState.getResource(resId) == null) return null; + return nextSystemState.getResource(resId).getState().getValue(); + } + }; } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java index cac52a4..98f752e 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java @@ -12,6 +12,7 @@ import models.algebra.Expression; import models.algebra.Term; import models.algebra.Type; +import models.algebra.Variable; import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.JsonTerm; import models.dataConstraintModel.ListTerm; @@ -88,9 +89,19 @@ ResourceIdentifier createdResource = null; for (int i = 0; i < listValue.size(); i++) { Expression childExp = new Constant(Integer.toString(i), DataConstraintModel.typeInt); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + Type childResType = null; + if (listValue.get(i) instanceof Variable) { + childResType = ((Variable) listValue.get(i)).getType(); + } else if (listValue.get(i) instanceof Term) { + childResType = ((Term) listValue.get(i)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, listValue.get(i)); ((ListResourceState) state).addChildState(childInfo.getKey()); createdResource = childInfo.getValue(); @@ -119,7 +130,13 @@ if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); } else { - childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1); + Type childResType = null; + if (listValue.getChild(1) instanceof Variable) { + childResType = ((Variable) listValue.getChild(1)).getType(); + } else if (listValue.getChild(1) instanceof Term) { + childResType = ((Term) listValue.getChild(1)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); } ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, listValue.getChild(1)); @@ -136,9 +153,19 @@ ResourceIdentifier createdResource = null; for (String key: mapValue.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + Type childResType = null; + if (mapValue.get(key) instanceof Variable) { + childResType = ((Variable) mapValue.get(key)).getType(); + } else if (mapValue.get(key) instanceof Term) { + childResType = ((Term) mapValue.get(key)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, mapValue.get(key)); ((MapResourceState) state).addChildState(key, childInfo.getKey()); createdResource = childInfo.getValue(); @@ -151,9 +178,19 @@ ResourceIdentifier createdResource = null; for (String key: mapValue.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + Type childResType = null; + if (mapValue.get(key) instanceof Variable) { + childResType = ((Variable) mapValue.get(key)).getType(); + } else if (mapValue.get(key) instanceof Term) { + childResType = ((Term) mapValue.get(key)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, mapValue.get(key)); ((MapResourceState) state).addChildState(key, childInfo.getKey()); createdResource = childInfo.getValue(); @@ -180,7 +217,13 @@ if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); } else { - childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1); + Type childResType = null; + if (mapValue.getChild(2) instanceof Variable) { + childResType = ((Variable) mapValue.getChild(2)).getType(); + } else if (mapValue.getChild(2) instanceof Term) { + childResType = ((Term) mapValue.getChild(2)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); } ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); String childId = ((Constant) childExp).toString(); @@ -207,7 +250,13 @@ } } if (childResourceHierarchy == null) { - childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName); + Type childResType = null; + if (jsonValue.get(key) instanceof Variable) { + childResType = ((Variable) jsonValue.get(key)).getType(); + } else if (jsonValue.get(key) instanceof Term) { + childResType = ((Term) jsonValue.get(key)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName, childResType); } ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, memberName, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, jsonValue.get(key)); @@ -236,7 +285,13 @@ } } if (childResourceHierarchy == null) { - childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName); + Type childResType = null; + if (jsonValue.getChild(2) instanceof Variable) { + childResType = ((Variable) jsonValue.getChild(2)).getType(); + } else if (jsonValue.getChild(2) instanceof Term) { + childResType = ((Term) jsonValue.getChild(2)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName, childResType); } ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, memberName, childResourceHierarchy); String childId = ((Constant) childExp).toString(); @@ -289,9 +344,19 @@ Map.Entry createInfo = null; for (int i = 0; i < listValue.size(); i++) { Expression childExp = new Constant(Integer.toString(i), DataConstraintModel.typeInt); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + Type childResType = null; + if (listValue.get(i) instanceof Variable) { + childResType = ((Variable) listValue.get(i)).getType(); + } else if (listValue.get(i) instanceof Term) { + childResType = ((Term) listValue.get(i)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, listValue.get(i)); state.addChildState(childInfo.getKey()); createInfo = new AbstractMap.SimpleEntry<>(state, childInfo.getValue()); @@ -302,9 +367,19 @@ if (listValue.getSymbol().equals(DataConstraintModel.append)) { ListResourceState state = new ListResourceState(); Expression childExp = new Constant(Integer.toString(((ListResourceState) state).getChildStates().size()), DataConstraintModel.typeInt); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + Type childResType = null; + if (listValue.getChild(1) instanceof Variable) { + childResType = ((Variable) listValue.getChild(1)).getType(); + } else if (listValue.getChild(1) instanceof Term) { + childResType = ((Term) listValue.getChild(1)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, listValue.getChild(1)); state.addChildState(childInfo.getKey()); return new AbstractMap.SimpleEntry<>(state, childInfo.getValue()); @@ -318,9 +393,19 @@ Map.Entry createInfo = null; for (String key: mapValue.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + Type childResType = null; + if (mapValue.get(key) instanceof Variable) { + childResType = ((Variable) mapValue.get(key)).getType(); + } else if (mapValue.get(key) instanceof Term) { + childResType = ((Term) mapValue.get(key)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, mapValue.get(key)); state.addChildState(key, childInfo.getKey()); createInfo = new AbstractMap.SimpleEntry<>(state, childInfo.getValue()); @@ -332,9 +417,19 @@ Map.Entry createInfo = null; for (String key: mapValue.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + Type childResType = null; + if (mapValue.get(key) instanceof Variable) { + childResType = ((Variable) mapValue.get(key)).getType(); + } else if (mapValue.get(key) instanceof Term) { + childResType = ((Term) mapValue.get(key)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, mapValue.get(key)); state.addChildState(key, childInfo.getKey()); createInfo = new AbstractMap.SimpleEntry<>(state, childInfo.getValue()); @@ -346,9 +441,19 @@ Expression childExp = mapValue.getChild(1); if (childExp instanceof Constant) { MapResourceState state = new MapResourceState(); - ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, - childExp, - resourceIdentifier.getResourceHierarchy().getChildren().iterator().next()); + ResourceHierarchy childResourceHierarchy = null; + if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { + childResourceHierarchy = resourceIdentifier.getResourceHierarchy().getChildren().iterator().next(); + } else { + Type childResType = null; + if (mapValue.getChild(2) instanceof Variable) { + childResType = ((Variable) mapValue.getChild(2)).getType(); + } else if (mapValue.getChild(2) instanceof Term) { + childResType = ((Term) mapValue.getChild(2)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), 1, childResType); + } + ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, childExp, childResourceHierarchy); String childId = ((Constant) childExp).toString(); Map.Entry childInfo = createResourceState(childResourceIdentifier, mapValue.getChild(2)); state.addChildState(childId, childInfo.getKey()); @@ -372,7 +477,13 @@ } } if (childResourceHierarchy == null) { - childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName); + Type childResType = null; + if (jsonValue.get(key) instanceof Variable) { + childResType = ((Variable) jsonValue.get(key)).getType(); + } else if (jsonValue.get(key) instanceof Term) { + childResType = ((Term) jsonValue.get(key)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName, childResType); } ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, memberName, childResourceHierarchy); Map.Entry childInfo = createResourceState(childResourceIdentifier, jsonValue.get(key)); @@ -401,7 +512,13 @@ } } if (childResourceHierarchy == null) { - childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName); + Type childResType = null; + if (jsonValue.getChild(2) instanceof Variable) { + childResType = ((Variable) jsonValue.getChild(2)).getType(); + } else if (jsonValue.getChild(2) instanceof Term) { + childResType = ((Term) jsonValue.getChild(2)).getType(); + } + childResourceHierarchy = new ResourceHierarchy(resourceIdentifier.getResourceHierarchy(), memberName, childResType); } ResourceIdentifier childResourceIdentifier = new ResourceIdentifier(resourceIdentifier, memberName, childResourceHierarchy); String childId = ((Constant) childExp).toString();