diff --git a/AlgebraicDataflowArchitectureModel/models/Test.model b/AlgebraicDataflowArchitectureModel/models/Test.model new file mode 100644 index 0000000..e5f79c4 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/models/Test.model @@ -0,0 +1,9 @@ +channel AddUser { + out users(userMap: Map, addUser(userId: Str, name: Str)) = insert(userMap, userId, {"name": name}) +} + +channel PostFriendRequest { + ref users(usersMap: Map, postFriendRequest(senderId: Str, receiverId: Str)) + out friendRequests(friendRequestList: List, postFriendRequest(senderId: Str, receiverId: Str)) = + if(senderId != null && receiverId != null, append(friendRequestList, {"senderId": senderId, "receiverId": receiverId}), friendRequestList) +} \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/Main.java b/AlgebraicDataflowArchitectureModel/src/Main.java index 54fdaf8..d815006 100644 --- a/AlgebraicDataflowArchitectureModel/src/Main.java +++ b/AlgebraicDataflowArchitectureModel/src/Main.java @@ -1,12 +1,10 @@ - - import application.ApplicationWindow; public class Main { - + public static void main(String[] args) { ApplicationWindow frame = new ApplicationWindow(); frame.setVisible(true); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/DataTransferModelAnalyzer.java b/AlgebraicDataflowArchitectureModel/src/algorithms/DataTransferModelAnalyzer.java index a392b11..651f5cc 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/DataTransferModelAnalyzer.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/DataTransferModelAnalyzer.java @@ -1,25 +1,26 @@ package algorithms; -import java.util.ArrayList; +import models.Edge; +import models.Node; +import models.NodeAttribute; +import models.dataConstraintModel.Channel; +import models.dataConstraintModel.ChannelMember; +import models.dataFlowModel.*; + import java.util.Collection; import java.util.HashSet; -import java.util.List; import java.util.Set; -import models.*; -import models.algebra.*; -import models.dataConstraintModel.*; -import models.dataFlowModel.*; - /** * Algorithms to analyze data transfer model. - * + * * @author Nitta * */ public class DataTransferModelAnalyzer { /** * Create data flow graph annotated with node attributes that indicate whether each resource state needs to be stored. + * * @param model a data transfer model * @return annotated data flow graph */ @@ -27,9 +28,9 @@ DataFlowGraph graph = model.getDataFlowGraph(); Collection channels = new HashSet<>(model.getInputChannels()); channels.addAll(model.getChannels()); - for (Channel channel: channels) { - for (ChannelMember member: ((DataTransferChannel) channel).getOutputChannelMembers()) { - boolean toBeStored = !member.getStateTransition().isRightUnary(); // The state does not need to be stored if the state transition function is right unary. + for (Channel channel : channels) { + for (ChannelMember member : ((DataTransferChannel) channel).getOutputChannelMembers()) { + boolean toBeStored = !member.getStateTransition().isRightUnary(); // The state does not need to be stored if the state transition function is right unary. for (Node node : graph.getResourceNodes()) { if (((ResourceNode) node).getInSideResources().contains(member.getResource())) { setStoreAttribute((ResourceNode) node, toBeStored); @@ -37,9 +38,9 @@ } } } - for (Node node: graph.getResourceNodes()) { + for (Node node : graph.getResourceNodes()) { HashSet inChannels = new HashSet<>(); - for(Edge inEdge: ((ResourceNode) node).getInEdges()) { + for (Edge inEdge : ((ResourceNode) node).getInEdges()) { if (inEdge instanceof DataFlowEdge) { DataFlowEdge dfEdge = (DataFlowEdge) inEdge; if (dfEdge.isChannelToResource()) { @@ -56,7 +57,7 @@ } return graph; } - + static private void setStoreAttribute(ResourceNode node, boolean toBeStored) { NodeAttribute attr = node.getAttribute(); StoreAttribute store; @@ -69,16 +70,17 @@ node.setAttribute(store); } } - + /** * Annotate data flow graph with edge attributes that indicate selectable data transfer methods. + * * @param graph a data flow graph * @return annotated data flow graph */ static public DataFlowGraph annotateWithSelectableDataTransferAttiribute(DataFlowGraph graph) { HashSet unvisitedNodes = new HashSet<>(graph.getResourceNodes()); // Turn push only - for (Node resNode: graph.getResourceNodes()) { + for (Node resNode : graph.getResourceNodes()) { if (unvisitedNodes.contains(resNode) && ((StoreAttribute) ((ResourceNode) resNode).getAttribute()).isNeeded()) { unvisitedNodes.remove(resNode); trackEdgesBackwardForPush(resNode, unvisitedNodes); @@ -93,19 +95,19 @@ // Should take into account the channel hierarchy. boolean pullContained = false; Set ancestorChannels = chNode.getAncestors(); - for (ChannelNode ancestorCh: ancestorChannels) { - for (Edge resToCh: ancestorCh.getInEdges()) { + for (ChannelNode ancestorCh : ancestorChannels) { + for (Edge resToCh : ancestorCh.getInEdges()) { ResourceNode srcResNode = (ResourceNode) resToCh.getSource(); DataTransferChannel ch = (DataTransferChannel) ancestorCh.getChannel(); - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (cm.isOutside()) { PushPullAttribute ppat = new PushPullAttribute(); - ppat.addOption(PushPullValue.PULL); // To refer to outside resource. + ppat.addOption(PushPullValue.PULL); // To refer to outside resource. ((DataFlowEdge) resToCh).setAttribute(ppat); pullContained = true; } else { PushPullAttribute ppat = new PushPullAttribute(); - ppat.addOption(PushPullValue.PUSH); // For broadcasting transfer. + ppat.addOption(PushPullValue.PUSH); // For broadcasting transfer. ((DataFlowEdge) resToCh).setAttribute(ppat); unvisitedNodes.remove(srcResNode); trackEdgesBackwardForPush(srcResNode, unvisitedNodes); @@ -114,10 +116,10 @@ } } Set descendantChannels = chNode.getDescendants(); - for (ChannelNode descendantCh: descendantChannels) { - for (Edge resToCh: descendantCh.getInEdges()) { + for (ChannelNode descendantCh : descendantChannels) { + for (Edge resToCh : descendantCh.getInEdges()) { PushPullAttribute ppat = new PushPullAttribute(); - ppat.addOption(PushPullValue.PULL); // For collecting transfer. + ppat.addOption(PushPullValue.PULL); // For collecting transfer. ((DataFlowEdge) resToCh).setAttribute(ppat); pullContained = true; } @@ -139,7 +141,7 @@ } return graph; } - + static private void trackEdgesBackwardForPush(Node resNode, HashSet unvisitedNodes) { // recursively turn push only backward in data-flow. for (Edge chToRes : ((ResourceNode) resNode).getInEdges()) { @@ -149,13 +151,13 @@ Set descendantChannels = chNode.getDescendants(); Set inEdges = new HashSet<>(); inEdges.addAll(chNode.getInEdges()); - for (ChannelNode ancestorCh: ancestorChannels) { + for (ChannelNode ancestorCh : ancestorChannels) { inEdges.addAll(ancestorCh.getInEdges()); } - for (ChannelNode descendantCh: descendantChannels) { + for (ChannelNode descendantCh : descendantChannels) { inEdges.addAll(descendantCh.getInEdges()); } - for (Edge resToCh: inEdges) { + for (Edge resToCh : inEdges) { PushPullAttribute ppat = new PushPullAttribute(); ppat.addOption(PushPullValue.PUSH); ((DataFlowEdge) resToCh).setAttribute(ppat); @@ -167,7 +169,7 @@ } } } - + private static void trackEdgesForwardForPull(Node resNode, HashSet unvisitedNodes) { // recursively turn pull only forward in data-flow. for (Edge resToCh : ((ResourceNode) resNode).getOutEdges()) { @@ -180,13 +182,13 @@ Set descendantChannels = chNode.getDescendants(); Set outEdges = new HashSet<>(); outEdges.addAll(chNode.getOutEdges()); - for (ChannelNode ancestorCh: ancestorChannels) { + for (ChannelNode ancestorCh : ancestorChannels) { outEdges.addAll(ancestorCh.getOutEdges()); } - for (ChannelNode descendantCh: descendantChannels) { + for (ChannelNode descendantCh : descendantChannels) { outEdges.addAll(descendantCh.getOutEdges()); } - for (Edge chToRes: outEdges) { + for (Edge chToRes : outEdges) { Node resNode2 = chToRes.getDestination(); if (unvisitedNodes.contains(resNode2)) { unvisitedNodes.remove(resNode2); diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/TypeInference.java b/AlgebraicDataflowArchitectureModel/src/algorithms/TypeInference.java index f57b895..b8c68b9 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/TypeInference.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/TypeInference.java @@ -1,39 +1,14 @@ package algorithms; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.xml.crypto.Data; - -import models.Node; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Position; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.Variable; -import models.dataConstraintModel.Channel; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.JsonType; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataConstraintModel.StateTransition; +import models.algebra.*; +import models.dataConstraintModel.*; import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.ResourceNode; + +import java.util.*; /** * Type inference for data transfer model - * + * * @author Nitta * */ @@ -48,55 +23,55 @@ static private Map> mapComponentTypes = new HashMap<>(); static private Map, Type> jsonTypes = new HashMap<>(); static private Map> jsonMemberTypes = new HashMap<>(); - + public static Type getListType(Type compType) { return listTypes.get(compType); } - + public static Type getListComponentType(Type listType) { return listComponentTypes.get(listType); } - + public static Collection getListTypes() { return listTypes.values(); } - + public static Type getTupleType(List compTypes) { return tupleTypes.get(compTypes); } - + public static List getTupleComponentTypes(Type tupleType) { return tupleComponentTypes.get(tupleType); } - + public static Collection getTupleTypes() { return tupleTypes.values(); } - + public static Type getPairType(Type compType) { return pairTypes.get(compType); } - + public static Type getPairComponentType(Type pairType) { return pairComponentTypes.get(pairType); } - + public static Type getMapType(List compTypes) { return mapTypes.get(compTypes); } - + public static List getMapComponentTypes(Type mapType) { return mapComponentTypes.get(mapType); } - + public static Type getJsonType(Map memberTypes) { return jsonTypes.get(memberTypes); } - + public static Map getJsonMemberTypes(Type jsonType) { return jsonMemberTypes.get(jsonType); } - + static public void infer(DataTransferModel model) { Map> resources = new HashMap<>(); Map> resourcePathParams = new HashMap<>(); @@ -118,7 +93,7 @@ Map>> expToPair = new HashMap<>(); Map>> expToMap = new HashMap<>(); Map>> expToJson = new HashMap<>(); - + // Maps from the objectId of each group to the set of updated expressions. Map> updateFromResource = new HashMap<>(); Set updateFromResourceOwnership = new HashSet<>(); @@ -129,7 +104,7 @@ Map> updateFromPair = new HashMap<>(); Map> updateFromMap = new HashMap<>(); Map> updateFromJson = new HashMap<>(); - + listComponentTypes.put(DataConstraintModel.typeList, null); listComponentTypes.put(DataConstraintModel.typeListInt, DataConstraintModel.typeInt); listComponentTypes.put(DataConstraintModel.typeListStr, DataConstraintModel.typeString); @@ -142,9 +117,9 @@ pairTypes.put(DataConstraintModel.typeInt, DataConstraintModel.typePairInt); pairTypes.put(DataConstraintModel.typeString, DataConstraintModel.typePairStr); pairTypes.put(DataConstraintModel.typeDouble, DataConstraintModel.typePairDouble); - tupleComponentTypes.put(DataConstraintModel.typeTuple, Arrays.asList(new Type[] { null, null })); - mapComponentTypes.put(DataConstraintModel.typeMap, Arrays.asList(new Type[] { null, null })); - + tupleComponentTypes.put(DataConstraintModel.typeTuple, Arrays.asList(new Type[]{null, null})); + mapComponentTypes.put(DataConstraintModel.typeMap, Arrays.asList(new Type[]{null, null})); + // 1. Collect type information from the architecture model. Collection channels = new HashSet<>(model.getInputChannels()); channels.addAll(model.getChannels()); @@ -224,13 +199,13 @@ } } } - for (Channel childCh: ch.getChildren()) { + for (Channel childCh : ch.getChildren()) { groupForChannel(childCh); } } }; groupExpressionsByResource.groupForChannel(ch); - + // 1.2 Group expressions by variable. IGroupExpressionsByVariable groupExpressionsByVariable = new IGroupExpressionsByVariable() { public void groupForChannel(Channel ch) { @@ -244,13 +219,13 @@ if (st.getNextStateExpression() != null) { allVariables.addAll(st.getNextStateExpression().getVariables().values()); } - for (Selector s: ch.getAllSelectors()) { // add channel selectors + for (Selector s : ch.getAllSelectors()) { // add channel selectors if (s.getExpression() instanceof Variable) { allVariables.add((Variable) s.getExpression()); } } ResourcePath resPath = cm.getResource(); - for (Expression param: resPath.getPathParams()) { // add path parameters + for (Expression param : resPath.getPathParams()) { // add path parameters if (param instanceof Variable) { allVariables.add((Variable) param); } else if (param instanceof Term) { @@ -290,13 +265,13 @@ variables.put(System.identityHashCode(locals.get(varName)), localTypes.get(varName)); } } - for (Channel childCh: ch.getChildren()) { + for (Channel childCh : ch.getChildren()) { groupForChannel(childCh); } } }; groupExpressionsByVariable.groupForChannel(ch); - + // 1.3 Group expressions by message. IGroupExpressionsByMessage groupExpressionsByMessage = new IGroupExpressionsByMessage() { public void groupForChannel(Channel rootCh, Channel ch) { @@ -385,7 +360,7 @@ } } } - for (Channel childCh: ch.getChildren()) { + for (Channel childCh : ch.getChildren()) { groupForChannel(rootCh, childCh); } } @@ -415,7 +390,7 @@ 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 + consExps.add(t); // list term updateExpressionBelonging(expToConsOrSet, t, consExps); if (symbol.equals(DataConstraintModel.cons)) { // If the root symbol of the term is cons. @@ -426,19 +401,19 @@ } 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 + consExps.add(e); // list element updateExpressionBelonging(expToConsOrSet, e, consExps); e = t.getChildren().get(0); - consExps.add(e); // list argument - updateExpressionBelonging(expToConsOrSet, e, consExps); + 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 element + consExps.add(e); // list element updateExpressionBelonging(expToConsOrSet, e, consExps); e = t.getChildren().get(0); - consExps.add(e); // list argument - updateExpressionBelonging(expToConsOrSet, e, consExps); + consExps.add(e); // list argument + updateExpressionBelonging(expToConsOrSet, e, consExps); } Type newType = getExpTypeIfUpdatable(t.getType(), consExps.get(2)); if (newType != null) { @@ -490,9 +465,9 @@ // If the root symbol of the term is head or get. List consExps = new ArrayList<>(); Expression e = t.getChildren().get(0); - consExps.add(e); // list argument + consExps.add(e); // list argument updateExpressionBelonging(expToConsOrSet, e, consExps); - consExps.add(t); // list's component + consExps.add(t); // list's component updateExpressionBelonging(expToConsOrSet, t, consExps); consExps.add(null); Type listType = listTypes.get(t.getType()); @@ -509,7 +484,7 @@ Map updateCons = getUpdateSet(updateFromConsOrSet, consExps); updateCons.put(System.identityHashCode(t), t); } - consOrSet.put(System.identityHashCode(consExps), newListType); + consOrSet.put(System.identityHashCode(consExps), newListType); } else { // If the type of the term is more concrete than the type of the component of the 1st argument. if (consExps.get(0) != null && consExps.get(0) instanceof Variable) { @@ -521,17 +496,17 @@ Map updateCons = getUpdateSet(updateFromConsOrSet, consExps); updateCons.put(System.identityHashCode(consExps.get(0)), consExps.get(0)); } - consOrSet.put(System.identityHashCode(consExps), listType); + consOrSet.put(System.identityHashCode(consExps), listType); } } else if (symbol.equals(DataConstraintModel.tail)) { // If the root symbol of the term is tail. List consExps = new ArrayList<>(); - consExps.add(t); // list term + consExps.add(t); // list term updateExpressionBelonging(expToConsOrSet, t, consExps); - consExps.add(null); // list's component + consExps.add(null); // list's component Expression e = t.getChildren().get(0); - consExps.add(e); // list argument - updateExpressionBelonging(expToConsOrSet, e, consExps); + consExps.add(e); // list argument + updateExpressionBelonging(expToConsOrSet, e, consExps); Type newType = getExpTypeIfUpdatable(t.getType(), consExps.get(2)); if (newType != null) { // If the type of the argument is more concrete than the type of the term. @@ -556,17 +531,17 @@ Map updateCons = getUpdateSet(updateFromConsOrSet, consExps); updateCons.put(System.identityHashCode(consExps.get(2)), consExps.get(2)); } - } + } } consOrSet.put(System.identityHashCode(consExps), t.getType()); } else if (symbol.equals(DataConstraintModel.tuple)) { // If the root symbol of the term is tuple. List tupleExps = new ArrayList<>(); List newArgTypesList = new ArrayList<>(); - tupleExps.add(t); // tuple term + tupleExps.add(t); // tuple term updateExpressionBelonging(expToTuple, t, tupleExps); for (Expression e : t.getChildren()) { - tupleExps.add(e); // tuple's component + tupleExps.add(e); // tuple's component updateExpressionBelonging(expToTuple, e, tupleExps); if (e instanceof Variable) { newArgTypesList.add(((Variable) e).getType()); @@ -591,11 +566,11 @@ } else if (symbol.equals(DataConstraintModel.pair)) { // If the root symbol of the term is pair. List pairExps = new ArrayList<>(); - pairExps.add(t); // pair + pairExps.add(t); // pair updateExpressionBelonging(expToPair, t, pairExps); if (t.getType() == DataConstraintModel.typePair) { for (Expression e : t.getChildren()) { - pairExps.add(e); // left/right + pairExps.add(e); // left/right updateExpressionBelonging(expToPair, e, pairExps); Type newArgType = null; if (e instanceof Variable) { @@ -621,11 +596,11 @@ // If the root symbol of the term is fst. List tupleExps = new ArrayList<>(); Expression arg = t.getChildren().get(0); - tupleExps.add(arg); // tuple argument + tupleExps.add(arg); // tuple argument updateExpressionBelonging(expToTuple, arg, tupleExps); - tupleExps.add(t); // first component + tupleExps.add(t); // first component updateExpressionBelonging(expToTuple, t, tupleExps); - tupleExps.add(null); // second component + tupleExps.add(null); // second component Type argType = null; if (arg instanceof Variable) { argType = ((Variable) arg).getType(); @@ -660,10 +635,10 @@ // If the root symbol of the term is snd. List tupleExps = new ArrayList<>(); Expression arg = t.getChildren().get(0); - tupleExps.add(arg); // tuple argument + tupleExps.add(arg); // tuple argument updateExpressionBelonging(expToTuple, arg, tupleExps); - tupleExps.add(null); // first component - tupleExps.add(t); // second component + tupleExps.add(null); // first component + tupleExps.add(t); // second component updateExpressionBelonging(expToTuple, t, tupleExps); Type argType = null; if (arg instanceof Variable) { @@ -678,7 +653,7 @@ if (DataConstraintModel.typeTuple.isAncestorOf(t.getType())) { List sndTypes = tupleComponentTypes.get(t.getType()); if (sndTypes != null) { - for (Type t2: sndTypes) { + for (Type t2 : sndTypes) { newCompTypeList.add(t2); } } else { @@ -710,11 +685,11 @@ // If the root symbol of the term is left. List pairExps = new ArrayList<>(); Expression arg = t.getChildren().get(0); - pairExps.add(arg); // pair + pairExps.add(arg); // pair updateExpressionBelonging(expToPair, arg, pairExps); - pairExps.add(t); // left + pairExps.add(t); // left updateExpressionBelonging(expToPair, t, pairExps); - pairExps.add(null); // right + pairExps.add(null); // right Type argType = null; if (arg instanceof Variable) { argType = ((Variable) arg).getType(); @@ -748,10 +723,10 @@ // If the root symbol of the term is right. List pairExps = new ArrayList<>(); Expression arg = t.getChildren().get(0); - pairExps.add(arg); // pair + pairExps.add(arg); // pair updateExpressionBelonging(expToPair, arg, pairExps); - pairExps.add(null); // left - pairExps.add(t); // right + pairExps.add(null); // left + pairExps.add(t); // right updateExpressionBelonging(expToPair, t, pairExps); Type argType = null; if (arg instanceof Variable) { @@ -785,13 +760,13 @@ } else if (symbol.equals(DataConstraintModel.lookup)) { // If the root symbol of the term is lookup. List mapExps = new ArrayList<>(); - Expression arg1 = t.getChildren().get(0); // map + Expression arg1 = t.getChildren().get(0); // map mapExps.add(arg1); updateExpressionBelonging(expToMap, arg1, mapExps); - Expression arg2 = t.getChildren().get(1); // key + Expression arg2 = t.getChildren().get(1); // key mapExps.add(arg2); updateExpressionBelonging(expToMap, arg2, mapExps); - mapExps.add(t); // value + mapExps.add(t); // value updateExpressionBelonging(expToMap, t, mapExps); Type arg1Type = null; if (arg1 instanceof Variable) { @@ -821,7 +796,7 @@ } else if (arg1 instanceof Term) { ((Term) arg1).setType(newMapType); arg1Type = newMapType; - } + } Map updateExps = getUpdateSet(updateFromMap, mapExps); updateExps.put(System.identityHashCode(arg1), arg1); } @@ -829,15 +804,15 @@ } else if (symbol.equals(DataConstraintModel.insert)) { // If the root symbol of the term is insert. List mapExps = new ArrayList<>(); - mapExps.add(t); // map + mapExps.add(t); // map updateExpressionBelonging(expToMap, t, mapExps); - Expression arg1 = t.getChildren().get(1); // key + Expression arg1 = t.getChildren().get(1); // key mapExps.add(arg1); updateExpressionBelonging(expToMap, arg1, mapExps); - Expression arg2 = t.getChildren().get(2); // value + Expression arg2 = t.getChildren().get(2); // value mapExps.add(arg2); updateExpressionBelonging(expToMap, arg2, mapExps); - Expression arg0 = t.getChildren().get(0); // map + Expression arg0 = t.getChildren().get(0); // map mapExps.add(arg0); updateExpressionBelonging(expToMap, arg0, mapExps); Type termType = t.getType(); @@ -909,13 +884,13 @@ Expression jsonArg = t.getChildren().get(0); Expression keyArg = t.getChildren().get(1); Expression valueArg = t.getChildren().get(2); - dotExps.add(t); // json + dotExps.add(t); // json updateExpressionBelonging(expToJson, t, dotExps); - dotExps.add(keyArg); // key + dotExps.add(keyArg); // key updateExpressionBelonging(expToJson, keyArg, dotExps); - dotExps.add(valueArg); // value + dotExps.add(valueArg); // value updateExpressionBelonging(expToJson, valueArg, dotExps); - dotExps.add(jsonArg); // json + dotExps.add(jsonArg); // json updateExpressionBelonging(expToJson, jsonArg, dotExps); Type jsonType = t.getType(); Type valueType = null; @@ -957,13 +932,13 @@ List dotExps = new ArrayList<>(); Expression jsonArg = t.getChildren().get(0); Expression keyArg = t.getChildren().get(1); - dotExps.add(jsonArg); // json + dotExps.add(jsonArg); // json updateExpressionBelonging(expToJson, jsonArg, dotExps); - dotExps.add(keyArg); // key + dotExps.add(keyArg); // key updateExpressionBelonging(expToJson, keyArg, dotExps); - dotExps.add(t); // value + dotExps.add(t); // value updateExpressionBelonging(expToJson, t, dotExps); - dotExps.add(null); // json + dotExps.add(null); // json Type jsonType = null; if (jsonArg instanceof Variable) { jsonType = ((Variable) jsonArg).getType(); @@ -1002,12 +977,12 @@ List dotExps = new ArrayList<>(); Expression jsonArg = t.getChildren().get(0); Expression keyArg = t.getChildren().get(1); - dotExps.add(jsonArg); // json (list/map) + dotExps.add(jsonArg); // json (list/map) updateExpressionBelonging(expToJson, jsonArg, dotExps); - dotExps.add(null); // key - dotExps.add(t); // value + dotExps.add(null); // key + dotExps.add(t); // value updateExpressionBelonging(expToJson, t, dotExps); - dotExps.add(null); // json + dotExps.add(null); // json Type jsonType = null; if (jsonArg instanceof Variable) { jsonType = ((Variable) jsonArg).getType(); @@ -1034,7 +1009,7 @@ newJsonType = createNewListType(t.getType(), DataConstraintModel.typeList); } } else if (jsonType == DataConstraintModel.typeMap) { - List keyValueTypes = Arrays.asList(new Type[] {DataConstraintModel.typeString, t.getType()}); + List keyValueTypes = Arrays.asList(new Type[]{DataConstraintModel.typeString, t.getType()}); newJsonType = mapTypes.get(keyValueTypes); if (newJsonType == null) { // Create new map type; @@ -1195,13 +1170,13 @@ } } } - for (Channel childCh: ch.getChildren()) { + for (Channel childCh : ch.getChildren()) { extractForChannel(childCh); } } }; extractConstraintsOnExpressionsInTerm.extractForChannel(ch); - + // 1.5 Extract constraints on path parameters and resources. IExtractConstraintsOnPathParametersAndResources extractConstraintsOnPathParametersAndResources = new IExtractConstraintsOnPathParametersAndResources() { public void extractForChannel(Channel ch) { @@ -1242,16 +1217,16 @@ rPath = rPath.getParent(); } } - for (Channel childCh: ch.getChildren()) { + for (Channel childCh : ch.getChildren()) { extractForChannel(childCh); } } }; extractConstraintsOnPathParametersAndResources.extractForChannel(ch); } - + // 1.6 Extract constraints on resource hierarchies. - for (ResourceHierarchy res: model.getResourceHierarchies()) { + for (ResourceHierarchy res : model.getResourceHierarchies()) { if (res.getResourceStateType() != null) { updateFromResourceOwnership.add(res); } @@ -1259,7 +1234,7 @@ // 2. Propagate type information. while (updateFromResource.size() > 0 || updateFromVariable.size() > 0 || updateFromMessage.size() > 0 - || updateFromConsOrSet.size() > 0 || updateFromTuple.size() > 0 || updateFromPair.size() > 0 + || updateFromConsOrSet.size() > 0 || updateFromTuple.size() > 0 || updateFromPair.size() > 0 || updateFromMap.size() > 0 || updateFromJson.size() > 0 || updateFromResourceOwnership.size() > 0) { if (updateFromResource.size() > 0) { Set resourceKeys = updateFromResource.keySet(); @@ -1405,7 +1380,7 @@ } } } - + private static void updateExpressionBelonging(Map>> belonging, Expression exp, List group) { Set> groups = belonging.get(System.identityHashCode(exp)); if (groups == null) { @@ -1418,18 +1393,18 @@ groups.add(group); } } - - private static void updateResourceTypes(Expression exp, Map> resources, Map> expToResource, - Map> updateFromResource, Set updateFromResourceOwnership) { + + private static void updateResourceTypes(Expression exp, Map> resources, Map> expToResource, + Map> updateFromResource, Set updateFromResourceOwnership) { List identicalResources = expToResource.get(System.identityHashCode(exp)); if (identicalResources == null) return; - for (ResourceHierarchy res: resources.keySet()) { + for (ResourceHierarchy res : resources.keySet()) { if (resources.get(res) == identicalResources) { Type resType = res.getResourceStateType(); Type newResType = getExpTypeIfUpdatable(resType, exp); if (newResType != null) { res.setResourceStateType(newResType); - updateFromResourceOwnership.add(res); // To update parent and children resources + updateFromResourceOwnership.add(res); // To update parent and children resources // Update identical resources Map updateExps = getUpdateSet(updateFromResource, identicalResources); for (Expression resExp : identicalResources) { @@ -1449,7 +1424,7 @@ } private static void updateResourcePathParamsTypes(Expression exp, Map> resourcePathParams, Set updateFromResourceOwnership) { - for (ResourceHierarchy parent: resourcePathParams.keySet()) { + for (ResourceHierarchy parent : resourcePathParams.keySet()) { List pathParams = resourcePathParams.get(parent); if (pathParams.contains(exp)) { Type parentType = parent.getResourceStateType(); @@ -1473,10 +1448,10 @@ } } } - - private static void updateResourceOwnershipTypes(ResourceHierarchy res, Map> resources, - Map> expToResource, Map> updateFromResource, Set updateFromResourceOwnership) { - for (ResourceHierarchy parent: resources.keySet()) { + + private static void updateResourceOwnershipTypes(ResourceHierarchy res, Map> resources, + Map> expToResource, Map> updateFromResource, Set updateFromResourceOwnership) { + for (ResourceHierarchy parent : resources.keySet()) { Type resType = res.getResourceStateType(); Set children = parent.getChildren(); if (res.equals(parent)) { @@ -1504,7 +1479,7 @@ } else if (DataConstraintModel.typeJson.isAncestorOf(resType)) { Map newMemberTypes = jsonMemberTypes.get(resType); if (newMemberTypes != null && newMemberTypes.size() > 0 && children != null && children.size() > 0) { - for (ResourceHierarchy chlid: children) { + for (ResourceHierarchy chlid : children) { String key = chlid.getResourceName(); Type memberType = chlid.getResourceStateType(); if (compareTypes(memberType, newMemberTypes.get(key))) { @@ -1533,7 +1508,7 @@ } else if (parentType != null && DataConstraintModel.typeMap.isAncestorOf(parentType)) { List oldComponentTypes = mapComponentTypes.get(parentType); if (compareTypes(oldComponentTypes.get(1), resType)) { - List newComponentTypes = Arrays.asList(new Type[] {DataConstraintModel.typeString, resType}); + List newComponentTypes = Arrays.asList(new Type[]{DataConstraintModel.typeString, resType}); Type newMapType = mapTypes.get(newComponentTypes); if (newMapType == null) { newMapType = createNewMapType(newComponentTypes, parentType); @@ -1545,7 +1520,7 @@ } } else if (parentType != null && DataConstraintModel.typeJson.isAncestorOf(parentType)) { Map oldMemberTypes = jsonMemberTypes.get(parentType); - String key= res.getResourceName(); + String key = res.getResourceName(); if (oldMemberTypes == null || compareTypes(oldMemberTypes.get(key), resType)) { Map newMemberTypes = new HashMap<>(); if (oldMemberTypes != null) newMemberTypes.putAll(oldMemberTypes); @@ -1566,7 +1541,7 @@ List identicalResources = resources.get(res); if (identicalResources != null) { Type newResType = res.getResourceStateType(); - for (Expression resExp: identicalResources) { + for (Expression resExp : identicalResources) { Type resType = null; if (resExp instanceof Variable) { resType = ((Variable) resExp).getType(); @@ -1586,9 +1561,9 @@ } } } - + private static void updateVaribleTypes(Expression exp, Map variables, - Map> expToVariable, Map> updateFromVariable) { + Map> expToVariable, Map> updateFromVariable) { List sameVariable = expToVariable.get(System.identityHashCode(exp)); if (sameVariable == null) return; Type varType = variables.get(System.identityHashCode(sameVariable)); @@ -1626,10 +1601,10 @@ } } } - + private static void updateMessageTypes(Expression exp, - Map, Type>>> messages, - Map> expToMessage, Map> updateFromMessage) { + Map, Type>>> messages, + Map> expToMessage, Map> updateFromMessage) { List messageExps = expToMessage.get(System.identityHashCode(exp)); if (messageExps == null) return; Type msgType = null; @@ -1662,94 +1637,94 @@ } } } - + private static void updateConsOrSetTypes(Expression exp, Map consOrSet, - Map>> expToConsOrSet, Map> updateFromConsOrSet) { + Map>> expToConsOrSet, Map> updateFromConsOrSet) { Set> consComponentGroups = expToConsOrSet.get(System.identityHashCode(exp)); if (consComponentGroups == null) return; - for (List consOrSetComponentGroup: consComponentGroups) { + for (List consOrSetComponentGroup : consComponentGroups) { int idx = consOrSetComponentGroup.indexOf(exp); switch (idx) { - case 0: - // exp is a list itself. - if (!(exp instanceof Term)) break; - Type listType = consOrSet.get(System.identityHashCode(consOrSetComponentGroup)); - Type expType = getExpTypeIfUpdatable(listType, exp); - if (expType != null) { - consOrSet.put(System.identityHashCode(consOrSetComponentGroup), expType); - Map updateExps = getUpdateSet(updateFromConsOrSet, consOrSetComponentGroup); - if (consOrSetComponentGroup.get(2) instanceof Variable) { - ((Variable) consOrSetComponentGroup.get(2)).setType(expType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(2)), consOrSetComponentGroup.get(2)); - } else if (consOrSetComponentGroup.get(2) instanceof Term) { - ((Term) consOrSetComponentGroup.get(2)).setType(expType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(2)), consOrSetComponentGroup.get(2)); + case 0: + // exp is a list itself. + if (!(exp instanceof Term)) break; + Type listType = consOrSet.get(System.identityHashCode(consOrSetComponentGroup)); + Type expType = getExpTypeIfUpdatable(listType, exp); + if (expType != null) { + consOrSet.put(System.identityHashCode(consOrSetComponentGroup), expType); + Map updateExps = getUpdateSet(updateFromConsOrSet, consOrSetComponentGroup); + if (consOrSetComponentGroup.get(2) instanceof Variable) { + ((Variable) consOrSetComponentGroup.get(2)).setType(expType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(2)), consOrSetComponentGroup.get(2)); + } else if (consOrSetComponentGroup.get(2) instanceof Term) { + ((Term) consOrSetComponentGroup.get(2)).setType(expType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(2)), consOrSetComponentGroup.get(2)); + } + Type compType = listComponentTypes.get(expType); + if (consOrSetComponentGroup.get(1) != null && consOrSetComponentGroup.get(1) instanceof Variable) { + ((Variable) consOrSetComponentGroup.get(1)).setType(compType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(1)), consOrSetComponentGroup.get(1)); + } else if (consOrSetComponentGroup.get(1) != null && consOrSetComponentGroup.get(1) instanceof Term) { + ((Term) consOrSetComponentGroup.get(1)).setType(compType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(1)), consOrSetComponentGroup.get(1)); + } } - Type compType = listComponentTypes.get(expType); - if (consOrSetComponentGroup.get(1) != null && consOrSetComponentGroup.get(1) instanceof Variable) { - ((Variable) consOrSetComponentGroup.get(1)).setType(compType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(1)), consOrSetComponentGroup.get(1)); - } else if (consOrSetComponentGroup.get(1) != null && consOrSetComponentGroup.get(1) instanceof Term) { - ((Term) consOrSetComponentGroup.get(1)).setType(compType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(1)), consOrSetComponentGroup.get(1)); + break; + case 1: + // exp is a list's component. + listType = consOrSet.get(System.identityHashCode(consOrSetComponentGroup)); + Type compType = listComponentTypes.get(listType); + Type newCompType = getExpTypeIfUpdatable(compType, exp); + if (newCompType != null) { + Type newListType = listTypes.get(newCompType); + if (newListType == null) { + // Create new list type. + newListType = createNewListType(newCompType, listType); + } + consOrSet.put(System.identityHashCode(consOrSetComponentGroup), newListType); + Map updateExps = getUpdateSet(updateFromConsOrSet, consOrSetComponentGroup); + if (consOrSetComponentGroup.get(0) instanceof Term) { + ((Term) consOrSetComponentGroup.get(0)).setType(newListType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(0)), consOrSetComponentGroup.get(0)); + } + if (consOrSetComponentGroup.get(2) instanceof Variable) { + ((Variable) consOrSetComponentGroup.get(2)).setType(newListType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(2)), consOrSetComponentGroup.get(2)); + } else if (consOrSetComponentGroup.get(2) instanceof Term) { + ((Term) consOrSetComponentGroup.get(2)).setType(newListType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(2)), consOrSetComponentGroup.get(2)); + } } - } - break; - case 1: - // exp is a list's component. - listType = consOrSet.get(System.identityHashCode(consOrSetComponentGroup)); - Type compType = listComponentTypes.get(listType); - Type newCompType = getExpTypeIfUpdatable(compType, exp); - if (newCompType != null) { - Type newListType = listTypes.get(newCompType); - if (newListType == null) { - // Create new list type. - newListType = createNewListType(newCompType, listType); + break; + case 2: + // exp is a list itself. + listType = consOrSet.get(System.identityHashCode(consOrSetComponentGroup)); + expType = getExpTypeIfUpdatable(listType, exp); + if (expType != null) { + consOrSet.put(System.identityHashCode(consOrSetComponentGroup), expType); + Map updateExps = getUpdateSet(updateFromConsOrSet, consOrSetComponentGroup); + if (consOrSetComponentGroup.get(0) instanceof Term) { + ((Term) consOrSetComponentGroup.get(0)).setType(expType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(0)), consOrSetComponentGroup.get(0)); + } + compType = listComponentTypes.get(expType); + if (consOrSetComponentGroup.get(1) != null && consOrSetComponentGroup.get(1) instanceof Variable) { + ((Variable) consOrSetComponentGroup.get(1)).setType(compType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(1)), consOrSetComponentGroup.get(1)); + } else if (consOrSetComponentGroup.get(1) != null && consOrSetComponentGroup.get(1) instanceof Term) { + ((Term) consOrSetComponentGroup.get(1)).setType(compType); + updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(1)), consOrSetComponentGroup.get(1)); + } } - consOrSet.put(System.identityHashCode(consOrSetComponentGroup), newListType); - Map updateExps = getUpdateSet(updateFromConsOrSet, consOrSetComponentGroup); - if (consOrSetComponentGroup.get(0) instanceof Term) { - ((Term) consOrSetComponentGroup.get(0)).setType(newListType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(0)), consOrSetComponentGroup.get(0)); - } - if (consOrSetComponentGroup.get(2) instanceof Variable) { - ((Variable) consOrSetComponentGroup.get(2)).setType(newListType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(2)), consOrSetComponentGroup.get(2)); - } else if (consOrSetComponentGroup.get(2) instanceof Term) { - ((Term) consOrSetComponentGroup.get(2)).setType(newListType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(2)), consOrSetComponentGroup.get(2)); - } - } - break; - case 2: - // exp is a list itself. - listType = consOrSet.get(System.identityHashCode(consOrSetComponentGroup)); - expType = getExpTypeIfUpdatable(listType, exp); - if (expType != null) { - consOrSet.put(System.identityHashCode(consOrSetComponentGroup), expType); - Map updateExps = getUpdateSet(updateFromConsOrSet, consOrSetComponentGroup); - if (consOrSetComponentGroup.get(0) instanceof Term) { - ((Term) consOrSetComponentGroup.get(0)).setType(expType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(0)), consOrSetComponentGroup.get(0)); - } - compType = listComponentTypes.get(expType); - if (consOrSetComponentGroup.get(1) != null && consOrSetComponentGroup.get(1) instanceof Variable) { - ((Variable) consOrSetComponentGroup.get(1)).setType(compType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(1)), consOrSetComponentGroup.get(1)); - } else if (consOrSetComponentGroup.get(1) != null && consOrSetComponentGroup.get(1) instanceof Term) { - ((Term) consOrSetComponentGroup.get(1)).setType(compType); - updateExps.put(System.identityHashCode(consOrSetComponentGroup.get(1)), consOrSetComponentGroup.get(1)); - } - } } } } - + private static void updateTupleTypes(Expression exp, Map tuple, - Map>> expToTuple, Map> updateFromTuple) { + Map>> expToTuple, Map> updateFromTuple) { Set> tupleComponentGroups = expToTuple.get(System.identityHashCode(exp)); if (tupleComponentGroups == null) return; - for (List tupleComponentGroup: tupleComponentGroups) { + for (List tupleComponentGroup : tupleComponentGroups) { int idx = tupleComponentGroup.indexOf(exp); if (idx == 0) { // exp is a tuple itself. @@ -1780,13 +1755,13 @@ if (compareTypes(compType, componentTypes.get(i - 1))) { ((Variable) compExp).setType(componentTypes.get(i - 1)); updateExps.put(System.identityHashCode(compExp), compExp); - } + } } else { // for insert if (compareTypes(compType, newTupleType)) { ((Variable) compExp).setType(newTupleType); updateExps.put(System.identityHashCode(compExp), compExp); - } + } } } } else if (compExp instanceof Term) { @@ -1883,12 +1858,12 @@ } } } - + private static void updatePairTypes(Expression exp, Map pair, - Map>> expToPair, Map> updateFromPair) { + Map>> expToPair, Map> updateFromPair) { Set> pairComponentGroups = expToPair.get(System.identityHashCode(exp)); if (pairComponentGroups == null) return; - for (List pairComponentGroup: pairComponentGroups) { + for (List pairComponentGroup : pairComponentGroups) { int idx = pairComponentGroup.indexOf(exp); if (idx == 0) { // exp is a pair itself. @@ -1940,10 +1915,10 @@ } private static void updateMapTypes(Expression exp, Map map, - Map>> expToMap, Map> updateFromMap) { + Map>> expToMap, Map> updateFromMap) { Set> mapComponentGroups = expToMap.get(System.identityHashCode(exp)); if (mapComponentGroups == null) return; - for (List mapComponentGroup: mapComponentGroups) { + for (List mapComponentGroup : mapComponentGroups) { int idx = mapComponentGroup.indexOf(exp); if (idx == 0 || idx == 3) { // exp is a map itself. @@ -1970,10 +1945,10 @@ } // Propagate an update of a map's type to another map's type. Expression compExp = null; - if (idx == 0 && mapComponentGroup.size() == 4) { // for insert + if (idx == 0 && mapComponentGroup.size() == 4) { // for insert compExp = mapComponentGroup.get(3); } else if (idx == 3) { - compExp = mapComponentGroup.get(0); + compExp = mapComponentGroup.get(0); } if (compExp != null) { if (compExp instanceof Variable) { @@ -2013,7 +1988,7 @@ ((Term) mapExp).setType(newMapType); updateExps.put(System.identityHashCode(mapExp), mapExp); } - if (mapComponentGroup.size() == 4) { // for insert + if (mapComponentGroup.size() == 4) { // for insert mapExp = mapComponentGroup.get(3); if (mapExp instanceof Variable) { ((Variable) mapExp).setType(newMapType); @@ -2021,7 +1996,7 @@ } else if (mapExp instanceof Term) { ((Term) mapExp).setType(newMapType); updateExps.put(System.identityHashCode(mapExp), mapExp); - } + } } map.put(System.identityHashCode(mapComponentGroup), newMapType); } @@ -2031,10 +2006,10 @@ private static void updateJsonTypes(Expression exp, Map json, - Map>> expToJson, Map> updateFromJson) { + Map>> expToJson, Map> updateFromJson) { Set> jsonMemberGroups = expToJson.get(System.identityHashCode(exp)); if (jsonMemberGroups == null) return; - for (List jsonMemberGroup: jsonMemberGroups) { + for (List jsonMemberGroup : jsonMemberGroups) { int idx = jsonMemberGroup.indexOf(exp); if (idx == 3) { // exp is a json argument (0:t = addMember(3:json, 1:key, 2:value)). @@ -2095,7 +2070,7 @@ Type newValueType = getExpTypeIfUpdatable(keyValueTypes.get(1), exp); if (newValueType != null) { // Propagate an update of a member's type to its container's (json's) type. - List newKeyValueTypes = Arrays.asList(new Type[] {DataConstraintModel.typeString, newValueType}); + List newKeyValueTypes = Arrays.asList(new Type[]{DataConstraintModel.typeString, newValueType}); newJsonType = mapTypes.get(newKeyValueTypes); if (newJsonType == null) { // Create new json type. @@ -2160,7 +2135,7 @@ } return newListType; } - + private static Type createNewTupleType(List componentTypes, Type parentTupleType) { String implTypeName = "AbstractMap.SimpleEntry<>"; String interfaceTypeName = "Map.Entry<$x>"; @@ -2195,7 +2170,7 @@ } return newTupleType; } - + private static Type createNewMapType(List componentTypes, Type parentMapType) { String implTypeName = "HashMap<>"; String interfaceTypeName = "Map<$x, $y>"; @@ -2222,13 +2197,13 @@ } return newMapType; } - + private static JsonType createNewJsonType(Map memberTypes, Type parentJsonType) { String implTypeName = "HashMap<>"; String interfaceTypeName = "Map"; List childrenTypes = getChildrenTypes(parentJsonType, jsonMemberTypes.keySet()); JsonType newJsonType = new JsonType("Json", implTypeName, interfaceTypeName, parentJsonType); - for (String key: memberTypes.keySet()) { + for (String key : memberTypes.keySet()) { newJsonType.addMemberType(key, memberTypes.get(key)); } jsonTypes.put(memberTypes, newJsonType); @@ -2246,11 +2221,12 @@ } return newJsonType; } - + /** * Get children types of a given type from given set of types. + * * @param parentType a type - * @param allTypes set of types + * @param allTypes set of types * @return list of the children types */ private static List getChildrenTypes(Type parentType, Set allTypes) { @@ -2262,7 +2238,7 @@ } return childrenTypes; } - + private static String getImplementationTypeName(Type type) { if (type == null) return "Object"; @@ -2271,7 +2247,7 @@ return wrapperType; return type.getImplementationTypeName(); } - + private static String getInterfaceTypeName(Type type) { if (type == null) return "Object"; @@ -2280,7 +2256,7 @@ return wrapperType; return type.getInterfaceTypeName(); } - + private static > Map getUpdateSet(Map> updateSets, U keySet) { Map updatedExps = updateSets.get(System.identityHashCode(keySet)); if (updatedExps == null) { @@ -2289,7 +2265,7 @@ } return updatedExps; } - + private static Type getExpTypeIfUpdatable(Type originalType, Expression newExp) { Type expType = null; if (newExp instanceof Term) { @@ -2302,14 +2278,14 @@ } return null; } - + /** * Is an given original type an ancestor of a given new type? - * + * * @param originalType original type * @param newType new type (may not have been registered) * @return true: if the original type equals to the new type or is an ancestor - * of the new type, false: otherwise + * of the new type, false: otherwise */ private static boolean compareTypes(Type originalType, Type newType) { if (originalType == null) return true; @@ -2322,8 +2298,9 @@ List newCompTypes = mapComponentTypes.get(newType); if (originalCompTypes == null) return true; for (int i = 0; i < originalCompTypes.size(); i++) { - if (originalCompTypes.get(i) != null && - (newCompTypes.get(i) == null || !originalCompTypes.get(i).isAncestorOf(newCompTypes.get(i)))) return false; + if (originalCompTypes.get(i) != null && + (newCompTypes.get(i) == null || !originalCompTypes.get(i).isAncestorOf(newCompTypes.get(i)))) + return false; } return true; } @@ -2338,20 +2315,21 @@ if (originalCompTypes.get(i) != null) { if (DataConstraintModel.typeTuple.isAncestorOf(originalCompTypes.get(i))) { // Unfold the nested tuple's types. - Type tupleType = originalCompTypes.remove(i); - for (Type t: tupleComponentTypes.get(tupleType)) { + Type tupleType = originalCompTypes.remove(i); + for (Type t : tupleComponentTypes.get(tupleType)) { originalCompTypes.add(t); } } if (newCompTypes.size() - 1 < i) return false; if (newCompTypes.get(i) != null && DataConstraintModel.typeTuple.isAncestorOf(newCompTypes.get(i))) { // Unfold the nested tuple's types. - Type tupleType = newCompTypes.remove(i); - for (Type t: tupleComponentTypes.get(tupleType)) { + Type tupleType = newCompTypes.remove(i); + for (Type t : tupleComponentTypes.get(tupleType)) { newCompTypes.add(t); } } - if (newCompTypes.get(i) == null || !originalCompTypes.get(i).isAncestorOf(newCompTypes.get(i))) return false; + if (newCompTypes.get(i) == null || !originalCompTypes.get(i).isAncestorOf(newCompTypes.get(i))) + return false; } } return true; @@ -2360,18 +2338,19 @@ && DataConstraintModel.typeList.isAncestorOf(newType)) { Type originalCompType = listComponentTypes.get(originalType); Type newCompType = listComponentTypes.get(newType); - if (originalCompType != null && (newCompType == null || !originalCompType.isAncestorOf(newCompType))) return false; + if (originalCompType != null && (newCompType == null || !originalCompType.isAncestorOf(newCompType))) + return false; return true; } if (DataConstraintModel.typeJson.isAncestorOf(originalType) && DataConstraintModel.typeJson.isAncestorOf(newType)) { Map originalMemberTypes = jsonMemberTypes.get(originalType); Map newMemberTypes = jsonMemberTypes.get(newType); if (originalMemberTypes == null) return true; - if (originalMemberTypes.keySet().size() < newMemberTypes.keySet().size() + if (originalMemberTypes.keySet().size() < newMemberTypes.keySet().size() && newMemberTypes.keySet().containsAll(originalMemberTypes.keySet())) return true; if (originalMemberTypes.keySet().size() > newMemberTypes.keySet().size()) return false; if (!newMemberTypes.keySet().containsAll(originalMemberTypes.keySet())) return false; - for (String key: originalMemberTypes.keySet()) { + for (String key : originalMemberTypes.keySet()) { if (!originalMemberTypes.get(key).isAncestorOf(newMemberTypes.get(key))) return false; } return true; diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/Validation.java b/AlgebraicDataflowArchitectureModel/src/algorithms/Validation.java index 1744af5..8ee7bc4 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/Validation.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/Validation.java @@ -1,13 +1,13 @@ package algorithms; -import java.util.*; +import models.Node; +import models.dataFlowModel.DataTransferModel; -import models.*; -import models.dataFlowModel.*; +import java.util.*; /** * Validation checker for data transfer model - * + * * @author Nitta * */ @@ -18,7 +18,7 @@ private static Map ids = new HashMap<>(); private static Map lowlink = new HashMap<>(); private static Map onStack = new HashMap<>(); - + static public boolean checkUpdateConflict(DataTransferModel model) { init(); boolean check = true; @@ -29,7 +29,7 @@ } return strong.size() == 0 && check; } - + static private void init() { index = 0; stack = new ArrayDeque<>(); @@ -38,14 +38,14 @@ lowlink = new HashMap<>(); onStack = new HashMap<>(); } - + static private void traverseStronglyConnectedComponents(Node node) { ids.put(node, index); lowlink.put(node, index); index++; stack.push(node); onStack.put(node, true); - + for (Node n : node.getSuccessors()) { if (lowlink.containsKey(n)) { traverseStronglyConnectedComponents(n); diff --git a/AlgebraicDataflowArchitectureModel/src/application/ApplicationMenuBar.java b/AlgebraicDataflowArchitectureModel/src/application/ApplicationMenuBar.java index bcbd998..70ae0dc 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/ApplicationMenuBar.java +++ b/AlgebraicDataflowArchitectureModel/src/application/ApplicationMenuBar.java @@ -6,83 +6,83 @@ import javax.swing.*; public class ApplicationMenuBar extends JMenuBar { - private static final long serialVersionUID = 4811536194182272888L; - - private ApplicationWindow applicationWindow = null; - - private NewResourceAction newResourceAction = null; - private NewChannelAction newChannelAction = null; - private NewEventChannelAction newIOChannelAction = null; - private NewFormulaChannelAction newFormulaChannelAction = null; - private DeleteAction deleteAction = null; - private JavaPrototypeGenerateAction javaPrototypeGenerateAction = null; - private JerseyPrototypeGenerateAction jerseyPrototypeGenerateAction = null; - private DAGLayoutAction dagLayoutAction = null; - private TreeLayoutAction treeLayoutAction = null; - private CircleLayoutAction circleLayoutAction = null; - private ShowNavigationAction showNavigationAction; - private ShowFlowLayerWindowAction showFlowLayerWindowAction; - //private SimulateAction simulateAction = null; - - - public ApplicationMenuBar(ApplicationWindow applicationWindow) { - this.applicationWindow = applicationWindow; - JMenu newMenu = new JMenu("New"); - - newMenu.add(new NewModelAction(applicationWindow)); - - newMenu.add(newResourceAction = new NewResourceAction(applicationWindow.getEditor())); - newMenu.add(newChannelAction = new NewChannelAction(applicationWindow.getEditor())); - newMenu.add(newIOChannelAction = new NewEventChannelAction(applicationWindow.getEditor())); - newMenu.add(newFormulaChannelAction = new NewFormulaChannelAction(applicationWindow.getEditor())); - - JMenu menu = null; - menu = add(new JMenu("File")); - menu.add(newMenu); - menu.add(new OpenAction(applicationWindow)); - menu.addSeparator(); - menu.add(new SaveAction(applicationWindow)); - menu.add(new SaveAsAction(applicationWindow)); - menu.addSeparator(); - menu.add(new ExitAction()); - - menu = add(new JMenu("Edit")); - menu.add(deleteAction = new DeleteAction(applicationWindow.getEditor())); - - - menu = add(new JMenu("Layout")); - menu.add(dagLayoutAction = new DAGLayoutAction(applicationWindow.getEditor())); - menu.add(treeLayoutAction = new TreeLayoutAction(applicationWindow.getEditor())); - menu.add(circleLayoutAction = new CircleLayoutAction(applicationWindow.getEditor())); - - menu = add(new JMenu("View")); - menu.add(new ZoomInAction(applicationWindow.getGraphComponent())); - menu.add(new ZoomOutAction(applicationWindow.getGraphComponent())); - - menu = add(new JMenu("Simulate")); - menu.add(new SimulateAction(applicationWindow)); - - menu = add(new JMenu("Generate")); - menu.add(javaPrototypeGenerateAction = new JavaPrototypeGenerateAction(applicationWindow.getEditor())); - menu.add(jerseyPrototypeGenerateAction = new JerseyPrototypeGenerateAction(applicationWindow.getEditor())); - - menu = add(new JMenu("Window")); - menu.add(showNavigationAction = new ShowNavigationAction(applicationWindow)); - menu.add(showFlowLayerWindowAction = new ShowFlowLayerWindowAction(applicationWindow)); - } - - public Editor getEditor() { - return applicationWindow.getEditor(); - } - - public void setEditor(Editor editor) { - newResourceAction.setEditor(editor); - newChannelAction.setEditor(editor); - newIOChannelAction.setEditor(editor); - deleteAction.setEditor(editor); - javaPrototypeGenerateAction.setEditor(editor); - jerseyPrototypeGenerateAction.setEditor(editor); - treeLayoutAction.setEditor(editor); - circleLayoutAction.setEditor(editor); - } + private static final long serialVersionUID = 4811536194182272888L; + + private ApplicationWindow applicationWindow = null; + + private NewResourceAction newResourceAction = null; + private NewChannelAction newChannelAction = null; + private NewEventChannelAction newIOChannelAction = null; + private NewFormulaChannelAction newFormulaChannelAction = null; + private DeleteAction deleteAction = null; + private JavaPrototypeGenerateAction javaPrototypeGenerateAction = null; + private JerseyPrototypeGenerateAction jerseyPrototypeGenerateAction = null; + private DAGLayoutAction dagLayoutAction = null; + private TreeLayoutAction treeLayoutAction = null; + private CircleLayoutAction circleLayoutAction = null; + private ShowNavigationAction showNavigationAction; + private ShowFlowLayerWindowAction showFlowLayerWindowAction; + //private SimulateAction simulateAction = null; + + + public ApplicationMenuBar(ApplicationWindow applicationWindow) { + this.applicationWindow = applicationWindow; + JMenu newMenu = new JMenu("New"); + + newMenu.add(new NewModelAction(applicationWindow)); + + newMenu.add(newResourceAction = new NewResourceAction(applicationWindow.getEditor())); + newMenu.add(newChannelAction = new NewChannelAction(applicationWindow.getEditor())); + newMenu.add(newIOChannelAction = new NewEventChannelAction(applicationWindow.getEditor())); + newMenu.add(newFormulaChannelAction = new NewFormulaChannelAction(applicationWindow.getEditor())); + + JMenu menu = null; + menu = add(new JMenu("File")); + menu.add(newMenu); + menu.add(new OpenAction(applicationWindow)); + menu.addSeparator(); + menu.add(new SaveAction(applicationWindow)); + menu.add(new SaveAsAction(applicationWindow)); + menu.addSeparator(); + menu.add(new ExitAction()); + + menu = add(new JMenu("Edit")); + menu.add(deleteAction = new DeleteAction(applicationWindow.getEditor())); + + + menu = add(new JMenu("Layout")); + menu.add(dagLayoutAction = new DAGLayoutAction(applicationWindow.getEditor())); + menu.add(treeLayoutAction = new TreeLayoutAction(applicationWindow.getEditor())); + menu.add(circleLayoutAction = new CircleLayoutAction(applicationWindow.getEditor())); + + menu = add(new JMenu("View")); + menu.add(new ZoomInAction(applicationWindow.getGraphComponent())); + menu.add(new ZoomOutAction(applicationWindow.getGraphComponent())); + + menu = add(new JMenu("Simulate")); + menu.add(new SimulateAction(applicationWindow)); + + menu = add(new JMenu("Generate")); + menu.add(javaPrototypeGenerateAction = new JavaPrototypeGenerateAction(applicationWindow.getEditor())); + menu.add(jerseyPrototypeGenerateAction = new JerseyPrototypeGenerateAction(applicationWindow.getEditor())); + + menu = add(new JMenu("Window")); + menu.add(showNavigationAction = new ShowNavigationAction(applicationWindow)); + menu.add(showFlowLayerWindowAction = new ShowFlowLayerWindowAction(applicationWindow)); + } + + public Editor getEditor() { + return applicationWindow.getEditor(); + } + + public void setEditor(Editor editor) { + newResourceAction.setEditor(editor); + newChannelAction.setEditor(editor); + newIOChannelAction.setEditor(editor); + deleteAction.setEditor(editor); + javaPrototypeGenerateAction.setEditor(editor); + jerseyPrototypeGenerateAction.setEditor(editor); + treeLayoutAction.setEditor(editor); + circleLayoutAction.setEditor(editor); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/ApplicationWindow.java b/AlgebraicDataflowArchitectureModel/src/application/ApplicationWindow.java index c692fa3..bfc4f3c 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/ApplicationWindow.java +++ b/AlgebraicDataflowArchitectureModel/src/application/ApplicationWindow.java @@ -3,92 +3,85 @@ import application.editor.Editor; import application.views.FlowLayerWindow; import application.views.NavigationWindow; -import com.mxgraph.model.mxCell; import com.mxgraph.model.mxGeometry; -import com.mxgraph.model.mxGraphModel; import com.mxgraph.swing.handler.mxRubberband; import com.mxgraph.swing.mxGraphComponent; -import com.mxgraph.util.mxEvent; -import com.mxgraph.util.mxEventObject; -import com.mxgraph.util.mxEventSource.mxIEventListener; import com.mxgraph.view.mxGraph; import javax.swing.*; -import java.util.ArrayList; -import java.util.List; public class ApplicationWindow extends JFrame { - private static final long serialVersionUID = -8690140317781055614L; - public static final String title = "Visual Modeling Tool"; - - private Editor editor = null; - private mxGraph graph = null; - private mxGraphComponent graphComponent = null; - - private ApplicationMenuBar menuBar = null; - private NavigationWindow navigationWindow; - private FlowLayerWindow showFlowLayerWindow = null; - - public ApplicationWindow() { - setTitle(title); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - this.graph = new mxGraph() { - public boolean isPort(Object cell) { - mxGeometry geo = getCellGeometry(cell); - return (geo != null) ? geo.isRelative() : false; - } - - public boolean isCellFoldable(Object cell, boolean collapse) { - return false; - } - }; - - this.graphComponent = new mxGraphComponent(graph); - - this.editor = new Editor(graphComponent); - - getContentPane().add(graphComponent); - new mxRubberband(graphComponent); - graph.setAllowDanglingEdges(false); - graph.setCellsDisconnectable(true); - - menuBar = new ApplicationMenuBar(this); - setJMenuBar(menuBar); - setSize(870, 640); - setLocationRelativeTo(null); // Center on screen - - navigationWindow = new NavigationWindow(this, editor); - navigationWindow.setVisible(true); - - showFlowLayerWindow = new FlowLayerWindow(this); - showFlowLayerWindow.setVisible(false); - - editor.addStageChangeListener(navigationWindow); - editor.addStageChangeListener(showFlowLayerWindow); - } - - public mxGraph getGraph() { - return graph; - } - - public mxGraphComponent getGraphComponent() { - return graphComponent; - } - - public Editor getEditor() { - return editor; - } - - public void setEditor(Editor editor) { - this.editor = editor; - } - - public void showNavigationWindow() { - navigationWindow.setVisible(true); - } - - public void showSwitchLayerWindow(){ - showFlowLayerWindow.setVisible(true); - } + private static final long serialVersionUID = -8690140317781055614L; + public static final String title = "Visual Modeling Tool"; + + private Editor editor = null; + private mxGraph graph = null; + private mxGraphComponent graphComponent = null; + + private ApplicationMenuBar menuBar = null; + private NavigationWindow navigationWindow; + private FlowLayerWindow showFlowLayerWindow = null; + + public ApplicationWindow() { + setTitle(title); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + this.graph = new mxGraph() { + public boolean isPort(Object cell) { + mxGeometry geo = getCellGeometry(cell); + return (geo != null) ? geo.isRelative() : false; + } + + public boolean isCellFoldable(Object cell, boolean collapse) { + return false; + } + }; + + this.graphComponent = new mxGraphComponent(graph); + + this.editor = new Editor(graphComponent); + + getContentPane().add(graphComponent); + new mxRubberband(graphComponent); + graph.setAllowDanglingEdges(false); + graph.setCellsDisconnectable(true); + + menuBar = new ApplicationMenuBar(this); + setJMenuBar(menuBar); + setSize(870, 640); + setLocationRelativeTo(null); // Center on screen + + navigationWindow = new NavigationWindow(this, editor); + navigationWindow.setVisible(true); + + showFlowLayerWindow = new FlowLayerWindow(this); + showFlowLayerWindow.setVisible(false); + + editor.addStageChangeListener(navigationWindow); + editor.addStageChangeListener(showFlowLayerWindow); + } + + public mxGraph getGraph() { + return graph; + } + + public mxGraphComponent getGraphComponent() { + return graphComponent; + } + + public Editor getEditor() { + return editor; + } + + public void setEditor(Editor editor) { + this.editor = editor; + } + + public void showNavigationWindow() { + navigationWindow.setVisible(true); + } + + public void showSwitchLayerWindow() { + showFlowLayerWindow.setVisible(true); + } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractEditorAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractEditorAction.java index 8b09b17..4354f6f 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractEditorAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractEditorAction.java @@ -1,23 +1,20 @@ package application.actions; -import javax.swing.AbstractAction; -import javax.swing.Icon; - -import com.mxgraph.view.mxGraph; - import application.editor.Editor; +import javax.swing.*; + public abstract class AbstractEditorAction extends AbstractAction { - + protected Editor editor; - + public AbstractEditorAction(String name, Editor editor) { super(name); this.editor = editor; } - + public void setEditor(Editor editor) { this.editor = editor; } - + } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractSystemAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractSystemAction.java index f734ae0..3d1c26b 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractSystemAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractSystemAction.java @@ -1,23 +1,20 @@ package application.actions; -import java.awt.event.ActionEvent; - -import javax.swing.AbstractAction; - import application.ApplicationWindow; -import application.editor.Editor; + +import javax.swing.*; public abstract class AbstractSystemAction extends AbstractAction { - + protected ApplicationWindow frame; - + public AbstractSystemAction(String name, ApplicationWindow frame) { super(name); this.frame = frame; } - + public void setFrame(ApplicationWindow frame) { this.frame = frame; } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractViewerAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractViewerAction.java index 422c537..8787840 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractViewerAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/AbstractViewerAction.java @@ -1,15 +1,13 @@ package application.actions; -import java.awt.event.ActionEvent; - -import javax.swing.AbstractAction; - import com.mxgraph.swing.mxGraphComponent; +import javax.swing.*; + public abstract class AbstractViewerAction extends AbstractAction { - + protected mxGraphComponent graphComponent = null; - + public AbstractViewerAction(String name, mxGraphComponent graphComponent) { super(name); this.graphComponent = graphComponent; diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/CircleLayoutAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/CircleLayoutAction.java index ba643bc..13a5a44 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/CircleLayoutAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/CircleLayoutAction.java @@ -1,18 +1,18 @@ package application.actions; -import java.awt.event.ActionEvent; - import application.editor.Editor; -public class CircleLayoutAction extends AbstractEditorAction { +import java.awt.event.ActionEvent; +public class CircleLayoutAction extends AbstractEditorAction { + public CircleLayoutAction(Editor editor) { super("Circle Layout", editor); } - + @Override public void actionPerformed(ActionEvent e) { editor.setCircleLayout(); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/DAGLayoutAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/DAGLayoutAction.java index 8dcc54f..8b5113e 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/DAGLayoutAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/DAGLayoutAction.java @@ -1,11 +1,11 @@ package application.actions; -import java.awt.event.ActionEvent; - import application.editor.Editor; -public class DAGLayoutAction extends AbstractEditorAction { +import java.awt.event.ActionEvent; +public class DAGLayoutAction extends AbstractEditorAction { + public DAGLayoutAction(Editor editor) { super("DAG Layout", editor); } @@ -14,5 +14,5 @@ public void actionPerformed(ActionEvent e) { editor.setDAGLayout(); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/DeleteAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/DeleteAction.java index 23225f1..8ac4dfc 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/DeleteAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/DeleteAction.java @@ -1,23 +1,23 @@ package application.actions; -import java.awt.event.ActionEvent; - import application.editor.Editor; -public class DeleteAction extends AbstractEditorAction { +import java.awt.event.ActionEvent; +public class DeleteAction extends AbstractEditorAction { + /** - * + * */ private static final long serialVersionUID = -4410145389391154784L; - + public DeleteAction(Editor editor) { super("Delete", editor); } - + @Override public void actionPerformed(ActionEvent e) { editor.delete(); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/ExitAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/ExitAction.java index 4069533..97de52e 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/ExitAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/ExitAction.java @@ -1,22 +1,21 @@ package application.actions; +import javax.swing.*; import java.awt.event.ActionEvent; -import javax.swing.AbstractAction; - public class ExitAction extends AbstractAction { /** - * + * */ private static final long serialVersionUID = -8733766417378036850L; - + public ExitAction() { super("Exit"); } - + @Override public void actionPerformed(ActionEvent e) { System.exit(0); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/JavaPrototypeGenerateAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/JavaPrototypeGenerateAction.java index 846c273..46bf35c 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/JavaPrototypeGenerateAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/JavaPrototypeGenerateAction.java @@ -1,42 +1,33 @@ package application.actions; +import algorithms.TypeInference; +import application.editor.Editor; +import code.ast.CompilationUnit; +import generators.*; +import models.dataConstraintModel.ResourceHierarchy; +import models.dataFlowModel.DataFlowGraph; +import models.dataFlowModel.DataTransferModel; +import models.dataFlowModel.ModelExtension; + +import javax.swing.*; import java.awt.event.ActionEvent; -import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; -import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import javax.swing.JFileChooser; - -import algorithms.*; -import application.editor.Editor; -import code.ast.*; -import generators.CodeGeneratorFromDataFlowGraph; -import generators.DataTransferMethodAnalyzer; -import generators.JavaCodeGenerator; -import generators.JavaMethodBodyGenerator; -import generators.JavaSpecific; -import generators.StandaloneSpecific; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.ModelExtension; -import models.dataFlowModel.DataFlowGraph; - public class JavaPrototypeGenerateAction extends AbstractEditorAction { /** - * + * */ private static final long serialVersionUID = -3694103632055735068L; - + private String lastDir = null; - + public JavaPrototypeGenerateAction(Editor editor) { super("Generate Plain Java Prototype", editor); } - + @Override public void actionPerformed(ActionEvent e) { DataFlowGraph graph = editor.getDataFlowGraph(); @@ -49,16 +40,16 @@ if (fileName == null) fileName = "Main"; String mainTypeName = fileName.split("\\.")[0]; boolean exist = false; - for (ResourceHierarchy res: model.getResourceHierarchies()) { + for (ResourceHierarchy res : model.getResourceHierarchies()) { String resourceName = res.getResourceName().substring(0, 1).toUpperCase() + res.getResourceName().substring(1); if (mainTypeName.equals(resourceName)) { exist = true; } } if (!exist) { - JavaCodeGenerator.setMainTypeName(mainTypeName); // use model's file name as the main type's name. + JavaCodeGenerator.setMainTypeName(mainTypeName); // use model's file name as the main type's name. } else { - JavaCodeGenerator.resetMainTypeName(); // use the default main type's name. + JavaCodeGenerator.resetMainTypeName(); // use the default main type's name. } // editor.setCodes(JavaMethodBodyGenerator.doGenerate(graph, model, JavaCodeGenerator.doGenerate(graph, model))); editor.setCodes(new CodeGeneratorFromDataFlowGraph().generateCode(model, graph, new StandaloneSpecific(), new JavaSpecific())); @@ -67,7 +58,7 @@ System.out.println(file); } - String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); + String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); JFileChooser fc = new JFileChooser(wd); fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); int rc = fc.showSaveDialog(null); @@ -79,7 +70,7 @@ } } } - + private void save(File dir, CompilationUnit cu) { File javaFile = new File(dir.getPath(), cu.getFileName()); try { @@ -90,5 +81,5 @@ e.printStackTrace(); } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/JerseyPrototypeGenerateAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/JerseyPrototypeGenerateAction.java index da1a3df..2a7cc25 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/JerseyPrototypeGenerateAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/JerseyPrototypeGenerateAction.java @@ -1,39 +1,33 @@ package application.actions; +import algorithms.TypeInference; +import application.editor.Editor; +import code.ast.CompilationUnit; +import generators.*; +import models.dataConstraintModel.ResourceHierarchy; +import models.dataFlowModel.DataFlowGraph; +import models.dataFlowModel.DataTransferModel; +import models.dataFlowModel.ModelExtension; + +import javax.swing.*; import java.awt.event.ActionEvent; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import javax.swing.JFileChooser; - -import algorithms.*; -import application.editor.Editor; -import code.ast.*; -import generators.CodeGeneratorFromDataFlowGraph; -import generators.DataTransferMethodAnalyzer; -import generators.JavaSpecific; -import generators.JerseyCodeGenerator; -import generators.JerseyMethodBodyGenerator; -import generators.JerseySpecific; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.ModelExtension; -import models.dataFlowModel.DataFlowGraph; - public class JerseyPrototypeGenerateAction extends AbstractEditorAction { /** - * + * */ private static final long serialVersionUID = 1117065654665887436L; private String lastDir = null; - + public JerseyPrototypeGenerateAction(Editor editor) { super("Generate JAX-RS Prototype", editor); } - + @Override public void actionPerformed(ActionEvent e) { DataFlowGraph graph = editor.getDataFlowGraph(); @@ -46,16 +40,16 @@ if (fileName == null) fileName = "Main"; String mainTypeName = fileName.split("\\.")[0]; boolean exist = false; - for (ResourceHierarchy res: model.getResourceHierarchies()) { + for (ResourceHierarchy res : model.getResourceHierarchies()) { String resourceName = res.getResourceName().substring(0, 1).toUpperCase() + res.getResourceName().substring(1); if (mainTypeName.equals(resourceName)) { exist = true; } } if (!exist) { - JerseyCodeGenerator.setMainTypeName(mainTypeName); // use model's file name as the main type's name. + JerseyCodeGenerator.setMainTypeName(mainTypeName); // use model's file name as the main type's name. } else { - JerseyCodeGenerator.resetMainTypeName(); // use the default main type's name. + JerseyCodeGenerator.resetMainTypeName(); // use the default main type's name. } // editor.setCodes(JerseyMethodBodyGenerator.doGenerate(graph, model, JerseyCodeGenerator.doGenerate(graph, model))); editor.setCodes(new CodeGeneratorFromDataFlowGraph().generateCode(model, graph, new JerseySpecific(), new JavaSpecific())); @@ -64,7 +58,7 @@ System.out.println(file); } - String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); + String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); JFileChooser fc = new JFileChooser(wd); fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); int rc = fc.showSaveDialog(null); @@ -76,7 +70,7 @@ } } } - + private void save(File dir, CompilationUnit cu) { File javaFile = new File(dir.getPath(), cu.getFileName()); try { @@ -87,5 +81,5 @@ e.printStackTrace(); } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/NewChannelAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/NewChannelAction.java index 1006055..6535f18 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/NewChannelAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/NewChannelAction.java @@ -1,28 +1,26 @@ package application.actions; +import application.editor.Editor; + +import javax.swing.*; import java.awt.event.ActionEvent; -import javax.swing.JOptionPane; - -import application.editor.Editor; -import models.dataFlowModel.DataTransferChannel; - public class NewChannelAction extends AbstractEditorAction { - + /** - * + * */ private static final long serialVersionUID = 5979007029473101802L; public NewChannelAction(Editor editor) { super("Channel...", editor); } - + @Override public void actionPerformed(ActionEvent e) { String channelName = JOptionPane.showInputDialog("Channel Name:"); if (channelName == null) return; editor.addChannel(channelName); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/NewEventChannelAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/NewEventChannelAction.java index df10657..315b07a 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/NewEventChannelAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/NewEventChannelAction.java @@ -1,28 +1,26 @@ package application.actions; +import application.editor.Editor; + +import javax.swing.*; import java.awt.event.ActionEvent; -import javax.swing.JOptionPane; - -import application.editor.Editor; -import models.dataFlowModel.DataTransferChannel; - public class NewEventChannelAction extends AbstractEditorAction { - + /** - * + * */ private static final long serialVersionUID = -1657072017390171313L; - + public NewEventChannelAction(Editor editor) { super("Event Channel...", editor); } - + @Override public void actionPerformed(ActionEvent e) { String channelName = JOptionPane.showInputDialog("Event Channel Name:"); if (channelName == null) return; editor.addEventChannel(channelName); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/NewFormulaChannelAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/NewFormulaChannelAction.java index 245be58..6487bf5 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/NewFormulaChannelAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/NewFormulaChannelAction.java @@ -1,41 +1,27 @@ package application.actions; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.FlowLayout; -import java.awt.Frame; -import java.awt.GridLayout; +import application.editor.Editor; + +import javax.swing.*; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import application.ApplicationWindow; -import application.editor.Editor; -import models.visualModel.FormulaChannel; - public class NewFormulaChannelAction extends AbstractEditorAction implements ActionListener { /** - * + * */ private static final long serialVersionUID = 5345875219049178252L; public NewFormulaChannelAction(Editor editor) { super("FormulaChannel...", editor); } - + @Override public void actionPerformed(ActionEvent e) { JPanel panel = new JPanel(); - GridLayout layout = new GridLayout(2,2); + GridLayout layout = new GridLayout(2, 2); panel.setLayout(layout); layout.setVgap(5); layout.setHgap(20); @@ -45,17 +31,17 @@ panel.add(new JLabel("Symbol:")); JTextField symbolText = new JTextField(); panel.add(symbolText); - + int r = JOptionPane.showConfirmDialog( - null, - panel, - "New Formula Channel", - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE); + null, + panel, + "New Formula Channel", + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); String channelName = channelText.getText(); String symbol = symbolText.getText(); - if(r == JOptionPane.OK_OPTION) { + if (r == JOptionPane.OK_OPTION) { editor.addFormulaChannel(channelName, editor.getModel().getSymbol(symbol)); } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/NewModelAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/NewModelAction.java index 517f525..e81e5d7 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/NewModelAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/NewModelAction.java @@ -1,24 +1,23 @@ package application.actions; -import java.awt.event.ActionEvent; - import application.ApplicationWindow; -import application.editor.Editor; + +import java.awt.event.ActionEvent; public class NewModelAction extends AbstractSystemAction { /** - * + * */ private static final long serialVersionUID = 8484493203589724589L; - + public NewModelAction(ApplicationWindow frame) { super("Model", frame); } - + @Override public void actionPerformed(ActionEvent e) { frame.getEditor().clear(); - frame.setTitle(frame.title); + frame.setTitle(frame.title); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/NewResourceAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/NewResourceAction.java index 3fb3f38..c322ad9 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/NewResourceAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/NewResourceAction.java @@ -1,7 +1,6 @@ package application.actions; import application.editor.Editor; -import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.ResourceNode; import javax.swing.*; @@ -9,34 +8,34 @@ import java.util.List; public class NewResourceAction extends AbstractEditorAction { - - private static final long serialVersionUID = -4439207504700741286L; - - public NewResourceAction(Editor editor) { - super("Resource...", editor); - } - - @Override - public void actionPerformed(ActionEvent e) { - List selectedResNodes = editor.getSelectedResourceNodes(); - String initialName = ""; - if (selectedResNodes != null && selectedResNodes.size() == 1) { - initialName = selectedResNodes.get(0).getPrimaryResourcePath().toString(); - } - String resName = JOptionPane.showInputDialog("Resource Name:", initialName); - if (resName == null) { - return; - } - if (selectedResNodes == null || selectedResNodes.size() == 0) { - editor.addResourceNode(null, resName); - } else if (selectedResNodes.size() == 1) { - if (initialName.length() > 0 && resName.startsWith(initialName)) { - resName = resName.substring(initialName.length()); - if (resName.startsWith(".")) { - resName = resName.substring(1); - } - } - editor.addResourceNode(selectedResNodes.get(0), resName); - } - } + + private static final long serialVersionUID = -4439207504700741286L; + + public NewResourceAction(Editor editor) { + super("Resource...", editor); + } + + @Override + public void actionPerformed(ActionEvent e) { + List selectedResNodes = editor.getSelectedResourceNodes(); + String initialName = ""; + if (selectedResNodes != null && selectedResNodes.size() == 1) { + initialName = selectedResNodes.get(0).getPrimaryResourcePath().toString(); + } + String resName = JOptionPane.showInputDialog("Resource Name:", initialName); + if (resName == null) { + return; + } + if (selectedResNodes == null || selectedResNodes.size() == 0) { + editor.addResourceNode(null, resName); + } else if (selectedResNodes.size() == 1) { + if (initialName.length() > 0 && resName.startsWith(initialName)) { + resName = resName.substring(initialName.length()); + if (resName.startsWith(".")) { + resName = resName.substring(1); + } + } + editor.addResourceNode(selectedResNodes.get(0), resName); + } + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/OpenAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/OpenAction.java index 90f3ca1..7e7ba3e 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/OpenAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/OpenAction.java @@ -10,54 +10,54 @@ import java.io.File; public class OpenAction extends AbstractSystemAction { - - private static final long serialVersionUID = -8290761032629599683L; - - private String lastDir = null; - - public OpenAction(ApplicationWindow frame) { - super("Open...", frame); - } - - @Override - public void actionPerformed(ActionEvent e) { - Editor editor = frame.getEditor(); - if (editor == null) { - return; - } - String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); - - JFileChooser fc = buildFileChooser(wd); - int option = fc.showDialog(null, "Open Model File"); - if (option == JFileChooser.APPROVE_OPTION) { - lastDir = fc.getSelectedFile().getParent(); - editor.open(fc.getSelectedFile()); - frame.setTitle(ApplicationWindow.title + " - " + fc.getSelectedFile().getAbsolutePath()); - } - } - - private static JFileChooser buildFileChooser(String wd) { - JFileChooser fc = new JFileChooser(wd); - - FileFilter model = new FileNameExtensionFilter("model", "model"); - FileFilter dtram = new FileNameExtensionFilter("dtram", "dtram"); - - // Adds file filter for supported file format - FileFilter defaultFilter = new FileFilter() { - public boolean accept(File file) { - String lowerCase = file.getName().toLowerCase(); - return lowerCase.endsWith(".model"); - } - - @Override - public String getDescription() { - return null; - } - }; - - fc.addChoosableFileFilter(defaultFilter); - fc.addChoosableFileFilter(model); - fc.addChoosableFileFilter(dtram); - return fc; - } + + private static final long serialVersionUID = -8290761032629599683L; + + private String lastDir = null; + + public OpenAction(ApplicationWindow frame) { + super("Open...", frame); + } + + @Override + public void actionPerformed(ActionEvent e) { + Editor editor = frame.getEditor(); + if (editor == null) { + return; + } + String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); + + JFileChooser fc = buildFileChooser(wd); + int option = fc.showDialog(null, "Open Model File"); + if (option == JFileChooser.APPROVE_OPTION) { + lastDir = fc.getSelectedFile().getParent(); + editor.open(fc.getSelectedFile()); + frame.setTitle(ApplicationWindow.title + " - " + fc.getSelectedFile().getAbsolutePath()); + } + } + + private static JFileChooser buildFileChooser(String wd) { + JFileChooser fc = new JFileChooser(wd); + + FileFilter model = new FileNameExtensionFilter("model", "model"); + FileFilter dtram = new FileNameExtensionFilter("dtram", "dtram"); + + // Adds file filter for supported file format + FileFilter defaultFilter = new FileFilter() { + public boolean accept(File file) { + String lowerCase = file.getName().toLowerCase(); + return lowerCase.endsWith(".model"); + } + + @Override + public String getDescription() { + return null; + } + }; + + fc.addChoosableFileFilter(defaultFilter); + fc.addChoosableFileFilter(model); + fc.addChoosableFileFilter(dtram); + return fc; + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAction.java index 0b41331..2b12295 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAction.java @@ -1,20 +1,20 @@ package application.actions; -import java.awt.event.ActionEvent; - import application.ApplicationWindow; import application.editor.Editor; +import java.awt.event.ActionEvent; + public class SaveAction extends AbstractSystemAction { /** - * + * */ private static final long serialVersionUID = 5660460585305281982L; - + public SaveAction(ApplicationWindow frame) { super("Save", frame); } - + @Override public void actionPerformed(ActionEvent e) { Editor editor = frame.getEditor(); @@ -22,5 +22,5 @@ editor.save(); } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAsAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAsAction.java index 9542cdb..049d6a8 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAsAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/SaveAsAction.java @@ -1,45 +1,43 @@ package application.actions; -import java.awt.event.ActionEvent; -import java.io.File; - -import javax.swing.AbstractAction; -import javax.swing.JFileChooser; -import javax.swing.filechooser.FileFilter; -import javax.swing.filechooser.FileNameExtensionFilter; - import application.ApplicationWindow; import application.editor.Editor; +import javax.swing.*; +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; +import java.awt.event.ActionEvent; +import java.io.File; + public class SaveAsAction extends AbstractSystemAction { /** - * + * */ private static final long serialVersionUID = -2599502783032684084L; - + private String lastDir = null; - + public SaveAsAction(ApplicationWindow frame) { super("Save As...", frame); } - + @Override public void actionPerformed(ActionEvent e) { Editor editor = frame.getEditor(); if (editor != null) { - String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); - + String wd = (lastDir != null) ? lastDir : System.getProperty("user.dir"); + JFileChooser fc = new JFileChooser(wd); - FileFilter model = new FileNameExtensionFilter("model","model"); + FileFilter model = new FileNameExtensionFilter("model", "model"); FileFilter dtram = new FileNameExtensionFilter("dtram", "dtram"); // Adds file filter for supported file format FileFilter defaultFilter = new FileFilter() { public boolean accept(File file) { String lcase = file.getName().toLowerCase(); - return lcase.endsWith(".model"); + return lcase.endsWith(".model"); } - + @Override public String getDescription() { return null; @@ -53,19 +51,19 @@ // choose a file extension from a dialog. if (rc == JFileChooser.APPROVE_OPTION) { - + // if extension filter is filled, then attaching extension by choosing filter. // but if it's not filled, then using default extension name. - String extension = ""; - if(fc.getFileFilter() instanceof FileNameExtensionFilter) { - FileNameExtensionFilter selectedFilter = (FileNameExtensionFilter)fc.getFileFilter(); + String extension = ""; + if (fc.getFileFilter() instanceof FileNameExtensionFilter) { + FileNameExtensionFilter selectedFilter = (FileNameExtensionFilter) fc.getFileFilter(); extension = "." + selectedFilter.getExtensions()[0].toString(); } lastDir = fc.getSelectedFile().getParent(); String fileName = fc.getSelectedFile().getAbsolutePath() + extension; - editor.setCurFilePath(fileName); + editor.setCurFilePath(fileName); // overwriting file editor.save(); @@ -73,5 +71,5 @@ } } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/ShowFlowLayerWindowAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/ShowFlowLayerWindowAction.java index a73a535..6a68bc0 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/ShowFlowLayerWindowAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/ShowFlowLayerWindowAction.java @@ -5,13 +5,13 @@ import java.awt.event.ActionEvent; public class ShowFlowLayerWindowAction extends AbstractSystemAction { - - public ShowFlowLayerWindowAction(ApplicationWindow frame) { - super(/*propName*/"Show FlowLayer", frame); - } - - @Override - public void actionPerformed(ActionEvent e) { - frame.showSwitchLayerWindow(); - } + + public ShowFlowLayerWindowAction(ApplicationWindow frame) { + super(/*propName*/"Show FlowLayer", frame); + } + + @Override + public void actionPerformed(ActionEvent e) { + frame.showSwitchLayerWindow(); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/ShowNavigationAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/ShowNavigationAction.java index 0dc4b9e..396ff73 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/ShowNavigationAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/ShowNavigationAction.java @@ -5,13 +5,13 @@ import java.awt.event.ActionEvent; public class ShowNavigationAction extends AbstractSystemAction { - - public ShowNavigationAction(ApplicationWindow frame) { - super("Show Navigation", frame); - } - - @Override - public void actionPerformed(ActionEvent e) { - frame.showNavigationWindow(); - } + + public ShowNavigationAction(ApplicationWindow frame) { + super("Show Navigation", frame); + } + + @Override + public void actionPerformed(ActionEvent e) { + frame.showNavigationWindow(); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/SimulateAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/SimulateAction.java index 26a1779..d1c35bd 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/SimulateAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/SimulateAction.java @@ -1,38 +1,29 @@ package application.actions; -import java.awt.event.ActionEvent; -import java.io.File; - -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; -import javax.swing.filechooser.FileNameExtensionFilter; - import application.ApplicationWindow; -import application.editor.Editor; import application.simulator.SimulatorWindow; -import models.dataFlowModel.DataTransferChannel; + +import java.awt.event.ActionEvent; public class SimulateAction extends AbstractSystemAction { private SimulatorWindow simulatorWindow = null; - + /** - * + * */ private static final long serialVersionUID = -995609232489316795L; - + public SimulateAction(ApplicationWindow frame) { super("Simulate", frame); //this.simulatorWindow = new SimulatorWindow(frame.getEditor()); } - - + + @Override public void actionPerformed(ActionEvent e) { this.simulatorWindow = new SimulatorWindow(frame.getEditor()); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/TreeLayoutAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/TreeLayoutAction.java index c2324c8..507b4bd 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/TreeLayoutAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/TreeLayoutAction.java @@ -1,18 +1,18 @@ package application.actions; -import java.awt.event.ActionEvent; - import application.editor.Editor; -public class TreeLayoutAction extends AbstractEditorAction { +import java.awt.event.ActionEvent; +public class TreeLayoutAction extends AbstractEditorAction { + public TreeLayoutAction(Editor editor) { super("Tree Layout", editor); } - + @Override public void actionPerformed(ActionEvent e) { editor.setTreeLayout(); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/ZoomInAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/ZoomInAction.java index d3b2c85..60f65d7 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/ZoomInAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/ZoomInAction.java @@ -1,28 +1,22 @@ package application.actions; -import java.awt.event.ActionEvent; - -import javax.swing.AbstractAction; -import javax.swing.JOptionPane; - import com.mxgraph.swing.mxGraphComponent; -import com.mxgraph.util.mxResources; -import application.editor.Editor; +import java.awt.event.ActionEvent; public class ZoomInAction extends AbstractViewerAction { /** - * + * */ private static final long serialVersionUID = 6758532166946195926L; - + public ZoomInAction(mxGraphComponent graphComponent) { super("Zoom In", graphComponent); } - + @Override public void actionPerformed(ActionEvent e) { graphComponent.zoomIn(); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/actions/ZoomOutAction.java b/AlgebraicDataflowArchitectureModel/src/application/actions/ZoomOutAction.java index 032e8b2..a447c43 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/actions/ZoomOutAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/actions/ZoomOutAction.java @@ -1,26 +1,22 @@ package application.actions; -import java.awt.event.ActionEvent; - -import javax.swing.AbstractAction; - import com.mxgraph.swing.mxGraphComponent; -import application.editor.Editor; +import java.awt.event.ActionEvent; public class ZoomOutAction extends AbstractViewerAction { /** - * + * */ private static final long serialVersionUID = 8657530769383486605L; - + public ZoomOutAction(mxGraphComponent graphComponent) { super("Zoom Out", graphComponent); } - + @Override public void actionPerformed(ActionEvent e) { graphComponent.zoomOut(); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java index db2fb6f..0dc3ed6 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java @@ -33,526 +33,526 @@ import java.util.List; public class Editor { - - protected DataTransferModel model = null; - - protected mxGraph graph; - private final mxGraphComponent graphComponent; - - protected Stage curStage; - private final List stageChangeListeners; - - private mxIEventListener curChangeEventListener = null; - private MouseListener curMouseEventListener = null; - - protected String curFileName = null; - protected String curFilePath = null; - protected ArrayList codes = null; - - public static DataFlowModelingStage STAGE_DATA_FLOW_MODELING = null; - public static PushPullSelectionStage STAGE_PUSH_PULL_SELECTION = null; - - public Editor(mxGraphComponent graphComponent) { - this.graphComponent = graphComponent; - this.graph = graphComponent.getGraph(); - - STAGE_DATA_FLOW_MODELING = new DataFlowModelingStage(graphComponent); - STAGE_PUSH_PULL_SELECTION = new PushPullSelectionStage(graphComponent); - - graphComponent.setCellEditor(STAGE_DATA_FLOW_MODELING.createCellEditor(graphComponent)); - - curStage = STAGE_DATA_FLOW_MODELING; - - stageChangeListeners = new ArrayList<>(); - } - - public boolean canChange(Stage nextStage) { - return nextStage.canChangeFrom(curStage); - } - - public boolean changeStage(Stage nextStage) { - if (!nextStage.canChangeFrom(curStage)) { - return false; - } - nextStage.init(curStage); - graphComponent.setCellEditor(nextStage.createCellEditor(graphComponent)); - - // add listeners - // "curChangeEventListener" will be called when updating the mxGraph. - if (curChangeEventListener != null) { - graph.getModel().removeListener(curChangeEventListener); - } - curChangeEventListener = nextStage.createChangeEventListener(this); - if (curChangeEventListener != null) { - graph.getModel().addListener(mxEvent.CHANGE, curChangeEventListener); - } - - // A handler of a mouse event. - if (curMouseEventListener != null) { - graphComponent.getGraphControl().removeMouseListener(curMouseEventListener); - } - curMouseEventListener = nextStage.createMouseEventListener(this); - if (curMouseEventListener != null) { - graphComponent.getGraphControl().addMouseListener(curMouseEventListener); - } - curStage = nextStage; - notifyStageChangeListeners(); - return true; - } - - public void addStageChangeListener(IStageChangeListener stageChangeListener) { - stageChangeListeners.add(stageChangeListener); - } - - private void notifyStageChangeListeners() { - for (IStageChangeListener l : stageChangeListeners) { - l.stageChanged(curStage); - } - } - - public DataFlowGraph getDataFlowGraph() { - if (curStage instanceof PushPullSelectionStage) { - return ((PushPullSelectionStage) curStage).getDataFlowGraph(); - } - return null; - } - - public void setCurFilePath(String curFilePath) { - this.curFilePath = curFilePath; - this.curFileName = new File(curFilePath).getName(); - } - - public void clear() { - // Force to change to the data-flow modeling stage - boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); - if (!stageChanged) { - return; - } - ((DataFlowModelingStage) curStage).clear(); - - model = null; - curFilePath = null; - curFileName = null; - codes = null; - } - - /** - * Open a given file, parse the file, construct a DataFlowModel and a mxGraph - * - * @param file given file - */ - public void open(File file) { - // Force to change to data-modeling stage - boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); - if (!stageChanged) { - return; - } - if (file == null || !file.exists()) { - return; - } - // get a file's extension - String extension = file.getName().substring(file.getName().lastIndexOf(".")); - if (extension.contains(".model")) { - openModel(file); - } - if (extension.contains(".dtram")) { - openDTRAM(file); - } - } - - private void openModel(File file) { - try { - Parser parser = new Parser(new BufferedReader(new FileReader(file))); - try { - // Parse the .model file. - model = parser.doParse(); - - // Update stage's model to new parsed one - if (curStage instanceof DataFlowModelingStage) { - ((DataFlowModelingStage) curStage).setModel(model); - } - - // Force to change PushPullSelectionStage to construct mxGraph - boolean stageChanged = changeStage(STAGE_PUSH_PULL_SELECTION); - - // Set layout - setDAGLayout(); - - // Update current file info - curFilePath = file.getAbsolutePath(); - curFileName = file.getName(); - } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | - ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals | - ExpectedRHSExpression | WrongLHSExpression | WrongRHSExpression | ExpectedRightBracket | - ExpectedAssignment | ExpectedRightCurlyBracket | WrongPathExpression | WrongJsonExpression | - ExpectedColon | ExpectedDoubleQuotation e) { - e.printStackTrace(); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - - private void openDTRAM(File file) { - try { - ParserDTRAM parser = new ParserDTRAM(new BufferedReader(new FileReader(file))); - try { - // Parse the .dtram file. - model = parser.doParseModel(); - - // Update stage's model to new parsed one - if (curStage instanceof DataFlowModelingStage) { - ((DataFlowModelingStage) curStage).setModel(model); - } - - // Force to change PushPullSelectionStage to construct mxGraph - boolean stageChanged = changeStage(STAGE_PUSH_PULL_SELECTION); - - // Restore the geometry - parser.doParseGeometry(graph); - - // Update current file info - curFilePath = file.getAbsolutePath(); - curFileName = file.getName(); - } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | - ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals | - ExpectedRHSExpression | WrongLHSExpression | WrongRHSExpression | ExpectedRightBracket | - ExpectedAssignment | ExpectedModel | ExpectedGeometry | ExpectedNode | ExpectedResource | - ExpectedFormulaChannel | ExpectedIoChannel | ExpectedRightCurlyBracket | WrongPathExpression | - WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { - e.printStackTrace(); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - - public void save() { - if (curFilePath == null) { - return; - } - File file = new File(curFilePath); - // get a file's extension - String extension = file.getName().substring(file.getName().lastIndexOf(".")); - if (extension.contains(".model")) { - saveModel(file); - } else if (extension.contains(".dtram")) { - saveDTRAM(file); - } - } - - private void saveModel(File file) { - try { - FileWriter filewriter = new FileWriter(file); - filewriter.write(model.getSourceText()); - filewriter.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void saveDTRAM(File file) { - try { - FileWriter filewriter = new FileWriter(file); - filewriter.write(toOutputString()); - filewriter.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * get writing texts "dtram" file information is written. - * - * @return formatted "dtram" info texts. - */ - private String toOutputString() { - StringBuilder fileString = new StringBuilder(); - - fileString.append("model {\n"); - fileString.append(model.getSourceText()); - fileString.append("}\n"); - - fileString.append("geometry {\n"); - - Object root = graph.getDefaultParent(); - mxCell dataFlowLayer = (mxCell) ((mxCell) root).getChildAt(Stage.DATA_FLOW_LAYER); - - for (int i = 0; i < graph.getModel().getChildCount(dataFlowLayer); i++) { - Object cell = graph.getModel().getChildAt(dataFlowLayer, i); - if (graph.getModel().isVertex(cell)) { - mxGraphView view = graph.getView(); - mxCellState state = view.getState(cell); - int x = (int) state.getX(); - int y = (int) state.getY(); - int w = (int) state.getWidth(); - int h = (int) state.getHeight(); - - for (ResourcePath res : model.getResourcePaths()) { - if (res != null && state.getLabel().equals(res.getLeafResourceName())) - fileString.append("\tnode r ").append(state.getLabel()).append(":").append(x).append(",").append(y).append(",").append(w).append(",").append(h).append("\n"); - } - - for (Channel ioC : model.getInputChannels()) { - if (ioC != null && state.getLabel().equals(ioC.getChannelName())) { - fileString.append("\tnode ioc ").append(state.getLabel()).append(":").append(x).append(",").append(y).append(",").append(w).append(",").append(h).append("\n"); - } - } - for (Channel ch : model.getChannels()) { - if (ch instanceof FormulaChannel && state.getLabel().equals(ch.getChannelName())) { - fileString.append("\tnode fc ").append(state.getLabel()).append(":").append(x).append(",").append(y).append(",").append(w).append(",").append(h).append("\n"); - } else if (ch != null && state.getLabel().equals(ch.getChannelName())) { - fileString.append("\tnode c ").append(state.getLabel()).append(":").append(x).append(",").append(y).append(",").append(w).append(",").append(h).append("\n"); - } - } - } - } - fileString.append("}\n"); - return fileString.toString(); - } - - public void setDAGLayout() { - mxCell root = (mxCell) graph.getDefaultParent(); - mxCell dataFlowLayer = (mxCell) root.getChildAt(Stage.DATA_FLOW_LAYER); - graph.getModel().beginUpdate(); - try { - DAGLayout ctl = new DAGLayout(graph); - ctl.execute(dataFlowLayer); + + protected DataTransferModel model = null; + + protected mxGraph graph; + private final mxGraphComponent graphComponent; + + protected Stage curStage; + private final List stageChangeListeners; + + private mxIEventListener curChangeEventListener = null; + private MouseListener curMouseEventListener = null; + + protected String curFileName = null; + protected String curFilePath = null; + protected ArrayList codes = null; + + public static DataFlowModelingStage STAGE_DATA_FLOW_MODELING = null; + public static PushPullSelectionStage STAGE_PUSH_PULL_SELECTION = null; + + public Editor(mxGraphComponent graphComponent) { + this.graphComponent = graphComponent; + this.graph = graphComponent.getGraph(); + + STAGE_DATA_FLOW_MODELING = new DataFlowModelingStage(graphComponent); + STAGE_PUSH_PULL_SELECTION = new PushPullSelectionStage(graphComponent); + + graphComponent.setCellEditor(STAGE_DATA_FLOW_MODELING.createCellEditor(graphComponent)); + + curStage = STAGE_DATA_FLOW_MODELING; + + stageChangeListeners = new ArrayList<>(); + } + + public boolean canChange(Stage nextStage) { + return nextStage.canChangeFrom(curStage); + } + + public boolean changeStage(Stage nextStage) { + if (!nextStage.canChangeFrom(curStage)) { + return false; + } + nextStage.init(curStage); + graphComponent.setCellEditor(nextStage.createCellEditor(graphComponent)); + + // add listeners + // "curChangeEventListener" will be called when updating the mxGraph. + if (curChangeEventListener != null) { + graph.getModel().removeListener(curChangeEventListener); + } + curChangeEventListener = nextStage.createChangeEventListener(this); + if (curChangeEventListener != null) { + graph.getModel().addListener(mxEvent.CHANGE, curChangeEventListener); + } + + // A handler of a mouse event. + if (curMouseEventListener != null) { + graphComponent.getGraphControl().removeMouseListener(curMouseEventListener); + } + curMouseEventListener = nextStage.createMouseEventListener(this); + if (curMouseEventListener != null) { + graphComponent.getGraphControl().addMouseListener(curMouseEventListener); + } + curStage = nextStage; + notifyStageChangeListeners(); + return true; + } + + public void addStageChangeListener(IStageChangeListener stageChangeListener) { + stageChangeListeners.add(stageChangeListener); + } + + private void notifyStageChangeListeners() { + for (IStageChangeListener l : stageChangeListeners) { + l.stageChanged(curStage); + } + } + + public DataFlowGraph getDataFlowGraph() { + if (curStage instanceof PushPullSelectionStage) { + return ((PushPullSelectionStage) curStage).getDataFlowGraph(); + } + return null; + } + + public void setCurFilePath(String curFilePath) { + this.curFilePath = curFilePath; + this.curFileName = new File(curFilePath).getName(); + } + + public void clear() { + // Force to change to the data-flow modeling stage + boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); + if (!stageChanged) { + return; + } + ((DataFlowModelingStage) curStage).clear(); + + model = null; + curFilePath = null; + curFileName = null; + codes = null; + } + + /** + * Open a given file, parse the file, construct a DataFlowModel and a mxGraph + * + * @param file given file + */ + public void open(File file) { + // Force to change to data-modeling stage + boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); + if (!stageChanged) { + return; + } + if (file == null || !file.exists()) { + return; + } + // get a file's extension + String extension = file.getName().substring(file.getName().lastIndexOf(".")); + if (extension.contains(".model")) { + openModel(file); + } + if (extension.contains(".dtram")) { + openDTRAM(file); + } + } + + private void openModel(File file) { + try { + Parser parser = new Parser(new BufferedReader(new FileReader(file))); + try { + // Parse the .model file. + model = parser.doParse(); + + // Update stage's model to new parsed one + if (curStage instanceof DataFlowModelingStage) { + ((DataFlowModelingStage) curStage).setModel(model); + } + + // Force to change PushPullSelectionStage to construct mxGraph + boolean stageChanged = changeStage(STAGE_PUSH_PULL_SELECTION); + + // Set layout + setDAGLayout(); + + // Update current file info + curFilePath = file.getAbsolutePath(); + curFileName = file.getName(); + } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | + ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals | + ExpectedRHSExpression | WrongLHSExpression | WrongRHSExpression | ExpectedRightBracket | + ExpectedAssignment | ExpectedRightCurlyBracket | WrongPathExpression | WrongJsonExpression | + ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + private void openDTRAM(File file) { + try { + ParserDTRAM parser = new ParserDTRAM(new BufferedReader(new FileReader(file))); + try { + // Parse the .dtram file. + model = parser.doParseModel(); + + // Update stage's model to new parsed one + if (curStage instanceof DataFlowModelingStage) { + ((DataFlowModelingStage) curStage).setModel(model); + } + + // Force to change PushPullSelectionStage to construct mxGraph + boolean stageChanged = changeStage(STAGE_PUSH_PULL_SELECTION); + + // Restore the geometry + parser.doParseGeometry(graph); + + // Update current file info + curFilePath = file.getAbsolutePath(); + curFileName = file.getName(); + } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | + ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals | + ExpectedRHSExpression | WrongLHSExpression | WrongRHSExpression | ExpectedRightBracket | + ExpectedAssignment | ExpectedModel | ExpectedGeometry | ExpectedNode | ExpectedResource | + ExpectedFormulaChannel | ExpectedIoChannel | ExpectedRightCurlyBracket | WrongPathExpression | + WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + public void save() { + if (curFilePath == null) { + return; + } + File file = new File(curFilePath); + // get a file's extension + String extension = file.getName().substring(file.getName().lastIndexOf(".")); + if (extension.contains(".model")) { + saveModel(file); + } else if (extension.contains(".dtram")) { + saveDTRAM(file); + } + } + + private void saveModel(File file) { + try { + FileWriter filewriter = new FileWriter(file); + filewriter.write(model.getSourceText()); + filewriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void saveDTRAM(File file) { + try { + FileWriter filewriter = new FileWriter(file); + filewriter.write(toOutputString()); + filewriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * get writing texts "dtram" file information is written. + * + * @return formatted "dtram" info texts. + */ + private String toOutputString() { + StringBuilder fileString = new StringBuilder(); + + fileString.append("model {\n"); + fileString.append(model.getSourceText()); + fileString.append("}\n"); + + fileString.append("geometry {\n"); + + Object root = graph.getDefaultParent(); + mxCell dataFlowLayer = (mxCell) ((mxCell) root).getChildAt(Stage.DATA_FLOW_LAYER); + + for (int i = 0; i < graph.getModel().getChildCount(dataFlowLayer); i++) { + Object cell = graph.getModel().getChildAt(dataFlowLayer, i); + if (graph.getModel().isVertex(cell)) { + mxGraphView view = graph.getView(); + mxCellState state = view.getState(cell); + int x = (int) state.getX(); + int y = (int) state.getY(); + int w = (int) state.getWidth(); + int h = (int) state.getHeight(); + + for (ResourcePath res : model.getResourcePaths()) { + if (res != null && state.getLabel().equals(res.getLeafResourceName())) + fileString.append("\tnode r ").append(state.getLabel()).append(":").append(x).append(",").append(y).append(",").append(w).append(",").append(h).append("\n"); + } + + for (Channel ioC : model.getInputChannels()) { + if (ioC != null && state.getLabel().equals(ioC.getChannelName())) { + fileString.append("\tnode ioc ").append(state.getLabel()).append(":").append(x).append(",").append(y).append(",").append(w).append(",").append(h).append("\n"); + } + } + for (Channel ch : model.getChannels()) { + if (ch instanceof FormulaChannel && state.getLabel().equals(ch.getChannelName())) { + fileString.append("\tnode fc ").append(state.getLabel()).append(":").append(x).append(",").append(y).append(",").append(w).append(",").append(h).append("\n"); + } else if (ch != null && state.getLabel().equals(ch.getChannelName())) { + fileString.append("\tnode c ").append(state.getLabel()).append(":").append(x).append(",").append(y).append(",").append(w).append(",").append(h).append("\n"); + } + } + } + } + fileString.append("}\n"); + return fileString.toString(); + } + + public void setDAGLayout() { + mxCell root = (mxCell) graph.getDefaultParent(); + mxCell dataFlowLayer = (mxCell) root.getChildAt(Stage.DATA_FLOW_LAYER); + graph.getModel().beginUpdate(); + try { + DAGLayout ctl = new DAGLayout(graph); + ctl.execute(dataFlowLayer); // for(int i = 0; i < dataFlowLayer.getChildCount(); i++){ // ctl.execute(dataFlowLayer.getChildAt(i)); // } - } finally { - graph.getModel().endUpdate(); - } - } - - public void setTreeLayout() { - mxCell root = (mxCell) graph.getDefaultParent(); - graph.getModel().beginUpdate(); - try { - mxCompactTreeLayout ctl = new mxCompactTreeLayout(graph); - ctl.setLevelDistance(100); - // ctl.setHorizontal(false); - ctl.setEdgeRouting(false); - for (int i = 0; i < root.getChildCount(); i++) { - ctl.execute(root.getChildAt(i)); - } - } finally { - graph.getModel().endUpdate(); - } - } - - public void setCircleLayout() { - mxCell root = (mxCell) graph.getDefaultParent(); - graph.getModel().beginUpdate(); - try { - mxCircleLayout ctl = new mxCircleLayout(graph); - for (int i = 0; i < root.getChildCount(); i++) { - ctl.execute(root.getChildAt(i)); - } - } finally { - graph.getModel().endUpdate(); - } - } - - public List getSelectedResourceNodes() { - Object[] sels = graph.getSelectionCells(); - List resNodes = new ArrayList<>(); - if (curStage instanceof DataFlowModelingStage) { - for (Object sel: sels) { - if (sel instanceof mxCell && ((mxCell) sel).isVertex()) { - mxCell cell = ((mxCell) sel); - ResourceNode resNode = ((DataFlowModelingStage) curStage).getResourceNode(cell); - if (resNode != null) { - resNodes.add(resNode); - } - } - } - } - return resNodes; - } - - public List getSelectedChannels() { - Object[] sels = graph.getSelectionCells(); - List channels = new ArrayList<>(); - for (Object sel: sels) { - if (sel instanceof mxCell && ((mxCell) sel).isVertex()) { - mxCell cell = ((mxCell) sel); - Channel channel = model.getChannel((String) cell.getValue()); - if (channel != null) { - channels.add(channel); - } else { - channel = model.getInputChannel((String) cell.getValue()); - if (channel != null) { - channels.add(channel); - } - } - } - } - return channels; - } - - public void delete() { - boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); - if (!stageChanged) { - return; - } - ((DataFlowModelingStage) curStage).delete(); - } - - public void addResourceNode(ResourceNode parentNode, String resName) { - // Force to change to data-flow modeling stage - boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); - if (!stageChanged) { - return; - } - ((DataFlowModelingStage) curStage).addResourceNode(parentNode, resName); - model = curStage.getModel(); - } - - public void addChannel(String channelName) { - // Force to change to data-flow modeling stage - boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); - if (!stageChanged) { - return; - } - DataTransferChannel channel = null; - if (channelName.contains(Parser.LEFT_BRACKET) && channelName.contains(Parser.RIGHT_BRACKET)) { - channel = new DataTransferChannel(channelName.substring(0, channelName.indexOf(Parser.LEFT_BRACKET))); - Parser.TokenStream stream = new Parser.TokenStream(); - Parser parser = new Parser(stream); - stream.addLine(channelName.substring(channelName.indexOf(Parser.LEFT_BRACKET), channelName.length())); - try { - String leftBracket = stream.next(); - if (leftBracket.equals(Parser.LEFT_BRACKET)) { - // has selectors - String rightBracket = null; - do { - String selector = stream.next(); - Variable var = parser.parseVariable(stream, model, selector); - channel.addSelector(var); - rightBracket = stream.next(); - } while (rightBracket.equals(Parser.COMMA)); - if (!rightBracket.equals(Parser.RIGHT_BRACKET)) throw new ExpectedRightBracket(stream.getLine()); - leftBracket = stream.next(); - } - } catch (ExpectedRightBracket e) { - e.printStackTrace(); - } - } else { - channel = new DataTransferChannel(channelName); - } - ((DataFlowModelingStage) curStage).addChannel(channel); - model = curStage.getModel(); - } - - public void addEventChannel(String channelName) { - // Force to change to data-flow modeling stage - boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); - if (!stageChanged) { - return; - } - DataTransferChannel eventChannel = null; - if (channelName.contains(Parser.LEFT_BRACKET) && channelName.contains(Parser.RIGHT_BRACKET)) { - eventChannel = new DataTransferChannel(channelName.substring(0, channelName.indexOf(Parser.LEFT_BRACKET))); - Parser.TokenStream stream = new Parser.TokenStream(); - Parser parser = new Parser(stream); - stream.addLine(channelName.substring(channelName.indexOf(Parser.LEFT_BRACKET), channelName.length())); - try { - String leftBracket = stream.next(); - if (leftBracket.equals(Parser.LEFT_BRACKET)) { - // has selectors - String rightBracket = null; - do { - String selector = stream.next(); - Variable var = parser.parseVariable(stream, model, selector); - eventChannel.addSelector(var); - rightBracket = stream.next(); - } while (rightBracket.equals(Parser.COMMA)); - if (!rightBracket.equals(Parser.RIGHT_BRACKET)) throw new ExpectedRightBracket(stream.getLine()); - leftBracket = stream.next(); - } - } catch (ExpectedRightBracket e) { - e.printStackTrace(); - } - } else { - eventChannel = new DataTransferChannel(channelName); - } - ((DataFlowModelingStage) curStage).addEventChannel(eventChannel); - model = curStage.getModel(); - } - - public void addFormulaChannel(String channelName, Symbol op) { - // Force to change to data-flow modeling stage - boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); - if (!stageChanged) { - return; - } - FormulaChannel formulaChannel = new FormulaChannel(channelName, op); - ((DataFlowModelingStage) curStage).addFormulaChannel(formulaChannel); - model = curStage.getModel(); - } - - public boolean connectEdge(mxCell edge, mxCell src, mxCell dst) { - boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); - if (!stageChanged) { - return false; - } - return ((DataFlowModelingStage) curStage).connectEdge(edge, src, dst); - } - - public mxGraph getGraph() { - return graph; - } - - public mxGraphComponent getGraphComponent() { - return graphComponent; - } - - public DataTransferModel getModel() { - model = curStage.getModel(); - return model; - } - - public Stage getCurStage() { - return curStage; - } - - public ArrayList getCodes() { - return codes; - } - - public void setCodes(ArrayList codes) { - this.codes = codes; - } - - public String getCurFileName() { - return curFileName; - } - - public String getCurFilePath() { - return curFilePath; - } - - public static class SrcDstAttribute extends EdgeAttribute { - private final Object src; - private final Object dst; - - public SrcDstAttribute(Object src, Object dst) { - this.src = src; - this.dst = dst; - } - - public Object getSource() { - return src; - } - - public Object getDestination() { - return dst; - } - - public String toString() { - return ""; - } - } + } finally { + graph.getModel().endUpdate(); + } + } + + public void setTreeLayout() { + mxCell root = (mxCell) graph.getDefaultParent(); + graph.getModel().beginUpdate(); + try { + mxCompactTreeLayout ctl = new mxCompactTreeLayout(graph); + ctl.setLevelDistance(100); + // ctl.setHorizontal(false); + ctl.setEdgeRouting(false); + for (int i = 0; i < root.getChildCount(); i++) { + ctl.execute(root.getChildAt(i)); + } + } finally { + graph.getModel().endUpdate(); + } + } + + public void setCircleLayout() { + mxCell root = (mxCell) graph.getDefaultParent(); + graph.getModel().beginUpdate(); + try { + mxCircleLayout ctl = new mxCircleLayout(graph); + for (int i = 0; i < root.getChildCount(); i++) { + ctl.execute(root.getChildAt(i)); + } + } finally { + graph.getModel().endUpdate(); + } + } + + public List getSelectedResourceNodes() { + Object[] sels = graph.getSelectionCells(); + List resNodes = new ArrayList<>(); + if (curStage instanceof DataFlowModelingStage) { + for (Object sel : sels) { + if (sel instanceof mxCell && ((mxCell) sel).isVertex()) { + mxCell cell = ((mxCell) sel); + ResourceNode resNode = ((DataFlowModelingStage) curStage).getResourceNode(cell); + if (resNode != null) { + resNodes.add(resNode); + } + } + } + } + return resNodes; + } + + public List getSelectedChannels() { + Object[] sels = graph.getSelectionCells(); + List channels = new ArrayList<>(); + for (Object sel : sels) { + if (sel instanceof mxCell && ((mxCell) sel).isVertex()) { + mxCell cell = ((mxCell) sel); + Channel channel = model.getChannel((String) cell.getValue()); + if (channel != null) { + channels.add(channel); + } else { + channel = model.getInputChannel((String) cell.getValue()); + if (channel != null) { + channels.add(channel); + } + } + } + } + return channels; + } + + public void delete() { + boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); + if (!stageChanged) { + return; + } + ((DataFlowModelingStage) curStage).delete(); + } + + public void addResourceNode(ResourceNode parentNode, String resName) { + // Force to change to data-flow modeling stage + boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); + if (!stageChanged) { + return; + } + ((DataFlowModelingStage) curStage).addResourceNode(parentNode, resName); + model = curStage.getModel(); + } + + public void addChannel(String channelName) { + // Force to change to data-flow modeling stage + boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); + if (!stageChanged) { + return; + } + DataTransferChannel channel = null; + if (channelName.contains(Parser.LEFT_BRACKET) && channelName.contains(Parser.RIGHT_BRACKET)) { + channel = new DataTransferChannel(channelName.substring(0, channelName.indexOf(Parser.LEFT_BRACKET))); + Parser.TokenStream stream = new Parser.TokenStream(); + Parser parser = new Parser(stream); + stream.addLine(channelName.substring(channelName.indexOf(Parser.LEFT_BRACKET), channelName.length())); + try { + String leftBracket = stream.next(); + if (leftBracket.equals(Parser.LEFT_BRACKET)) { + // has selectors + String rightBracket = null; + do { + String selector = stream.next(); + Variable var = parser.parseVariable(stream, model, selector); + channel.addSelector(var); + rightBracket = stream.next(); + } while (rightBracket.equals(Parser.COMMA)); + if (!rightBracket.equals(Parser.RIGHT_BRACKET)) throw new ExpectedRightBracket(stream.getLine()); + leftBracket = stream.next(); + } + } catch (ExpectedRightBracket e) { + e.printStackTrace(); + } + } else { + channel = new DataTransferChannel(channelName); + } + ((DataFlowModelingStage) curStage).addChannel(channel); + model = curStage.getModel(); + } + + public void addEventChannel(String channelName) { + // Force to change to data-flow modeling stage + boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); + if (!stageChanged) { + return; + } + DataTransferChannel eventChannel = null; + if (channelName.contains(Parser.LEFT_BRACKET) && channelName.contains(Parser.RIGHT_BRACKET)) { + eventChannel = new DataTransferChannel(channelName.substring(0, channelName.indexOf(Parser.LEFT_BRACKET))); + Parser.TokenStream stream = new Parser.TokenStream(); + Parser parser = new Parser(stream); + stream.addLine(channelName.substring(channelName.indexOf(Parser.LEFT_BRACKET), channelName.length())); + try { + String leftBracket = stream.next(); + if (leftBracket.equals(Parser.LEFT_BRACKET)) { + // has selectors + String rightBracket = null; + do { + String selector = stream.next(); + Variable var = parser.parseVariable(stream, model, selector); + eventChannel.addSelector(var); + rightBracket = stream.next(); + } while (rightBracket.equals(Parser.COMMA)); + if (!rightBracket.equals(Parser.RIGHT_BRACKET)) throw new ExpectedRightBracket(stream.getLine()); + leftBracket = stream.next(); + } + } catch (ExpectedRightBracket e) { + e.printStackTrace(); + } + } else { + eventChannel = new DataTransferChannel(channelName); + } + ((DataFlowModelingStage) curStage).addEventChannel(eventChannel); + model = curStage.getModel(); + } + + public void addFormulaChannel(String channelName, Symbol op) { + // Force to change to data-flow modeling stage + boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); + if (!stageChanged) { + return; + } + FormulaChannel formulaChannel = new FormulaChannel(channelName, op); + ((DataFlowModelingStage) curStage).addFormulaChannel(formulaChannel); + model = curStage.getModel(); + } + + public boolean connectEdge(mxCell edge, mxCell src, mxCell dst) { + boolean stageChanged = changeStage(STAGE_DATA_FLOW_MODELING); + if (!stageChanged) { + return false; + } + return ((DataFlowModelingStage) curStage).connectEdge(edge, src, dst); + } + + public mxGraph getGraph() { + return graph; + } + + public mxGraphComponent getGraphComponent() { + return graphComponent; + } + + public DataTransferModel getModel() { + model = curStage.getModel(); + return model; + } + + public Stage getCurStage() { + return curStage; + } + + public ArrayList getCodes() { + return codes; + } + + public void setCodes(ArrayList codes) { + this.codes = codes; + } + + public String getCurFileName() { + return curFileName; + } + + public String getCurFilePath() { + return curFilePath; + } + + public static class SrcDstAttribute extends EdgeAttribute { + private final Object src; + private final Object dst; + + public SrcDstAttribute(Object src, Object dst) { + this.src = src; + this.dst = dst; + } + + public Object getSource() { + return src; + } + + public Object getDestination() { + return dst; + } + + public String toString() { + return ""; + } + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/FlowCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/FlowCellEditor.java index b4d7176..5563b59 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/FlowCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/FlowCellEditor.java @@ -6,22 +6,22 @@ import java.util.EventObject; public abstract class FlowCellEditor implements mxICellEditor { - - protected Stage stage; - protected mxGraphComponent graphComponent; - - protected Object editingCell = null; - - protected FlowCellEditor(Stage stage, mxGraphComponent graphComponent) { - this.stage = stage; - this.graphComponent = graphComponent; - } - - public abstract void startEditing(Object cellObj, EventObject eventObj); - - public abstract void stopEditing(boolean cancel); - - public Object getEditingCell() { - return this.editingCell; - } + + protected Stage stage; + protected mxGraphComponent graphComponent; + + protected Object editingCell = null; + + protected FlowCellEditor(Stage stage, mxGraphComponent graphComponent) { + this.stage = stage; + this.graphComponent = graphComponent; + } + + public abstract void startEditing(Object cellObj, EventObject eventObj); + + public abstract void stopEditing(boolean cancel); + + public Object getEditingCell() { + return this.editingCell; + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/IStageChangeListener.java b/AlgebraicDataflowArchitectureModel/src/application/editor/IStageChangeListener.java index f2cf45c..4d149f8 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/IStageChangeListener.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/IStageChangeListener.java @@ -1,5 +1,5 @@ package application.editor; public interface IStageChangeListener { - void stageChanged(Stage newStage); + void stageChanged(Stage newStage); } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/Stage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/Stage.java index 1107278..b088d37 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/Stage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/Stage.java @@ -10,86 +10,86 @@ import java.awt.event.MouseListener; public abstract class Stage { - - public static final int PORT_DIAMETER = 8; - public static final int PORT_RADIUS = PORT_DIAMETER / 2; - - protected DataTransferModel model = null; - - protected mxGraphComponent graphComponent; - protected mxGraph graph; - - public static final int NODE_LAYER = 0; - public static final int DATA_FLOW_LAYER = 0; - public static final int PUSH_FLOW_LAYER = 1; - public static final int PULL_FLOW_LAYER = 2; - - public Stage(mxGraphComponent graphComponent) { - this.graphComponent = graphComponent; - this.graph = graphComponent.getGraph(); - } - - public abstract void init(Stage prevStage); - - public abstract mxICellEditor createCellEditor(mxGraphComponent graphComponent); - - public abstract mxIEventListener createChangeEventListener(Editor editor); - - public abstract MouseListener createMouseEventListener(Editor editor); - - public abstract boolean canChangeFrom(Stage prevStage); - - public DataTransferModel getModel() { - return model; - } - - /** - * Constructs the hierarchical layer structure under the root cell. - */ - public void constructLayer(mxGraph graph){ - mxCell root = (mxCell) graph.getDefaultParent(); - - mxCell nodeAndDataFlowLayer = new mxCell(); // 0 - mxCell pushFlowLayer = new mxCell(); // 1 - mxCell pullFlowLayer = new mxCell(); // 2 - - graph.getModel().beginUpdate(); - try { - graph.addCell(nodeAndDataFlowLayer, root); - graph.addCell(pushFlowLayer, root); - graph.addCell(pullFlowLayer, root); - } finally { - graph.getModel().endUpdate(); - } - } - - /** - * Enable or disable the specified layer (layerNo) - */ - public void setLayerEnabled(final int layerNo, final boolean isEnable){ - mxCell rootCell = (mxCell) graph.getDefaultParent(); - if(rootCell == null) return; - if(rootCell.getChildCount() <= 0) return; - - graph.getModel().setVisible(rootCell.getChildAt(layerNo), isEnable); - graph.refresh(); - } - - /** - * Show the specified layers only (argsOfLayers) - */ - public void showLayers(final int... argsOfLayers){ - mxCell rootCell = (mxCell) graph.getDefaultParent(); - if(rootCell == null) return; - if(rootCell.getChildCount() <= 0) return; - - - for(int i = 0; i < rootCell.getChildCount(); i++){ - graph.getModel().setVisible(rootCell.getChildAt(i), false); - } - - for(int layerNo : argsOfLayers){ - graph.getModel().setVisible(rootCell.getChildAt(layerNo), true); - } - } + + public static final int PORT_DIAMETER = 8; + public static final int PORT_RADIUS = PORT_DIAMETER / 2; + + protected DataTransferModel model = null; + + protected mxGraphComponent graphComponent; + protected mxGraph graph; + + public static final int NODE_LAYER = 0; + public static final int DATA_FLOW_LAYER = 0; + public static final int PUSH_FLOW_LAYER = 1; + public static final int PULL_FLOW_LAYER = 2; + + public Stage(mxGraphComponent graphComponent) { + this.graphComponent = graphComponent; + this.graph = graphComponent.getGraph(); + } + + public abstract void init(Stage prevStage); + + public abstract mxICellEditor createCellEditor(mxGraphComponent graphComponent); + + public abstract mxIEventListener createChangeEventListener(Editor editor); + + public abstract MouseListener createMouseEventListener(Editor editor); + + public abstract boolean canChangeFrom(Stage prevStage); + + public DataTransferModel getModel() { + return model; + } + + /** + * Constructs the hierarchical layer structure under the root cell. + */ + public void constructLayer(mxGraph graph) { + mxCell root = (mxCell) graph.getDefaultParent(); + + mxCell nodeAndDataFlowLayer = new mxCell(); // 0 + mxCell pushFlowLayer = new mxCell(); // 1 + mxCell pullFlowLayer = new mxCell(); // 2 + + graph.getModel().beginUpdate(); + try { + graph.addCell(nodeAndDataFlowLayer, root); + graph.addCell(pushFlowLayer, root); + graph.addCell(pullFlowLayer, root); + } finally { + graph.getModel().endUpdate(); + } + } + + /** + * Enable or disable the specified layer (layerNo) + */ + public void setLayerEnabled(final int layerNo, final boolean isEnable) { + mxCell rootCell = (mxCell) graph.getDefaultParent(); + if (rootCell == null) return; + if (rootCell.getChildCount() <= 0) return; + + graph.getModel().setVisible(rootCell.getChildAt(layerNo), isEnable); + graph.refresh(); + } + + /** + * Show the specified layers only (argsOfLayers) + */ + public void showLayers(final int... argsOfLayers) { + mxCell rootCell = (mxCell) graph.getDefaultParent(); + if (rootCell == null) return; + if (rootCell.getChildCount() <= 0) return; + + + for (int i = 0; i < rootCell.getChildCount(); i++) { + graph.getModel().setVisible(rootCell.getChildAt(i), false); + } + + for (int layerNo : argsOfLayers) { + graph.getModel().setVisible(rootCell.getChildAt(layerNo), true); + } + } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowCellEditor.java index f8e85fc..fdb0577 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowCellEditor.java @@ -2,13 +2,9 @@ import application.editor.FlowCellEditor; import com.mxgraph.model.mxCell; -import com.mxgraph.model.mxIGraphModel; import com.mxgraph.swing.mxGraphComponent; -import com.mxgraph.util.mxConstants; -import com.mxgraph.util.mxUtils; import models.algebra.Expression; import models.dataFlowModel.DataTransferChannel; -import models.dataFlowModel.DataTransferModel; import models.visualModel.FormulaChannel; import parser.Parser; import parser.exceptions.ExpectedColon; @@ -21,85 +17,85 @@ import java.util.EventObject; public class DataFlowCellEditor extends FlowCellEditor { - - public DataFlowCellEditor(DataFlowModelingStage stage, mxGraphComponent graphComponent) { - super(stage, graphComponent); - } - - @Override - public void startEditing(Object cellObj, EventObject eventObj) { - if (editingCell != null) { - stopEditing(true); - } - if (graphComponent.getGraph().getModel().isEdge(cellObj)) { - return; - } - DataTransferChannel ch = (DataTransferChannel) ((DataFlowModelingStage) stage).getChannel((mxCell) cellObj); - if (ch == null) { - // selected cell is a resource - return; - } - JPanel panel = new JPanel(); - if (ch instanceof FormulaChannel) { - JLabel label1 = new JLabel("Formula: "); - JLabel label2 = new JLabel("Source: "); - GridBagLayout layout = new GridBagLayout(); - panel.setLayout(layout); - GridBagConstraints gbc = new GridBagConstraints(); - - gbc.gridx = 0; - gbc.gridy = 0; - layout.setConstraints(label1, gbc); - panel.add(label1); - - gbc.gridx = 1; - gbc.gridy = 0; - JTextField formulaText = new JTextField(((FormulaChannel) ch).getFormula(), 15); - layout.setConstraints(formulaText, gbc); - panel.add(formulaText); - - gbc.gridx = 0; - gbc.gridy = 1; - layout.setConstraints(label2, gbc); - panel.add(label2); - - gbc.gridx = 1; - gbc.gridy = 1; - JTextArea textArea = new JTextArea(ch.getSourceText(), 7, 15); - textArea.setEditable(false); - layout.setConstraints(textArea, gbc); - panel.add(textArea); - - int option = JOptionPane.showConfirmDialog(null, panel, "Edit Formula Channel", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - if (option == JOptionPane.OK_OPTION) { - Parser.TokenStream stream = new Parser.TokenStream(); - Parser parser = new Parser(stream); - - String formula = formulaText.getText(); - stream.addLine(formula.split(Parser.EQUALS)[1]); - - try { - Expression exp = parser.parseTerm(stream, stage.getModel()); - ((FormulaChannel) ch).setFormula(formula); - ((FormulaChannel) ch).setFormulaTerm(exp); - } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { - e.printStackTrace(); - } - } - } else { - JTextArea textArea = new JTextArea(ch.getSourceText(), 15, 50); - textArea.setLineWrap(true); - textArea.setTabSize(4); - panel.add(textArea); - - int option = JOptionPane.showConfirmDialog(null, panel, "Channel Code", JOptionPane.OK_CANCEL_OPTION); - if (option == JOptionPane.OK_OPTION) { - ((DataFlowModelingStage) stage).setChannelCode(ch, textArea.getText()); - } - } - } - - @Override - public void stopEditing(boolean cancel) { - } + + public DataFlowCellEditor(DataFlowModelingStage stage, mxGraphComponent graphComponent) { + super(stage, graphComponent); + } + + @Override + public void startEditing(Object cellObj, EventObject eventObj) { + if (editingCell != null) { + stopEditing(true); + } + if (graphComponent.getGraph().getModel().isEdge(cellObj)) { + return; + } + DataTransferChannel ch = (DataTransferChannel) ((DataFlowModelingStage) stage).getChannel((mxCell) cellObj); + if (ch == null) { + // selected cell is a resource + return; + } + JPanel panel = new JPanel(); + if (ch instanceof FormulaChannel) { + JLabel label1 = new JLabel("Formula: "); + JLabel label2 = new JLabel("Source: "); + GridBagLayout layout = new GridBagLayout(); + panel.setLayout(layout); + GridBagConstraints gbc = new GridBagConstraints(); + + gbc.gridx = 0; + gbc.gridy = 0; + layout.setConstraints(label1, gbc); + panel.add(label1); + + gbc.gridx = 1; + gbc.gridy = 0; + JTextField formulaText = new JTextField(((FormulaChannel) ch).getFormula(), 15); + layout.setConstraints(formulaText, gbc); + panel.add(formulaText); + + gbc.gridx = 0; + gbc.gridy = 1; + layout.setConstraints(label2, gbc); + panel.add(label2); + + gbc.gridx = 1; + gbc.gridy = 1; + JTextArea textArea = new JTextArea(ch.getSourceText(), 7, 15); + textArea.setEditable(false); + layout.setConstraints(textArea, gbc); + panel.add(textArea); + + int option = JOptionPane.showConfirmDialog(null, panel, "Edit Formula Channel", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (option == JOptionPane.OK_OPTION) { + Parser.TokenStream stream = new Parser.TokenStream(); + Parser parser = new Parser(stream); + + String formula = formulaText.getText(); + stream.addLine(formula.split(Parser.EQUALS)[1]); + + try { + Expression exp = parser.parseTerm(stream, stage.getModel()); + ((FormulaChannel) ch).setFormula(formula); + ((FormulaChannel) ch).setFormulaTerm(exp); + } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + } else { + JTextArea textArea = new JTextArea(ch.getSourceText(), 15, 50); + textArea.setLineWrap(true); + textArea.setTabSize(4); + panel.add(textArea); + + int option = JOptionPane.showConfirmDialog(null, panel, "Channel Code", JOptionPane.OK_CANCEL_OPTION); + if (option == JOptionPane.OK_OPTION) { + ((DataFlowModelingStage) stage).setChannelCode(ch, textArea.getText()); + } + } + } + + @Override + public void stopEditing(boolean cancel) { + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowModelingStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowModelingStage.java index d3a550e..48a2ca9 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowModelingStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowModelingStage.java @@ -16,7 +16,6 @@ import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.ResourcePath; import models.dataConstraintModel.Selector; -import models.dataFlowModel.DataFlowGraph; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; import models.dataFlowModel.ResourceNode; @@ -34,386 +33,386 @@ private HashMap channelToCell = new HashMap<>(); private HashMap cellToResNode = new HashMap<>(); private HashMap cellToChannel = new HashMap<>(); - - public DataFlowModelingStage(mxGraphComponent graphComponent) { - super(graphComponent); - } - - @Override - public void init(Stage prevStage) { - if (prevStage instanceof PushPullSelectionStage) { - if (((PushPullSelectionStage) prevStage).getResNodeToCell() != null) { - resNodeToCell = ((PushPullSelectionStage) prevStage).getResNodeToCell(); - } - if (((PushPullSelectionStage) prevStage).getChannelToCell() != null) { - channelToCell = ((PushPullSelectionStage) prevStage).getChannelToCell(); - } - for (ResourceNode resNode: resNodeToCell.keySet()) { - cellToResNode.put(resNodeToCell.get(resNode), resNode); - } - for (DataTransferChannel ch: channelToCell.keySet()) { - cellToChannel.put(channelToCell.get(ch), ch); - } - } - } - - @Override - public FlowCellEditor createCellEditor(mxGraphComponent graphComponent) { - return new DataFlowCellEditor(this, graphComponent); - } - - @Override - public mxIEventListener createChangeEventListener(Editor editor) { - return (sender, event) -> { - List terminals = new ArrayList<>(); - mxCell cell = null; - for (Object change : ((List) event.getProperties().get("changes"))) { - if (change instanceof mxTerminalChange) { - mxTerminalChange terminalChange = (mxTerminalChange) change; - cell = (mxCell) terminalChange.getCell(); - mxCell terminal = (mxCell) terminalChange.getTerminal(); - terminals.add(terminal); - } - } - if (terminals.size() == 2) { - if (!editor.connectEdge(cell, terminals.get(0), terminals.get(1))) { - graph.removeCells(new mxCell[]{cell}); - graph.clearSelection(); - } - } - }; - } - - @Override - public MouseListener createMouseEventListener(Editor editor) { - return null; - } - - @Override - public boolean canChangeFrom(Stage prevStage) { - return true; - } - - public void clear() { - model = null; - - ((mxGraphModel) graph.getModel()).clear(); - constructLayer(this.graph); - } - - public DataTransferModel getModel() { - if (model == null) { - model = new DataTransferModel(); - } - return model; - } - - public void setModel(DataTransferModel model) { - // Clear the mxGraph - clear(); - - this.model = model; - } - - public boolean isValid() { - if (model == null) { - return false; - } - return Validation.checkUpdateConflict(model); - } - - public ResourceNode getResourceNode(mxCell cell) { - return cellToResNode.get(cell); - } - - public Channel getChannel(mxCell cell) { - return cellToChannel.get(cell); - } - - public void addResourceNode(ResourceNode parentNode, String resName) { - ResourceNode resourceNode = null; - ResourcePath resourcePath = null; - if (parentNode == null) { - resourcePath = new ResourcePath(resName); - resourceNode = new ResourceNode(null, resourcePath); - getModel().addResourcePath(resourcePath); - } else { - ResourcePath parentPath = parentNode.getPrimaryResourcePath(); - if (resName.startsWith(Parser.LEFT_CURLY_BRACKET) && resName.endsWith(Parser.RIGHT_CURLY_BRACKET)) { - Parser.TokenStream stream = new Parser.TokenStream(); - Parser parser = new Parser(stream); - stream.addLine(resName.substring(1, resName.length() - 1)); - try { - Expression exp = parser.parseTerm(stream, getModel()); - resourcePath = new ResourcePath(parentPath, exp); - resourceNode = new ResourceNode(parentNode, resourcePath); - getModel().addResourcePath(resourcePath); - } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { - e.printStackTrace(); - } - } else { - resourcePath = new ResourcePath(parentPath, resName); - resourceNode = new ResourceNode(parentNode, resourcePath); - getModel().addResourcePath(resourcePath); - } - } - - graph.getModel().beginUpdate(); - mxCell root = (mxCell) graph.getDefaultParent(); - mxCell layer = (mxCell) root.getChildAt(DATA_FLOW_LAYER); - try { - if (parentNode == null) { - mxCell resCell = (mxCell) graph.insertVertex(layer, null, resourceNode.getPrimaryResourcePath().getName(), 20, 20, 80, 30, "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"); // insert a resource as a vertex - resNodeToCell.put(resourceNode, resCell); - cellToResNode.put(resCell, resourceNode); - } else { - mxCell parentCell = resNodeToCell.get(parentNode); - double pw = parentCell.getGeometry().getWidth(); - double ph = parentCell.getGeometry().getHeight(); - mxCell resCell = (mxCell) graph.insertVertex(parentCell, null, resourceNode.getPrimaryResourcePath().getName(), 20, 20, pw * 0.8, ph * 0.8, "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"); // insert a resource as a vertex - resNodeToCell.put(resourceNode, resCell); - cellToResNode.put(resCell, resourceNode); - } - } finally { - graph.getModel().endUpdate(); - } - } - - public void addChannel(DataTransferChannel channel) { - getModel().addChannel(channel); - - graph.getModel().beginUpdate(); - mxCell root = (mxCell) graph.getDefaultParent(); - mxCell layer = (mxCell) root.getChildAt(DATA_FLOW_LAYER); - try { - mxGeometry geo1 = new mxGeometry(0, 0.5, PORT_DIAMETER, PORT_DIAMETER); - geo1.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); - geo1.setRelative(true); - - mxGeometry geo2 = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); - geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); - geo2.setRelative(true); - - String channelName = channel.getChannelName(); - if (channel.getSelectors().size() > 0) { - channelName += "("; - String delimiter = ""; - for (Selector s: channel.getSelectors()) { - Expression exp = s.getExpression(); - String selectorName = exp.toString(); - channelName += delimiter + selectorName; - delimiter = ", "; - } - channelName += ")"; - } - Object chCell = graph.insertVertex(layer, null, channelName, 150, 20, 30, 30, "verticalAlign=top"); // insert a channel as a vertex - mxCell port_in = new mxCell(null, geo1, "shape=ellipse;perimter=ellipsePerimeter"); - port_in.setVertex(true); - graph.addCell(port_in, chCell); // insert the input port of a channel - mxCell port_out = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); - port_out.setVertex(true); - graph.addCell(port_out, chCell); // insert the output port of a channel - channelToCell.put(channel, (mxCell) chCell); - cellToChannel.put((mxCell) chCell, channel); - cellToChannel.put(port_in, channel); - cellToChannel.put(port_out, channel); - } finally { - graph.getModel().endUpdate(); - } - } - - public void addEventChannel(DataTransferChannel eventChannel) { - getModel().addInputChannel(eventChannel); - - graph.getModel().beginUpdate(); - mxCell root = (mxCell) graph.getDefaultParent(); - mxCell layer = (mxCell) root.getChildAt(NODE_LAYER); - try { - mxGeometry geo2 = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); - geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); - geo2.setRelative(true); - - String channelName = eventChannel.getChannelName(); - if (eventChannel.getSelectors().size() > 0) { - channelName += "("; - String delimiter = ""; - for (Selector s: eventChannel.getSelectors()) { - Expression exp = s.getExpression(); - String selectorName = exp.toString(); - channelName += delimiter + selectorName; - delimiter = ", "; - } - channelName += ")"; - } - Object chCell = graph.insertVertex(layer, null, channelName, 150, 20, 30, 30, "verticalAlign=top"); // insert an I/O channel as a vertex - mxCell port_out = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); - port_out.setVertex(true); - graph.addCell(port_out, chCell); // insert the output port of a channel - channelToCell.put(eventChannel, (mxCell) chCell); - cellToChannel.put((mxCell) chCell, eventChannel); - cellToChannel.put(port_out, eventChannel); - } finally { - graph.getModel().endUpdate(); - } - } - - public void addFormulaChannel(FormulaChannel formulaChannel) { - getModel().addChannel(formulaChannel); - - graph.getModel().beginUpdate(); - mxCell root = (mxCell) graph.getDefaultParent(); - mxCell layer = (mxCell) root.getChildAt(DATA_FLOW_LAYER); - try { - mxGeometry geo1 = new mxGeometry(0, 0.5, PORT_DIAMETER, PORT_DIAMETER); - geo1.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); - geo1.setRelative(true); - - mxGeometry geo2 = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); - geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); - geo2.setRelative(true); - - String channelName = formulaChannel.getChannelName(); - if (formulaChannel.getSelectors().size() > 0) { - channelName += "("; - String delimiter = ""; - for (Selector s: formulaChannel.getSelectors()) { - Expression exp = s.getExpression(); - String selectorName = exp.toString(); - channelName += delimiter + selectorName; - delimiter = ", "; - } - channelName += ")"; - } - Object chCell = graph.insertVertex(layer, null, channelName, 150, 20, 30, 30, "verticalAlign=top"); // insert a channel as a vertex - mxCell port_in = new mxCell(null, geo1, "shape=ellipse;perimter=ellipsePerimeter"); - port_in.setVertex(true); - graph.addCell(port_in, chCell); // insert the input port of a channel - mxCell port_out = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); - port_out.setVertex(true); - graph.addCell(port_out, chCell); // insert the output port of a channel - channelToCell.put(formulaChannel, (mxCell) chCell); - cellToChannel.put((mxCell) chCell, formulaChannel); - cellToChannel.put(port_in, formulaChannel); - cellToChannel.put(port_out, formulaChannel); - } finally { - graph.getModel().endUpdate(); - } - } - - public boolean connectEdge(mxCell edge, mxCell src, mxCell dst) { - DataTransferChannel srcCh = cellToChannel.get(src); - if (srcCh == null) { - ResourceNode srcResNode = cellToResNode.get(src); - DataTransferChannel dstCh = cellToChannel.get(dst); - if (srcResNode == null || dstCh == null) { - return false; - } - // resource to channel edge - ResourcePath srcRes = srcResNode.getPrimaryResourcePath(); - if (srcResNode.getIndegree() + srcResNode.getOutdegree() == 0) { - srcResNode.addOutSideResource(dstCh, srcRes); - } else { - srcRes = new ResourcePath(srcRes.getName(), srcRes.getResourceHierarchy()); - model.addResourcePath(srcRes); - } - ChannelMember srcCm = new ChannelMember(srcRes); - dstCh.addChannelMemberAsInput(srcCm); - edge.setValue(new Editor.SrcDstAttribute(srcRes, dstCh)); - return true; - } - ResourceNode dstResNode = cellToResNode.get(dst); - if (dstResNode == null) { - return false; - } - // channel to resource edge - ResourcePath dstRes = dstResNode.getPrimaryResourcePath(); - if (dstResNode.getIndegree() + dstResNode.getOutdegree() == 0) { - dstResNode.addInSideResource(srcCh, dstRes); - } else { - dstRes = new ResourcePath(dstRes.getName(), dstRes.getResourceHierarchy()); - model.addResourcePath(dstRes); - } - ChannelMember dstCm = new ChannelMember(dstRes); - srcCh.addChannelMemberAsOutput(dstCm); - edge.setValue(new Editor.SrcDstAttribute(srcCh, dstRes)); - return true; - } - - public void delete() { - for (Object obj : graph.getSelectionCells()) { - mxCell cell = (mxCell) obj; - if (cell.isEdge()) { - mxCell srcCell = (mxCell) cell.getSource(); - mxCell dstCell = (mxCell) cell.getTarget(); - if (cellToResNode.get(srcCell) != null) { - // resource to channel edge - DataTransferChannel ch = cellToChannel.get(dstCell); - ch.removeChannelMember(cellToResNode.get(srcCell).getOutSideResource(ch)); - } else if (cellToResNode.get(dstCell) != null) { - // channel to resource edge - DataTransferChannel ch = cellToChannel.get(srcCell); - ch.removeChannelMember(cellToResNode.get(dstCell).getInSideResource(ch)); - } - } else if (cell.isVertex()) { - if (cellToChannel.get(cell) != null) { - DataTransferChannel ch = cellToChannel.get(cell); - if (ch.getInputChannelMembers().size() == 0) { - model.removeInputChannel(cellToChannel.get(cell).getChannelName()); - } else { - model.removeChannel(cellToChannel.get(cell).getChannelName()); - } - } else if (cellToResNode.get(cell) != null) { - for (ResourcePath resPath: cellToResNode.get(cell).getInSideResources()) { - model.removeResourcePath(resPath); - } - for (ResourcePath resPath: cellToResNode.get(cell).getOutSideResources()) { - model.removeResourcePath(resPath); - } - } - } - } - graph.removeCells(graph.getSelectionCells()); - } - - public void setChannelCode(DataTransferChannel ch, String code) { - ch.setSourceText(code); - Parser.TokenStream stream = new Parser.TokenStream(); - Parser parser = new Parser(stream); - - for (String line : code.split("\n")) { - stream.addLine(line); - } - try { - DataTransferChannel ch2 = parser.parseChannel(getModel()); - for (ChannelMember chm2 : ch2.getInputChannelMembers()) { - for (ChannelMember chm : ch.getInputChannelMembers()) { - if (chm2.getResource().getResourceHierarchy() == chm.getResource().getResourceHierarchy()) { - chm.setStateTransition(chm2.getStateTransition()); - break; - } - } - } - for (ChannelMember chm2 : ch2.getOutputChannelMembers()) { - for (ChannelMember chm : ch.getOutputChannelMembers()) { - if (chm2.getResource().getResourceHierarchy() == chm.getResource().getResourceHierarchy()) { - chm.setStateTransition(chm2.getStateTransition()); - break; - } - } - } - for (ChannelMember chm2 : ch2.getReferenceChannelMembers()) { - for (ChannelMember chm : ch.getReferenceChannelMembers()) { - if (chm2.getResource().getResourceHierarchy() == chm.getResource().getResourceHierarchy()) { - chm.setStateTransition(chm2.getStateTransition()); - break; - } - } - } - } catch (ExpectedRightBracket | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | - ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | - WrongLHSExpression | WrongRHSExpression | ExpectedAssignment | ExpectedRightCurlyBracket | - WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { - e.printStackTrace(); - } - } + + public DataFlowModelingStage(mxGraphComponent graphComponent) { + super(graphComponent); + } + + @Override + public void init(Stage prevStage) { + if (prevStage instanceof PushPullSelectionStage) { + if (((PushPullSelectionStage) prevStage).getResNodeToCell() != null) { + resNodeToCell = ((PushPullSelectionStage) prevStage).getResNodeToCell(); + } + if (((PushPullSelectionStage) prevStage).getChannelToCell() != null) { + channelToCell = ((PushPullSelectionStage) prevStage).getChannelToCell(); + } + for (ResourceNode resNode : resNodeToCell.keySet()) { + cellToResNode.put(resNodeToCell.get(resNode), resNode); + } + for (DataTransferChannel ch : channelToCell.keySet()) { + cellToChannel.put(channelToCell.get(ch), ch); + } + } + } + + @Override + public FlowCellEditor createCellEditor(mxGraphComponent graphComponent) { + return new DataFlowCellEditor(this, graphComponent); + } + + @Override + public mxIEventListener createChangeEventListener(Editor editor) { + return (sender, event) -> { + List terminals = new ArrayList<>(); + mxCell cell = null; + for (Object change : ((List) event.getProperties().get("changes"))) { + if (change instanceof mxTerminalChange) { + mxTerminalChange terminalChange = (mxTerminalChange) change; + cell = (mxCell) terminalChange.getCell(); + mxCell terminal = (mxCell) terminalChange.getTerminal(); + terminals.add(terminal); + } + } + if (terminals.size() == 2) { + if (!editor.connectEdge(cell, terminals.get(0), terminals.get(1))) { + graph.removeCells(new mxCell[]{cell}); + graph.clearSelection(); + } + } + }; + } + + @Override + public MouseListener createMouseEventListener(Editor editor) { + return null; + } + + @Override + public boolean canChangeFrom(Stage prevStage) { + return true; + } + + public void clear() { + model = null; + + ((mxGraphModel) graph.getModel()).clear(); + constructLayer(this.graph); + } + + public DataTransferModel getModel() { + if (model == null) { + model = new DataTransferModel(); + } + return model; + } + + public void setModel(DataTransferModel model) { + // Clear the mxGraph + clear(); + + this.model = model; + } + + public boolean isValid() { + if (model == null) { + return false; + } + return Validation.checkUpdateConflict(model); + } + + public ResourceNode getResourceNode(mxCell cell) { + return cellToResNode.get(cell); + } + + public Channel getChannel(mxCell cell) { + return cellToChannel.get(cell); + } + + public void addResourceNode(ResourceNode parentNode, String resName) { + ResourceNode resourceNode = null; + ResourcePath resourcePath = null; + if (parentNode == null) { + resourcePath = new ResourcePath(resName); + resourceNode = new ResourceNode(null, resourcePath); + getModel().addResourcePath(resourcePath); + } else { + ResourcePath parentPath = parentNode.getPrimaryResourcePath(); + if (resName.startsWith(Parser.LEFT_CURLY_BRACKET) && resName.endsWith(Parser.RIGHT_CURLY_BRACKET)) { + Parser.TokenStream stream = new Parser.TokenStream(); + Parser parser = new Parser(stream); + stream.addLine(resName.substring(1, resName.length() - 1)); + try { + Expression exp = parser.parseTerm(stream, getModel()); + resourcePath = new ResourcePath(parentPath, exp); + resourceNode = new ResourceNode(parentNode, resourcePath); + getModel().addResourcePath(resourcePath); + } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } else { + resourcePath = new ResourcePath(parentPath, resName); + resourceNode = new ResourceNode(parentNode, resourcePath); + getModel().addResourcePath(resourcePath); + } + } + + graph.getModel().beginUpdate(); + mxCell root = (mxCell) graph.getDefaultParent(); + mxCell layer = (mxCell) root.getChildAt(DATA_FLOW_LAYER); + try { + if (parentNode == null) { + mxCell resCell = (mxCell) graph.insertVertex(layer, null, resourceNode.getPrimaryResourcePath().getName(), 20, 20, 80, 30, "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"); // insert a resource as a vertex + resNodeToCell.put(resourceNode, resCell); + cellToResNode.put(resCell, resourceNode); + } else { + mxCell parentCell = resNodeToCell.get(parentNode); + double pw = parentCell.getGeometry().getWidth(); + double ph = parentCell.getGeometry().getHeight(); + mxCell resCell = (mxCell) graph.insertVertex(parentCell, null, resourceNode.getPrimaryResourcePath().getName(), 20, 20, pw * 0.8, ph * 0.8, "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"); // insert a resource as a vertex + resNodeToCell.put(resourceNode, resCell); + cellToResNode.put(resCell, resourceNode); + } + } finally { + graph.getModel().endUpdate(); + } + } + + public void addChannel(DataTransferChannel channel) { + getModel().addChannel(channel); + + graph.getModel().beginUpdate(); + mxCell root = (mxCell) graph.getDefaultParent(); + mxCell layer = (mxCell) root.getChildAt(DATA_FLOW_LAYER); + try { + mxGeometry geo1 = new mxGeometry(0, 0.5, PORT_DIAMETER, PORT_DIAMETER); + geo1.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); + geo1.setRelative(true); + + mxGeometry geo2 = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); + geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); + geo2.setRelative(true); + + String channelName = channel.getChannelName(); + if (channel.getSelectors().size() > 0) { + channelName += "("; + String delimiter = ""; + for (Selector s : channel.getSelectors()) { + Expression exp = s.getExpression(); + String selectorName = exp.toString(); + channelName += delimiter + selectorName; + delimiter = ", "; + } + channelName += ")"; + } + Object chCell = graph.insertVertex(layer, null, channelName, 150, 20, 30, 30, "verticalAlign=top"); // insert a channel as a vertex + mxCell port_in = new mxCell(null, geo1, "shape=ellipse;perimter=ellipsePerimeter"); + port_in.setVertex(true); + graph.addCell(port_in, chCell); // insert the input port of a channel + mxCell port_out = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); + port_out.setVertex(true); + graph.addCell(port_out, chCell); // insert the output port of a channel + channelToCell.put(channel, (mxCell) chCell); + cellToChannel.put((mxCell) chCell, channel); + cellToChannel.put(port_in, channel); + cellToChannel.put(port_out, channel); + } finally { + graph.getModel().endUpdate(); + } + } + + public void addEventChannel(DataTransferChannel eventChannel) { + getModel().addInputChannel(eventChannel); + + graph.getModel().beginUpdate(); + mxCell root = (mxCell) graph.getDefaultParent(); + mxCell layer = (mxCell) root.getChildAt(NODE_LAYER); + try { + mxGeometry geo2 = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); + geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); + geo2.setRelative(true); + + String channelName = eventChannel.getChannelName(); + if (eventChannel.getSelectors().size() > 0) { + channelName += "("; + String delimiter = ""; + for (Selector s : eventChannel.getSelectors()) { + Expression exp = s.getExpression(); + String selectorName = exp.toString(); + channelName += delimiter + selectorName; + delimiter = ", "; + } + channelName += ")"; + } + Object chCell = graph.insertVertex(layer, null, channelName, 150, 20, 30, 30, "verticalAlign=top"); // insert an I/O channel as a vertex + mxCell port_out = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); + port_out.setVertex(true); + graph.addCell(port_out, chCell); // insert the output port of a channel + channelToCell.put(eventChannel, (mxCell) chCell); + cellToChannel.put((mxCell) chCell, eventChannel); + cellToChannel.put(port_out, eventChannel); + } finally { + graph.getModel().endUpdate(); + } + } + + public void addFormulaChannel(FormulaChannel formulaChannel) { + getModel().addChannel(formulaChannel); + + graph.getModel().beginUpdate(); + mxCell root = (mxCell) graph.getDefaultParent(); + mxCell layer = (mxCell) root.getChildAt(DATA_FLOW_LAYER); + try { + mxGeometry geo1 = new mxGeometry(0, 0.5, PORT_DIAMETER, PORT_DIAMETER); + geo1.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); + geo1.setRelative(true); + + mxGeometry geo2 = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); + geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); + geo2.setRelative(true); + + String channelName = formulaChannel.getChannelName(); + if (formulaChannel.getSelectors().size() > 0) { + channelName += "("; + String delimiter = ""; + for (Selector s : formulaChannel.getSelectors()) { + Expression exp = s.getExpression(); + String selectorName = exp.toString(); + channelName += delimiter + selectorName; + delimiter = ", "; + } + channelName += ")"; + } + Object chCell = graph.insertVertex(layer, null, channelName, 150, 20, 30, 30, "verticalAlign=top"); // insert a channel as a vertex + mxCell port_in = new mxCell(null, geo1, "shape=ellipse;perimter=ellipsePerimeter"); + port_in.setVertex(true); + graph.addCell(port_in, chCell); // insert the input port of a channel + mxCell port_out = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); + port_out.setVertex(true); + graph.addCell(port_out, chCell); // insert the output port of a channel + channelToCell.put(formulaChannel, (mxCell) chCell); + cellToChannel.put((mxCell) chCell, formulaChannel); + cellToChannel.put(port_in, formulaChannel); + cellToChannel.put(port_out, formulaChannel); + } finally { + graph.getModel().endUpdate(); + } + } + + public boolean connectEdge(mxCell edge, mxCell src, mxCell dst) { + DataTransferChannel srcCh = cellToChannel.get(src); + if (srcCh == null) { + ResourceNode srcResNode = cellToResNode.get(src); + DataTransferChannel dstCh = cellToChannel.get(dst); + if (srcResNode == null || dstCh == null) { + return false; + } + // resource to channel edge + ResourcePath srcRes = srcResNode.getPrimaryResourcePath(); + if (srcResNode.getIndegree() + srcResNode.getOutdegree() == 0) { + srcResNode.addOutSideResource(dstCh, srcRes); + } else { + srcRes = new ResourcePath(srcRes.getName(), srcRes.getResourceHierarchy()); + model.addResourcePath(srcRes); + } + ChannelMember srcCm = new ChannelMember(srcRes); + dstCh.addChannelMemberAsInput(srcCm); + edge.setValue(new Editor.SrcDstAttribute(srcRes, dstCh)); + return true; + } + ResourceNode dstResNode = cellToResNode.get(dst); + if (dstResNode == null) { + return false; + } + // channel to resource edge + ResourcePath dstRes = dstResNode.getPrimaryResourcePath(); + if (dstResNode.getIndegree() + dstResNode.getOutdegree() == 0) { + dstResNode.addInSideResource(srcCh, dstRes); + } else { + dstRes = new ResourcePath(dstRes.getName(), dstRes.getResourceHierarchy()); + model.addResourcePath(dstRes); + } + ChannelMember dstCm = new ChannelMember(dstRes); + srcCh.addChannelMemberAsOutput(dstCm); + edge.setValue(new Editor.SrcDstAttribute(srcCh, dstRes)); + return true; + } + + public void delete() { + for (Object obj : graph.getSelectionCells()) { + mxCell cell = (mxCell) obj; + if (cell.isEdge()) { + mxCell srcCell = (mxCell) cell.getSource(); + mxCell dstCell = (mxCell) cell.getTarget(); + if (cellToResNode.get(srcCell) != null) { + // resource to channel edge + DataTransferChannel ch = cellToChannel.get(dstCell); + ch.removeChannelMember(cellToResNode.get(srcCell).getOutSideResource(ch)); + } else if (cellToResNode.get(dstCell) != null) { + // channel to resource edge + DataTransferChannel ch = cellToChannel.get(srcCell); + ch.removeChannelMember(cellToResNode.get(dstCell).getInSideResource(ch)); + } + } else if (cell.isVertex()) { + if (cellToChannel.get(cell) != null) { + DataTransferChannel ch = cellToChannel.get(cell); + if (ch.getInputChannelMembers().size() == 0) { + model.removeInputChannel(cellToChannel.get(cell).getChannelName()); + } else { + model.removeChannel(cellToChannel.get(cell).getChannelName()); + } + } else if (cellToResNode.get(cell) != null) { + for (ResourcePath resPath : cellToResNode.get(cell).getInSideResources()) { + model.removeResourcePath(resPath); + } + for (ResourcePath resPath : cellToResNode.get(cell).getOutSideResources()) { + model.removeResourcePath(resPath); + } + } + } + } + graph.removeCells(graph.getSelectionCells()); + } + + public void setChannelCode(DataTransferChannel ch, String code) { + ch.setSourceText(code); + Parser.TokenStream stream = new Parser.TokenStream(); + Parser parser = new Parser(stream); + + for (String line : code.split("\n")) { + stream.addLine(line); + } + try { + DataTransferChannel ch2 = parser.parseChannel(getModel()); + for (ChannelMember chm2 : ch2.getInputChannelMembers()) { + for (ChannelMember chm : ch.getInputChannelMembers()) { + if (chm2.getResource().getResourceHierarchy() == chm.getResource().getResourceHierarchy()) { + chm.setStateTransition(chm2.getStateTransition()); + break; + } + } + } + for (ChannelMember chm2 : ch2.getOutputChannelMembers()) { + for (ChannelMember chm : ch.getOutputChannelMembers()) { + if (chm2.getResource().getResourceHierarchy() == chm.getResource().getResourceHierarchy()) { + chm.setStateTransition(chm2.getStateTransition()); + break; + } + } + } + for (ChannelMember chm2 : ch2.getReferenceChannelMembers()) { + for (ChannelMember chm : ch.getReferenceChannelMembers()) { + if (chm2.getResource().getResourceHierarchy() == chm.getResource().getResourceHierarchy()) { + chm.setStateTransition(chm2.getStateTransition()); + break; + } + } + } + } catch (ExpectedRightBracket | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | + ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | + WrongLHSExpression | WrongRHSExpression | ExpectedAssignment | ExpectedRightCurlyBracket | + WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionCellEditor.java index 8ca07ef..a762098 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionCellEditor.java @@ -15,118 +15,118 @@ import java.util.List; public class PushPullSelectionCellEditor extends FlowCellEditor { - - public int DEFAULT_MIN_WIDTH = 70; - public int DEFAULT_MIN_HEIGHT = 30; - public double DEFAULT_MINIMUM_EDITOR_SCALE = 1; - - protected double minimumEditorScale = DEFAULT_MINIMUM_EDITOR_SCALE; - protected int minimumWidth = DEFAULT_MIN_WIDTH; - protected int minimumHeight = DEFAULT_MIN_HEIGHT; - - private EventObject trigger; - private JComboBox comboBox; - - public PushPullSelectionCellEditor(PushPullSelectionStage stage, mxGraphComponent graphComponent) { - super(stage, graphComponent); - } - - @Override - public void startEditing(Object cellObj, EventObject eventObj) { - if (editingCell != null) { - stopEditing(true); - } - if (!graphComponent.getGraph().getModel().isEdge(cellObj)) { - return; - } - mxCellState state = graphComponent.getGraph().getView().getState(cellObj); - if (state != null && state.getLabel() != null && !state.getLabel().isEmpty()) { - editingCell = cellObj; - trigger = eventObj; - - double scale = Math.max(minimumEditorScale, graphComponent.getGraph().getView().getScale()); - Object value = graphComponent.getGraph().getModel().getValue(cellObj); - if (value instanceof PushPullAttribute) { - PushPullAttribute attr = (PushPullAttribute) value; - comboBox = new JComboBox<>(attr.getOptionStrings()); - comboBox.setBorder(BorderFactory.createEmptyBorder()); - comboBox.setOpaque(false); - comboBox.setBounds(getEditorBounds(state, scale)); - comboBox.setVisible(true); - graphComponent.getGraphControl().add(comboBox, 0); - comboBox.updateUI(); - } - } - } - - @Override - public void stopEditing(boolean cancel) { - if (editingCell == null) { - return; - } - comboBox.transferFocusUpCycle(); - Object cell = editingCell; - editingCell = null; - if (!cancel) { - EventObject trig = trigger; - trigger = null; - Object value = graphComponent.getGraph().getModel().getValue(cell); - if (value instanceof PushPullAttribute) { - PushPullAttribute attr = (PushPullAttribute) value; - List options = attr.getOptions(); - PushPullValue selected = null; - for (PushPullValue option : options) { - if (option.toString().equals(getCurrentValue())) { - selected = option; - break; - } - } - if (selected != null) { - attr.selectOption(selected); - } - graphComponent.labelChanged(cell, attr, trig); - } - } else { - mxCellState state = graphComponent.getGraph().getView().getState(cell); - graphComponent.redraw(state); - } - - if (comboBox.getParent() != null) { - comboBox.setVisible(false); - comboBox.getParent().remove(comboBox); - } - - graphComponent.requestFocusInWindow(); - } - - public String getCurrentValue() { - return (String) comboBox.getSelectedItem(); - } - - /** - * Returns the bounds to be used for the editor. - */ - public Rectangle getEditorBounds(mxCellState state, double scale) { - mxIGraphModel model = state.getView().getGraph().getModel(); - Rectangle bounds = state.getLabelBounds().getRectangle(); - bounds.height += 10; - - // Applies the horizontal and vertical label positions - if (model.isVertex(state.getCell())) { - String horizontal = mxUtils.getString(state.getStyle(), mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER); - if (horizontal.equals(mxConstants.ALIGN_LEFT)) { - bounds.x -= (int) state.getWidth(); - } else if (horizontal.equals(mxConstants.ALIGN_RIGHT)) { - bounds.x += (int) state.getWidth(); - } - String vertical = mxUtils.getString(state.getStyle(), mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE); - if (vertical.equals(mxConstants.ALIGN_TOP)) { - bounds.y -= (int) state.getHeight(); - } else if (vertical.equals(mxConstants.ALIGN_BOTTOM)) { - bounds.y += (int) state.getHeight(); - } - } - bounds.setSize((int) Math.max(bounds.getWidth(), Math.round(minimumWidth * scale)), (int) Math.max(bounds.getHeight(), Math.round(minimumHeight * scale))); - return bounds; - } + + public int DEFAULT_MIN_WIDTH = 70; + public int DEFAULT_MIN_HEIGHT = 30; + public double DEFAULT_MINIMUM_EDITOR_SCALE = 1; + + protected double minimumEditorScale = DEFAULT_MINIMUM_EDITOR_SCALE; + protected int minimumWidth = DEFAULT_MIN_WIDTH; + protected int minimumHeight = DEFAULT_MIN_HEIGHT; + + private EventObject trigger; + private JComboBox comboBox; + + public PushPullSelectionCellEditor(PushPullSelectionStage stage, mxGraphComponent graphComponent) { + super(stage, graphComponent); + } + + @Override + public void startEditing(Object cellObj, EventObject eventObj) { + if (editingCell != null) { + stopEditing(true); + } + if (!graphComponent.getGraph().getModel().isEdge(cellObj)) { + return; + } + mxCellState state = graphComponent.getGraph().getView().getState(cellObj); + if (state != null && state.getLabel() != null && !state.getLabel().isEmpty()) { + editingCell = cellObj; + trigger = eventObj; + + double scale = Math.max(minimumEditorScale, graphComponent.getGraph().getView().getScale()); + Object value = graphComponent.getGraph().getModel().getValue(cellObj); + if (value instanceof PushPullAttribute) { + PushPullAttribute attr = (PushPullAttribute) value; + comboBox = new JComboBox<>(attr.getOptionStrings()); + comboBox.setBorder(BorderFactory.createEmptyBorder()); + comboBox.setOpaque(false); + comboBox.setBounds(getEditorBounds(state, scale)); + comboBox.setVisible(true); + graphComponent.getGraphControl().add(comboBox, 0); + comboBox.updateUI(); + } + } + } + + @Override + public void stopEditing(boolean cancel) { + if (editingCell == null) { + return; + } + comboBox.transferFocusUpCycle(); + Object cell = editingCell; + editingCell = null; + if (!cancel) { + EventObject trig = trigger; + trigger = null; + Object value = graphComponent.getGraph().getModel().getValue(cell); + if (value instanceof PushPullAttribute) { + PushPullAttribute attr = (PushPullAttribute) value; + List options = attr.getOptions(); + PushPullValue selected = null; + for (PushPullValue option : options) { + if (option.toString().equals(getCurrentValue())) { + selected = option; + break; + } + } + if (selected != null) { + attr.selectOption(selected); + } + graphComponent.labelChanged(cell, attr, trig); + } + } else { + mxCellState state = graphComponent.getGraph().getView().getState(cell); + graphComponent.redraw(state); + } + + if (comboBox.getParent() != null) { + comboBox.setVisible(false); + comboBox.getParent().remove(comboBox); + } + + graphComponent.requestFocusInWindow(); + } + + public String getCurrentValue() { + return (String) comboBox.getSelectedItem(); + } + + /** + * Returns the bounds to be used for the editor. + */ + public Rectangle getEditorBounds(mxCellState state, double scale) { + mxIGraphModel model = state.getView().getGraph().getModel(); + Rectangle bounds = state.getLabelBounds().getRectangle(); + bounds.height += 10; + + // Applies the horizontal and vertical label positions + if (model.isVertex(state.getCell())) { + String horizontal = mxUtils.getString(state.getStyle(), mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER); + if (horizontal.equals(mxConstants.ALIGN_LEFT)) { + bounds.x -= (int) state.getWidth(); + } else if (horizontal.equals(mxConstants.ALIGN_RIGHT)) { + bounds.x += (int) state.getWidth(); + } + String vertical = mxUtils.getString(state.getStyle(), mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE); + if (vertical.equals(mxConstants.ALIGN_TOP)) { + bounds.y -= (int) state.getHeight(); + } else if (vertical.equals(mxConstants.ALIGN_BOTTOM)) { + bounds.y += (int) state.getHeight(); + } + } + bounds.setSize((int) Math.max(bounds.getWidth(), Math.round(minimumWidth * scale)), (int) Math.max(bounds.getHeight(), Math.round(minimumHeight * scale))); + return bounds; + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java index 27471b2..35aaa1b 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java @@ -23,352 +23,352 @@ import java.util.*; public class PushPullSelectionStage extends Stage { - - private DataFlowGraph dataFlowGraph = null; + + private DataFlowGraph dataFlowGraph = null; private HashMap resNodeToCell; private HashMap channelToCell; - - public PushPullSelectionStage(mxGraphComponent graphComponent) { - super(graphComponent); - } - - @Override - public void init(Stage prevStage) { - if (prevStage instanceof DataFlowModelingStage) { - model = prevStage.getModel(); - dataFlowGraph = analyzeDataTransferModel(model); - showLayers(DATA_FLOW_LAYER); - } - } - - @Override - public FlowCellEditor createCellEditor(mxGraphComponent graphComponent) { - return new PushPullSelectionCellEditor(this, graphComponent); - } - - @Override - public mxIEventListener createChangeEventListener(Editor editor) { - return (sender, eventObject) -> { - List terminals = new ArrayList<>(); - mxCell cell = null; - for (Object change : ((List) eventObject.getProperties().get("changes"))) { - if (change instanceof mxGraphModel.mxTerminalChange) { - mxGraphModel.mxTerminalChange terminalChange = (mxGraphModel.mxTerminalChange) change; - cell = (mxCell) terminalChange.getCell(); - mxCell terminal = (mxCell) terminalChange.getTerminal(); - terminals.add(terminal); - } - } - if (terminals.size() == 2) { - // cancel connect - graph.removeCells(new mxCell[]{cell}); - graph.clearSelection(); - } - }; - } - - @Override - public MouseListener createMouseEventListener(Editor editor) { - return null; - } - - @Override - public boolean canChangeFrom(Stage prevStage) { - if (prevStage instanceof DataFlowModelingStage) { - return ((DataFlowModelingStage) prevStage).isValid(); - } - return false; - } - - private DataFlowGraph analyzeDataTransferModel(DataTransferModel model) { - DataFlowGraph flowGraph = DataTransferModelAnalyzer.createDataFlowGraphWithStateStoringAttribute(model); - dataFlowGraph = DataTransferModelAnalyzer.annotateWithSelectableDataTransferAttiribute(flowGraph); - mxCell parent = (mxCell) graph.getDefaultParent(); - mxCell layer = (mxCell) parent.getChildAt(DATA_FLOW_LAYER); - if (layer.getChildCount() == 0) { - constructGraph(); // Construct data-flow graph (on file open action) - } // Construct data-flow graph (on file open action) - updateEdgeAttributes(dataFlowGraph); // Update push/pull selection pull-downs - return dataFlowGraph; - } - - private void updateEdgeAttributes(DataFlowGraph dataFlowGraph) { - mxCell root = (mxCell) graph.getDefaultParent(); - mxCell layer = (mxCell) root.getChildAt(DATA_FLOW_LAYER); - - graph.getModel().beginUpdate(); - try { - // add input, output and reference edges - for (Edge e : dataFlowGraph.getEdges()) { - if (e instanceof DataFlowEdge) { - DataFlowEdge dataFlow = (DataFlowEdge) e; - if (!dataFlow.isChannelToResource()) { - ResourceNode srcRes = (ResourceNode) dataFlow.getSource(); - DataTransferChannel channel = ((ChannelNode) dataFlow.getDestination()).getChannel(); - // input edge - for (Object edge : graph.getChildEdges(layer)) { - mxCell edgeCell = (mxCell) edge; - if (edgeCell.getValue() instanceof Editor.SrcDstAttribute) { - Editor.SrcDstAttribute edgeAttr = (Editor.SrcDstAttribute) edgeCell.getValue(); - if (srcRes.getPrimaryResourcePath().equals(edgeAttr.getSource()) && channel.equals(edgeAttr.getDestination())) { - edgeCell.setValue(dataFlow.getAttribute()); - break; - } - } - } - } - } - } - } finally { - graph.getModel().endUpdate(); - } - graph.refresh(); - } - - /** - * Construct a mxGraph from DataFlowGraph - */ - public void constructGraph() { - ((mxGraphModel) graph.getModel()).clear(); - constructLayer(this.graph); - - mxCell parent = (mxCell) graph.getDefaultParent(); - mxCell layer = (mxCell) parent.getChildAt(DATA_FLOW_LAYER); - - graph.getModel().beginUpdate(); - try { - Map channelInToCell = new HashMap<>(); - Map channelOutToCell = new HashMap<>(); - channelToCell = new HashMap<>(); - resNodeToCell = new HashMap<>(); - - mxGeometry geoPortIn = new mxGeometry(0, 0.5, PORT_DIAMETER, PORT_DIAMETER); - geoPortIn.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); - geoPortIn.setRelative(true); - - mxGeometry geoPortOut = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); - geoPortOut.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); - geoPortOut.setRelative(true); - - // create resource vertices - for (ResourceNode resourceNode : dataFlowGraph.getRootResourceNodes()) { - int w = 80; - int h = 30; - ResourcePath resourcePath = resourceNode.getPrimaryResourcePath(); - mxCell resourceCell = (mxCell) graph.insertVertex(layer, null, resourcePath.getLeafResourceName(), 20, 20, w, h, "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"); // insert a resource as a vertex - resNodeToCell.put(resourceNode, resourceCell); - - createChildResourceVertices(resourceCell, resourceNode, w, h); - } - - // create channel vertices - for (ChannelNode channelNode : dataFlowGraph.getRootChannelNodes()) { - DataTransferChannel channel = channelNode.getChannel(); - if (!channel.getInputResources().isEmpty()) { - // Normal channel - if (channelInToCell.get(channel) == null || channelOutToCell.get(channel) == null) { - String channelName = channel.getChannelName(); - if (channel.getSelectors().size() > 0) { - channelName += "("; - String delimiter = ""; - for (Selector s: channel.getSelectors()) { - Expression exp = s.getExpression(); - String selectorName = exp.toString(); - channelName += delimiter + selectorName; - delimiter = ", "; - } - channelName += ")"; - } - int w = 60; - int h = 30; - if (channelNode.getChildren().size() > 0) { - w *= 2; - h *= 2; - } - mxCell channelCell = (mxCell) graph.insertVertex(layer, null, channelName, 150, 20, w, h, "verticalAlign=top"); // insert a channel as a vertex - channelToCell.put(channel, channelCell); - - mxCell portIn = new mxCell(null, geoPortIn, "shape=ellipse;perimter=ellipsePerimeter"); - portIn.setVertex(true); - graph.addCell(portIn, channelCell); // insert the input port of a channel - channelInToCell.put(channel, portIn); - - mxCell portOut = new mxCell(null, geoPortOut, "shape=ellipse;perimter=ellipsePerimeter"); - portOut.setVertex(true); - graph.addCell(portOut, channelCell); // insert the output port of a channel - channelOutToCell.put(channel, portOut); - createChildChannelVertices(channelCell, channelNode, channelInToCell, channelOutToCell, geoPortIn, geoPortOut, w, h); - } - } else { - // Event channel - if (channelOutToCell.get(channel) == null) { - String channelName = channel.getChannelName(); - if (channel.getSelectors().size() > 0) { - channelName += "("; - String delimiter = ""; - for (Selector s: channel.getSelectors()) { - Expression exp = s.getExpression(); - String selectorName = exp.toString(); - channelName += delimiter + selectorName; - delimiter = ", "; - } - channelName += ")"; - } - int w = 40; - int h = 30; - if (channelNode.getChildren().size() > 0) { - w *= 2; - h *= 2; - } - mxCell channelCell = (mxCell) graph.insertVertex(layer, null, channelName, 150, 20, w, h, "verticalAlign=top"); // insert a channel as a vertex - channelToCell.put(channel, channelCell); - - mxCell portOut = new mxCell(null, geoPortOut, "shape=ellipse;perimter=ellipsePerimeter"); - portOut.setVertex(true); - graph.addCell(portOut, channelCell); // insert the output port of a channel - channelOutToCell.put(channel, portOut); - createChildChannelVertices(channelCell, channelNode, channelInToCell, channelOutToCell, geoPortIn, geoPortOut, w, h); - } - } - } - - // add input, output and reference edges - for (Edge edge : dataFlowGraph.getEdges()) { - DataFlowEdge dataFlowEdge = (DataFlowEdge) edge; - if (dataFlowEdge.isChannelToResource()) { - // output edge - DataTransferChannel channel = ((ChannelNode) dataFlowEdge.getSource()).getChannel(); - ResourcePath dstRes = ((ResourceNode) dataFlowEdge.getDestination()).getInSideResource(channel); - graph.insertEdge(layer, null, new Editor.SrcDstAttribute(channel, dstRes), channelOutToCell.get(channel), resNodeToCell.get((ResourceNode) dataFlowEdge.getDestination()), "strokeColor=red;movable=false"); - } else { - // input edge - DataTransferChannel channel = ((ChannelNode) dataFlowEdge.getDestination()).getChannel(); - ResourcePath srcRes = ((ResourceNode) dataFlowEdge.getSource()).getOutSideResource(channel); - Set> toRes = getResourceDependencyForChannel(channel, dataFlowGraph); - for (Map.Entry RtoR : toRes) { - graph.insertEdge(layer, null, null, resNodeToCell.get(RtoR.getValue()), resNodeToCell.get(RtoR.getKey()), "strokeColor=red;dashed=true;movable=false"); - } - - graph.insertEdge(layer, null, new Editor.SrcDstAttribute(srcRes, channel), resNodeToCell.get((ResourceNode) dataFlowEdge.getSource()), channelInToCell.get(channel), "strokeColor=red;movable=false"); - } - } - - for (Channel ch : model.getChannels()) { - // reference edges - DataTransferChannel channel = (DataTransferChannel) ch; - for (ResourcePath refRes : channel.getReferenceResources()) { - graph.insertEdge(layer, null, null, resNodeToCell.get(dataFlowGraph.getResourceNode(refRes)), channelInToCell.get(channel), "strokeColor=red;dashed=true;movable=false"); - } - } - } finally { - graph.getModel().endUpdate(); - } - } - - private void createChildResourceVertices(mxCell parentCell, ResourceNode parentResNode, int w, int h) { - for (ResourceNode resNode: parentResNode.getChildren()) { - ResourcePath resPath = resNode.getPrimaryResourcePath(); - mxCell resourceCell = (mxCell) graph.insertVertex(parentCell, null, resPath.getName(), 0, 0, w, h, "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"); // insert a resource as a vertex - resNodeToCell.put(resNode, resourceCell); - createChildResourceVertices(resourceCell, resNode, w, h); - } - } - private void createChildChannelVertices(mxCell parentCell, ChannelNode parentChannelNode, - Map channelInToCell, Map channelOutToCell, mxGeometry geoPortIn, mxGeometry geoPortOut, int w, int h) { - for (ChannelNode channelNode: parentChannelNode.getChildren()) { - DataTransferChannel channel = channelNode.getChannel(); - if (!channel.getInputResources().isEmpty()) { - // Normal channel - if (channelInToCell.get(channel) == null || channelOutToCell.get(channel) == null) { - String channelName = channel.getChannelName(); - if (channel.getSelectors().size() > 0) { - channelName += "("; - String delimiter = ""; - for (Selector s: channel.getSelectors()) { - Expression exp = s.getExpression(); - String selectorName = exp.toString(); - channelName += delimiter + selectorName; - delimiter = ", "; - } - channelName += ")"; - } - mxCell channelCell = (mxCell) graph.insertVertex(parentCell, null, channelName, w / 4, h / 4, w / 2, h / 2, "verticalAlign=top"); // insert a channel as a vertex - channelToCell.put(channel, channelCell); - - mxCell portIn = new mxCell(null, geoPortIn, "shape=ellipse;perimter=ellipsePerimeter"); - portIn.setVertex(true); - graph.addCell(portIn, channelCell); // insert the input port of a channel - channelInToCell.put(channel, portIn); - - mxCell portOut = new mxCell(null, geoPortOut, "shape=ellipse;perimter=ellipsePerimeter"); - portOut.setVertex(true); - graph.addCell(portOut, channelCell); // insert the output port of a channel - channelOutToCell.put(channel, portOut); - createChildChannelVertices(channelCell, channelNode, channelInToCell, channelOutToCell, geoPortIn, geoPortOut, w / 2, h / 2); - } - } else { - // Event channel - if (channelOutToCell.get(channel) == null) { - String channelName = channel.getChannelName(); - if (channel.getSelectors().size() > 0) { - channelName += "("; - String delimiter = ""; - for (Selector s: channel.getSelectors()) { - Expression exp = s.getExpression(); - String selectorName = exp.toString(); - channelName += delimiter + selectorName; - delimiter = ", "; - } - channelName += ")"; - } - mxCell channelCell = (mxCell) graph.insertVertex(parentCell, null, channelName, w / 4, h / 4, w / 2, h / 2, "verticalAlign=top"); // insert a channel as a vertex - channelToCell.put(channel, channelCell); - - mxCell portOut = new mxCell(null, geoPortOut, "shape=ellipse;perimter=ellipsePerimeter"); - portOut.setVertex(true); - graph.addCell(portOut, channelCell); // insert the output port of a channel - channelOutToCell.put(channel, portOut); - createChildChannelVertices(channelCell, channelNode, channelInToCell, channelOutToCell, geoPortIn, geoPortOut, w / 2, h / 2); - } - } - } + public PushPullSelectionStage(mxGraphComponent graphComponent) { + super(graphComponent); } - - private Set> getResourceDependencyForChannel(DataTransferChannel ch, DataFlowGraph dataFlowGraph) { - Set> resourceDependency = new HashSet<>(); - if (!ch.getOutputChannelMembers().isEmpty()) { - try { - Map>> dependency = ch.fillOutsideResourcePaths(ch.getOutputChannelMembers().iterator().next(), JavaCodeGenerator.pullAccessor); - for (ChannelMember srcMem : dependency.keySet()) { - ResourceNode srcNode = dataFlowGraph.getResourceNode(srcMem.getResource()); - if (srcNode != null) { - for (ChannelMember dstMem : dependency.get(srcMem).getValue()) { - ResourceNode dstNode = dataFlowGraph.getResourceNode(dstMem.getResource()); - while (srcNode.getResourceHierarchy().getNumParameters() == 0 && srcNode.getParent() != null) { - srcNode = srcNode.getParent(); - } - resourceDependency.add(new AbstractMap.SimpleEntry<>(srcNode, dstNode)); - } - } - } - } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | - UnificationFailed | ValueUndefined e) { - e.printStackTrace(); - } - } - return resourceDependency; - } - - public DataFlowGraph getDataFlowGraph() { - return dataFlowGraph; - } - - public HashMap getResNodeToCell() { - return resNodeToCell; - } - - public HashMap getChannelToCell() { - return channelToCell; - } + + @Override + public void init(Stage prevStage) { + if (prevStage instanceof DataFlowModelingStage) { + model = prevStage.getModel(); + dataFlowGraph = analyzeDataTransferModel(model); + showLayers(DATA_FLOW_LAYER); + } + } + + @Override + public FlowCellEditor createCellEditor(mxGraphComponent graphComponent) { + return new PushPullSelectionCellEditor(this, graphComponent); + } + + @Override + public mxIEventListener createChangeEventListener(Editor editor) { + return (sender, eventObject) -> { + List terminals = new ArrayList<>(); + mxCell cell = null; + for (Object change : ((List) eventObject.getProperties().get("changes"))) { + if (change instanceof mxGraphModel.mxTerminalChange) { + mxGraphModel.mxTerminalChange terminalChange = (mxGraphModel.mxTerminalChange) change; + cell = (mxCell) terminalChange.getCell(); + mxCell terminal = (mxCell) terminalChange.getTerminal(); + terminals.add(terminal); + } + } + if (terminals.size() == 2) { + // cancel connect + graph.removeCells(new mxCell[]{cell}); + graph.clearSelection(); + } + }; + } + + @Override + public MouseListener createMouseEventListener(Editor editor) { + return null; + } + + @Override + public boolean canChangeFrom(Stage prevStage) { + if (prevStage instanceof DataFlowModelingStage) { + return ((DataFlowModelingStage) prevStage).isValid(); + } + return false; + } + + private DataFlowGraph analyzeDataTransferModel(DataTransferModel model) { + DataFlowGraph flowGraph = DataTransferModelAnalyzer.createDataFlowGraphWithStateStoringAttribute(model); + dataFlowGraph = DataTransferModelAnalyzer.annotateWithSelectableDataTransferAttiribute(flowGraph); + mxCell parent = (mxCell) graph.getDefaultParent(); + mxCell layer = (mxCell) parent.getChildAt(DATA_FLOW_LAYER); + if (layer.getChildCount() == 0) { + constructGraph(); // Construct data-flow graph (on file open action) + } // Construct data-flow graph (on file open action) + updateEdgeAttributes(dataFlowGraph); // Update push/pull selection pull-downs + return dataFlowGraph; + } + + private void updateEdgeAttributes(DataFlowGraph dataFlowGraph) { + mxCell root = (mxCell) graph.getDefaultParent(); + mxCell layer = (mxCell) root.getChildAt(DATA_FLOW_LAYER); + + graph.getModel().beginUpdate(); + try { + // add input, output and reference edges + for (Edge e : dataFlowGraph.getEdges()) { + if (e instanceof DataFlowEdge) { + DataFlowEdge dataFlow = (DataFlowEdge) e; + if (!dataFlow.isChannelToResource()) { + ResourceNode srcRes = (ResourceNode) dataFlow.getSource(); + DataTransferChannel channel = ((ChannelNode) dataFlow.getDestination()).getChannel(); + // input edge + for (Object edge : graph.getChildEdges(layer)) { + mxCell edgeCell = (mxCell) edge; + if (edgeCell.getValue() instanceof Editor.SrcDstAttribute) { + Editor.SrcDstAttribute edgeAttr = (Editor.SrcDstAttribute) edgeCell.getValue(); + if (srcRes.getPrimaryResourcePath().equals(edgeAttr.getSource()) && channel.equals(edgeAttr.getDestination())) { + edgeCell.setValue(dataFlow.getAttribute()); + break; + } + } + } + } + } + } + } finally { + graph.getModel().endUpdate(); + } + graph.refresh(); + } + + /** + * Construct a mxGraph from DataFlowGraph + */ + public void constructGraph() { + ((mxGraphModel) graph.getModel()).clear(); + constructLayer(this.graph); + + mxCell parent = (mxCell) graph.getDefaultParent(); + mxCell layer = (mxCell) parent.getChildAt(DATA_FLOW_LAYER); + + graph.getModel().beginUpdate(); + try { + Map channelInToCell = new HashMap<>(); + Map channelOutToCell = new HashMap<>(); + channelToCell = new HashMap<>(); + resNodeToCell = new HashMap<>(); + + mxGeometry geoPortIn = new mxGeometry(0, 0.5, PORT_DIAMETER, PORT_DIAMETER); + geoPortIn.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); + geoPortIn.setRelative(true); + + mxGeometry geoPortOut = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); + geoPortOut.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); + geoPortOut.setRelative(true); + + // create resource vertices + for (ResourceNode resourceNode : dataFlowGraph.getRootResourceNodes()) { + int w = 80; + int h = 30; + ResourcePath resourcePath = resourceNode.getPrimaryResourcePath(); + mxCell resourceCell = (mxCell) graph.insertVertex(layer, null, resourcePath.getLeafResourceName(), 20, 20, w, h, "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"); // insert a resource as a vertex + resNodeToCell.put(resourceNode, resourceCell); + + createChildResourceVertices(resourceCell, resourceNode, w, h); + } + + // create channel vertices + for (ChannelNode channelNode : dataFlowGraph.getRootChannelNodes()) { + DataTransferChannel channel = channelNode.getChannel(); + if (!channel.getInputResources().isEmpty()) { + // Normal channel + if (channelInToCell.get(channel) == null || channelOutToCell.get(channel) == null) { + String channelName = channel.getChannelName(); + if (channel.getSelectors().size() > 0) { + channelName += "("; + String delimiter = ""; + for (Selector s : channel.getSelectors()) { + Expression exp = s.getExpression(); + String selectorName = exp.toString(); + channelName += delimiter + selectorName; + delimiter = ", "; + } + channelName += ")"; + } + int w = 60; + int h = 30; + if (channelNode.getChildren().size() > 0) { + w *= 2; + h *= 2; + } + mxCell channelCell = (mxCell) graph.insertVertex(layer, null, channelName, 150, 20, w, h, "verticalAlign=top"); // insert a channel as a vertex + channelToCell.put(channel, channelCell); + + mxCell portIn = new mxCell(null, geoPortIn, "shape=ellipse;perimter=ellipsePerimeter"); + portIn.setVertex(true); + graph.addCell(portIn, channelCell); // insert the input port of a channel + channelInToCell.put(channel, portIn); + + mxCell portOut = new mxCell(null, geoPortOut, "shape=ellipse;perimter=ellipsePerimeter"); + portOut.setVertex(true); + graph.addCell(portOut, channelCell); // insert the output port of a channel + channelOutToCell.put(channel, portOut); + createChildChannelVertices(channelCell, channelNode, channelInToCell, channelOutToCell, geoPortIn, geoPortOut, w, h); + } + } else { + // Event channel + if (channelOutToCell.get(channel) == null) { + String channelName = channel.getChannelName(); + if (channel.getSelectors().size() > 0) { + channelName += "("; + String delimiter = ""; + for (Selector s : channel.getSelectors()) { + Expression exp = s.getExpression(); + String selectorName = exp.toString(); + channelName += delimiter + selectorName; + delimiter = ", "; + } + channelName += ")"; + } + int w = 40; + int h = 30; + if (channelNode.getChildren().size() > 0) { + w *= 2; + h *= 2; + } + mxCell channelCell = (mxCell) graph.insertVertex(layer, null, channelName, 150, 20, w, h, "verticalAlign=top"); // insert a channel as a vertex + channelToCell.put(channel, channelCell); + + mxCell portOut = new mxCell(null, geoPortOut, "shape=ellipse;perimter=ellipsePerimeter"); + portOut.setVertex(true); + graph.addCell(portOut, channelCell); // insert the output port of a channel + channelOutToCell.put(channel, portOut); + createChildChannelVertices(channelCell, channelNode, channelInToCell, channelOutToCell, geoPortIn, geoPortOut, w, h); + } + } + } + + // add input, output and reference edges + for (Edge edge : dataFlowGraph.getEdges()) { + DataFlowEdge dataFlowEdge = (DataFlowEdge) edge; + if (dataFlowEdge.isChannelToResource()) { + // output edge + DataTransferChannel channel = ((ChannelNode) dataFlowEdge.getSource()).getChannel(); + ResourcePath dstRes = ((ResourceNode) dataFlowEdge.getDestination()).getInSideResource(channel); + graph.insertEdge(layer, null, new Editor.SrcDstAttribute(channel, dstRes), channelOutToCell.get(channel), resNodeToCell.get((ResourceNode) dataFlowEdge.getDestination()), "strokeColor=red;movable=false"); + } else { + // input edge + DataTransferChannel channel = ((ChannelNode) dataFlowEdge.getDestination()).getChannel(); + ResourcePath srcRes = ((ResourceNode) dataFlowEdge.getSource()).getOutSideResource(channel); + Set> toRes = getResourceDependencyForChannel(channel, dataFlowGraph); + for (Map.Entry RtoR : toRes) { + graph.insertEdge(layer, null, null, resNodeToCell.get(RtoR.getValue()), resNodeToCell.get(RtoR.getKey()), "strokeColor=red;dashed=true;movable=false"); + } + + graph.insertEdge(layer, null, new Editor.SrcDstAttribute(srcRes, channel), resNodeToCell.get((ResourceNode) dataFlowEdge.getSource()), channelInToCell.get(channel), "strokeColor=red;movable=false"); + } + } + + for (Channel ch : model.getChannels()) { + // reference edges + DataTransferChannel channel = (DataTransferChannel) ch; + for (ResourcePath refRes : channel.getReferenceResources()) { + graph.insertEdge(layer, null, null, resNodeToCell.get(dataFlowGraph.getResourceNode(refRes)), channelInToCell.get(channel), "strokeColor=red;dashed=true;movable=false"); + } + } + } finally { + graph.getModel().endUpdate(); + } + } + + private void createChildResourceVertices(mxCell parentCell, ResourceNode parentResNode, int w, int h) { + for (ResourceNode resNode : parentResNode.getChildren()) { + ResourcePath resPath = resNode.getPrimaryResourcePath(); + mxCell resourceCell = (mxCell) graph.insertVertex(parentCell, null, resPath.getName(), 0, 0, w, h, "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"); // insert a resource as a vertex + resNodeToCell.put(resNode, resourceCell); + createChildResourceVertices(resourceCell, resNode, w, h); + } + } + + private void createChildChannelVertices(mxCell parentCell, ChannelNode parentChannelNode, + Map channelInToCell, Map channelOutToCell, mxGeometry geoPortIn, mxGeometry geoPortOut, int w, int h) { + for (ChannelNode channelNode : parentChannelNode.getChildren()) { + DataTransferChannel channel = channelNode.getChannel(); + if (!channel.getInputResources().isEmpty()) { + // Normal channel + if (channelInToCell.get(channel) == null || channelOutToCell.get(channel) == null) { + String channelName = channel.getChannelName(); + if (channel.getSelectors().size() > 0) { + channelName += "("; + String delimiter = ""; + for (Selector s : channel.getSelectors()) { + Expression exp = s.getExpression(); + String selectorName = exp.toString(); + channelName += delimiter + selectorName; + delimiter = ", "; + } + channelName += ")"; + } + mxCell channelCell = (mxCell) graph.insertVertex(parentCell, null, channelName, w / 4, h / 4, w / 2, h / 2, "verticalAlign=top"); // insert a channel as a vertex + channelToCell.put(channel, channelCell); + + mxCell portIn = new mxCell(null, geoPortIn, "shape=ellipse;perimter=ellipsePerimeter"); + portIn.setVertex(true); + graph.addCell(portIn, channelCell); // insert the input port of a channel + channelInToCell.put(channel, portIn); + + mxCell portOut = new mxCell(null, geoPortOut, "shape=ellipse;perimter=ellipsePerimeter"); + portOut.setVertex(true); + graph.addCell(portOut, channelCell); // insert the output port of a channel + channelOutToCell.put(channel, portOut); + createChildChannelVertices(channelCell, channelNode, channelInToCell, channelOutToCell, geoPortIn, geoPortOut, w / 2, h / 2); + } + } else { + // Event channel + if (channelOutToCell.get(channel) == null) { + String channelName = channel.getChannelName(); + if (channel.getSelectors().size() > 0) { + channelName += "("; + String delimiter = ""; + for (Selector s : channel.getSelectors()) { + Expression exp = s.getExpression(); + String selectorName = exp.toString(); + channelName += delimiter + selectorName; + delimiter = ", "; + } + channelName += ")"; + } + mxCell channelCell = (mxCell) graph.insertVertex(parentCell, null, channelName, w / 4, h / 4, w / 2, h / 2, "verticalAlign=top"); // insert a channel as a vertex + channelToCell.put(channel, channelCell); + + mxCell portOut = new mxCell(null, geoPortOut, "shape=ellipse;perimter=ellipsePerimeter"); + portOut.setVertex(true); + graph.addCell(portOut, channelCell); // insert the output port of a channel + channelOutToCell.put(channel, portOut); + createChildChannelVertices(channelCell, channelNode, channelInToCell, channelOutToCell, geoPortIn, geoPortOut, w / 2, h / 2); + } + } + } + } + + private Set> getResourceDependencyForChannel(DataTransferChannel ch, DataFlowGraph dataFlowGraph) { + Set> resourceDependency = new HashSet<>(); + if (!ch.getOutputChannelMembers().isEmpty()) { + try { + Map>> dependency = ch.fillOutsideResourcePaths(ch.getOutputChannelMembers().iterator().next(), JavaCodeGenerator.pullAccessor); + for (ChannelMember srcMem : dependency.keySet()) { + ResourceNode srcNode = dataFlowGraph.getResourceNode(srcMem.getResource()); + if (srcNode != null) { + for (ChannelMember dstMem : dependency.get(srcMem).getValue()) { + ResourceNode dstNode = dataFlowGraph.getResourceNode(dstMem.getResource()); + while (srcNode.getResourceHierarchy().getNumParameters() == 0 && srcNode.getParent() != null) { + srcNode = srcNode.getParent(); + } + resourceDependency.add(new AbstractMap.SimpleEntry<>(srcNode, dstNode)); + } + } + } + } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | + UnificationFailed | ValueUndefined e) { + e.printStackTrace(); + } + } + return resourceDependency; + } + + public DataFlowGraph getDataFlowGraph() { + return dataFlowGraph; + } + + public HashMap getResNodeToCell() { + return resNodeToCell; + } + + public HashMap getChannelToCell() { + return channelToCell; + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/layouts/DAGLayout.java b/AlgebraicDataflowArchitectureModel/src/application/layouts/DAGLayout.java index 9200de6..785be27 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/layouts/DAGLayout.java +++ b/AlgebraicDataflowArchitectureModel/src/application/layouts/DAGLayout.java @@ -1,14 +1,5 @@ package application.layouts; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; - import com.mxgraph.layout.mxGraphLayout; import com.mxgraph.model.mxCell; import com.mxgraph.model.mxGeometry; @@ -17,6 +8,8 @@ import com.mxgraph.view.mxGraph; import com.mxgraph.view.mxGraphView; +import java.util.*; + public class DAGLayout extends mxGraphLayout { private mxIGraphModel graphModel; private mxGraphView view; @@ -43,7 +36,7 @@ final double MARGIN_WIDTH = 30; final double MARGIN_HEIGHT = 30; final double delta = Math.pow(10, -3); - + public DAGLayout(mxGraph graph) { super(graph); @@ -213,8 +206,8 @@ } } - public void recalcDepths() { - while (true) { + public void recalcDepths() { + while (true) { boolean isUpdated = false; for (List path : paths) { @@ -239,7 +232,8 @@ for (mxCell cell : orderInResourceHierarchy.get(rootCell)) { mxCell parentCell = (mxCell) graphModel.getParent(cell); if (!vertexToDepths.containsKey(cell)) { - if (vertexToDepths.get(parentCell) != null) vertexToDepths.put(cell, Arrays.asList(vertexToDepths.get(parentCell).get(0), vertexToDepths.get(parentCell).get(0))); + if (vertexToDepths.get(parentCell) != null) + vertexToDepths.put(cell, Arrays.asList(vertexToDepths.get(parentCell).get(0), vertexToDepths.get(parentCell).get(0))); } else { if (vertexToDepths.get(parentCell) != null && vertexToDepths.get(parentCell).get(0) > vertexToDepths.get(cell).get(0)) { List dists = vertexToDepths.get(cell); @@ -263,7 +257,7 @@ } } - public void sortPaths() { + public void sortPaths() { for (int i = 0; i < paths.size(); i++) { List path = paths.get(i); @@ -389,13 +383,13 @@ updateDistToMaxX(distToMaxX, movedSet, movedMap, d, maxD, endX); } maxY = Math.max(maxY, endY); - } + } } } } for (mxCell c : resources) { - for (mxCell cc : dotEdges.get(c)) { + for (mxCell cc : dotEdges.get(c)) { for (Map.Entry> entry : dotEdges.entrySet()) { mxCell u = entry.getKey(); for (mxCell v : entry.getValue()) { @@ -403,10 +397,10 @@ continue; } - double []posC = {cellGeo.get(c).get("x") + c.getGeometry().getWidth() / 2, cellGeo.get(c).get("y") + c.getGeometry().getHeight() / 2}; - double []posCC = {cellGeo.get(cc).get("x") + cc.getGeometry().getWidth() / 2, cellGeo.get(cc).get("y") + cc.getGeometry().getHeight() / 2}; - double []posU = {cellGeo.get(u).get("x") + u.getGeometry().getWidth() / 2, cellGeo.get(u).get("y") + u.getGeometry().getHeight() / 2}; - double []posV = {cellGeo.get(v).get("x") + v.getGeometry().getWidth() / 2, cellGeo.get(v).get("y") + v.getGeometry().getHeight() / 2}; + double[] posC = {cellGeo.get(c).get("x") + c.getGeometry().getWidth() / 2, cellGeo.get(c).get("y") + c.getGeometry().getHeight() / 2}; + double[] posCC = {cellGeo.get(cc).get("x") + cc.getGeometry().getWidth() / 2, cellGeo.get(cc).get("y") + cc.getGeometry().getHeight() / 2}; + double[] posU = {cellGeo.get(u).get("x") + u.getGeometry().getWidth() / 2, cellGeo.get(u).get("y") + u.getGeometry().getHeight() / 2}; + double[] posV = {cellGeo.get(v).get("x") + v.getGeometry().getWidth() / 2, cellGeo.get(v).get("y") + v.getGeometry().getHeight() / 2}; if (isStraightLine(posC, posCC, posU, posV)) { c.getGeometry().setX(c.getGeometry().getX() + SHIFT); @@ -429,15 +423,15 @@ ecs.add(paths.get(j).get(0)); } } - + double centerY = cellGeo.get(cur).get("y") + cur.getGeometry().getHeight() / 2; double y = 0; if (ecs.size() % 2 != 0) { - y = centerY - ecs.size()*HEIGHT / 2 - ((ecs.size() - 1) / 2)*SPACE; + y = centerY - ecs.size() * HEIGHT / 2 - ((ecs.size() - 1) / 2) * SPACE; } else { - y = centerY - ecs.size()*HEIGHT / 2 - (ecs.size() - 1)*SPACE / 2; + y = centerY - ecs.size() * HEIGHT / 2 - (ecs.size() - 1) * SPACE / 2; } - + for (int j : order) { mxCell other = paths.get(j).get(0); if (ecs.contains(other)) { @@ -484,7 +478,7 @@ } } - public void layout2(mxCell s) { + public void layout2(mxCell s) { Set movedSet = new HashSet<>(); Map> movedMap = new TreeMap<>(); Map distToMaxX = new HashMap<>(); @@ -600,7 +594,7 @@ } for (mxCell c : resources) { - for (mxCell cc : dotEdges.get(c)) { + for (mxCell cc : dotEdges.get(c)) { for (Map.Entry> entry : dotEdges.entrySet()) { mxCell u = entry.getKey(); for (mxCell v : entry.getValue()) { @@ -608,10 +602,10 @@ continue; } - double []posC = {cellGeo.get(c).get("x") + c.getGeometry().getWidth() / 2, cellGeo.get(c).get("y") + c.getGeometry().getHeight() / 2}; - double []posCC = {cellGeo.get(cc).get("x") + cc.getGeometry().getWidth() / 2, cellGeo.get(cc).get("y") + cc.getGeometry().getHeight() / 2}; - double []posU = {cellGeo.get(u).get("x") + u.getGeometry().getWidth() / 2, cellGeo.get(u).get("y") + u.getGeometry().getHeight() / 2}; - double []posV = {cellGeo.get(v).get("x") + v.getGeometry().getWidth() / 2, cellGeo.get(v).get("y") + v.getGeometry().getHeight() / 2}; + double[] posC = {cellGeo.get(c).get("x") + c.getGeometry().getWidth() / 2, cellGeo.get(c).get("y") + c.getGeometry().getHeight() / 2}; + double[] posCC = {cellGeo.get(cc).get("x") + cc.getGeometry().getWidth() / 2, cellGeo.get(cc).get("y") + cc.getGeometry().getHeight() / 2}; + double[] posU = {cellGeo.get(u).get("x") + u.getGeometry().getWidth() / 2, cellGeo.get(u).get("y") + u.getGeometry().getHeight() / 2}; + double[] posV = {cellGeo.get(v).get("x") + v.getGeometry().getWidth() / 2, cellGeo.get(v).get("y") + v.getGeometry().getHeight() / 2}; if (isStraightLine(posC, posCC, posU, posV)) { c.getGeometry().setX(c.getGeometry().getX() + SHIFT); @@ -638,11 +632,11 @@ double centerY = cellGeo.get(cur).get("y") + cur.getGeometry().getHeight() / 2; double y = 0; if (ecs.size() % 2 != 0) { - y = centerY - ecs.size()*HEIGHT / 2 - ((ecs.size() - 1) / 2)*SPACE; + y = centerY - ecs.size() * HEIGHT / 2 - ((ecs.size() - 1) / 2) * SPACE; } else { - y = centerY - ecs.size()*HEIGHT / 2 - (ecs.size() - 1)*SPACE / 2; + y = centerY - ecs.size() * HEIGHT / 2 - (ecs.size() - 1) * SPACE / 2; } - + for (int j : order) { mxCell other = paths.get(j).get(0); if (ecs.contains(other)) { @@ -700,7 +694,7 @@ mm.get(d).add(c); } - public boolean isStraightLine(double []u1, double []v1, double []u2, double []v2) { + public boolean isStraightLine(double[] u1, double[] v1, double[] u2, double[] v2) { double gradient1 = 0; double length1 = Math.pow(u1[0] - v1[0], 2) + Math.pow(u1[1] - v1[1], 2); double gradient2 = 0; @@ -725,15 +719,15 @@ } } - double [][]a = {u1, v1}; - double [][]b = {u2, v2}; + double[][] a = {u1, v1}; + double[][] b = {u2, v2}; double maxLength = 0; - for (double []c1 : a) { - for (double []c2 : b) { + for (double[] c1 : a) { + for (double[] c2 : b) { double gradient3 = 0; double length3 = Math.pow(c1[0] - c2[0], 2) + Math.pow(c1[1] - c2[1], 2); - if(isVertical) { + if (isVertical) { if (c1[0] == c2[0]) { maxLength = Math.max(maxLength, length3); } else { diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java index 569fe28..6374908 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java @@ -1,80 +1,49 @@ package application.simulator; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Rectangle; -import java.util.EventObject; -import java.util.HashMap; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.swing.BorderFactory; -import javax.swing.JComboBox; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextArea; -import javax.swing.JTextField; - +import application.editor.Editor; import com.mxgraph.model.mxCell; -import com.mxgraph.model.mxGraphModel; import com.mxgraph.model.mxIGraphModel; import com.mxgraph.swing.mxGraphComponent; import com.mxgraph.swing.view.mxICellEditor; import com.mxgraph.util.mxConstants; import com.mxgraph.util.mxUtils; import com.mxgraph.view.mxCellState; -import com.mxgraph.view.mxGraph; -import com.mxgraph.view.mxGraphView; - -import application.editor.Editor; -import application.layouts.DAGLayout; -import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.Term; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.algebra.Variable; +import models.algebra.*; import models.dataConstraintModel.Channel; import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.ResourceHierarchy; import models.dataConstraintModel.ResourcePath; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.DataFlowGraph; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.PushPullAttribute; import models.dataFlowModel.PushPullValue; import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; -import models.visualModel.FormulaChannel; import parser.Parser; import parser.Parser.TokenStream; import parser.exceptions.ExpectedColon; import parser.exceptions.ExpectedDoubleQuotation; import parser.exceptions.ExpectedRightBracket; import parser.exceptions.WrongJsonExpression; -import simulator.ChannelState; +import simulator.Event; import simulator.Resource; import simulator.ResourceIdentifier; import simulator.Simulator; -import simulator.Event; -import simulator.SystemState; -public class InputEventCellEditor implements mxICellEditor { +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.EventObject; +import java.util.List; + +public class InputEventCellEditor implements mxICellEditor { public int DEFAULT_MIN_WIDTH = 70; public int DEFAULT_MIN_HEIGHT = 30; public double DEFAULT_MINIMUM_EDITOR_SCALE = 1; private double x = 20; private double y = 20; - + protected double minimumEditorScale = DEFAULT_MINIMUM_EDITOR_SCALE; protected int minimumWidth = DEFAULT_MIN_WIDTH; protected int minimumHeight = DEFAULT_MIN_HEIGHT; - + private SimulatorWindow window; private Object editingCell; private EventObject trigger; @@ -91,12 +60,12 @@ this.simulator = simulator; this.editor = editor; } - + @Override public Object getEditingCell() { return editingCell; } - + @Override public void startEditing(Object cell, EventObject evt) { if (editingCell != null) { @@ -105,16 +74,16 @@ if (!graphComponent.getGraph().getModel().isEdge(cell)) { Resource res = simulator.getCurState().getResource((String) ((mxCell) cell).getValue()); - ResourceIdentifier resId = res.getResourceIdentifier(); // clicked resource - ArrayList eventChs = new ArrayList<>(); // eventchannelList - ArrayList messages = new ArrayList<>(); // ADLmessage - ArrayList eventMessages = new ArrayList<>(); // messageList + ResourceIdentifier resId = res.getResourceIdentifier(); // clicked resource + ArrayList eventChs = new ArrayList<>(); // eventchannelList + ArrayList messages = new ArrayList<>(); // ADLmessage + ArrayList eventMessages = new ArrayList<>(); // messageList ResourcePath eventResPath = null; - - for (Channel ch: simulator.getModel().getInputChannels()) { // all channels + + for (Channel ch : simulator.getModel().getInputChannels()) { // all channels eventResPath = getSelectableMessages(ch, resId, eventChs, messages, eventMessages, eventResPath); } - + if (messages.isEmpty()) { return; } @@ -122,41 +91,42 @@ JComboBox event = new JComboBox(eventList); JPanel eventChoice = new JPanel(); - eventChoice.add(event); // FirstEventChoice + eventChoice.add(event); // FirstEventChoice int ret = JOptionPane.showConfirmDialog(window, eventChoice, "Event Choice", JOptionPane.OK_CANCEL_OPTION); if (ret == JOptionPane.OK_OPTION) { JPanel inputEvent = new JPanel(); - int i , eventNum; + int i, eventNum; i = eventNum = 0; for (String eventString : eventList) { - if(eventString.equals(event.getSelectedItem().toString())) { + if (eventString.equals(event.getSelectedItem().toString())) { eventNum = i; } i++; } - JTextArea textArea = new JTextArea(eventMessages.get(eventNum).toString(), 10, 30); // EventInput + JTextArea textArea = new JTextArea(eventMessages.get(eventNum).toString(), 10, 30); // EventInput inputEvent.add(textArea); - + int approve = JOptionPane.showConfirmDialog(window, inputEvent, "Event Code", JOptionPane.OK_CANCEL_OPTION); if (approve == JOptionPane.OK_OPTION) { try { - - TokenStream stream = new Parser.TokenStream(); - Parser parser = new Parser(stream); - stream.addLine(textArea.getText()); - Expression eventMessage = parser.parseTerm(stream, simulator.getModel()); - - Event newEvent = new Event(eventChs.get(eventNum), eventMessage, eventResPath, simulator.getCurState().getResource(resId)); - simulator.transition(newEvent); - - graphComponent.setCellEditor(new InputEventCellEditor(window, graphComponent, simulator, this.editor)); - + + TokenStream stream = new Parser.TokenStream(); + Parser parser = new Parser(stream); + stream.addLine(textArea.getText()); + Expression eventMessage = parser.parseTerm(stream, simulator.getModel()); + + Event newEvent = new Event(eventChs.get(eventNum), eventMessage, eventResPath, simulator.getCurState().getResource(resId)); + simulator.transition(newEvent); + + graphComponent.setCellEditor(new InputEventCellEditor(window, graphComponent, simulator, this.editor)); + } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined | ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + | InvalidMessage | UnificationFailed | ValueUndefined | ExpectedRightBracket | + WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -164,12 +134,12 @@ // resource return; } - + mxCellState state = graphComponent.getGraph().getView().getState(cell); if (state != null && state.getLabel() != null && !state.getLabel().equals("")) { editingCell = cell; trigger = evt; - + double scale = Math.max(minimumEditorScale, graphComponent.getGraph().getView().getScale()); Object value = graphComponent.getGraph().getModel().getValue(cell); if (value != null && value instanceof PushPullAttribute) { @@ -184,14 +154,14 @@ } } } - + private ResourcePath getSelectableMessages(Channel ch, ResourceIdentifier resId, - ArrayList eventChs, ArrayList messages, ArrayList eventMessages, - ResourcePath eventResPath) { - if (((DataTransferChannel) ch).getInputResources().size() == 0) { // event ch or normal ch - for (ChannelMember out: ((DataTransferChannel) ch).getOutputChannelMembers()) { + ArrayList eventChs, ArrayList messages, ArrayList eventMessages, + ResourcePath eventResPath) { + if (((DataTransferChannel) ch).getInputResources().size() == 0) { // event ch or normal ch + for (ChannelMember out : ((DataTransferChannel) ch).getOutputChannelMembers()) { ResourcePath resPath = out.getResource(); - if (!out.isOutside() && 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; @@ -200,7 +170,7 @@ List pathParams = resPath.getPathParams(); List children = ((Term) mesExp).getChildren(); mesExp = new Term(((Term) mesExp).getSymbol()); - for (Expression child: children) { + for (Expression child : children) { if (!pathParams.contains(child)) { ((Term) mesExp).addChild(child); } else { @@ -209,20 +179,20 @@ } } message = ((Term) mesExp).getSymbol().toString(); - } else if(mesExp instanceof Variable) { + } else if (mesExp instanceof Variable) { message = ((Variable) mesExp).getName(); } eventMessages.add(mesExp); - messages.add(message); // for the pull-down menu + messages.add(message); // for the pull-down menu } } - for (Channel childCh: ch.getChildren()) { + for (Channel childCh : ch.getChildren()) { eventResPath = getSelectableMessages(childCh, resId, eventChs, messages, eventMessages, eventResPath); } } return eventResPath; } - + @Override public void stopEditing(boolean cancel) { if (editingCell != null) { @@ -237,14 +207,14 @@ PushPullAttribute attr = (PushPullAttribute) value; List options = attr.getOptions(); PushPullValue selected = null; - for (PushPullValue option: options) { + for (PushPullValue option : options) { if (option.toString().equals(getCurrentValue())) { selected = option; break; } } if (selected != null) { - attr.selectOption(selected); + attr.selectOption(selected); } graphComponent.labelChanged(cell, attr, trig); } @@ -252,58 +222,58 @@ mxCellState state = graphComponent.getGraph().getView().getState(cell); graphComponent.redraw(state); } - + if (comboBox.getParent() != null) { comboBox.setVisible(false); comboBox.getParent().remove(comboBox); } - + graphComponent.requestFocusInWindow(); } } - + public String getCurrentValue() { return (String) comboBox.getSelectedItem(); } - + /** * Returns the bounds to be used for the editor. */ public Rectangle getEditorBounds(mxCellState state, double scale) { mxIGraphModel model = state.getView().getGraph().getModel(); Rectangle bounds = null; - + bounds = state.getLabelBounds().getRectangle(); bounds.height += 10; - + // Applies the horizontal and vertical label positions if (model.isVertex(state.getCell())) { String horizontal = mxUtils.getString(state.getStyle(), mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER); - + if (horizontal.equals(mxConstants.ALIGN_LEFT)) { bounds.x -= state.getWidth(); } else if (horizontal.equals(mxConstants.ALIGN_RIGHT)) { bounds.x += state.getWidth(); } - + String vertical = mxUtils.getString(state.getStyle(), mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE); - + if (vertical.equals(mxConstants.ALIGN_TOP)) { bounds.y -= state.getHeight(); } else if (vertical.equals(mxConstants.ALIGN_BOTTOM)) { bounds.y += state.getHeight(); } } - + bounds.setSize( (int) Math.max(bounds.getWidth(), Math.round(minimumWidth * scale)), (int) Math.max(bounds.getHeight(), Math.round(minimumHeight * scale))); - + return bounds; } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulationLayout.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulationLayout.java index eced48d..141203c 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulationLayout.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulationLayout.java @@ -10,148 +10,153 @@ import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Set; public class SimulationLayout { - // Hold the division level for each resource - HashMap divisionLevelMap = new HashMap<>(); - // Hold the scaling factor for each resource - HashMap resourceScaleMap = new HashMap<>(); - int maxDivisionLevel = 1; - public final double BASE_WIDTH = 720; - public final double BASE_HEIGHT = BASE_WIDTH/2; - public final double MARGIN_SCALE = 0.92; - SystemState systemState; - public SimulationLayout(SystemState systemState){ - this.systemState = systemState; - // Calculate the division level for each resource - for (Resource res:systemState.getRootResources()) { - setDivisionLevel(divisionLevelMap, res.getResourceIdentifier(), 1); - } - // Calculate the scaling factor for each resource - for (ResourceIdentifier res:divisionLevelMap.keySet()) { - double scale = (double) maxDivisionLevel / divisionLevelMap.get(res); - resourceScaleMap.put(res, scale); - } - } - public double getScale(ResourceIdentifier resource){ - return resourceScaleMap.get(resource); - } - public double getDivision(ResourceIdentifier resource){ - return divisionLevelMap.get(resource); - } - - public int getMaxDivisionLevel() { - return maxDivisionLevel; - } - - public boolean isExistResource(ResourceIdentifier resourceIdentifier){ - return divisionLevelMap.containsKey(resourceIdentifier); - } - private void setDivisionLevel(HashMap resourceSet, ResourceIdentifier resource, int childCount){ - int divisionLevel; - if(resourceSet.get(resource.getParent()) == null){ - divisionLevel = 1; - }else{ - divisionLevel = resourceSet.get(resource.getParent()) * childCount; - } - if (divisionLevel > maxDivisionLevel)maxDivisionLevel = divisionLevel; - resourceSet.put(resource,divisionLevel); - - Collection identifiers = systemState.getResource(resource).getChildren(); - if (identifiers != null) { - for (Resource child:identifiers) { - setDivisionLevel(resourceSet, child.getResourceIdentifier(), identifiers.size()); - } - } - } - /** - * - * Draw an object corresponding to the target resource on the mxGraph. - * @param graph The mxGraph for drawing. - * @param parent The parent object of the target resource. - * @param resourceIdentifier The ID of the target resource. - * @param index The index. - * @param length The number of sibling resources of the target resource. - * @return The drawing object of the target resource. - */ - - private Object setLayout(mxGraph graph,Object parent, ResourceIdentifier resourceIdentifier,double index, double length){ - double width, height, x, y; - double parentWidth = graph.getCellGeometry(parent).getWidth(); - double parentHeight = graph.getCellGeometry(parent).getHeight(); - - width = parentWidth / length * MARGIN_SCALE; - height = width/2; - x = parentWidth * (index - 1)/length + (parentWidth/length)*(1-MARGIN_SCALE)/2; - - // Process to avoid hiding the parent's resource name - if ((int)length == 1) { - y = 20; - height -=20; - } else { - y = parentHeight/2 - height/2; - } - - Object result = graph.insertVertex(parent, null, - resourceIdentifier.toString(), x, y, width, height, - "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top;"); - System.out.println(result); - return result; - } - - public mxGraph constructSimulateGraph(mxGraph graph, Simulator simulator){ - ((mxGraphModel) graph.getModel()).clear(); - Object parent = graph.getDefaultParent(); - graph.getModel().beginUpdate(); - - try { - Map resources = new HashMap<>(); - int i = 0; - int childCount = simulator.getCurState().getRootResources().size(); - // create resource vertices - for (Resource resNode: simulator.getCurState().getRootResources()) { - double scale = this.getScale(resNode.getResourceIdentifier()); - double maxDiv = this.getMaxDivisionLevel(); - double w = this.BASE_WIDTH * scale / maxDiv / childCount; - double h = this.BASE_HEIGHT * scale / maxDiv / childCount; - double x = w * i + 50; - double y = 20 ; - ResourcePath res = resNode.getResourceIdentifier(); - Object resource = graph.insertVertex(parent, null, - res.toString(), x, y, w, h, - "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top;"); // insert a resource as a vertex - resources.put(resNode, resource); - i++; - createNextChildSimulateResourceVerticies(graph, resource, resNode, resources); - - } - - } finally { - graph.getModel().endUpdate(); - } - - return graph; - } - private void createNextChildSimulateResourceVerticies(mxGraph graph, Object parent, Resource resNode, Map resources) { //sample - Collection children = resNode.getChildren(); - if (children != null) { - //List children = resNode.getChildren(); - double i = 1; - double childCount = children.size(); - for (Resource childNode: children) { - Object childResource = setLayout(graph, parent, childNode.getResourceIdentifier(), i, childCount); - resources.put(childNode, childResource); - i++; - createNextChildSimulateResourceVerticies(graph, childResource, childNode, resources); - - } - } - if (children == null || children.size() == 0) { - Object state = graph.insertVertex(parent, null, - resNode.getState().getValue().toString(), 0.5, 0.5, 0.25, 0.25, "opacity=0;verticalAlign=down;", true); // insert a state label as a vertex - } - } + // Hold the division level for each resource + HashMap divisionLevelMap = new HashMap<>(); + // Hold the scaling factor for each resource + HashMap resourceScaleMap = new HashMap<>(); + int maxDivisionLevel = 1; + public final double BASE_WIDTH = 720; + public final double BASE_HEIGHT = BASE_WIDTH / 2; + public final double MARGIN_SCALE = 0.92; + SystemState systemState; + + public SimulationLayout(SystemState systemState) { + this.systemState = systemState; + // Calculate the division level for each resource + for (Resource res : systemState.getRootResources()) { + setDivisionLevel(divisionLevelMap, res.getResourceIdentifier(), 1); + } + // Calculate the scaling factor for each resource + for (ResourceIdentifier res : divisionLevelMap.keySet()) { + double scale = (double) maxDivisionLevel / divisionLevelMap.get(res); + resourceScaleMap.put(res, scale); + } + } + + public double getScale(ResourceIdentifier resource) { + return resourceScaleMap.get(resource); + } + + public double getDivision(ResourceIdentifier resource) { + return divisionLevelMap.get(resource); + } + + public int getMaxDivisionLevel() { + return maxDivisionLevel; + } + + public boolean isExistResource(ResourceIdentifier resourceIdentifier) { + return divisionLevelMap.containsKey(resourceIdentifier); + } + + private void setDivisionLevel(HashMap resourceSet, ResourceIdentifier resource, int childCount) { + int divisionLevel; + if (resourceSet.get(resource.getParent()) == null) { + divisionLevel = 1; + } else { + divisionLevel = resourceSet.get(resource.getParent()) * childCount; + } + if (divisionLevel > maxDivisionLevel) maxDivisionLevel = divisionLevel; + resourceSet.put(resource, divisionLevel); + + Collection identifiers = systemState.getResource(resource).getChildren(); + if (identifiers != null) { + for (Resource child : identifiers) { + setDivisionLevel(resourceSet, child.getResourceIdentifier(), identifiers.size()); + } + } + } + + /** + * + * Draw an object corresponding to the target resource on the mxGraph. + * + * @param graph The mxGraph for drawing. + * @param parent The parent object of the target resource. + * @param resourceIdentifier The ID of the target resource. + * @param index The index. + * @param length The number of sibling resources of the target resource. + * @return The drawing object of the target resource. + */ + + private Object setLayout(mxGraph graph, Object parent, ResourceIdentifier resourceIdentifier, double index, double length) { + double width, height, x, y; + double parentWidth = graph.getCellGeometry(parent).getWidth(); + double parentHeight = graph.getCellGeometry(parent).getHeight(); + + width = parentWidth / length * MARGIN_SCALE; + height = width / 2; + x = parentWidth * (index - 1) / length + (parentWidth / length) * (1 - MARGIN_SCALE) / 2; + + // Process to avoid hiding the parent's resource name + if ((int) length == 1) { + y = 20; + height -= 20; + } else { + y = parentHeight / 2 - height / 2; + } + + Object result = graph.insertVertex(parent, null, + resourceIdentifier.toString(), x, y, width, height, + "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top;"); + System.out.println(result); + return result; + } + + public mxGraph constructSimulateGraph(mxGraph graph, Simulator simulator) { + ((mxGraphModel) graph.getModel()).clear(); + Object parent = graph.getDefaultParent(); + graph.getModel().beginUpdate(); + + try { + Map resources = new HashMap<>(); + int i = 0; + int childCount = simulator.getCurState().getRootResources().size(); + // create resource vertices + for (Resource resNode : simulator.getCurState().getRootResources()) { + double scale = this.getScale(resNode.getResourceIdentifier()); + double maxDiv = this.getMaxDivisionLevel(); + double w = this.BASE_WIDTH * scale / maxDiv / childCount; + double h = this.BASE_HEIGHT * scale / maxDiv / childCount; + double x = w * i + 50; + double y = 20; + ResourcePath res = resNode.getResourceIdentifier(); + Object resource = graph.insertVertex(parent, null, + res.toString(), x, y, w, h, + "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top;"); // insert a resource as a vertex + resources.put(resNode, resource); + i++; + createNextChildSimulateResourceVerticies(graph, resource, resNode, resources); + + } + + } finally { + graph.getModel().endUpdate(); + } + + return graph; + } + + private void createNextChildSimulateResourceVerticies(mxGraph graph, Object parent, Resource resNode, Map resources) { //sample + Collection children = resNode.getChildren(); + if (children != null) { + //List children = resNode.getChildren(); + double i = 1; + double childCount = children.size(); + for (Resource childNode : children) { + Object childResource = setLayout(graph, parent, childNode.getResourceIdentifier(), i, childCount); + resources.put(childNode, childResource); + i++; + createNextChildSimulateResourceVerticies(graph, childResource, childNode, resources); + + } + } + if (children == null || children.size() == 0) { + Object state = graph.insertVertex(parent, null, + resNode.getState().getValue().toString(), 0.5, 0.5, 0.25, 0.25, "opacity=0;verticalAlign=down;", true); // insert a state label as a vertex + } + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorMenuBar.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorMenuBar.java index 29463f4..b998bd8 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorMenuBar.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorMenuBar.java @@ -1,17 +1,16 @@ package application.simulator; -import javax.swing.JMenu; -import javax.swing.JMenuBar; - import application.actions.ZoomInAction; import application.actions.ZoomOutAction; import application.simulator.actions.ShowUISimulatorAction; +import javax.swing.*; + public class SimulatorMenuBar extends JMenuBar { private static final long serialVersionUID = 7769410930379012970L; - + private SimulatorWindow simulatorWindow = null; - + public SimulatorMenuBar(SimulatorWindow simulatorWindow) { this.simulatorWindow = simulatorWindow; @@ -23,5 +22,5 @@ menu = add(new JMenu("Show")); menu.add(new ShowUISimulatorAction(simulatorWindow.getSimulator())); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorWindow.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorWindow.java index 5470a65..11553a5 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorWindow.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorWindow.java @@ -22,90 +22,90 @@ import java.util.List; public class SimulatorWindow extends JFrame implements INativeReceiver { - - private static final long serialVersionUID = -2425820512017088254L; - public static final String title = "Simulation Tool"; - - final int PORT_DIAMETER = 8; - final int PORT_RADIUS = PORT_DIAMETER / 2; - - private Editor editor = null; - private mxGraph graph = null; - private mxGraphComponent graphComponent = null; - - private Simulator simulator = null; - - private boolean bReflectingArchitectureModel = false; - private double x = 20; - private double y = 20; - private SimulatorMenuBar menuBar; - - public SimulatorWindow(Editor editor) { - setTitle(title); - setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - - this.graph = new mxGraph() { - public boolean isPort(Object cell) { - mxGeometry geo = getCellGeometry(cell); - - return (geo != null) ? geo.isRelative() : false; - } - - public boolean isCellFoldable(Object cell, boolean collapse) { - return false; - } - }; - - this.graphComponent = new mxGraphComponent(graph); - this.editor = editor; - - graph.getModel().addListener(mxEvent.CHANGE, new mxIEventListener() { - public void invoke(Object sender, mxEventObject evt) { - List terminals = new ArrayList<>(); - mxCell cell = null; - for (Object change : ((List) evt.getProperties().get("changes"))) { - if (change instanceof mxGraphModel.mxTerminalChange) { - mxGraphModel.mxTerminalChange terminalChange = (mxGraphModel.mxTerminalChange) change; - cell = (mxCell) terminalChange.getCell(); - mxCell terminal = (mxCell) terminalChange.getTerminal(); - terminals.add(terminal); - } - } - if (terminals.size() == 2) { - if (!editor.connectEdge(cell, terminals.get(0), terminals.get(1))) { - graph.removeCells(new mxCell[]{cell}); - } - } - } - }); - getContentPane().add(graphComponent); - new mxRubberband(graphComponent); - graph.setAllowDanglingEdges(false); - graph.setCellsDisconnectable(true); - - setTitle(title); - setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - setSize(870, 640); - setVisible(true); - - DataTransferModel model = this.editor.getModel(); - TypeInference.infer(model); - simulator = new Simulator(model); - SimulationLayout layout = new SimulationLayout(simulator.getCurState()); - layout.constructSimulateGraph(graph, simulator); - graphComponent.setCellEditor(new InputEventCellEditor(this, graphComponent, simulator, this.editor)); - simulator.addSystemReceiver(this); - - menuBar = new SimulatorMenuBar(this); - setJMenuBar(menuBar); - } - - - @Override - public void onReceiveFromModel(Event event, SystemState nextSystemState) { - SimulationLayout layout = new SimulationLayout(nextSystemState); - layout.constructSimulateGraph(graph, simulator); - } + + private static final long serialVersionUID = -2425820512017088254L; + public static final String title = "Simulation Tool"; + + final int PORT_DIAMETER = 8; + final int PORT_RADIUS = PORT_DIAMETER / 2; + + private Editor editor = null; + private mxGraph graph = null; + private mxGraphComponent graphComponent = null; + + private Simulator simulator = null; + + private boolean bReflectingArchitectureModel = false; + private double x = 20; + private double y = 20; + private SimulatorMenuBar menuBar; + + public SimulatorWindow(Editor editor) { + setTitle(title); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + + this.graph = new mxGraph() { + public boolean isPort(Object cell) { + mxGeometry geo = getCellGeometry(cell); + + return (geo != null) ? geo.isRelative() : false; + } + + public boolean isCellFoldable(Object cell, boolean collapse) { + return false; + } + }; + + this.graphComponent = new mxGraphComponent(graph); + this.editor = editor; + + graph.getModel().addListener(mxEvent.CHANGE, new mxIEventListener() { + public void invoke(Object sender, mxEventObject evt) { + List terminals = new ArrayList<>(); + mxCell cell = null; + for (Object change : ((List) evt.getProperties().get("changes"))) { + if (change instanceof mxGraphModel.mxTerminalChange) { + mxGraphModel.mxTerminalChange terminalChange = (mxGraphModel.mxTerminalChange) change; + cell = (mxCell) terminalChange.getCell(); + mxCell terminal = (mxCell) terminalChange.getTerminal(); + terminals.add(terminal); + } + } + if (terminals.size() == 2) { + if (!editor.connectEdge(cell, terminals.get(0), terminals.get(1))) { + graph.removeCells(new mxCell[]{cell}); + } + } + } + }); + getContentPane().add(graphComponent); + new mxRubberband(graphComponent); + graph.setAllowDanglingEdges(false); + graph.setCellsDisconnectable(true); + + setTitle(title); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setSize(870, 640); + setVisible(true); + + DataTransferModel model = this.editor.getModel(); + TypeInference.infer(model); + simulator = new Simulator(model); + SimulationLayout layout = new SimulationLayout(simulator.getCurState()); + layout.constructSimulateGraph(graph, simulator); + graphComponent.setCellEditor(new InputEventCellEditor(this, graphComponent, simulator, this.editor)); + simulator.addSystemReceiver(this); + + menuBar = new SimulatorMenuBar(this); + setJMenuBar(menuBar); + } + + + @Override + public void onReceiveFromModel(Event event, SystemState nextSystemState) { + SimulationLayout layout = new SimulationLayout(nextSystemState); + layout.constructSimulateGraph(graph, simulator); + } // public mxGraph constructSimulateGraph(Set simulateRes, DataTransferModel model, DataFlowGraph dataFlowGraph) { // bReflectingArchitectureModel = true; @@ -155,21 +155,21 @@ // resNode.getState().getValue().toString(), 0.5, 0.5, 0.25, 0.25, "opacity=0;verticalAlign=down;", true); // insert a state label as a vertex // } // } - - public mxGraphComponent getGraphComponent() { - return graphComponent; - } - - public Editor getEditor() { - return editor; - } - - public void setEditor(Editor editor) { - this.editor = editor; - } - - public Simulator getSimulator() { - return simulator; - } - + + public mxGraphComponent getGraphComponent() { + return graphComponent; + } + + public Editor getEditor() { + return editor; + } + + public void setEditor(Editor editor) { + this.editor = editor; + } + + public Simulator getSimulator() { + return simulator; + } + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java index 1c246b9..9c92c63 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java @@ -1,14 +1,13 @@ package application.simulator; -import javax.swing.JFrame; -import javax.swing.JPanel; - import simulator.Simulator; import simulator.interfaces.swing.SwingPresenter; import simulator.interfaces.timers.TimerService; -public class UISimulatorWindow extends JFrame { +import javax.swing.*; +public class UISimulatorWindow extends JFrame { + private static final long serialVersionUID = 1770206525826167136L; private SwingPresenter presenter; private Simulator simulator; @@ -23,7 +22,7 @@ this.add(mainPanel); timerService = new TimerService(simulator); - setSize(870,640); - setVisible(true); + setSize(870, 640); + setVisible(true); } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/actions/ShowUISimulatorAction.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/actions/ShowUISimulatorAction.java index 758d2d9..c2c7aa0 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/actions/ShowUISimulatorAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/actions/ShowUISimulatorAction.java @@ -1,23 +1,22 @@ package application.simulator.actions; -import java.awt.event.ActionEvent; - -import javax.swing.AbstractAction; - import application.simulator.UISimulatorWindow; import simulator.Simulator; +import javax.swing.*; +import java.awt.event.ActionEvent; + public class ShowUISimulatorAction extends AbstractAction { private Simulator simulator; - + public ShowUISimulatorAction(Simulator simulator) { super("Show UI Simulator"); this.simulator = simulator; } - + @Override public void actionPerformed(ActionEvent e) { new UISimulatorWindow(simulator); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/application/views/FlowLayerWindow.java b/AlgebraicDataflowArchitectureModel/src/application/views/FlowLayerWindow.java index cca4aac..2d6a769 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/views/FlowLayerWindow.java +++ b/AlgebraicDataflowArchitectureModel/src/application/views/FlowLayerWindow.java @@ -11,72 +11,75 @@ import java.awt.event.ActionListener; public class FlowLayerWindow extends JDialog implements IStageChangeListener { - private String title = "Flow Layer"; - private JCheckBox dataFlowCheckBox = null; - private JCheckBox pushFlowCheckBox = null; - private JCheckBox pullFlowCheckBox = null; - - private Stage stage = null; - - public FlowLayerWindow(final ApplicationWindow owner){ - super(owner); - - setTitle(title); - setDefaultCloseOperation(HIDE_ON_CLOSE); - - stage = Editor.STAGE_PUSH_PULL_SELECTION; - - // Add check boxes. - dataFlowCheckBox = new JCheckBox("Data-Flow", false); - pushFlowCheckBox = new JCheckBox("Push-Flow", true); - pullFlowCheckBox = new JCheckBox("Pull-Flow", true); - - // Add handlers to the check boxes. - dataFlowCheckBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - stage.setLayerEnabled(Stage.DATA_FLOW_LAYER, dataFlowCheckBox.isSelected()); - }}); - - pushFlowCheckBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - stage.setLayerEnabled(Stage.PUSH_FLOW_LAYER, pushFlowCheckBox.isSelected()); - }}); - - pullFlowCheckBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - stage.setLayerEnabled(Stage.PULL_FLOW_LAYER, pullFlowCheckBox.isSelected()); - }}); - - dataFlowCheckBox.setEnabled(false); - pushFlowCheckBox.setEnabled(false); - pullFlowCheckBox.setEnabled(false); - - // Initialize the layer panel layout. - Container panel = getContentPane(); - panel.setLayout(new GridLayout(/*low*/4, /*col*/1)); - panel.add(dataFlowCheckBox); - panel.add(pushFlowCheckBox); - panel.add(pullFlowCheckBox); - Point location = new Point(owner.getX() + (owner.getWidth() / 2) - (this.getWidth() / 2), owner.getY() + (owner.getHeight() / 2) - (this.getHeight() / 2)); - setLocation(location); - - pack(); - setResizable(false); - } - - /** - * Toggle the activation of layer check boxes whenever the current stage changes. + private String title = "Flow Layer"; + private JCheckBox dataFlowCheckBox = null; + private JCheckBox pushFlowCheckBox = null; + private JCheckBox pullFlowCheckBox = null; + + private Stage stage = null; + + public FlowLayerWindow(final ApplicationWindow owner) { + super(owner); + + setTitle(title); + setDefaultCloseOperation(HIDE_ON_CLOSE); + + stage = Editor.STAGE_PUSH_PULL_SELECTION; + + // Add check boxes. + dataFlowCheckBox = new JCheckBox("Data-Flow", false); + pushFlowCheckBox = new JCheckBox("Push-Flow", true); + pullFlowCheckBox = new JCheckBox("Pull-Flow", true); + + // Add handlers to the check boxes. + dataFlowCheckBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + stage.setLayerEnabled(Stage.DATA_FLOW_LAYER, dataFlowCheckBox.isSelected()); + } + }); + + pushFlowCheckBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + stage.setLayerEnabled(Stage.PUSH_FLOW_LAYER, pushFlowCheckBox.isSelected()); + } + }); + + pullFlowCheckBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + stage.setLayerEnabled(Stage.PULL_FLOW_LAYER, pullFlowCheckBox.isSelected()); + } + }); + + dataFlowCheckBox.setEnabled(false); + pushFlowCheckBox.setEnabled(false); + pullFlowCheckBox.setEnabled(false); + + // Initialize the layer panel layout. + Container panel = getContentPane(); + panel.setLayout(new GridLayout(/*low*/4, /*col*/1)); + panel.add(dataFlowCheckBox); + panel.add(pushFlowCheckBox); + panel.add(pullFlowCheckBox); + Point location = new Point(owner.getX() + (owner.getWidth() / 2) - (this.getWidth() / 2), owner.getY() + (owner.getHeight() / 2) - (this.getHeight() / 2)); + setLocation(location); + + pack(); + setResizable(false); + } + + /** + * Toggle the activation of layer check boxes whenever the current stage changes. */ - @Override - public void stageChanged(Stage newStage) { - dataFlowCheckBox.setEnabled(false); - pushFlowCheckBox.setEnabled(false); - pullFlowCheckBox.setEnabled(false); - - newStage.setLayerEnabled(Stage.PUSH_FLOW_LAYER, false); - newStage.setLayerEnabled(Stage.PULL_FLOW_LAYER, false); - } + @Override + public void stageChanged(Stage newStage) { + dataFlowCheckBox.setEnabled(false); + pushFlowCheckBox.setEnabled(false); + pullFlowCheckBox.setEnabled(false); + + newStage.setLayerEnabled(Stage.PUSH_FLOW_LAYER, false); + newStage.setLayerEnabled(Stage.PULL_FLOW_LAYER, false); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/views/NavigationWindow.java b/AlgebraicDataflowArchitectureModel/src/application/views/NavigationWindow.java index cddad6c..f21d9df 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/views/NavigationWindow.java +++ b/AlgebraicDataflowArchitectureModel/src/application/views/NavigationWindow.java @@ -13,75 +13,75 @@ import java.awt.event.ActionListener; public class NavigationWindow extends JDialog implements IStageChangeListener { - - private static final String TITLE = "Navigation"; - private final Editor editor; - - private final JToggleButton dataFlowModelingButton; - private final JToggleButton pushPullSelectionButton; - - private boolean forbidReentry = false; - - public NavigationWindow(ApplicationWindow owner, Editor editor) { - super(owner); - this.editor = editor; - dataFlowModelingButton = new JToggleButton("Data Flow Modeling"); - pushPullSelectionButton = new JToggleButton("Push Pull Selection"); - dataFlowModelingButton.addActionListener(new DataFlowModelingButtonListener()); - pushPullSelectionButton.addActionListener(new PushPullSelectionButtonListener()); - pushPullSelectionButton.setEnabled(false); - dataFlowModelingButton.setSelected(true); - - setTitle(TITLE); - setDefaultCloseOperation(HIDE_ON_CLOSE); - Container panel = getContentPane(); - panel.setLayout(new GridLayout(2, 1)); - - ButtonGroup group = new ButtonGroup(); - group.add(dataFlowModelingButton); - group.add(pushPullSelectionButton); - panel.add(dataFlowModelingButton); - panel.add(pushPullSelectionButton); - - pack(); - - Point location = new Point(owner.getX() + (owner.getWidth() / 2) - (this.getWidth() / 2), owner.getY() + (owner.getHeight() / 2) - (this.getHeight() / 2)); - setLocation(location); - - setResizable(false); - } - - @Override - public void stageChanged(Stage newStage) { - if (forbidReentry) { - return; - } - if (newStage instanceof DataFlowModelingStage) { - dataFlowModelingButton.setSelected(true); - pushPullSelectionButton.setEnabled(editor.canChange(Editor.STAGE_PUSH_PULL_SELECTION)); - } else if (newStage instanceof PushPullSelectionStage) { - pushPullSelectionButton.setSelected(true); - dataFlowModelingButton.setEnabled(editor.canChange(Editor.STAGE_DATA_FLOW_MODELING)); - } - } - - private class DataFlowModelingButtonListener implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - forbidReentry = true; - editor.changeStage(Editor.STAGE_DATA_FLOW_MODELING); - forbidReentry = false; - pushPullSelectionButton.setEnabled(editor.canChange(Editor.STAGE_PUSH_PULL_SELECTION)); - } - } - - private class PushPullSelectionButtonListener implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - forbidReentry = true; - editor.changeStage(Editor.STAGE_PUSH_PULL_SELECTION); - forbidReentry = false; - dataFlowModelingButton.setEnabled(editor.canChange(Editor.STAGE_DATA_FLOW_MODELING)); - } - } + + private static final String TITLE = "Navigation"; + private final Editor editor; + + private final JToggleButton dataFlowModelingButton; + private final JToggleButton pushPullSelectionButton; + + private boolean forbidReentry = false; + + public NavigationWindow(ApplicationWindow owner, Editor editor) { + super(owner); + this.editor = editor; + dataFlowModelingButton = new JToggleButton("Data Flow Modeling"); + pushPullSelectionButton = new JToggleButton("Push Pull Selection"); + dataFlowModelingButton.addActionListener(new DataFlowModelingButtonListener()); + pushPullSelectionButton.addActionListener(new PushPullSelectionButtonListener()); + pushPullSelectionButton.setEnabled(false); + dataFlowModelingButton.setSelected(true); + + setTitle(TITLE); + setDefaultCloseOperation(HIDE_ON_CLOSE); + Container panel = getContentPane(); + panel.setLayout(new GridLayout(2, 1)); + + ButtonGroup group = new ButtonGroup(); + group.add(dataFlowModelingButton); + group.add(pushPullSelectionButton); + panel.add(dataFlowModelingButton); + panel.add(pushPullSelectionButton); + + pack(); + + Point location = new Point(owner.getX() + (owner.getWidth() / 2) - (this.getWidth() / 2), owner.getY() + (owner.getHeight() / 2) - (this.getHeight() / 2)); + setLocation(location); + + setResizable(false); + } + + @Override + public void stageChanged(Stage newStage) { + if (forbidReentry) { + return; + } + if (newStage instanceof DataFlowModelingStage) { + dataFlowModelingButton.setSelected(true); + pushPullSelectionButton.setEnabled(editor.canChange(Editor.STAGE_PUSH_PULL_SELECTION)); + } else if (newStage instanceof PushPullSelectionStage) { + pushPullSelectionButton.setSelected(true); + dataFlowModelingButton.setEnabled(editor.canChange(Editor.STAGE_DATA_FLOW_MODELING)); + } + } + + private class DataFlowModelingButtonListener implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + forbidReentry = true; + editor.changeStage(Editor.STAGE_DATA_FLOW_MODELING); + forbidReentry = false; + pushPullSelectionButton.setEnabled(editor.canChange(Editor.STAGE_PUSH_PULL_SELECTION)); + } + } + + private class PushPullSelectionButtonListener implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + forbidReentry = true; + editor.changeStage(Editor.STAGE_PUSH_PULL_SELECTION); + forbidReentry = false; + dataFlowModelingButton.setEnabled(editor.canChange(Editor.STAGE_DATA_FLOW_MODELING)); + } + } } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ASTNode.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ASTNode.java index 0e250a1..9c4ddb9 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/ASTNode.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ASTNode.java @@ -2,11 +2,11 @@ public abstract class ASTNode { private ASTNode parent; - + public ASTNode getParent() { return parent; } - + public void setParent(ASTNode parent) { this.parent = parent; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/AbstractTypeDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/AbstractTypeDeclaration.java index 383962c..fc11be8 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/AbstractTypeDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/AbstractTypeDeclaration.java @@ -2,11 +2,11 @@ public class AbstractTypeDeclaration extends BodyDeclaration { protected String typeName = null; - + public String getTypeName() { return typeName; } - + public void setTypeName(String typeName) { this.typeName = typeName; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Annotation.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Annotation.java index 15b1e6a..7fe95e7 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Annotation.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Annotation.java @@ -18,11 +18,11 @@ keyValueMap = new HashMap<>(); keyValueMap.put("value", value); } - + public String getElementName() { return name; } - + public Map getParams() { return keyValueMap; } @@ -45,13 +45,13 @@ } else { code += "("; String delimitar = ""; - for (String key: keySet) { + for (String key : keySet) { Object value = keyValueMap.get(key); code += delimitar + key + " = \"" + value.toString() + "\""; delimitar = ", "; } code += ")"; } - return code; + return code; } } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java index 2b4f654..57a2a8c 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java @@ -1,15 +1,15 @@ package code.ast; -import java.util.List; import java.util.ArrayList; +import java.util.List; public class Block extends ASTNode { private List statements = new ArrayList(); - + public List getStatements() { return statements; } - + public void setStatements(List statements) { this.statements = statements; } @@ -24,7 +24,7 @@ public String toString() { String code = ""; - for (String statement: statements) { + for (String statement : statements) { code += (statement + "\n"); } return code; diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/BodyDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/BodyDeclaration.java index 812f0d7..6d20c71 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/BodyDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/BodyDeclaration.java @@ -2,11 +2,11 @@ public abstract class BodyDeclaration extends ASTNode { private int modifiers = 0; - + public int getModifiers() { return modifiers; } - + public void setModifiers(int modifiers) { this.modifiers = modifiers; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/CodeUtil.java b/AlgebraicDataflowArchitectureModel/src/code/ast/CodeUtil.java index fd57c66..f2369dd 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/CodeUtil.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/CodeUtil.java @@ -5,7 +5,7 @@ public static String insertTab(String code) { String newString = ""; String[] lines = code.split("\n"); - for (String line: lines) { + for (String line : lines) { newString = newString + "\t" + line + "\n"; } return newString; diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java b/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java index 9a5a58a..87be092 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java @@ -10,7 +10,7 @@ public CompilationUnit(TypeDeclaration type) { types.add(type); - if(type.getTypeName().contains("<")) + if (type.getTypeName().contains("<")) fileName = type.getTypeName().split("<")[0] + ".java"; else fileName = type.getTypeName() + ".java"; @@ -31,18 +31,18 @@ public void addType(TypeDeclaration type) { types.add(type); } - + public String getFileName() { return fileName; } public String toString() { String result = ""; - for (ImportDeclaration imp: imports) { + for (ImportDeclaration imp : imports) { result += imp.toString(); } - result +="\n"; - for (TypeDeclaration type: types) { + result += "\n"; + for (TypeDeclaration type : types) { result += type.toString(); } return result; diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java index 0993b92..cc7f2d0 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/FieldDeclaration.java @@ -1,11 +1,11 @@ package code.ast; +import models.algebra.Type; + import java.util.Collection; import java.util.HashMap; import java.util.Map; -import models.algebra.Type; - public class FieldDeclaration extends BodyDeclaration implements IAnnotatable { private Type type; private String fieldName; @@ -22,49 +22,49 @@ this.fieldName = fieldName; this.initializer = initializer; } - + public Type getType() { return type; } - + public void setType(Type type) { this.type = type; } - + public String getName() { return fieldName; } - + public void setName(String fieldName) { this.fieldName = fieldName; - } - + } + public String getInitializer() { return initializer; } - + public void setInitializer(String initializer) { this.initializer = initializer; } - + @Override public Annotation getAnnotation(String name) { return annotations.get(name); } - + @Override public Collection getAnnotations() { return annotations.values(); } - + @Override public void addAnnotation(Annotation annotation) { annotations.put(annotation.getElementName(), annotation); } - + public String toString() { String code = ""; - for (Annotation annotation: getAnnotations()) { + for (Annotation annotation : getAnnotations()) { code += annotation.toString() + "\n"; } if (initializer == null) { diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/IAnnotatable.java b/AlgebraicDataflowArchitectureModel/src/code/ast/IAnnotatable.java index 47001e5..2de8379 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/IAnnotatable.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/IAnnotatable.java @@ -4,6 +4,8 @@ public interface IAnnotatable { Annotation getAnnotation(String name); + Collection getAnnotations(); + void addAnnotation(Annotation annotation); } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ImportDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ImportDeclaration.java index 9135d68..629528a 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/ImportDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ImportDeclaration.java @@ -6,11 +6,11 @@ public ImportDeclaration(String name) { this.name = name; } - + public String getName() { return name; } - + public void setName(String name) { this.name = name; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java index 5f5aafc..6969e55 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java @@ -1,13 +1,9 @@ package code.ast; -import java.util.List; -import java.util.Map; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; - import models.algebra.Type; +import java.util.*; + public class MethodDeclaration extends BodyDeclaration implements IAnnotatable { private String name = null; private boolean isConstructor = false; @@ -41,35 +37,35 @@ this.parameters = parameters; this.body = body; } - + public String getName() { return name; } - + public void setName(String name) { this.name = name; } - + public boolean isConstructor() { return isConstructor; } - + public void setConstructor(boolean isConstructor) { this.isConstructor = isConstructor; } - + public Type getReturnType() { return returnType; } - + public void setReturnType(Type returnType) { this.returnType = returnType; } - + public List getParameters() { return parameters; } - + public void setParameters(List parameters) { this.parameters = parameters; } @@ -80,11 +76,11 @@ } parameters.add(parameter); } - + public Block getBody() { return body; } - + public void setBody(Block body) { this.body = body; } @@ -112,18 +108,18 @@ public Throws getThrows() { return thrws; - } - + } + @Override public Annotation getAnnotation(String name) { return annotations.get(name); } - + @Override public Collection getAnnotations() { return annotations.values(); } - + @Override public void addAnnotation(Annotation annotation) { annotations.put(annotation.getElementName(), annotation); @@ -131,19 +127,19 @@ public String toString() { String code = ""; - for (Annotation annotation: getAnnotations()) { + for (Annotation annotation : getAnnotations()) { code += annotation.toString() + "\n"; } code += "public "; if (returnType == null) { - if(!isConstructor) code += "void "; - }else { + if (!isConstructor) code += "void "; + } else { code += returnType.getInterfaceTypeName() + " "; } code += (name + "("); if (parameters != null) { String delimitar = ""; - for (VariableDeclaration parameter: parameters) { + for (VariableDeclaration parameter : parameters) { code = code + delimitar + parameter.toString(); delimitar = ", "; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Modifier.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Modifier.java index 7d1645a..ae84b20 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Modifier.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Modifier.java @@ -6,7 +6,7 @@ public static final int PROTECTED = 0x0004; public static final int PUBLIC = 0x0001; public static final int STATIC = 0x0008; - + public static boolean isAbstract(int flags) { return (flags & ABSTRACT) != 0; } @@ -18,7 +18,7 @@ public static boolean isProtected(int flags) { return (flags & PROTECTED) != 0; } - + public static boolean isPublic(int flags) { return (flags & PUBLIC) != 0; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Throws.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Throws.java index a8b41e5..1646c76 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Throws.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Throws.java @@ -1,18 +1,18 @@ package code.ast; -import java.util.Set; import java.util.HashSet; +import java.util.Set; public class Throws extends ASTNode { private Set exceptions = new HashSet<>(); - + public Throws() { } public void addException(String exception) { exceptions.add(exception); } - + public Set getExceptions() { return exceptions; } @@ -20,7 +20,7 @@ public String toString() { String code = "throws "; String delimiter = ""; - for (String exception: exceptions) { + for (String exception : exceptions) { code += delimiter + exception; delimiter = ", "; } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/TypeDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/TypeDeclaration.java index 0406d59..19204e1 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/TypeDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/TypeDeclaration.java @@ -1,10 +1,6 @@ package code.ast; -import java.util.List; -import java.util.Map; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; +import java.util.*; public class TypeDeclaration extends AbstractTypeDeclaration implements IAnnotatable { private List fields = new ArrayList<>(); @@ -33,11 +29,11 @@ public void addMethod(MethodDeclaration method) { methods.add(method); } - + public void removeMethod(MethodDeclaration method) { methods.remove(method); } - + public List getFields() { return fields; } @@ -45,7 +41,7 @@ public List getMethods() { return methods; } - + public MethodDeclaration createConstructor() { MethodDeclaration constructor = new MethodDeclaration(typeName, true); addMethod(constructor); @@ -56,12 +52,12 @@ public Annotation getAnnotation(String name) { return annotations.get(name); } - + @Override public Collection getAnnotations() { return annotations.values(); } - + @Override public void addAnnotation(Annotation annotation) { annotations.put(annotation.getElementName(), annotation); @@ -69,14 +65,14 @@ public String toString() { String code = ""; - for (Annotation annotation: getAnnotations()) { + for (Annotation annotation : getAnnotations()) { code += annotation.toString() + "\n"; } code += "public class " + typeName + " {\n"; - for (FieldDeclaration f: fields) { + for (FieldDeclaration f : fields) { code += "\t" + f.toString(); } - for (MethodDeclaration m: methods) { + for (MethodDeclaration m : methods) { code += CodeUtil.insertTab(m.toString()); } code += "}"; diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclaration.java index 6a7b25b..db4e9dc 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclaration.java @@ -1,11 +1,11 @@ package code.ast; +import models.algebra.Type; + import java.util.Collection; import java.util.HashMap; import java.util.Map; -import models.algebra.Type; - public class VariableDeclaration extends ASTNode implements IAnnotatable { private Type type; private String variableName; @@ -15,33 +15,33 @@ this.type = type; this.variableName = variableName; } - + public Type getType() { return type; } - + public void setType(Type type) { this.type = type; } - + public String getName() { return variableName; } - + public void setName(String variableName) { this.variableName = variableName; } - + @Override public Annotation getAnnotation(String name) { return annotations.get(name); } - + @Override public Collection getAnnotations() { return annotations.values(); } - + @Override public void addAnnotation(Annotation annotation) { annotations.put(annotation.getElementName(), annotation); @@ -49,7 +49,7 @@ public String toString() { String code = ""; - for (Annotation annotation: getAnnotations()) { + for (Annotation annotation : getAnnotations()) { code += annotation.toString() + " "; } code += type.getInterfaceTypeName() + " " + variableName; diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index 40caf08..d16e014 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -1,53 +1,20 @@ package generators; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Stack; - import algorithms.TypeInference; -import code.ast.Block; -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; +import code.ast.*; import models.Edge; import models.Node; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Field; -import models.algebra.Parameter; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.Variable; +import models.algebra.*; import models.controlFlowModel.StatefulObjectNode; -import models.dataConstraintModel.Channel; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.ChannelNode; -import models.dataFlowModel.DataFlowEdge; -import models.dataFlowModel.DataFlowGraph; -import models.dataFlowModel.DataTransferChannel; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.IFlowGraph; -import models.dataFlowModel.PushPullAttribute; -import models.dataFlowModel.PushPullValue; -import models.dataFlowModel.ResourceNode; +import models.dataConstraintModel.*; +import models.dataFlowModel.*; import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; +import java.util.*; + /** * Common generator for prototypes - * + * * @author Nitta * */ @@ -55,18 +22,18 @@ public static final String fieldOfResourceState = "value"; public static final String methoNameOfResourceState = "Value"; public static final String getterPrefix = "get"; - public static final String getterOfResourceState = getterPrefix + methoNameOfResourceState; // "getValue" + public static final String getterOfResourceState = getterPrefix + methoNameOfResourceState; // "getValue" public static final String updateMethodPrefix = "update"; public static final String from = "From"; public static final String _for = "For"; private static String mainTypeName = null; private static ILanguageSpecific langSpec = null; private static IPlatformSpecific platformSpec = null; - + public static String getMainTypeName() { return mainTypeName; } - + public static void setMainTypeName(String mainTypeName) { CodeGenerator.mainTypeName = mainTypeName; } @@ -74,7 +41,7 @@ public static void resetMainTypeName() { CodeGenerator.mainTypeName = null; } - + public static String getComponentName(ResourceHierarchy res, ILanguageSpecific langSpec) { String name = res.getResourceName(); if (res.getNumParameters() > 0) { @@ -124,19 +91,21 @@ public static boolean generatesComponent(ResourceHierarchy res) { if (res.getParent() == null) return true; if (res.getChildren() == null || res.getChildren().size() == 0) return false; - if (res.getNumParameters() > 0 && res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0) return false; - if (res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0 - && (res.getChildren().iterator().next().getChildren() == null || res.getChildren().iterator().next().getChildren().size() == 0)) return false; + if (res.getNumParameters() > 0 && res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0) + return false; + if (res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0 + && (res.getChildren().iterator().next().getChildren() == null || res.getChildren().iterator().next().getChildren().size() == 0)) + return false; return true; // return res.getParent() == null || !(res.getChildren() == null || res.getChildren().size() == 0); } - + /** * Generate source codes in specified language from data-flow/control-flow graph. - * - * @param model architecture model + * + * @param model architecture model * @param flowGraph data-flow or control-flow graph - * @param langSpec specified language + * @param langSpec specified language * @return source codes */ public ArrayList generateCode(DataTransferModel model, IFlowGraph flowGraph, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { @@ -165,18 +134,18 @@ return codes; } - public abstract void generateCodeFromFlowGraph(DataTransferModel model, IFlowGraph flowGraph, Collection> components, ArrayList codes, - Map> dependedRootComponentGraph, IPlatformSpecific platformSpec, ILanguageSpecific langSpec); + public abstract void generateCodeFromFlowGraph(DataTransferModel model, IFlowGraph flowGraph, Collection> components, ArrayList codes, + Map> dependedRootComponentGraph, IPlatformSpecific platformSpec, ILanguageSpecific langSpec); private static Map> getDependedRootComponentGraph(DataTransferModel model) { Map> dependedComponentGraph = new HashMap<>(); - for (Channel ch: model.getChannels()) { + for (Channel ch : model.getChannels()) { Set insideRes = new HashSet<>(); Set outsideRes = new HashSet<>(); getDependedRootComponentGraphSub(ch, insideRes, outsideRes, true); if (outsideRes.size() > 0 && insideRes.size() > 0) { - for (ResourceHierarchy outside: outsideRes) { - for (ResourceHierarchy inside: insideRes) { + for (ResourceHierarchy outside : outsideRes) { + for (ResourceHierarchy inside : insideRes) { Set dependings = dependedComponentGraph.get(outside.getRoot()); if (dependings == null) { dependings = new HashSet<>(); @@ -191,20 +160,20 @@ } return dependedComponentGraph; } - + private static void getDependedRootComponentGraphSub(Channel ch, Set insideRes, Set outsideRes, boolean isRoot) { DataTransferChannel dtCh = (DataTransferChannel) ch; - for (ChannelMember cm: dtCh.getChannelMembers()) { + for (ChannelMember cm : dtCh.getChannelMembers()) { if (!isRoot && !cm.isOutside()) { - outsideRes.add(cm.getResource().getResourceHierarchy()); // dependency to a descendant channel resource. + outsideRes.add(cm.getResource().getResourceHierarchy()); // dependency to a descendant channel resource. } if (cm.isOutside()) { - outsideRes.add(cm.getResource().getResourceHierarchy()); // dependency to an outside resource. + outsideRes.add(cm.getResource().getResourceHierarchy()); // dependency to an outside resource. } else { - insideRes.add(cm.getResource().getResourceHierarchy()); // dependency from an inside resource. + insideRes.add(cm.getResource().getResourceHierarchy()); // dependency from an inside resource. } } - for (Channel childCh: ch.getChildren()) { + for (Channel childCh : ch.getChildren()) { getDependedRootComponentGraphSub(childCh, insideRes, outsideRes, false); } } @@ -213,7 +182,7 @@ ArrayList> objectList = new ArrayList<>(); Set> visited = new HashSet<>(); Map> allNodes = graph.getAllComponentNodes(); - for (Set nodeSet: allNodes.values()) { + for (Set nodeSet : allNodes.values()) { topologicalSort(nodeSet, allNodes, dependedRootComponentGraph, visited, objectList); } return objectList; @@ -225,10 +194,10 @@ // A caller is before the callee // For each incoming PUSH transfer. - for (Node curNode: curNodeSet) { - for (Edge chToRes: curNode.getInEdges()) { - for (Edge resToCh: chToRes.getSource().getInEdges()) { - if (!(resToCh instanceof DataFlowEdge) || ((PushPullAttribute)((DataFlowEdge) resToCh).getAttribute()).getSelectedOption() == PushPullValue.PUSH) { + for (Node curNode : curNodeSet) { + for (Edge chToRes : curNode.getInEdges()) { + for (Edge resToCh : chToRes.getSource().getInEdges()) { + if (!(resToCh instanceof DataFlowEdge) || ((PushPullAttribute) ((DataFlowEdge) resToCh).getAttribute()).getSelectedOption() == PushPullValue.PUSH) { topologicalSort(allNodeSets.get(resToCh.getSource()), allNodeSets, dependedRootComponentGraph, visited, orderedList); } } @@ -236,8 +205,8 @@ } // For each outgoing PULL transfer. if (curNodeSet.iterator().next() instanceof ResourceNode) { - for (Node curNode: curNodeSet) { - for (Edge resToCh: curNode.getOutEdges()) { + for (Node curNode : curNodeSet) { + for (Edge resToCh : curNode.getOutEdges()) { DataFlowEdge de = (DataFlowEdge) resToCh; if (((PushPullAttribute) de.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { for (Edge chToRes : resToCh.getDestination().getOutEdges()) { @@ -250,8 +219,8 @@ // For each depending root node. Node curNode = curNodeSet.iterator().next(); if (curNode instanceof ResourceNode && dependedRootComponentGraph.get(((ResourceNode) curNode).getResourceHierarchy()) != null) { - for (ResourceHierarchy dependingRes: dependedRootComponentGraph.get(((ResourceNode) curNode).getResourceHierarchy())) { - for (Node node: allNodeSets.keySet()) { + for (ResourceHierarchy dependingRes : dependedRootComponentGraph.get(((ResourceNode) curNode).getResourceHierarchy())) { + for (Node node : allNodeSets.keySet()) { if (node instanceof ResourceNode) { ResourceNode rootNode = (ResourceNode) node; ResourceHierarchy rootRes = rootNode.getResourceHierarchy(); @@ -270,15 +239,15 @@ cn = ((StatefulObjectNode) curNode).getResource(); } if (cn != null) { - for (Node n: allNodeSets.keySet()) { + for (Node n : allNodeSets.keySet()) { ResourceNode resNode = null; if (n instanceof ResourceNode) { resNode = (ResourceNode) n; } if (resNode != null) { - for (Edge resToCh: resNode.getOutEdges()) { + for (Edge resToCh : resNode.getOutEdges()) { ChannelNode chNode = (ChannelNode) resToCh.getDestination(); - for (ChannelMember m: chNode.getChannel().getReferenceChannelMembers()) { + for (ChannelMember m : chNode.getChannel().getReferenceChannelMembers()) { if (cn.getOutSideResources().contains(m.getResource())) { topologicalSort(allNodeSets.get(resNode), allNodeSets, dependedRootComponentGraph, visited, orderedList); } @@ -289,9 +258,9 @@ } orderedList.add(0, curNodeSet); } - - protected void updateMainComponent(TypeDeclaration mainType, MethodDeclaration mainConstructor, Node componentNode, - MethodDeclaration constructor, final List depends, ILanguageSpecific langSpec) { + + protected void updateMainComponent(TypeDeclaration mainType, MethodDeclaration mainConstructor, Node componentNode, + MethodDeclaration constructor, final List depends, ILanguageSpecific langSpec) { // Declare the field to refer to each object in the main type. ResourceNode resNode = null; String nodeName = null; @@ -307,17 +276,17 @@ } // Add a statement to instantiate each object to the main constructor. List parameters = new ArrayList<>(); - for (ResourceHierarchy res: depends) { + for (ResourceHierarchy res : depends) { parameters.add(res.getResourceName()); } if (constructor.getParameters() != null) { - for (VariableDeclaration var: constructor.getParameters()) { + for (VariableDeclaration var : constructor.getParameters()) { if (!parameters.contains(var.getName())) { parameters.add(var.getName()); } } } - + Block mainConstructorBody = mainConstructor.getBody(); if (mainConstructorBody == null) { mainConstructorBody = new Block(); @@ -325,7 +294,7 @@ } mainConstructorBody.addStatement(langSpec.getFieldAccessor(nodeName) + langSpec.getAssignment() + langSpec.getConstructorInvocation(componentName, parameters) + langSpec.getStatementDelimiter()); } - + protected ResourceHierarchy addReference(TypeDeclaration component, MethodDeclaration constructor, ResourceHierarchy dstRes, ILanguageSpecific langSpec) { if (!generatesComponent(dstRes)) { dstRes = dstRes.getParent(); @@ -343,11 +312,11 @@ } return dstRes; } - + protected void fillStateGetterMethod(MethodDeclaration stateGetter, ResourceHierarchy resourceHierarchy, Type resStateType, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { // returns the state field when all incoming data-flow edges are PUSH-style. if (langSpec.isValueType(resStateType)) { - stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getFieldAccessor(fieldOfResourceState)) + langSpec.getStatementDelimiter()); // return value; + stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getFieldAccessor(fieldOfResourceState)) + langSpec.getStatementDelimiter()); // return value; } else { if (resourceHierarchy.getChildren() != null && resourceHierarchy.getChildren().size() == 1 && resourceHierarchy.getChildren().iterator().next().getNumParameters() > 0) { // list or map @@ -355,11 +324,11 @@ // // For REST API // stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getFieldAccessor(fieldOfResourceState)) + langSpec.getStatementDelimiter()); // return value; // } else { - String implTypeName = resStateType.getImplementationTypeName(); - // copy the current state to be returned as a 'value' - List parameters = new ArrayList<>(); - parameters.add(langSpec.getFieldAccessor(fieldOfResourceState)); - stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getConstructorInvocation(implTypeName, parameters)) + langSpec.getStatementDelimiter()); // return new Resource(value); + String implTypeName = resStateType.getImplementationTypeName(); + // copy the current state to be returned as a 'value' + List parameters = new ArrayList<>(); + parameters.add(langSpec.getFieldAccessor(fieldOfResourceState)); + stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getConstructorInvocation(implTypeName, parameters)) + langSpec.getStatementDelimiter()); // return new Resource(value); // } } else { if (resourceHierarchy.getChildren() == null || resourceHierarchy.getChildren().size() == 0) { @@ -368,20 +337,20 @@ // // For REST API // stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getFieldAccessor(fieldOfResourceState)) + langSpec.getStatementDelimiter()); // return value; // } else { - String implTypeName = resStateType.getImplementationTypeName(); - // copy the current state to be returned as a 'value' - List parameters = new ArrayList<>(); - parameters.add(langSpec.getFieldAccessor(fieldOfResourceState)); - stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getConstructorInvocation(implTypeName, parameters)) + langSpec.getStatementDelimiter()); // return new Resource(value); + String implTypeName = resStateType.getImplementationTypeName(); + // copy the current state to be returned as a 'value' + List parameters = new ArrayList<>(); + parameters.add(langSpec.getFieldAccessor(fieldOfResourceState)); + stateGetter.addStatement(langSpec.getReturnStatement(langSpec.getConstructorInvocation(implTypeName, parameters)) + langSpec.getStatementDelimiter()); // return new Resource(value); // } } else { - Term composer = null; + Term composer = null; Term composerSub = new Constant(DataConstraintModel.nil); composerSub.setType(DataConstraintModel.typeMap); - for (ResourceHierarchy child: resourceHierarchy.getChildren()) { + for (ResourceHierarchy child : resourceHierarchy.getChildren()) { String childTypeName = getComponentName(child, langSpec); String fieldName = langSpec.toVariableName(childTypeName); - Term childGetter = null; + Term childGetter = null; if (!generatesComponent(child)) { // the child is not a class childGetter = new Term(new Symbol(getterPrefix + childTypeName, 1, Symbol.Type.METHOD)); @@ -393,13 +362,13 @@ } composer = new Term(DataConstraintModel.insert); composer.addChild(composerSub); - composer.addChild(new Constant(fieldName, DataConstraintModel.typeString)); // key - composer.addChild(childGetter); // value + 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[] sideEffects = new String[]{null}; String returnValue = composer.toImplementation(sideEffects); if (sideEffects[0] != null) { stateGetter.addStatement(sideEffects[0] + langSpec.getReturnStatement(returnValue) + langSpec.getStatementDelimiter()); @@ -410,9 +379,9 @@ } } } - - protected void fillDescendantGetterMethod(MethodDeclaration descendantGetter, ResourceHierarchy descendant, - ResourceHierarchy child, ResourceHierarchy ancestor, TypeDeclaration ancestorComponent, ILanguageSpecific langSpec) { + + protected void fillDescendantGetterMethod(MethodDeclaration descendantGetter, ResourceHierarchy descendant, + ResourceHierarchy child, ResourceHierarchy ancestor, TypeDeclaration ancestorComponent, ILanguageSpecific langSpec) { // (#4) descendant getter method (the implementation must be kept consistent with #3) Expression selector; if (DataConstraintModel.typeList.isAncestorOf(ancestor.getResourceStateType())) { @@ -424,7 +393,7 @@ selector = new Variable(langSpec.getFieldAccessor(fieldName)); } if (descendantGetter.getParameters() != null) { - for (VariableDeclaration param: descendantGetter.getParameters()) { + for (VariableDeclaration param : descendantGetter.getParameters()) { if (DataConstraintModel.typeInt.isAncestorOf(param.getType())) { Term newSelector = new Term(DataConstraintModel.get); newSelector.addChild(selector); @@ -439,17 +408,17 @@ } } if (descendantGetter != null && (descendantGetter.getBody() == null || descendantGetter.getBody().getStatements().size() == 0)) { - String[] sideEffects = new String[] {null}; + String[] sideEffects = new String[]{null}; String returnValue = selector.toImplementation(sideEffects); if (sideEffects[0] != null) descendantGetter.addStatement(sideEffects[0]); descendantGetter.addStatement(langSpec.getReturnStatement(returnValue) + langSpec.getStatementDelimiter()); } } - + protected void declareAccessorInMainComponent(TypeDeclaration mainComponent, ResourceNode accessRes, MethodDeclaration stateGetter, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { List mainGetterParams = new ArrayList<>(); int v = 1; - for (Expression param: accessRes.getPrimaryResourcePath().getPathParams()) { + for (Expression param : accessRes.getPrimaryResourcePath().getPathParams()) { if (param instanceof Variable) { Variable var = (Variable) param; mainGetterParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); @@ -472,7 +441,7 @@ } Block block = new Block(); Expression getState = getPullAccessor(platformSpec).getDirectStateAccessorFor(accessResPath, null); - block.addStatement(langSpec.getReturnStatement(getState.toImplementation(new String[] {null})) + langSpec.getStatementDelimiter()); + block.addStatement(langSpec.getReturnStatement(getState.toImplementation(new String[]{null})) + langSpec.getStatementDelimiter()); // if (stateGetter.getParameters() == null || stateGetter.getParameters().size() == 0) { // block.addStatement(langSpec.getReturnStatement(langSpec.getMethodInvocation(accessRes.getResourceName(), stateGetter.getName())) + langSpec.getStatementDelimiter()); // } else { @@ -485,19 +454,19 @@ accessor.setBody(block); mainComponent.addMethod(accessor); } - + protected void declareFieldsToReferenceResources(DataTransferModel model, ResourceNode resourceNode, TypeDeclaration component, MethodDeclaration constructor, - final List depends, ILanguageSpecific langSpec) { + final List depends, ILanguageSpecific langSpec) { Set refs = new HashSet<>(); for (Channel ch : model.getChannels()) { DataTransferChannel c = (DataTransferChannel) ch; if (resourceNode.getOutSideResource(c) != null) { - for (ResourcePath res: c.getReferenceResources()) { + for (ResourcePath res : c.getReferenceResources()) { if (!refs.contains(res) && !depends.contains(res.getResourceHierarchy())) { refs.add(res); String refResName = langSpec.toComponentName(res.getLeafResourceName()); component.addField(langSpec.newFieldDeclaration(new Type(refResName, refResName), res.getLeafResourceName())); - constructor.addParameter(langSpec.newVariableDeclaration(new Type(refResName, refResName), res.getLeafResourceName())); + constructor.addParameter(langSpec.newVariableDeclaration(new Type(refResName, refResName), res.getLeafResourceName())); constructor.getBody().addStatement(langSpec.getFieldAccessor(res.getLeafResourceName()) + langSpec.getAssignment() + res.getLeafResourceName() + langSpec.getStatementDelimiter()); } } @@ -506,7 +475,7 @@ } protected MethodDeclaration getConstructor(TypeDeclaration component) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.isConstructor()) return m; } return null; @@ -514,7 +483,7 @@ protected static List getGetterMethods(TypeDeclaration component, String resourceName) { List getters = new ArrayList<>(); - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().equals(getterPrefix + resourceName)) { getters.add(m); } @@ -523,15 +492,15 @@ } protected MethodDeclaration getUpdateMethod(Edge inEdge, TypeDeclaration component, - Map>> dataFlowInform, ILanguageSpecific langSpec) { + Map>> dataFlowInform, ILanguageSpecific langSpec) { List passedResoueces = dataFlowInform.get(inEdge).get(PushPullValue.PUSH); String methodName = updateMethodPrefix; - for (ResourceNode rn: passedResoueces) { + for (ResourceNode rn : passedResoueces) { methodName += langSpec.toComponentName(rn.getResourceName()); } return getMethod(component, methodName); } - + protected MethodDeclaration getInputMethod(ResourceNode resourceNode, DataTransferChannel ch, TypeDeclaration component) { MethodDeclaration input = null; for (ChannelMember out : ch.getOutputChannelMembers()) { @@ -549,9 +518,9 @@ return input; } - + protected MethodDeclaration getMethod(TypeDeclaration component, String methodName, List params) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().equals(methodName)) { if (m.getParameters() == null && (params == null || params.size() == 0)) return m; if (m.getParameters() != null && params != null && m.getParameters().size() == params.size()) { @@ -568,18 +537,18 @@ } return null; } - + protected MethodDeclaration getMethod(TypeDeclaration component, String methodName) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().equals(methodName)) return m; } return null; - } - + } + protected boolean isPut(ChannelMember cm) { return cm.getStateTransition().isRightUnary(); } - + protected boolean isDelete(ChannelMember cm) { boolean isDelete = false; Expression nextExp = cm.getStateTransition().getNextStateExpression(); @@ -606,45 +575,47 @@ } return isDelete; } - - protected String getGetterResourcePathAndPathParams(ResourcePath resPath, List pathParams, - IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + + protected String getGetterResourcePathAndPathParams(ResourcePath resPath, List pathParams, + IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { int v = 1; List params = new ArrayList<>(); - for (Expression pathParam: resPath.getPathParams()) { + for (Expression pathParam : resPath.getPathParams()) { if (pathParam instanceof Variable) { Variable var = (Variable) pathParam; String paramName = var.getName(); params.add("{" + paramName + "}"); VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), paramName); - if (!platformSpec.isMonolithic()) ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); + if (!platformSpec.isMonolithic()) + ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); pathParams.add(param); } else if (pathParam instanceof Term) { Term var = (Term) pathParam; String paramName = "v" + v; params.add("{" + paramName + "}"); VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), paramName); - if (!platformSpec.isMonolithic()) ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); + if (!platformSpec.isMonolithic()) + ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); pathParams.add(param); } } return resPath.getResourceHierarchy().toResourcePath(params); } - protected String getUpdateResourcePathAndPathParams(ResourcePath resPath, ArrayList pathParams, boolean isRestAPI, - IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + protected String getUpdateResourcePathAndPathParams(ResourcePath resPath, ArrayList pathParams, boolean isRestAPI, + IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { int v = 1; List params = new ArrayList<>(); - for (Expression pathParam: resPath.getPathParams()) { + for (Expression pathParam : resPath.getPathParams()) { if (pathParam instanceof Variable) { Variable var = (Variable) pathParam; String paramName = null; if (isRestAPI) { - paramName = var.getName(); + paramName = var.getName(); } else { paramName = "self" + (v > 1 ? v : ""); } - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), paramName); if (isRestAPI) ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); pathParams.add(param); @@ -652,11 +623,11 @@ Term var = (Term) pathParam; String paramName = null; if (isRestAPI) { - paramName = "v" + v; + paramName = "v" + v; } else { paramName = "self" + (v > 1 ? v : ""); } - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), paramName); if (isRestAPI) ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); pathParams.add(param); @@ -667,7 +638,7 @@ } protected String getInputMethodResourcePathAndPathParams(ResourcePath resPath, ArrayList rootInputParams, - IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { int v = 1; List params = new ArrayList<>(); if (resPath.getLastParam() != null) { @@ -675,35 +646,39 @@ if (pathParam instanceof Variable) { Variable var = (Variable) pathParam; String paramName = var.getName(); - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), paramName); - if (!platformSpec.isMonolithic()) ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); + if (!platformSpec.isMonolithic()) + ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); rootInputParams.add(param); } else if (pathParam instanceof Term) { Term var = (Term) pathParam; String paramName = "v" + v; - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), paramName); - if (!platformSpec.isMonolithic()) ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); + if (!platformSpec.isMonolithic()) + ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); rootInputParams.add(param); } v++; } if (resPath.getParent() != null) { - for (Expression pathParam: resPath.getParent().getPathParams()) { + for (Expression pathParam : resPath.getParent().getPathParams()) { if (pathParam instanceof Variable) { Variable var = (Variable) pathParam; String paramName = var.getName(); - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), paramName); - if (!platformSpec.isMonolithic()) ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); + if (!platformSpec.isMonolithic()) + ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); rootInputParams.add(param); } else if (pathParam instanceof Term) { Term var = (Term) pathParam; String paramName = "v" + v; - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), paramName); - if (!platformSpec.isMonolithic()) ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); + if (!platformSpec.isMonolithic()) + ((RestApiSpecific) platformSpec).addPathParamAnnotation(param, paramName); rootInputParams.add(param); } v++; @@ -713,7 +688,7 @@ } protected void generatePullDataTransfer(MethodDeclaration methodBody, String fromResourceName, String fromResourcePath, Type fromResourceType, boolean doesAddFirst, - IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { RestApiSpecific restApiSpec = (RestApiSpecific) platformSpec; String varName = new String(fromResourceName); String respTypeName = fromResourceType.getInterfaceTypeName(); @@ -728,7 +703,7 @@ respConverter += langSpec.getVariableDeclaration(fromResourceType.getInterfaceTypeName(), fromResourceName) + langSpec.getAssignment() + langSpec.getConstructorInvocation(fromResourceType.getImplementationTypeName(), null) + langSpec.getStatementDelimiter() + "\n"; respConverter += langSpec.getForStatementForCollection("i", mapTypeName, varName) + "\n"; respConverter += "\t" + langSpec.getMethodInvocation(fromResourceName, DataConstraintModel.append.getImplName(), List.of(getCodeForConversionFromMapToTuple(compType, "i", langSpec))) + langSpec.getStatementDelimiter() + "\n"; - respConverter += langSpec.getEndForStatement("i") ; + respConverter += langSpec.getEndForStatement("i"); restApiSpec.addJsonException(methodBody); } else if (DataConstraintModel.typeMap.isAncestorOf(compType)) { // To do. @@ -784,37 +759,37 @@ } else { mapTypeName = type.getInterfaceTypeName(); mapTypeName = mapTypeName.replace(DataConstraintModel.typeTuple.getInterfaceTypeName(), DataConstraintModel.typeMap.getInterfaceTypeName()); - for (int idx = mapTypeName.indexOf("<", 0); idx >= 0; idx = mapTypeName.indexOf("<", idx + 1)) { // Java specific - int to = mapTypeName.indexOf(",", idx); // Java specific + for (int idx = mapTypeName.indexOf("<", 0); idx >= 0; idx = mapTypeName.indexOf("<", idx + 1)) { // Java specific + int to = mapTypeName.indexOf(",", idx); // Java specific if (to > idx) { - mapTypeName = mapTypeName.substring(0, idx + 1) + DataConstraintModel.typeString.getInterfaceTypeName() + mapTypeName.substring(to); // All elements except for the last one have the string type. + mapTypeName = mapTypeName.substring(0, idx + 1) + DataConstraintModel.typeString.getInterfaceTypeName() + mapTypeName.substring(to); // All elements except for the last one have the string type. } } } return mapTypeName; } - + protected String getCodeForConversionFromMapToTuple(Type tupleType, String mapVar, ILanguageSpecific langSpec) { String decoded = "$x"; List elementsTypes = TypeInference.getTupleComponentTypes(tupleType); String elementBase = mapVar; - for (Type elmType: elementsTypes.subList(0, elementsTypes.size() - 1)) { - elementBase = langSpec.getFirstEntryFromMapExp(elementBase); // elementBase.entrySet().iterator().next() + for (Type elmType : elementsTypes.subList(0, elementsTypes.size() - 1)) { + elementBase = langSpec.getFirstEntryFromMapExp(elementBase); // elementBase.entrySet().iterator().next() if (elmType == DataConstraintModel.typeBoolean || elmType == DataConstraintModel.typeInt || elmType == DataConstraintModel.typeLong || elmType == DataConstraintModel.typeFloat || elmType == DataConstraintModel.typeDouble) { - String getKey = langSpec.getMethodInvocation(elementBase, DataConstraintModel.fst.getImplName()); // elementBase.getKey() - String elmVal = langSpec.getStringToValueExp(elmType.getImplementationTypeName(), getKey); // Integer.parseInt(elementBase.getKey()) - decoded = decoded.replace("$x", langSpec.getPairExp(elmVal, "$x")); // new AbstractMap.SimpleEntry<>(Integer.parseInt(elementBase.getKey()), $x) + String getKey = langSpec.getMethodInvocation(elementBase, DataConstraintModel.fst.getImplName()); // elementBase.getKey() + String elmVal = langSpec.getStringToValueExp(elmType.getImplementationTypeName(), getKey); // Integer.parseInt(elementBase.getKey()) + decoded = decoded.replace("$x", langSpec.getPairExp(elmVal, "$x")); // new AbstractMap.SimpleEntry<>(Integer.parseInt(elementBase.getKey()), $x) } else if (elmType == DataConstraintModel.typeString) { - String getKey = langSpec.getMethodInvocation(elementBase, DataConstraintModel.fst.getImplName()); // elementBase.getKey() - decoded = decoded.replace("$x", langSpec.getPairExp(getKey, "$x")); // new AbstractMap.SimpleEntry<>(elementBase.getKey(), $x) + String getKey = langSpec.getMethodInvocation(elementBase, DataConstraintModel.fst.getImplName()); // elementBase.getKey() + decoded = decoded.replace("$x", langSpec.getPairExp(getKey, "$x")); // new AbstractMap.SimpleEntry<>(elementBase.getKey(), $x) } else { // To do. } - elementBase = langSpec.getMethodInvocation(elementBase, DataConstraintModel.snd.getImplName()); // elementBase.getValue() + elementBase = langSpec.getMethodInvocation(elementBase, DataConstraintModel.snd.getImplName()); // elementBase.getValue() } decoded = decoded.replace("$x", elementBase); return decoded; @@ -826,7 +801,7 @@ decoded = decoded.replace("$x", mapVar + ".get(\"right\")"); return decoded; } - + protected String getCodeForConversionFromMapToMap(Type mapType, String mapVal, String mapVar, ILanguageSpecific langSpec) { List elementsTypes = TypeInference.getMapComponentTypes(mapType); Type keyType = elementsTypes.get(0); @@ -847,14 +822,14 @@ } return decoded; } - + protected IResourceStateAccessor getPushAccessor(IPlatformSpecific platformSpec) { if (platformSpec.isMonolithic()) { return new IResourceStateAccessor() { @Override public Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from) { - ResourcePath targetRes= target.getResource(); - ResourcePath fromRes= from.getResource(); + ResourcePath targetRes = target.getResource(); + ResourcePath fromRes = from.getResource(); if (targetRes.equals(fromRes)) { return new Field(fieldOfResourceState, targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() @@ -865,15 +840,15 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { - ResourcePath targetRes= target.getResource(); + ResourcePath targetRes = target.getResource(); return new Parameter(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null && targetRes.equals(fromRes)) { @@ -903,7 +878,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -911,7 +886,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null && targetRes.equals(fromRes)) { @@ -924,15 +899,15 @@ }; } } - + protected IResourceStateAccessor getPullAccessor(IPlatformSpecific platformSpec) { if (platformSpec.isMonolithic()) { return new IResourceStateAccessor() { @Override public Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from) { - ResourcePath targetRes= target.getResource(); + ResourcePath targetRes = target.getResource(); if (from != null) { - ResourcePath fromRes= from.getResource(); + ResourcePath fromRes = from.getResource(); if (!target.isOutside()) { return getDirectStateAccessorFor(targetRes, fromRes); } @@ -952,12 +927,12 @@ return getDirectStateAccessorFor(targetRes, null); } } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { - ResourcePath targetRes= target.getResource(); + ResourcePath targetRes = target.getResource(); if (from != null) { - ResourcePath fromRes= from.getResource(); + ResourcePath fromRes = from.getResource(); if (!target.isOutside()) { return getDirectStateAccessorFor(targetRes, fromRes); } @@ -992,7 +967,7 @@ ResourcePath curPath = targetRes; do { pathStack.push(curPath); - curPath = curPath.getParent(); + curPath = curPath.getParent(); } while (!curPath.equals(fromRes)); // iterate from the fromRes resource return getRelativePath(targetRes, pathStack); @@ -1010,13 +985,13 @@ ResourcePath curPath = targetRes; do { pathStack.push(curPath); - curPath = curPath.getParent(); + curPath = curPath.getParent(); } while (curPath != null); // iterate from the root resource return getRelativePath(targetRes, pathStack); } } - + private Expression getRelativePath(ResourcePath targetRes, Stack pathStack) { ResourcePath curPath; Term getter = null; @@ -1101,7 +1076,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -1135,7 +1110,7 @@ do { if (fromRes != null && curPath.equals(fromRes)) break; pathStack.push(curPath); - curPath = curPath.getParent(); + curPath = curPath.getParent(); } while (curPath != null); // iterate from the `from' resource Term getter = null; @@ -1213,8 +1188,8 @@ return new IResourceStateAccessor() { @Override public Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from) { - ResourcePath targetRes= target.getResource(); - ResourcePath fromRes= from.getResource(); + ResourcePath targetRes = target.getResource(); + ResourcePath fromRes = from.getResource(); if (targetRes.equals(fromRes)) { return new Field(fieldOfResourceState, targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() @@ -1225,15 +1200,15 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { - ResourcePath targetRes= target.getResource(); + ResourcePath targetRes = target.getResource(); return new Parameter(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null && targetRes.equals(fromRes)) { @@ -1263,7 +1238,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -1271,7 +1246,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null && targetRes.equals(fromRes)) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index f6ad47d..972a1cb 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -1,68 +1,21 @@ package generators; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - import algorithms.TypeInference; - -import java.util.Set; -import java.util.Stack; - -import code.ast.Annotation; -import code.ast.Block; -import code.ast.CodeUtil; -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; +import code.ast.*; import models.Edge; import models.Node; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Field; -import models.algebra.InvalidMessage; -import models.algebra.Parameter; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.Position; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.algebra.Variable; -import models.dataConstraintModel.Channel; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.JsonAccessor; -import models.dataConstraintModel.JsonTerm; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.DataFlowEdge; -import models.dataFlowModel.DataFlowGraph; -import models.dataFlowModel.DataTransferChannel; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.IFlowGraph; -import models.dataFlowModel.PushPullAttribute; -import models.dataFlowModel.PushPullValue; -import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; -import models.dataFlowModel.ResourceNode; -import models.dataFlowModel.ChannelNode; -import models.dataFlowModel.StoreAttribute; +import models.algebra.*; +import models.dataConstraintModel.*; +import models.dataFlowModel.*; import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; -public class CodeGeneratorFromDataFlowGraph extends CodeGenerator { +import java.util.*; +import java.util.Map.Entry; - public void generateCodeFromFlowGraph(DataTransferModel model, IFlowGraph flowGraph, Collection> components, ArrayList codes, - Map> dependedRootComponentGraph, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { +public class CodeGeneratorFromDataFlowGraph extends CodeGenerator { + + public void generateCodeFromFlowGraph(DataTransferModel model, IFlowGraph flowGraph, Collection> components, ArrayList codes, + Map> dependedRootComponentGraph, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { Map resourceComponents = new HashMap<>(); Map resourceConstructors = new HashMap<>(); Map> constructorParams = new HashMap<>(); @@ -84,7 +37,7 @@ } // For each components (1st pass). - for (Set componentNodeSet: components) { + for (Set componentNodeSet : components) { Node componentNode = componentNodeSet.iterator().next(); ResourceNode resourceNode = (ResourceNode) componentNode; TypeDeclaration component = null; @@ -103,7 +56,7 @@ } resourceComponents.put(resourceNode.getResourceHierarchy(), component); CompilationUnit cu = langSpec.newCompilationUnit(component); - if (!platformSpec.isMonolithic() && resourceNode.getResourceHierarchy().getParent() == null) { + if (!platformSpec.isMonolithic() && resourceNode.getResourceHierarchy().getParent() == null) { // For each root node, add platform specific imports. ((RestApiSpecific) platformSpec).addPlatformSpecificImports(cu); } @@ -122,12 +75,12 @@ } // Declare the fields to refer to reference resources. - declareFieldsToReferenceResources(model, resourceNode, component, constructor, depends, langSpec); + declareFieldsToReferenceResources(model, resourceNode, component, constructor, depends, langSpec); if (constructor.getParameters() == null || constructor.getParameters().size() == 0) { component.removeMethod(constructor); } else { - resourceConstructors.put(resourceNode.getResourceHierarchy(), constructor); + resourceConstructors.put(resourceNode.getResourceHierarchy(), constructor); } } @@ -154,7 +107,7 @@ // For each components (2nd pass). Map priorMemberForInputChannel = new HashMap<>(); Set generatedResources = new HashSet<>(); - for (Set componentNodeSet: components) { + for (Set componentNodeSet : components) { Node componentNode = componentNodeSet.iterator().next(); // Declare this resource. ResourceNode resourceNode = (ResourceNode) componentNode; @@ -163,7 +116,7 @@ TypeDeclaration parentComponent = null; TypeDeclaration rootComponent = null; if (generatesComponent(resourceNode.getResourceHierarchy())) { - component = resourceComponents.get(resourceNode.getResourceHierarchy()); + component = resourceComponents.get(resourceNode.getResourceHierarchy()); } if (resourceNode.getResourceHierarchy().getParent() != null) { parentComponent = resourceComponents.get(resourceNode.getResourceHierarchy().getParent()); @@ -172,14 +125,14 @@ // Declare cache fields and update methods in this resource, and an update accessor method in the type of root resource. Map.Entry, Map>>> initStatementsAndUpdateUpdates - = declareCacheFieldsAndUpdateMethods(resourceNode, component, parentComponent, rootComponent, platformSpec, langSpec); + = declareCacheFieldsAndUpdateMethods(resourceNode, component, parentComponent, rootComponent, platformSpec, langSpec); if (component == null) { // Constructor statements were not added to any component because no component had been generated. - for (String statement: initStatementsAndUpdateUpdates.getKey()) { + 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()); } @@ -204,14 +157,14 @@ // Declare input methods in this component and the main component. if (!generatedResources.contains(resourceNode.getResourceHierarchy())) { Map.Entry, Map>>> initStatementsAndInputUpdates - = declareInputMethodsInThisAndMainComponents(resourceNode, component, parentComponent, mainComponent, rootComponent, model, priorMemberForInputChannel, platformSpec, langSpec); + = declareInputMethodsInThisAndMainComponents(resourceNode, component, parentComponent, mainComponent, rootComponent, model, priorMemberForInputChannel, platformSpec, langSpec); if (component == null) { // Constructor statements were not added to any component because no component had been generated. - for (String statement: initStatementsAndInputUpdates.getKey()) { + 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()); } } @@ -220,17 +173,17 @@ } // Add constructor parameters to the ancestor components. - for (ResourceNode root: ((DataFlowGraph) flowGraph).getRootResourceNodes()) { + for (ResourceNode root : ((DataFlowGraph) flowGraph).getRootResourceNodes()) { addConstructorParameters(root.getResourceHierarchy(), resourceComponents, resourceConstructors, constructorParams, langSpec); } // Add constructor statements. - for (Map.Entry entry: constructorStatements) { + for (Map.Entry entry : constructorStatements) { resourceConstructors.get(entry.getKey()).addStatement(entry.getValue()); } // Add update statements. - for (MethodDeclaration method: updateStatements.keySet()) { + for (MethodDeclaration method : updateStatements.keySet()) { Expression updateExp = updateStatements.get(method).getKey(); ResourceHierarchy resource = updateStatements.get(method).getValue().getKey(); ResourceHierarchy descendantRes = updateStatements.get(method).getValue().getValue(); @@ -238,15 +191,15 @@ addUpdateStatementWithConstructorInvocationToMethod(method, updateExp, resource, descendantRes, descendantComponent, langSpec); } } - + private static List addConstructorParameters(ResourceHierarchy resource, Map resourceComponents, - Map resourceConstructors, Map> constructorParams, ILanguageSpecific langSpec) { + Map resourceConstructors, Map> constructorParams, ILanguageSpecific langSpec) { List params = new ArrayList<>(); - for (ResourceHierarchy child: resource.getChildren()) { + for (ResourceHierarchy child : resource.getChildren()) { params.addAll(addConstructorParameters(child, resourceComponents, resourceConstructors, constructorParams, langSpec)); } if (constructorParams.get(resource) != null) { - for (VariableDeclaration param: constructorParams.get(resource).values()) { + for (VariableDeclaration param : constructorParams.get(resource).values()) { params.add(param); } } @@ -263,10 +216,10 @@ } } if (constructor != null) { - for (VariableDeclaration param: params) { + for (VariableDeclaration param : params) { boolean existsParam = false; if (constructor.getParameters() != null) { - for (VariableDeclaration constParam: constructor.getParameters()) { + for (VariableDeclaration constParam : constructor.getParameters()) { if (constParam.getName().equals(param.getName())) { existsParam = true; break; @@ -300,12 +253,12 @@ MethodDeclaration childConstructor = getConstructor(descendantComponent); List params = new ArrayList<>(); if (childConstructor != null) { - for (VariableDeclaration var: childConstructor.getParameters()) { + for (VariableDeclaration var : childConstructor.getParameters()) { // Extract the argument of each constructor parameter from jsonTerm. JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); jsonMember.addChild(jsonTerm); jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); - Expression param = jsonMember.reduce(); // Reduce {"name": "foo", age: 25}.name => "foo" + Expression param = jsonMember.reduce(); // Reduce {"name": "foo", age: 25}.name => "foo" if (param != null) { if (param instanceof Term) { if (((Term) param).getType() == null) { @@ -330,10 +283,10 @@ } } 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()) { + 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); @@ -344,7 +297,7 @@ Type fieldType = getImplStateType(resource, langSpec); if (exp instanceof Term) { ((Term) exp).setType(fieldType); - for (Map.Entry varEnt: ((Term) exp).getVariables().entrySet()) { + for (Map.Entry varEnt : ((Term) exp).getVariables().entrySet()) { if (varEnt.getValue().getName().equals(fieldOfResourceState)) { varEnt.getValue().setType(fieldType); } @@ -352,11 +305,11 @@ } else if (exp instanceof Variable) { ((Variable) exp).setType(fieldType); } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String newState = exp.toImplementation(sideEffects); String updateStatement; if (exp instanceof Term && ((Term) exp).getSymbol().isImplWithSideEffect()) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); } @@ -365,9 +318,9 @@ } method.addFirstStatement(updateStatement); } - - private MethodDeclaration declareConstructor(ResourceNode resourceNode, TypeDeclaration component, Map> dependedRootComponentGraph, - List depends, ILanguageSpecific langSpec) { + + private MethodDeclaration declareConstructor(ResourceNode resourceNode, TypeDeclaration component, Map> dependedRootComponentGraph, + List depends, ILanguageSpecific langSpec) { // Declare a constructor in each component. String resourceName = getComponentName(resourceNode.getResourceHierarchy(), langSpec); MethodDeclaration constructor = langSpec.newMethodDeclaration(resourceName, true, null, null); @@ -375,24 +328,24 @@ constructor.setBody(block); component.addMethod(constructor); - for (Edge resToCh: resourceNode.getOutEdges()) { + for (Edge resToCh : resourceNode.getOutEdges()) { DataTransferChannel ch = ((ChannelNode) resToCh.getDestination()).getChannel(); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (resourceNode.getOutSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } - for (Edge chToRes: resToCh.getDestination().getOutEdges()) { + for (Edge chToRes : resToCh.getDestination().getOutEdges()) { if (chToRes.getDestination() instanceof ResourceNode) { ResourceHierarchy dstRes = ((ResourceNode) chToRes.getDestination()).getResourceHierarchy(); // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (((ResourceNode) chToRes.getDestination()).getInSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } @@ -413,23 +366,23 @@ } } } - for (Edge chToRes: resourceNode.getInEdges()) { - for (Edge resToCh: chToRes.getSource().getInEdges()) { + for (Edge chToRes : resourceNode.getInEdges()) { + for (Edge resToCh : chToRes.getSource().getInEdges()) { ResourceHierarchy srcRes = ((ResourceNode) resToCh.getSource()).getResourceHierarchy(); DataTransferChannel ch = ((ChannelNode) resToCh.getDestination()).getChannel(); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (((ResourceNode) resToCh.getSource()).getOutSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } @@ -451,8 +404,8 @@ } // Declare a field to refer to outside resources. if (resourceNode.getParent() == null) { - for (ResourceHierarchy dependedRes: dependedRootComponentGraph.keySet()) { - for (ResourceHierarchy dependingRes: dependedRootComponentGraph.get(dependedRes)) { + for (ResourceHierarchy dependedRes : dependedRootComponentGraph.keySet()) { + for (ResourceHierarchy dependingRes : dependedRootComponentGraph.get(dependedRes)) { if (resourceNode.getResourceHierarchy().equals(dependingRes)) { // Declare a field to refer to outside resources. depends.add(dependedRes); @@ -488,7 +441,7 @@ component.addField(stateField); } else { // class - for (ResourceHierarchy c: children) { + for (ResourceHierarchy c : children) { String childTypeName = getComponentName(c, langSpec); Type childType = null; if (generatesComponent(c)) { @@ -502,9 +455,9 @@ } } } - - private void declareFieldsToReferToOtherResourcesAndStateFieldInParentComponent(ResourceNode resourceNode, TypeDeclaration component, TypeDeclaration parentComponent, - Map> constructorParams, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + + private void declareFieldsToReferToOtherResourcesAndStateFieldInParentComponent(ResourceNode resourceNode, TypeDeclaration component, TypeDeclaration parentComponent, + Map> constructorParams, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { // Declare reference fields for push data transfer. boolean noPullTransfer = true; for (Edge resToCh : resourceNode.getOutEdges()) { @@ -513,9 +466,9 @@ DataTransferChannel directDstCh = directDstChNode.getChannel(); // Check if the source resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: directDstCh.getInputChannelMembers()) { + for (ChannelMember cm : directDstCh.getInputChannelMembers()) { if (cm.getResource().equals(resourceNode.getOutSideResource(directDstCh)) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } @@ -524,13 +477,13 @@ Set descendantDstChannels = directDstChNode.getDescendants(); Set outEdges = new HashSet<>(); outEdges.addAll(directDstChNode.getOutEdges()); - for (ChannelNode ancestorDst: ancestorDstChannels) { + for (ChannelNode ancestorDst : ancestorDstChannels) { outEdges.addAll(ancestorDst.getOutEdges()); } - for (ChannelNode descendantDst: descendantDstChannels) { + for (ChannelNode descendantDst : descendantDstChannels) { outEdges.addAll(descendantDst.getOutEdges()); } - for (Edge chToRes: outEdges) { + for (Edge chToRes : outEdges) { if (chToRes.getDestination() instanceof ResourceNode) { ResourceHierarchy dstRes = ((ResourceNode) chToRes.getDestination()).getResourceHierarchy(); ChannelNode chNode = (ChannelNode) chToRes.getSource(); @@ -538,11 +491,11 @@ // Check if the destination resource is outside of the channel scope. boolean outsideOutputResource = false; ChannelMember out = null; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (((ResourceNode) chToRes.getDestination()).getInSideResources().contains(cm.getResource())) { out = cm; if (cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } @@ -550,10 +503,10 @@ ResourcePath dstResPath = out.getResource(); // Also take into account the channel hierarchy to determine push/pull transfer. if (descendantDstChannels.contains(chNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if (ancestorDstChannels.contains(chNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // Declare a field in the parent or this component to refer to the destination resource of push transfer. @@ -563,10 +516,10 @@ String dstResName = getComponentName(dstRes, langSpec); FieldDeclaration refFieldForPush = langSpec.newFieldDeclaration(new Type(dstResName, dstResName), langSpec.toVariableName(dstResName)); VariableDeclaration refVarForPush = langSpec.newVariableDeclaration(new Type(dstResName, dstResName), langSpec.toVariableName(dstResName)); - if (!platformSpec.isMonolithic() + if (!platformSpec.isMonolithic() && (outsideOutputResource || (resourceNode.getOutSideResource(ch).getCommonPrefix(dstResPath) == null && platformSpec.isDifferentTreesAsDifferentServices()))) { // Inter-service (for REST API) - if (parentComponent != null && + if (parentComponent != null && !((RestApiSpecific) platformSpec).hasHttpClientFieldDeclaration(parentComponent)) { // Declare a client field to connect to the destination resource of push transfer. ((RestApiSpecific) platformSpec).addHttpClientFieldDeclaration(parentComponent); @@ -616,7 +569,7 @@ if (component != null) { // A component is created for this resource. boolean existsField = false; - for (FieldDeclaration field: component.getFields()) { + for (FieldDeclaration field : component.getFields()) { if (dstRootResName.equals(field.getName())) { existsField = true; break; @@ -636,7 +589,7 @@ } else { // No component is created for this resource. boolean existsField = false; - for (FieldDeclaration field: parentComponent.getFields()) { + for (FieldDeclaration field : parentComponent.getFields()) { if (dstRootResName.equals(field.getName())) { existsField = true; break; @@ -670,39 +623,39 @@ Set descendantSrcChannels = directSrcChNode.getDescendants(); Set inEdges = new HashSet<>(); inEdges.addAll(directSrcChNode.getInEdges()); - for (ChannelNode ancestorSrc: ancestorSrcChannels) { + for (ChannelNode ancestorSrc : ancestorSrcChannels) { inEdges.addAll(ancestorSrc.getInEdges()); } - for (ChannelNode descendantSrc: descendantSrcChannels) { + for (ChannelNode descendantSrc : descendantSrcChannels) { inEdges.addAll(descendantSrc.getInEdges()); } - for (Edge resToCh: inEdges) { + for (Edge resToCh : inEdges) { DataFlowEdge re = (DataFlowEdge) resToCh; ChannelNode chNode = (ChannelNode) re.getDestination(); DataTransferChannel ch = chNode.getChannel(); ResourcePath srcRes = ((ResourceNode) re.getSource()).getOutSideResource(ch); // Check if the source resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (cm.getResource().equals(srcRes) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } // Also take into account the channel hierarchy to determine push/pull transfer. if (descendantSrcChannels.contains(chNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } if (ancestorSrcChannels.contains(chNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { noPullTransfer = false; @@ -713,10 +666,10 @@ String srcResName = getComponentName(srcRes.getResourceHierarchy(), langSpec); FieldDeclaration refFieldForPull = langSpec.newFieldDeclaration(new Type(srcResName, srcResName), langSpec.toVariableName(srcResName)); VariableDeclaration refVarForPull = langSpec.newVariableDeclaration(new Type(srcResName, srcResName), langSpec.toVariableName(srcResName)); - if (!platformSpec.isMonolithic() + if (!platformSpec.isMonolithic() && (outsideInputResource || (resourceNode.getInSideResource(ch).getCommonPrefix(srcRes) == null && platformSpec.isDifferentTreesAsDifferentServices()))) { // Inter-service (for REST API) - if (parentComponent != null + if (parentComponent != null && !((RestApiSpecific) platformSpec).hasHttpClientFieldDeclaration(parentComponent)) { // Declare a client field to connect to the destination resource of push transfer. ((RestApiSpecific) platformSpec).addHttpClientFieldDeclaration(parentComponent); @@ -767,7 +720,7 @@ if (component != null) { // A component is created for this resource. boolean existsField = false; - for (FieldDeclaration field: component.getFields()) { + for (FieldDeclaration field : component.getFields()) { if (srcRootResName.equals(field.getName())) { existsField = true; break; @@ -787,14 +740,14 @@ } else { // No component is created for this resource. boolean existsField = false; - for (FieldDeclaration field: parentComponent.getFields()) { + for (FieldDeclaration field : parentComponent.getFields()) { if (srcRootResName.equals(field.getName())) { existsField = true; break; } } if (!existsField) { - parentComponent.addField(refRootFieldForPull); + parentComponent.addField(refRootFieldForPull); Map nameToParam = constructorParams.get(resourceNode.getParent().getResourceHierarchy()); if (nameToParam == null) { nameToParam = new HashMap<>(); @@ -817,7 +770,7 @@ if (((StoreAttribute) resourceNode.getAttribute()).isStored() && noPullTransfer && res.getNumParameters() == 0) { String resName = langSpec.toVariableName(getComponentName(res, langSpec)); boolean existsField = false; - for (FieldDeclaration field: parentComponent.getFields()) { + for (FieldDeclaration field : parentComponent.getFields()) { if (resName.equals(field.getName())) { existsField = true; break; @@ -840,8 +793,8 @@ } - private MethodDeclaration declareStateGetterMethod(ResourceNode resourceNode, TypeDeclaration component, Type resStateType, - IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + private MethodDeclaration declareStateGetterMethod(ResourceNode resourceNode, TypeDeclaration component, Type resStateType, + IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { // Declare the getter method of the resource state. MethodDeclaration stateGetter = langSpec.newMethodDeclaration(getterOfResourceState, resStateType); if (!platformSpec.isMonolithic() && resourceNode.getResourceHierarchy().getParent() == null) { @@ -853,7 +806,7 @@ boolean hasDescendantIn = hasDescendantInput(resourceNode); if (((StoreAttribute) resourceNode.getAttribute()).isStored() && !hasDescendantIn) { fillStateGetterMethod(stateGetter, resourceNode.getResourceHierarchy(), resStateType, platformSpec, langSpec); - } else { + } else { // invocations to other getter methods when at least one incoming data-flow edges is PULL-style. if (addOtherGetterInvocationsToStateGatter(stateGetter, resourceNode, platformSpec, langSpec)) { // Declare a client field to connect to the destination resource of push transfer. @@ -866,8 +819,8 @@ return stateGetter; } - private MethodDeclaration declareStateGetterMethodInAncestor(ResourceNode resourceNode, Map resourceComponents, Type resStateType, - IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + private MethodDeclaration declareStateGetterMethodInAncestor(ResourceNode resourceNode, Map resourceComponents, Type resStateType, + IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { // Search an ancestor in which the getter method is declared. ResourceNode ancestorNode = resourceNode; ResourceNode childNode = null; @@ -894,9 +847,10 @@ } // Check duplication. String getterName = getterPrefix + getComponentName(resourceNode.getResourceHierarchy(), langSpec); - for (MethodDeclaration method: ancestorComponent.getMethods()) { - if (method.getName().equals(getterName) - && (method.getParameters() == null ? 0 : method.getParameters().size()) == getterParams.size()) return null; + for (MethodDeclaration method : ancestorComponent.getMethods()) { + if (method.getName().equals(getterName) + && (method.getParameters() == null ? 0 : method.getParameters().size()) == getterParams.size()) + return null; } // Declare the getter method of the resource state. @@ -913,7 +867,7 @@ boolean hasDescendantIn = hasDescendantInput(resourceNode); if (((StoreAttribute) resourceNode.getAttribute()).isStored() && !hasDescendantIn) { fillDescendantGetterMethod(stateGetter, resourceNode.getResourceHierarchy(), childNode.getResourceHierarchy(), ancestorNode.getResourceHierarchy(), ancestorComponent, langSpec); - } else { + } else { if (addOtherGetterInvocationsToStateGatter(stateGetter, resourceNode, platformSpec, langSpec)) { // Declare a client field to connect to the destination resource of push transfer. if (ancestorComponent != null && !((RestApiSpecific) platformSpec).hasHttpClientFieldDeclaration(ancestorComponent)) { @@ -924,13 +878,14 @@ return stateGetter; } - + private boolean hasDescendantInput(ResourceNode resourceNode) { boolean hasDescendantIn = false; - outer: for (Edge chToRes: resourceNode.getInEdges()) { + outer: + for (Edge chToRes : resourceNode.getInEdges()) { ChannelNode chNode = (ChannelNode) chToRes.getSource(); Set descendantChannels = chNode.getDescendants(); - for (ChannelNode descendantCh: descendantChannels) { + for (ChannelNode descendantCh : descendantChannels) { if (descendantCh.getIndegree() > 0) { hasDescendantIn = true; break outer; @@ -939,9 +894,9 @@ } return hasDescendantIn; } - + private boolean addOtherGetterInvocationsToStateGatter(MethodDeclaration stateGetter, ResourceNode resourceNode, - IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { boolean bDeclareClientField = false; try { // Data transfer on the same channel hierarchy. @@ -949,12 +904,12 @@ DataTransferChannel ch = null; DataTransferChannel ch2 = null; HashMap inputResourceToStateAccessor = new HashMap<>(); - for (Edge chToRes: resourceNode.getInEdges()) { + for (Edge chToRes : resourceNode.getInEdges()) { ch2 = ((ChannelNode) chToRes.getSource()).getChannel(); - for (Edge resToCh: chToRes.getSource().getInEdges()) { + for (Edge resToCh : chToRes.getSource().getInEdges()) { DataFlowEdge dIn = (DataFlowEdge) resToCh; ChannelMember in = null; - for (ChannelMember cm: ch2.getInputChannelMembers()) { + for (ChannelMember cm : ch2.getInputChannelMembers()) { if (((ResourceNode) dIn.getSource()).getOutSideResources().contains(cm.getResource())) { in = cm; break; @@ -967,23 +922,23 @@ } else { // PULL transfer inputResourceToStateAccessor.put(in, getPullAccessor(platformSpec)); - ch = ((ChannelNode) resToCh.getDestination()).getChannel(); // pull containing input side channel is at most one. - if (!platformSpec.isMonolithic() - && !in.isOutside() - && in.getResource().getCommonPrefix(resourceNode.getInSideResource(ch2)) == null + ch = ((ChannelNode) resToCh.getDestination()).getChannel(); // pull containing input side channel is at most one. + if (!platformSpec.isMonolithic() + && !in.isOutside() + && in.getResource().getCommonPrefix(resourceNode.getInSideResource(ch2)) == null && platformSpec.isDifferentTreesAsDifferentServices()) { // for REST API ResourcePath srcResPath = in.getResource(); String srcResourceName = langSpec.toVariableName(getComponentName(srcResPath.getResourceHierarchy(), langSpec)); Type srcResourceType = srcResPath.getResourceStateType(); List pathParams = new ArrayList<>(); - for (Expression pathExp: srcResPath.getPathParams()) { - String[] sideEffects = new String[] {""}; + for (Expression pathExp : srcResPath.getPathParams()) { + String[] sideEffects = new String[]{""}; pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } - generatePullDataTransfer(stateGetter, srcResourceName, - srcResPath.getResourceHierarchy().toResourcePath(pathParams), srcResourceType, - true, platformSpec, langSpec); + generatePullDataTransfer(stateGetter, srcResourceName, + srcResPath.getResourceHierarchy().toResourcePath(pathParams), srcResourceType, + true, platformSpec, langSpec); bDeclareClientField = true; } } @@ -993,7 +948,7 @@ ch = ch2; } ChannelMember out = null; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(cm.getResource())) { out = cm; break; @@ -1002,23 +957,23 @@ // for reference channel members. ResourcePath dstResPath = resourceNode.getInSideResource(ch); - for (ChannelMember rc: ch.getReferenceChannelMembers()) { - inputResourceToStateAccessor.put(rc, getPullAccessor(platformSpec)); // by pull data transfer + for (ChannelMember rc : ch.getReferenceChannelMembers()) { + inputResourceToStateAccessor.put(rc, getPullAccessor(platformSpec)); // by pull data transfer ResourcePath refResPath = rc.getResource(); - if (!platformSpec.isMonolithic() - && (rc.isOutside() - || (refResPath.getCommonPrefix(dstResPath) == null && platformSpec.isDifferentTreesAsDifferentServices()))) { + if (!platformSpec.isMonolithic() + && (rc.isOutside() + || (refResPath.getCommonPrefix(dstResPath) == null && platformSpec.isDifferentTreesAsDifferentServices()))) { // for REST API String refResourceName = langSpec.toVariableName(getComponentName(refResPath.getResourceHierarchy(), langSpec)); Type refResourceType = refResPath.getResourceStateType(); List pathParams = new ArrayList<>(); - for (Expression pathExp: refResPath.getPathParams()) { - String[] sideEffects = new String[] {""}; + for (Expression pathExp : refResPath.getPathParams()) { + String[] sideEffects = new String[]{""}; pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } - generatePullDataTransfer(stateGetter, refResourceName, - refResPath.getResourceHierarchy().toResourcePath(pathParams), refResourceType, - true, platformSpec, langSpec); + generatePullDataTransfer(stateGetter, refResourceName, + refResPath.getResourceHierarchy().toResourcePath(pathParams), refResourceType, + true, platformSpec, langSpec); bDeclareClientField = true; } } @@ -1036,18 +991,18 @@ Term messageTerm = resourcePathsAndMessage.getValue(); // Data transfer from path depending resource. - for (Entry>> pathEnt: resourcePaths.entrySet()) { + for (Entry>> pathEnt : resourcePaths.entrySet()) { ChannelMember cm = pathEnt.getKey(); ResourcePath srcResPath = pathEnt.getValue().getKey(); // get outside srcResPath resource state by pull data transfer. - if (!platformSpec.isMonolithic() - && (cm.isOutside() - || (srcResPath.getCommonPrefix(dstResPath)) == null && platformSpec.isDifferentTreesAsDifferentServices())) { + if (!platformSpec.isMonolithic() + && (cm.isOutside() + || (srcResPath.getCommonPrefix(dstResPath)) == null && platformSpec.isDifferentTreesAsDifferentServices())) { // for REST API // Data transfer from an outside input resource is regarded as PULL transfer. List pathParams = new ArrayList<>(); - for (Expression pathExp: srcResPath.getPathParams()) { - String[] sideEffects = new String[] {""}; + for (Expression pathExp : srcResPath.getPathParams()) { + String[] sideEffects = new String[]{""}; pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } // generate a pull data transfer from a depending in/ref resource. @@ -1069,22 +1024,22 @@ if (!chItr.hasNext()) { chItr = channelItrStack.pop(); } else { - curChannel = (DataTransferChannel) chItr.next(); + curChannel = (DataTransferChannel) chItr.next(); // generate pull data transfers. Set chMems = new HashSet<>(curChannel.getInputChannelMembers()); chMems.addAll(curChannel.getReferenceChannelMembers()); - for (ChannelMember cm2: chMems) { + for (ChannelMember cm2 : chMems) { if (resourcePaths == null || !resourcePaths.keySet().contains(cm2)) { // not a depending channel member. ResourcePath src2 = cm2.getResource(); Type srcResType2 = src2.getResourceStateType(); String srcResName2 = langSpec.toVariableName(getComponentName(src2.getResourceHierarchy(), langSpec)); if (platformSpec.isMonolithic()) { - String srcGetter = getPullAccessor(platformSpec).getDirectStateAccessorFor(src2, resourceNode.getInSideResource(curChannel)).toImplementation(new String[] {}); - stateGetter.addStatement(langSpec.getVariableDeclaration(srcResType2.getInterfaceTypeName(), srcResName2) + String srcGetter = getPullAccessor(platformSpec).getDirectStateAccessorFor(src2, resourceNode.getInSideResource(curChannel)).toImplementation(new String[]{}); + stateGetter.addStatement(langSpec.getVariableDeclaration(srcResType2.getInterfaceTypeName(), srcResName2) + langSpec.getAssignment() + srcGetter + langSpec.getStatementDelimiter()); } else { - String srcPath2 = src2.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + String srcPath2 = src2.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); generatePullDataTransfer(stateGetter, srcResName2, srcPath2, srcResType2, false, platformSpec, langSpec); bDeclareClientField = true; } @@ -1097,11 +1052,11 @@ Type srcResType2 = src2.getResourceStateType(); String srcResName2 = langSpec.toVariableName(getComponentName(src2.getResourceHierarchy(), langSpec)); if (platformSpec.isMonolithic()) { - String dependingGetter = getPullAccessor(platformSpec).getDirectStateAccessorFor(src2, resourceNode.getInSideResource(curChannel)).toImplementation(new String[] {}); + String dependingGetter = getPullAccessor(platformSpec).getDirectStateAccessorFor(src2, resourceNode.getInSideResource(curChannel)).toImplementation(new String[]{}); stateGetter.addStatement(langSpec.getVariableDeclaration(srcResType2.getInterfaceTypeName(), srcResName2) + langSpec.getAssignment() + dependingGetter + langSpec.getStatementDelimiter()); } else { - String srcPath2 = src2.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + String srcPath2 = src2.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); generatePullDataTransfer(stateGetter, srcResName2, srcPath2, srcResType2, false, platformSpec, langSpec); bDeclareClientField = true; } @@ -1115,13 +1070,13 @@ if (resourcePathsAndMessage != null) { resourcePaths = resourcePathsAndMessage.getKey(); Term messageTermSub = resourcePathsAndMessage.getValue(); - for (Entry fieldEnt: ((Term) messageTermSub).getSubTerms(Field.class).entrySet()) { + for (Entry fieldEnt : ((Term) messageTermSub).getSubTerms(Field.class).entrySet()) { Position pos = fieldEnt.getKey(); Field field = fieldEnt.getValue(); Variable var = new Variable(field.getSymbol().getName(), field.getType()); ((Term) messageTermSub).replaceSubTerm(pos, var); } - for (Map.Entry subTermEnt: messageTermSub.getSubTerms(Term.class).entrySet()) { + for (Map.Entry subTermEnt : messageTermSub.getSubTerms(Term.class).entrySet()) { Term subTerm = subTermEnt.getValue(); if (!(subTerm instanceof Constant) && subTerm.getSymbol().isImplWithSideEffect()) { Variable var = new Variable("v" + v, subTerm.getType()); @@ -1131,7 +1086,7 @@ Position pos = new Position(); pos.addHeadOrder(0); subTerm.replaceSubTerm(pos, var); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String curState = messageTermSub.toImplementation(sideEffects); stateGetter.addStatement(sideEffects[0].replaceAll("\n", "")); // Cancel the side effects in the return value. @@ -1156,14 +1111,14 @@ selType = ((Variable) selExp).getType(); forVarName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm2 :curChannel.getInputChannelMembers()) { + for (ChannelMember cm2 : curChannel.getInputChannelMembers()) { if (!cm2.isOutside()) { insideChMem = cm2; break; } } if (insideChMem == null) { - for (ChannelMember cm2 :curChannel.getReferenceChannelMembers()) { + for (ChannelMember cm2 : curChannel.getReferenceChannelMembers()) { if (!cm2.isOutside()) { insideChMem = cm2; break; @@ -1177,16 +1132,16 @@ insideResPath = insideResPath.getParent(); if (insideResPath != null) { String parent = null; - if (platformSpec.isMonolithic() - || insideResPath.getCommonPrefix(dstResPath) != null + if (platformSpec.isMonolithic() + || insideResPath.getCommonPrefix(dstResPath) != null || !platformSpec.isDifferentTreesAsDifferentServices()) { if (!platformSpec.isMonolithic() && generatesComponent(insideResPath.getResourceHierarchy())) { Expression parentGetter = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, dstResPath); Term valueGetter = new Term(new Symbol(getterOfResourceState, 1, Symbol.Type.METHOD)); valueGetter.addChild(parentGetter); - parent = valueGetter.toImplementation(new String[] {}); + parent = valueGetter.toImplementation(new String[]{}); } else { - parent = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, dstResPath).toImplementation(new String[] {}); + parent = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, dstResPath).toImplementation(new String[]{}); } } else { // for REST API @@ -1199,20 +1154,20 @@ // make a for loop (for a map) for data collecting. stateGetter.addFirstStatement(langSpec.getForStatementForMap(forVarName, DataConstraintModel.typeString.getInterfaceTypeName(), parent)); } - if (!platformSpec.isMonolithic() - && insideResPath.getCommonPrefix(dstResPath) == null + if (!platformSpec.isMonolithic() + && insideResPath.getCommonPrefix(dstResPath) == null && platformSpec.isDifferentTreesAsDifferentServices()) { // for REST API Type parentResType = insideResPath.getResourceStateType(); String parentResName = langSpec.toVariableName(getComponentName(insideResPath.getResourceHierarchy(), langSpec)); - String parentResPath = insideResPath.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + String parentResPath = insideResPath.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); generatePullDataTransfer(stateGetter, parentResName, parentResPath, parentResType, true, platformSpec, langSpec); bDeclareClientField = true; } } } // initialize the variables to hold side effects within the loop - for (Variable var: varsForSideEffects) { + for (Variable var : varsForSideEffects) { stateGetter.addFirstStatement(langSpec.getVariableDeclaration(var.getType().getInterfaceTypeName(), var.getName()) + langSpec.getAssignment() + langSpec.getConstructorInvocation(var.getType().getImplementationTypeName(), null) + langSpec.getStatementDelimiter()); } @@ -1227,11 +1182,11 @@ } // generate a return statement. - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String curState = ch.deriveUpdateExpressionOf(out, messageTerm, getPullAccessor(platformSpec)).toImplementation(sideEffects); stateGetter.addStatement(sideEffects[0] + langSpec.getReturnStatement(curState) + langSpec.getStatementDelimiter()); } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e) { + | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } return bDeclareClientField; @@ -1244,7 +1199,7 @@ descendants = new HashSet<>(); descendantGetters.put(resourceNode.getResourceHierarchy(), descendants); } - for (ResourceNode child: resourceNode.getChildren()) { + for (ResourceNode child : resourceNode.getChildren()) { // A descendant of the child may generate a component. List params = new ArrayList<>(); int v = 1; @@ -1285,13 +1240,13 @@ } } - private Map.Entry, Map>>> declareCacheFieldsAndUpdateMethods(ResourceNode resourceNode, - TypeDeclaration component, TypeDeclaration parentComponent, TypeDeclaration rootComponent, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + private Map.Entry, Map>>> declareCacheFieldsAndUpdateMethods(ResourceNode resourceNode, + TypeDeclaration component, TypeDeclaration parentComponent, TypeDeclaration rootComponent, IPlatformSpecific platformSpec, 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<>(); - for (Edge chToRes: resourceNode.getInEdges()) { + for (Edge chToRes : resourceNode.getInEdges()) { ChannelNode directSrcChannel = (ChannelNode) chToRes.getSource(); DataTransferChannel ch = directSrcChannel.getChannel(); // Should take into account the channel hierarchy. @@ -1299,13 +1254,13 @@ Set descendantSrcChannels = directSrcChannel.getDescendants(); Set inEdges = new HashSet<>(); inEdges.addAll(directSrcChannel.getInEdges()); - for (ChannelNode ancestorSrc: ancestorSrcChannels) { + for (ChannelNode ancestorSrc : ancestorSrcChannels) { inEdges.addAll(ancestorSrc.getInEdges()); } - for (ChannelNode descendantSrc: descendantSrcChannels) { + for (ChannelNode descendantSrc : descendantSrcChannels) { inEdges.addAll(descendantSrc.getInEdges()); } - for (Edge resToCh: inEdges) { + for (Edge resToCh : inEdges) { // For each data transfer from srcResPath:ResourcePath to resourceNode:ResourceNode. DataFlowEdge re = (DataFlowEdge) resToCh; ChannelNode indirectSrcChNode = (ChannelNode) re.getDestination(); @@ -1315,9 +1270,9 @@ String srcResName = langSpec.toVariableName(srcResComponentName); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: indirectSrcCh.getInputChannelMembers()) { + for (ChannelMember cm : indirectSrcCh.getInputChannelMembers()) { if (cm.getResource().equals(srcResPath) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } @@ -1325,29 +1280,29 @@ boolean outsideOutputResource = false; ChannelMember out = null; ResourcePath dstResPath = null; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(cm.getResource())) { out = cm; dstResPath = cm.getResource(); if (cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } } // Also take into account the channel hierarchy to determine push/pull transfer. if (ancestorSrcChannels.contains(indirectSrcChNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if (descendantSrcChannels.contains(indirectSrcChNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // For push data transfer boolean hasRestAPI = false; boolean isRestAPI = false; - if (!platformSpec.isMonolithic() + if (!platformSpec.isMonolithic() && (outsideOutputResource || (resourceNode.getInSideResource(ch).getCommonPrefix(srcResPath) == null && platformSpec.isDifferentTreesAsDifferentServices()))) { // Inter-service hasRestAPI = true; @@ -1362,20 +1317,21 @@ } // Declare an update method in the type of the destination resource. ArrayList parameters = new ArrayList<>(); - getUpdateResourcePathAndPathParams(dstResPath, parameters, isRestAPI, platformSpec, langSpec); // Path parameters to identify the self resource. - for (Selector selector: ch.getAllSelectors()) { + getUpdateResourcePathAndPathParams(dstResPath, parameters, isRestAPI, platformSpec, langSpec); // Path parameters to identify the self resource. + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); VariableDeclaration chParam = langSpec.newVariableDeclaration(selVar.getType(), selVar.getName()); - if (isRestAPI) ((RestApiSpecific) platformSpec).addFormParamAnnotation(chParam, selVar.getName()); - parameters.add(chParam); // A channel parameter to specify the context of the collaboration. + if (isRestAPI) + ((RestApiSpecific) platformSpec).addFormParamAnnotation(chParam, selVar.getName()); + parameters.add(chParam); // A channel parameter to specify the context of the collaboration. } } VariableDeclaration param = langSpec.newVariableDeclaration(srcResPath.getResourceStateType(), srcResName); if (isRestAPI) ((RestApiSpecific) platformSpec).addFormParamAnnotation(param, srcResName); - parameters.add(param); // The state of the source resource to carry the data-flow. + parameters.add(param); // The state of the source resource to carry the data-flow. // For the refs. - for (ResourcePath ref: ch.getReferenceResources()) { + for (ResourcePath ref : ch.getReferenceResources()) { if (!resourceNode.getInSideResources().contains(ref)) { String refName = langSpec.toVariableName(getComponentName(ref.getResourceHierarchy(), langSpec)); param = langSpec.newVariableDeclaration(ref.getResourceStateType(), refName); @@ -1385,7 +1341,7 @@ } MethodDeclaration update = null; if (component != null) { - for (MethodDeclaration method: component.getMethods()) { + for (MethodDeclaration method : component.getMethods()) { if (method.getName().equals(updateMethodPrefix + from + srcResComponentName)) { update = method; break; @@ -1395,7 +1351,7 @@ update = langSpec.newMethodDeclaration(updateMethodPrefix + from + srcResComponentName, false, null, parameters); } } else if (parentComponent != null) { - for (MethodDeclaration method: parentComponent.getMethods()) { + for (MethodDeclaration method : parentComponent.getMethods()) { if (method.getName().equals(updateMethodPrefix + resComponentName + from + srcResComponentName)) { update = method; break; @@ -1407,8 +1363,8 @@ } // Calculate in-degree (PUSH transfer) of the destination resource. int inDegree = 0; - for (Edge resToCh2: inEdges) { - DataFlowEdge df =(DataFlowEdge) resToCh2; + for (Edge resToCh2 : inEdges) { + DataFlowEdge df = (DataFlowEdge) resToCh2; if (((PushPullAttribute) df.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { inDegree++; } @@ -1447,7 +1403,7 @@ rootComponent, inDegree, platformSpec, langSpec); } // to convert a json param to a tuple, pair or map object. - for (VariableDeclaration jsonParam: update.getParameters()) { + for (VariableDeclaration jsonParam : update.getParameters()) { Type paramType = jsonParam.getType(); String paramName = jsonParam.getName(); String paramTypeName = paramType.getInterfaceTypeName(); @@ -1521,7 +1477,7 @@ try { if (resourceNode.getInSideResources().contains(out.getResource())) { Term unifiedMassage = null; - for (ChannelNode srcChNode: ancestorSrcChannels) { + for (ChannelNode srcChNode : ancestorSrcChannels) { DataTransferChannel abcestorSrcCh = (DataTransferChannel) srcChNode.getChannel(); Term message = abcestorSrcCh.fillOutsideResourcePaths(out, getPushAccessor(platformSpec), null).getValue(); if (unifiedMassage == null) { @@ -1542,10 +1498,10 @@ } else { // if there exists one or more reference channel member. HashMap inputResourceToStateAccessor = new HashMap<>(); - for (ChannelMember in: ch.getInputChannelMembers()) { + for (ChannelMember in : ch.getInputChannelMembers()) { inputResourceToStateAccessor.put(in, getPushAccessor(platformSpec)); } - for (ChannelMember ref: ch.getReferenceChannelMembers()) { + for (ChannelMember ref : ch.getReferenceChannelMembers()) { inputResourceToStateAccessor.put(ref, getRefAccessor(platformSpec)); } Term message = ch.fillOutsideResourcePaths(out, getPushAccessor(platformSpec), inputResourceToStateAccessor).getValue(); @@ -1575,7 +1531,7 @@ Type fieldType = getImplStateType(outRes, langSpec); if (updateExp instanceof Term) { ((Term) updateExp).setType(fieldType); - for (Map.Entry varEnt: ((Term) updateExp).getVariables().entrySet()) { + for (Map.Entry varEnt : ((Term) updateExp).getVariables().entrySet()) { if (varEnt.getValue().getName().equals(fieldOfResourceState)) { varEnt.getValue().setType(fieldType); } @@ -1584,10 +1540,10 @@ ((Variable) updateExp).setType(fieldType); } // Add statements to the update method. - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String newState = updateExp.toImplementation(sideEffects); int numOfOutResourcesWithTheSameHierarchy = 0; - for (ResourcePath outResPath: ch.getOutputResources()) { + for (ResourcePath outResPath : ch.getOutputResources()) { if (outResPath.getResourceHierarchy().equals(outRes)) { numOfOutResourcesWithTheSameHierarchy++; } @@ -1600,7 +1556,7 @@ updateStatement = updateStatement.substring(0, updateStatement.length() - 1); } } else { - updateStatement = sideEffects[0] + langSpec.getFieldAccessor(fieldOfResourceState) + langSpec.getAssignment() + newState + langSpec.getStatementDelimiter(); // this.value = ... + updateStatement = sideEffects[0] + langSpec.getFieldAccessor(fieldOfResourceState) + langSpec.getAssignment() + newState + langSpec.getStatementDelimiter(); // this.value = ... } } else { if (sideEffects[0] != null) { @@ -1616,7 +1572,7 @@ selector.addChild(new Constant(langSpec.getFieldAccessor(fieldOfResourceState))); selector.addChild(new Variable(update.getParameters().get(update.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newList = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (DataConstraintModel.typeMap.isAncestorOf(resourceNode.getParent().getResourceStateType())) { @@ -1624,7 +1580,7 @@ selector.addChild(new Constant(langSpec.getFieldAccessor(fieldOfResourceState))); selector.addChild(new Variable(update.getParameters().get(update.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newMap = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (!(updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect())) { @@ -1639,11 +1595,11 @@ Term conditions = null; int i = 1; Map>> resourcePaths = ch.fillOutsideResourcePaths(out, getPushAccessor(platformSpec)); - for (Expression pathParam: out.getResource().getPathParams()) { + for (Expression pathParam : out.getResource().getPathParams()) { if (pathParam instanceof Variable) { String selfParamName = ((Variable) pathParam).getName(); Expression arg = null; - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); if (selVar.getName().equals(selfParamName)) { @@ -1656,14 +1612,14 @@ ResourcePath filledPath = resourcePaths.get(out).getKey(); arg = filledPath.getPathParams().get(i - 1); } - Term condition = new Term(DataConstraintModel.eq, new Expression[] { - new Parameter("self" + (i > 1 ? i : ""), DataConstraintModel.typeString), + Term condition = new Term(DataConstraintModel.eq, new Expression[]{ + new Parameter("self" + (i > 1 ? i : ""), DataConstraintModel.typeString), arg}); if (conditions == null) { conditions = condition; } else { - conditions = new Term(DataConstraintModel.and, new Expression[] { - conditions, + conditions = new Term(DataConstraintModel.and, new Expression[]{ + conditions, condition}); } } @@ -1673,7 +1629,7 @@ } } } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e1) { + | InvalidMessage | UnificationFailed | ValueUndefined e1) { e1.printStackTrace(); } } @@ -1686,12 +1642,12 @@ // Declare the cache field. String cacheFieldName = langSpec.toVariableName(getComponentName(srcResPath.getResourceHierarchy(), langSpec)); FieldDeclaration cacheField = langSpec.newFieldDeclaration( - srcResPath.getResourceStateType(), - cacheFieldName, - langSpec.getFieldInitializer(srcResPath.getResourceStateType(), srcResPath.getResourceHierarchy().getInitialValue())); + srcResPath.getResourceStateType(), + cacheFieldName, + langSpec.getFieldInitializer(srcResPath.getResourceStateType(), srcResPath.getResourceHierarchy().getInitialValue())); if (component != null) { component.addField(cacheField); - } else if (parentComponent != null){ + } else if (parentComponent != null) { parentComponent.addField(cacheField); } @@ -1707,27 +1663,28 @@ if (platformSpec.isMonolithic()) { // For a monolithic application. Set outsideInputMembers = new HashSet<>(); - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (cm.isOutside()) { outsideInputMembers.add(cm); } } if (outsideInputMembers.size() > 0) { Map>> resourcePaths = null; - for (ChannelMember out1: ch.getOutputChannelMembers()) { + for (ChannelMember out1 : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(out1.getResource())) { try { resourcePaths = ch.fillOutsideResourcePaths(out1, getPullAccessor(platformSpec)); - } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e) { + } catch (ParameterizedIdentifierIsFutureWork | + ResolvingMultipleDefinitionIsFutureWork + | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } break; } } if (resourcePaths != null && resourcePaths.size() > 0) { - for (ChannelMember outsideMember: outsideInputMembers) { - for (ChannelMember dependingMember: resourcePaths.get(outsideMember).getValue()) { + for (ChannelMember outsideMember : outsideInputMembers) { + for (ChannelMember dependingMember : resourcePaths.get(outsideMember).getValue()) { if (dependingMember.getResource().equals(srcResPath)) { // An outside input resource path depends on srcRes. ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); @@ -1739,20 +1696,20 @@ Expression nextExp = dependingMember.getStateTransition().getNextStateExpression(); if (nextExp != null && outsideExp instanceof Term) { if (nextExp instanceof Variable) { - outsideExp = ((Term) outsideExp).substitute((Variable) nextExp, new Field(langSpec.toVariableName(getComponentName(dependingMember.getResource().getResourceHierarchy(), langSpec)))); + outsideExp = ((Term) outsideExp).substitute((Variable) nextExp, new Field(langSpec.toVariableName(getComponentName(dependingMember.getResource().getResourceHierarchy(), langSpec)))); } else { // ToDo. } } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); String updateReference = langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter(); - update.addStatement(updateReference); // Update the reference field. + update.addStatement(updateReference); // Update the reference field. // Update constructor. if (component != null) { MethodDeclaration constructor = getConstructor(component); - constructor.addStatement(updateReference); // Initialize the reference field. - } else if (parentComponent != null){ + constructor.addStatement(updateReference); // Initialize the reference field. + } else if (parentComponent != null) { constructorStatements.add(updateReference); } } @@ -1764,7 +1721,7 @@ // Add an invocation to another update method (for a chain of update method invocations). boolean hasUpdateMethodinvoked = false; - for (Edge resToCh2: resourceNode.getOutEdges()) { + for (Edge resToCh2 : resourceNode.getOutEdges()) { DataFlowEdge dOut = (DataFlowEdge) resToCh2; ChannelNode directDstChNode = (ChannelNode) resToCh2.getDestination(); DataTransferChannel directDstCh = directDstChNode.getChannel(); @@ -1772,10 +1729,10 @@ boolean outsideInputResource2 = false; ChannelMember in = null; Set outsideInputMembers2 = new HashSet<>(); - for (ChannelMember cm: directDstCh.getInputChannelMembers()) { + for (ChannelMember cm : directDstCh.getInputChannelMembers()) { if (cm.getResource().equals(resourceNode.getOutSideResource(directDstCh))) { if (cm.isOutside()) { - outsideInputResource2 = true; // Regarded as pull transfer. + outsideInputResource2 = true; // Regarded as pull transfer. } in = cm; } @@ -1788,13 +1745,13 @@ Set descendantDstChannels = directDstChNode.getDescendants(); Set outEdges = new HashSet<>(); outEdges.addAll(directDstChNode.getOutEdges()); - for (ChannelNode ancestorDst: ancestorDstChannels) { + for (ChannelNode ancestorDst : ancestorDstChannels) { outEdges.addAll(ancestorDst.getOutEdges()); } - for (ChannelNode descendantDst: descendantDstChannels) { + for (ChannelNode descendantDst : descendantDstChannels) { outEdges.addAll(descendantDst.getOutEdges()); } - for (Edge chToRes2: outEdges) { + for (Edge chToRes2 : outEdges) { // For each data transfer to dstNode:ResourceNode. ResourceNode dstNode = ((ResourceNode) chToRes2.getDestination()); ChannelNode chNode2 = (ChannelNode) chToRes2.getSource(); @@ -1802,7 +1759,7 @@ // Check if the output resource is outside of the channel scope. boolean outsideOutputResource2 = false; ChannelMember out1 = null; - for (ChannelMember cm: ch2.getOutputChannelMembers()) { + for (ChannelMember cm : ch2.getOutputChannelMembers()) { if (dstNode.getInSideResources().contains(cm.getResource())) { out1 = cm; if (cm.isOutside()) { @@ -1813,10 +1770,10 @@ } // Also take into account the channel hierarchy to determine push/pull transfer. if (descendantDstChannels.contains(chNode2)) { - outsideOutputResource2 = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource2 = true; // Regarded as (broadcasting) push transfer. } if (ancestorDstChannels.contains(chNode2)) { - outsideInputResource2 = true; // Regarded as (collecting) pull transfer. + outsideInputResource2 = true; // Regarded as (collecting) pull transfer. } if ((((PushPullAttribute) dOut.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource2) || outsideOutputResource2) { // PUSH transfer @@ -1831,14 +1788,14 @@ selType = ((Variable) selExp).getType(); forVarName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm :ch2.getInputChannelMembers()) { + for (ChannelMember cm : ch2.getInputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; } } if (insideChMem == null) { - for (ChannelMember cm :ch2.getReferenceChannelMembers()) { + for (ChannelMember cm : ch2.getReferenceChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -1846,7 +1803,7 @@ } } if (insideChMem == null) { - for (ChannelMember cm :ch2.getOutputChannelMembers()) { + for (ChannelMember cm : ch2.getOutputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -1860,16 +1817,16 @@ insideResPath = insideResPath.getParent(); if (insideResPath != null) { String parent = null; - if (platformSpec.isMonolithic() - || insideResPath.getCommonPrefix(resourceNode.getOutSideResource(directDstCh)) != null + if (platformSpec.isMonolithic() + || insideResPath.getCommonPrefix(resourceNode.getOutSideResource(directDstCh)) != null || !platformSpec.isDifferentTreesAsDifferentServices()) { if (!platformSpec.isMonolithic() && generatesComponent(insideResPath.getResourceHierarchy())) { Expression getter = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, resourceNode.getOutSideResource(directDstCh)); Term valueGetter = new Term(new Symbol(getterOfResourceState, 1, Symbol.Type.METHOD)); valueGetter.addChild(getter); - parent = valueGetter.toImplementation(new String[] {}); + parent = valueGetter.toImplementation(new String[]{}); } else { - parent = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, resourceNode.getOutSideResource(directDstCh)).toImplementation(new String[] {}); + parent = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, resourceNode.getOutSideResource(directDstCh)).toImplementation(new String[]{}); } } else { // for REST API @@ -1884,13 +1841,13 @@ update.addStatement(langSpec.getForStatementForMap(forVarName, DataConstraintModel.typeString.getInterfaceTypeName(), parent)); addForStatement = true; } - if (!platformSpec.isMonolithic() - && insideResPath.getCommonPrefix(resourceNode.getOutSideResource(directDstCh)) == null + if (!platformSpec.isMonolithic() + && insideResPath.getCommonPrefix(resourceNode.getOutSideResource(directDstCh)) == null && platformSpec.isDifferentTreesAsDifferentServices()) { // for REST API Type parentResType = insideResPath.getResourceStateType(); String parentResName = langSpec.toVariableName(getComponentName(insideResPath.getResourceHierarchy(), langSpec)); - String parentResPath = insideResPath.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + String parentResPath = insideResPath.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); generatePullDataTransfer(update, parentResName, parentResPath, parentResType, true, platformSpec, langSpec); } } @@ -1901,9 +1858,9 @@ } // Get the value of reference member to call the update method. List>> refParams = new ArrayList<>(); - Map> referredResources = new HashMap<>(); + Map> referredResources = new HashMap<>(); Set referredSet = referredResources.get(update); - for (ChannelMember rc: ch2.getReferenceChannelMembers()) { + for (ChannelMember rc : ch2.getReferenceChannelMembers()) { ResourcePath ref = rc.getResource(); if (referredSet == null) { referredSet = new HashSet<>(); @@ -1914,10 +1871,10 @@ Type refResourceType = ref.getResourceStateType(); if (!referredSet.contains(ref)) { referredSet.add(ref); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; if (!platformSpec.isMonolithic() && rc.isOutside()) { List pathParams = new ArrayList<>(); - for (Expression pathExp: ref.getPathParams()) { + for (Expression pathExp : ref.getPathParams()) { pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } generatePullDataTransfer(update, refVarName, ref.getResourceHierarchy().toResourcePath(pathParams), refResourceType, false, platformSpec, langSpec); @@ -1933,18 +1890,18 @@ } } refParams.add(new AbstractMap.SimpleEntry<>(ref.getResourceStateType(), - new AbstractMap.SimpleEntry<>(refVarName, - refVarName))); + new AbstractMap.SimpleEntry<>(refVarName, + refVarName))); } } - List>> pathParams = new ArrayList<>(); + List>> pathParams = new ArrayList<>(); if (platformSpec.isMonolithic()) { // Update fields to refer to outside resources. ResourcePath filledOutsideResourcePath = null; try { Map>> resourcePaths = ch2.fillOutsideResourcePaths(out1, getPullAccessor(platformSpec)); if (resourcePaths != null && resourcePaths.size() > 0) { - for (ChannelMember outsideMember: resourcePaths.keySet()) { + for (ChannelMember outsideMember : resourcePaths.keySet()) { ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); if (out1.equals(outsideMember)) { filledOutsideResourcePath = outsidePath; @@ -1960,71 +1917,72 @@ if (outsideExp instanceof Field) { outsideExp = new Variable(((Field) outsideExp).getSymbol().getName(), ((Field) outsideExp).getType()); } else if (outsideExp instanceof Term) { - for (Entry fieldEnt: ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { + for (Entry fieldEnt : ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { Position pos = fieldEnt.getKey(); Field field = fieldEnt.getValue(); Variable var = new Variable(field.getSymbol().getName(), field.getType()); ((Term) outsideExp).replaceSubTerm(pos, var); } } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); - update.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. + update.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. } } - } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e) { + } catch (ParameterizedIdentifierIsFutureWork | + ResolvingMultipleDefinitionIsFutureWork + | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } // Values of path parameters to call the update method. if (filledOutsideResourcePath == null) { filledOutsideResourcePath = out1.getResource(); } - for (Expression pathParam: filledOutsideResourcePath.getPathParams()) { + for (Expression pathParam : filledOutsideResourcePath.getPathParams()) { if (pathParam instanceof Variable) { Variable pathVar = (Variable) pathParam; pathParams.add(new AbstractMap.SimpleEntry<>(pathVar.getType(), - new AbstractMap.SimpleEntry<>(pathVar.getName(), - pathVar.getName()))); + new AbstractMap.SimpleEntry<>(pathVar.getName(), + pathVar.getName()))); } else if (pathParam instanceof Constant) { Constant pathVar = (Constant) pathParam; pathParams.add(new AbstractMap.SimpleEntry<>(pathVar.getType(), - new AbstractMap.SimpleEntry<>(pathVar.getSymbol().getName(), - pathVar.getSymbol().getName()))); + new AbstractMap.SimpleEntry<>(pathVar.getSymbol().getName(), + pathVar.getSymbol().getName()))); } } } else { // Values of path parameters to call the update method. - for (Expression pathParam: out1.getResource().getPathParams()) { + for (Expression pathParam : out1.getResource().getPathParams()) { if (pathParam instanceof Variable) { Variable pathVar = (Variable) pathParam; pathParams.add(new AbstractMap.SimpleEntry<>(pathVar.getType(), - new AbstractMap.SimpleEntry<>(pathVar.getName(), - pathVar.getName()))); + new AbstractMap.SimpleEntry<>(pathVar.getName(), + pathVar.getName()))); } } } // Values of channel parameters to call the update method. - List>> params = new ArrayList<>(); - for (Selector selector: ch2.getAllSelectors()) { + List>> params = new ArrayList<>(); + for (Selector selector : ch2.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); - params.add(new AbstractMap.SimpleEntry<>(selVar.getType(), - new AbstractMap.SimpleEntry<>(selVar.getName(), - selVar.getName()))); + params.add(new AbstractMap.SimpleEntry<>(selVar.getType(), + new AbstractMap.SimpleEntry<>(selVar.getName(), + selVar.getName()))); } } // Value of the source side (input side) resource to call the update method. ResourceHierarchy srcRes2 = resourceNode.getResourceHierarchy(); if (generatesComponent(srcRes2)) { - params.add(new AbstractMap.SimpleEntry<>(srcRes2.getResourceStateType(), - new AbstractMap.SimpleEntry<>(langSpec.toVariableName(srcRes2.getResourceName()), - langSpec.getFieldAccessor(fieldOfResourceState)))); + params.add(new AbstractMap.SimpleEntry<>(srcRes2.getResourceStateType(), + new AbstractMap.SimpleEntry<>(langSpec.toVariableName(srcRes2.getResourceName()), + langSpec.getFieldAccessor(fieldOfResourceState)))); } else { params.add(new AbstractMap.SimpleEntry<>(srcRes2.getResourceStateType(), - new AbstractMap.SimpleEntry<>(langSpec.toVariableName(srcRes2.getResourceName()), - langSpec.getFieldAccessor(langSpec.toVariableName(srcRes2.getResourceName()))))); - srcRes2 = srcRes2.getParent(); + new AbstractMap.SimpleEntry<>(langSpec.toVariableName(srcRes2.getResourceName()), + langSpec.getFieldAccessor(langSpec.toVariableName(srcRes2.getResourceName()))))); + srcRes2 = srcRes2.getParent(); } params.addAll(refParams); // Call the update method. @@ -2034,10 +1992,10 @@ updateMethodName = updateMethodPrefix + getComponentName(dstRes, langSpec) + from + resComponentName; dstRes = dstRes.getParent(); } else { - updateMethodName = updateMethodPrefix + from + resComponentName; + updateMethodName = updateMethodPrefix + from + resComponentName; } String dstCompName = langSpec.toVariableName(getComponentName(dstRes, langSpec)); - if (outsideOutputResource2 + if (outsideOutputResource2 || (!platformSpec.isMonolithic() && in.getResource().getCommonPrefix(out1.getResource()) == null && platformSpec.isDifferentTreesAsDifferentServices())) { // Inter-servces if (!platformSpec.isMonolithic()) { @@ -2045,13 +2003,13 @@ RestApiSpecific restApiSpec = (RestApiSpecific) platformSpec; String httpMethod = null; if (out1.getStateTransition().isRightUnary()) { - httpMethod = "put"; + httpMethod = "put"; } else { httpMethod = "post"; } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; List pathParamsUrl = new ArrayList<>(); - for (Expression pathExp: out1.getResource().getPathParams()) { + for (Expression pathExp : out1.getResource().getPathParams()) { pathParamsUrl.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } String resName = langSpec.toVariableName(resComponentName); @@ -2062,14 +2020,14 @@ try { filledPaths = ch2.fillOutsideResourcePaths(out1, getPushAccessor(platformSpec)); } catch (ParameterizedIdentifierIsFutureWork - | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage - | UnificationFailed | ValueUndefined e) { + | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage + | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } String dstPath = null; if (filledPaths != null && filledPaths.get(out1) != null) { ResourcePath filledDstPath = filledPaths.get(out1).getKey(); - dstPath = filledDstPath.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + dstPath = filledDstPath.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); } else { dstPath = dstRes.toResourcePath(pathParamsUrl); } @@ -2078,7 +2036,7 @@ // The first call to an update method in this method update.addStatement(restApiSpec.getHttpMethodParamsConstructionStatement(srcRes2.getResourceName(), params, true)); update.addStatement(langSpec.getVariableDeclaration(DataConstraintModel.typeString.getInterfaceTypeName(), "result") - + langSpec.getAssignment() + restApiSpec.getHttpMethodCallStatement(restApiSpec.getBaseURL(), dstPath, resName, httpMethod)); + + langSpec.getAssignment() + restApiSpec.getHttpMethodCallStatement(restApiSpec.getBaseURL(), dstPath, resName, httpMethod)); hasUpdateMethodinvoked = true; } else { // After the second time of call to update methods in this method @@ -2088,31 +2046,31 @@ } else { // Use the reference field to refer to outside destination resource. List args = new ArrayList<>(); - for (Map.Entry> paramEnt: pathParams) { + for (Map.Entry> paramEnt : pathParams) { args.add(paramEnt.getValue().getValue()); } - for (Map.Entry> paramEnt: params) { + for (Map.Entry> paramEnt : params) { args.add(paramEnt.getValue().getValue()); } - update.addStatement(langSpec.getMethodInvocation(langSpec.getFieldAccessor(dstCompName), updateMethodName, args) - + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); + update.addStatement(langSpec.getMethodInvocation(langSpec.getFieldAccessor(dstCompName), updateMethodName, args) + + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); } } else { // Intra-service // The destination resource is not outside. List args = new ArrayList<>(); - for (Map.Entry> paramEnt: pathParams) { + for (Map.Entry> paramEnt : pathParams) { args.add(paramEnt.getValue().getValue()); } - for (Map.Entry> paramEnt: params) { + for (Map.Entry> paramEnt : params) { args.add(paramEnt.getValue().getValue()); } if (srcRes2 != dstRes) { - update.addStatement(langSpec.getMethodInvocation(langSpec.getFieldAccessor(dstCompName), updateMethodName, args) - + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); + update.addStatement(langSpec.getMethodInvocation(langSpec.getFieldAccessor(dstCompName), updateMethodName, args) + + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); } else { update.addStatement(langSpec.getMethodInvocation(updateMethodName, args) - + langSpec.getStatementDelimiter()); // this.updateDstFromSrc(value, refParams); + + langSpec.getStatementDelimiter()); // this.updateDstFromSrc(value, refParams); } } if (addForStatement) { @@ -2125,10 +2083,10 @@ if (!generatesComponent(resourceNode.getResourceHierarchy())) { // srcRes2 does not have a component. ResourcePath srcRes2 = resourceNode.getOutSideResource(directDstCh); - for (Edge chToRes2: outEdges) { + for (Edge chToRes2 : outEdges) { ChannelNode chNode2 = (ChannelNode) chToRes2.getSource(); DataTransferChannel ch2 = chNode2.getChannel(); - for (ChannelMember out2: ch2.getOutputChannelMembers()) { + for (ChannelMember out2 : ch2.getOutputChannelMembers()) { if (!generatesComponent(out2.getResource().getResourceHierarchy())) { // Also dstRes2 does not have a component. ResourcePath dstRes2 = out2.getResource(); @@ -2137,8 +2095,8 @@ try { resourcePaths = ch2.fillOutsideResourcePaths(out2, getPullAccessor(platformSpec)); if (resourcePaths != null && resourcePaths.size() > 0) { - for (ChannelMember outsideMember: outsideInputMembers2) { - for (ChannelMember dependedMember: resourcePaths.get(outsideMember).getValue()) { + for (ChannelMember outsideMember : outsideInputMembers2) { + for (ChannelMember dependedMember : resourcePaths.get(outsideMember).getValue()) { if (dependedMember.getResource().equals(srcRes2)) { // An outside input resource path depends on srcRes. ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); @@ -2150,14 +2108,14 @@ if (generatesComponent(outsidePath.getResourceHierarchy())) { outsideExp = ((Term) outsideExp).getChild(0); } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); String updateReference = langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter(); - update.addStatement(updateReference); // Update the reference field. + update.addStatement(updateReference); // Update the reference field. // Update constructor. if (component != null) { MethodDeclaration constructor = getConstructor(component); - constructor.addStatement(updateReference); // Initialize the reference field. + constructor.addStatement(updateReference); // Initialize the reference field. } else if (parentComponent != null) { constructorStatements.add(updateReference); } @@ -2165,8 +2123,9 @@ } } } - } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e) { + } catch (ParameterizedIdentifierIsFutureWork | + ResolvingMultipleDefinitionIsFutureWork + | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } } @@ -2183,21 +2142,21 @@ } private Map.Entry, Map>>> declareInputMethodsInThisAndMainComponents(ResourceNode resourceNode, TypeDeclaration component, - TypeDeclaration parentComponent, TypeDeclaration mainComponent, TypeDeclaration rootComponent, DataTransferModel model, Map priorMemberForInputChannel, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + TypeDeclaration parentComponent, TypeDeclaration mainComponent, TypeDeclaration rootComponent, DataTransferModel model, Map priorMemberForInputChannel, IPlatformSpecific platformSpec, 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 (Channel ch : model.getInputChannels()) { for (ChannelMember cm : ((DataTransferChannel) ch).getOutputChannelMembers()) { if (!cm.isOutside()) { if (priorMemberForInputChannel.get(ch) == null) { - priorMemberForInputChannel.put(ch, cm); // The receiver of the input event when multiple output resources are defined for the channel. + priorMemberForInputChannel.put(ch, cm); // The receiver of the input event when multiple output resources are defined for the channel. } } } - for (ChannelMember out: ((DataTransferChannel) ch).getOutputChannelMembers()) { + for (ChannelMember out : ((DataTransferChannel) ch).getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(out.getResource())) { Expression message = out.getStateTransition().getMessageExpression(); MethodDeclaration input = null; @@ -2210,7 +2169,7 @@ ArrayList rootInputParams = new ArrayList<>(); String resourcePath = null; if (!platformSpec.isMonolithic()) { - resourcePath = getInputMethodResourcePathAndPathParams(out.getResource(), rootInputParams, platformSpec, langSpec); // Path parameters for the input REST API. + resourcePath = getInputMethodResourcePathAndPathParams(out.getResource(), rootInputParams, platformSpec, langSpec); // Path parameters for the input REST API. if (resourcePath.indexOf('/') > 0) { resourcePath = resourcePath.substring(resourcePath.indexOf('/')); } else { @@ -2222,35 +2181,35 @@ // Channel parameters to specify the context of the collaboration. int v = 1; - for (Selector selector: ch.getSelectors()) { + for (Selector selector : ch.getSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); resInputParams.add(langSpec.newVariableDeclaration(selVar.getType(), selVar.getName())); mainInputParams.add(langSpec.newVariableDeclaration(selVar.getType(), selVar.getName())); } else if (selector.getExpression() instanceof Term) { Term var = (Term) selector.getExpression(); - resInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); - mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); + resInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); + mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); } v++; } if (ch.getParent() != null) { - for (Selector selector: ch.getParent().getAllSelectors()) { + for (Selector selector : ch.getParent().getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); mainInputParams.add(langSpec.newVariableDeclaration(selVar.getType(), selVar.getName())); } else if (selector.getExpression() instanceof Term) { Term var = (Term) selector.getExpression(); - mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); + mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); } v++; } } // Message parameters to carry the data-flows. - for (Map.Entry varEnt: message.getVariables().entrySet()) { + for (Map.Entry varEnt : message.getVariables().entrySet()) { Variable var = varEnt.getValue(); String refVarName = null; - for (ChannelMember refCm: ((DataTransferChannel) ch).getReferenceChannelMembers()) { + for (ChannelMember refCm : ((DataTransferChannel) ch).getReferenceChannelMembers()) { Expression varExp = refCm.getStateTransition().getMessageExpression().getSubTerm(varEnt.getKey()); if (varExp != null && varExp instanceof Variable) { if (refCm.getStateTransition().getCurStateExpression().contains(varExp)) { @@ -2266,8 +2225,8 @@ // var has not come from a reference resource. resInputParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); boolean bExists = false; - for (VariableDeclaration mainParam: mainInputParams) { - if (mainParam.getName().equals(var.getName()) ) { + for (VariableDeclaration mainParam : mainInputParams) { + if (mainParam.getName().equals(var.getName())) { bExists = true; break; } @@ -2275,7 +2234,7 @@ if (!bExists) { mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); } - if (!platformSpec.isMonolithic() && !resourcePath.contains("{" + var.getName()+ "}")) { + if (!platformSpec.isMonolithic() && !resourcePath.contains("{" + var.getName() + "}")) { VariableDeclaration param = langSpec.newVariableDeclaration(var.getType(), var.getName()); ((RestApiSpecific) platformSpec).addFormParamAnnotation(param, var.getName()); rootInputParams.add(param); @@ -2290,7 +2249,7 @@ } if (component != null) { // A component is created for this resource. - for (MethodDeclaration method: component.getMethods()) { + for (MethodDeclaration method : component.getMethods()) { if (method.getName().equals(inputMethodName)) { input = method; break; @@ -2302,7 +2261,7 @@ } } else if (parentComponent != null) { // No component is created for this resource. - for (MethodDeclaration method: parentComponent.getMethods()) { + for (MethodDeclaration method : parentComponent.getMethods()) { if (method.getName().equals(inputMethodName)) { input = method; break; @@ -2325,9 +2284,9 @@ } else { // Add type to a parameter without type. if (mainInputAccessor.getParameters() != null) { - for (VariableDeclaration param: mainInputAccessor.getParameters()) { + for (VariableDeclaration param : mainInputAccessor.getParameters()) { if (param.getType() == null) { - for (VariableDeclaration p: mainInputParams) { + for (VariableDeclaration p : mainInputParams) { if (param.getName().equals(p.getName()) && p.getType() != null) { param.setType(p.getType()); } @@ -2345,7 +2304,7 @@ priorMemberForInputChannel.put(ch, out); String messageSymbol = ((Term) message).getSymbol().getImplName(); rootInputAccessor = declareInputAccessorInTheRootResource(messageSymbol, rootInputParams, out, resourcePath, - rootComponent, platformSpec, langSpec); + rootComponent, platformSpec, langSpec); if (input == null) { input = rootInputAccessor; rootInputAccessor = null; @@ -2361,23 +2320,23 @@ Expression param = out.getResource().getLastParam(); if (param instanceof Variable) { Variable var = (Variable) param; - resInputParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); - mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); + resInputParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); + mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); } else if (param instanceof Term) { Term var = (Term) param; - resInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); - mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); + resInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); + mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); } v++; } if (out.getResource().getParent() != null) { - for (Expression param: out.getResource().getParent().getPathParams()) { + for (Expression param : out.getResource().getParent().getPathParams()) { if (param instanceof Variable) { Variable var = (Variable) param; - mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); + mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), var.getName())); } else if (param instanceof Term) { Term var = (Term) param; - mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); + mainInputParams.add(langSpec.newVariableDeclaration(var.getType(), "v" + v)); } v++; } @@ -2390,7 +2349,7 @@ } if (component != null) { // A component is created for this resource. - for (MethodDeclaration method: component.getMethods()) { + for (MethodDeclaration method : component.getMethods()) { if (method.getName().equals(inputMethodName)) { input = method; break; @@ -2400,13 +2359,13 @@ if (resInputParams.size() == 0) { input = langSpec.newMethodDeclaration(inputMethodName, null); } else { - input = langSpec.newMethodDeclaration(inputMethodName, false, null, resInputParams); + input = langSpec.newMethodDeclaration(inputMethodName, false, null, resInputParams); } component.addMethod(input); } } else if (parentComponent != null) { // No component is created for this resource. - for (MethodDeclaration method: parentComponent.getMethods()) { + for (MethodDeclaration method : parentComponent.getMethods()) { if (method.getName().equals(inputMethodName)) { input = method; break; @@ -2416,13 +2375,13 @@ if (resInputParams.size() == 0) { input = langSpec.newMethodDeclaration(inputMethodName, null); } else { - input = langSpec.newMethodDeclaration(inputMethodName, false, null, resInputParams); + input = langSpec.newMethodDeclaration(inputMethodName, false, null, resInputParams); } parentComponent.addMethod(input); } } } - + // Declare the accessor in the main component to call the input method. (for monolithic application) if (platformSpec.hasMain()) { String messageSymbol = ((Variable) message).getName(); @@ -2451,7 +2410,7 @@ } String messageSymbol = ((Variable) message).getName(); rootInputAccessor = declareInputAccessorInTheRootResource(messageSymbol, rootInputParams, out, resourcePath, - rootComponent, platformSpec, langSpec); + rootComponent, platformSpec, langSpec); if (input == null) { input = rootInputAccessor; rootInputAccessor = null; @@ -2464,17 +2423,17 @@ if (mainInputAccessor != null) { if (platformSpec.hasMain()) { // For an application with a main component, the reference resource is accessed from the main component. - for (ChannelMember rc: ((DataTransferChannel) ch).getReferenceChannelMembers()) { + for (ChannelMember rc : ((DataTransferChannel) ch).getReferenceChannelMembers()) { // For each reference channel member, get the current state of the reference resource by pull data transfer. ResourcePath ref = rc.getResource(); if (!out.getResource().equals(ref)) { String refVarName = ref.getLeafResourceName(); Expression refGetter = getPullAccessor(platformSpec).getDirectStateAccessorFor(ref, null); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String refExp = refGetter.toImplementation(sideEffects); String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); mainInputAccessor.addFirstStatement(sideEffects[0] + langSpec.getVariableDeclaration(refTypeName, refVarName) - + langSpec.getAssignment() + refExp + langSpec.getStatementDelimiter()); + + langSpec.getAssignment() + refExp + langSpec.getStatementDelimiter()); } } } @@ -2483,13 +2442,13 @@ if (resExp instanceof Term) { // to access the parent if (((Term) resExp).getChildren().size() > 1 && ((Term) resExp).getChild(1) instanceof Variable) { - args.add(((Variable)((Term) resExp).getChild(1)).getName()); + args.add(((Variable) ((Term) resExp).getChild(1)).getName()); } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {""}); + String resourceAccess = resExp.toImplementation(new String[]{""}); // Values of channel parameters. - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); if (!args.contains(selVar.getName())) { @@ -2499,9 +2458,9 @@ } // Values of message parameters. if (message instanceof Term) { - for (Map.Entry varEnt: message.getVariables().entrySet()) { + for (Map.Entry varEnt : message.getVariables().entrySet()) { String refVarName = null; - for (ChannelMember rc: ((DataTransferChannel) ch).getReferenceChannelMembers()) { + for (ChannelMember rc : ((DataTransferChannel) ch).getReferenceChannelMembers()) { Expression varExp = rc.getStateTransition().getMessageExpression().getSubTerm(varEnt.getKey()); if (varExp != null && rc.getStateTransition().getCurStateExpression().contains(varExp)) { refVarName = rc.getResource().getLeafResourceName(); @@ -2513,7 +2472,8 @@ args.add(refVarName); } } else { - if (!args.contains(varEnt.getValue().getName())) args.add(varEnt.getValue().getName()); + if (!args.contains(varEnt.getValue().getName())) + args.add(varEnt.getValue().getName()); } } } @@ -2525,16 +2485,16 @@ try { if (!platformSpec.hasMain()) { // For an application with no main component, the reference resource is accessed from each resource. - for (ChannelMember rc: ((DataTransferChannel) ch).getReferenceChannelMembers()) { + for (ChannelMember rc : ((DataTransferChannel) ch).getReferenceChannelMembers()) { // For each reference channel member, get the current state of the reference side resource by pull data transfer. ResourcePath ref = rc.getResource(); if (!out.getResource().equals(ref)) { String refResourceName = ref.getLeafResourceName(); Type refResourceType = ref.getResourceStateType(); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; if (!platformSpec.isMonolithic() && rc.isOutside()) { List pathParams = new ArrayList<>(); - for (Expression pathExp: ref.getPathParams()) { + for (Expression pathExp : ref.getPathParams()) { pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } generatePullDataTransfer(input, refResourceName, ref.getResourceHierarchy().toResourcePath(pathParams), refResourceType, true, platformSpec, langSpec); @@ -2547,7 +2507,7 @@ String refExp = refGetter.toImplementation(sideEffects); String refTypeName = refResourceType.getInterfaceTypeName(); input.addFirstStatement(sideEffects[0] + langSpec.getVariableDeclaration(refTypeName, refResourceName) - + langSpec.getAssignment() + refExp + langSpec.getStatementDelimiter()); + + langSpec.getAssignment() + refExp + langSpec.getStatementDelimiter()); } } } @@ -2571,13 +2531,13 @@ } // Add statements to the input method. if (updateExp != null) { - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String newState = updateExp.toImplementation(sideEffects); ResourceHierarchy resource = resourceNode.getResourceHierarchy(); if (generatesComponent(resource)) { String updateStatement; if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); } @@ -2588,7 +2548,7 @@ } else { String updateStatement = ""; if (sideEffects[0] != null) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; String resourceName = langSpec.toVariableName(getComponentName(resource, langSpec)); updateStatement = updateStatement.replace(langSpec.getFieldAccessor(fieldOfResourceState), langSpec.getFieldAccessor(resourceName)); if (updateStatement.endsWith("\n")) { @@ -2600,7 +2560,7 @@ selector.addChild(new Constant(langSpec.getFieldAccessor(fieldOfResourceState))); selector.addChild(new Variable(input.getParameters().get(input.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newList = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (DataConstraintModel.typeMap.isAncestorOf(resourceNode.getParent().getResourceStateType())) { @@ -2608,7 +2568,7 @@ selector.addChild(new Constant(langSpec.getFieldAccessor(fieldOfResourceState))); selector.addChild(new Variable(input.getParameters().get(input.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newMap = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (!(updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect())) { @@ -2633,13 +2593,13 @@ if (resExp instanceof Term) { // to access the parent if (((Term) resExp).getChildren().size() > 1 && ((Term) resExp).getChild(1) instanceof Variable) { - args.add(((Variable)((Term) resExp).getChild(1)).getName()); + args.add(((Variable) ((Term) resExp).getChild(1)).getName()); } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {""}); + String resourceAccess = resExp.toImplementation(new String[]{""}); // Values of channel parameters. - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); args.add(selVar.getName()); @@ -2647,7 +2607,7 @@ } // Values of message parameters. if (message instanceof Term) { - for (Variable mesVar: message.getVariables().values()) { + for (Variable mesVar : message.getVariables().values()) { args.add(mesVar.getName()); } } @@ -2657,13 +2617,13 @@ } } } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e) { + | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } - + // Add an invocation to an update method (for a chain of update method invocations). boolean hasUpdateMethodinvoked = false; - for (Edge resToCh: resourceNode.getOutEdges()) { + for (Edge resToCh : resourceNode.getOutEdges()) { DataFlowEdge dOut = (DataFlowEdge) resToCh; ChannelNode directDstChNode = (ChannelNode) resToCh.getDestination(); DataTransferChannel directDstCh = directDstChNode.getChannel(); @@ -2671,10 +2631,10 @@ boolean outsideInputResource2 = false; ChannelMember in = null; Set outsideInputMembers2 = new HashSet<>(); - for (ChannelMember cm: directDstCh.getInputChannelMembers()) { + for (ChannelMember cm : directDstCh.getInputChannelMembers()) { if (resourceNode.getOutSideResources().contains(cm.getResource())) { if (cm.isOutside()) { - outsideInputResource2 = true; // Regarded as pull transfer. + outsideInputResource2 = true; // Regarded as pull transfer. } in = cm; } @@ -2687,13 +2647,13 @@ Set descendantDstChannels = directDstChNode.getDescendants(); Set outEdges = new HashSet<>(); outEdges.addAll(directDstChNode.getOutEdges()); - for (ChannelNode ancestorDst: ancestorDstChannels) { + for (ChannelNode ancestorDst : ancestorDstChannels) { outEdges.addAll(ancestorDst.getOutEdges()); } - for (ChannelNode descendantDst: descendantDstChannels) { + for (ChannelNode descendantDst : descendantDstChannels) { outEdges.addAll(descendantDst.getOutEdges()); } - for (Edge chToRes: outEdges) { + for (Edge chToRes : outEdges) { // For each data transfer to dstNode:ResourceNode. ResourceNode dstNode = ((ResourceNode) chToRes.getDestination()); ChannelNode chNode2 = (ChannelNode) chToRes.getSource(); @@ -2701,7 +2661,7 @@ // Check if the output resource is outside of the channel scope. boolean outsideOutputResource2 = false; ChannelMember out2 = null; - for (ChannelMember cm: ch2.getOutputChannelMembers()) { + for (ChannelMember cm : ch2.getOutputChannelMembers()) { if (dstNode.getInSideResources().contains(cm.getResource())) { out2 = cm; if (cm.isOutside()) { @@ -2712,10 +2672,10 @@ } // Also take into account the channel hierarchy to determine push/pull transfer. if (descendantDstChannels.contains(chNode2)) { - outsideOutputResource2 = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource2 = true; // Regarded as (broadcasting) push transfer. } if (ancestorDstChannels.contains(chNode2)) { - outsideInputResource2 = true; // Regarded as (collecting) pull transfer. + outsideInputResource2 = true; // Regarded as (collecting) pull transfer. } if ((((PushPullAttribute) dOut.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource2) || outsideOutputResource2) { // PUSH transfer @@ -2723,15 +2683,15 @@ // Calculate in-degree (PUSH transfer) of the destination resource. Set inEdges = new HashSet<>(); inEdges.addAll(directDstChNode.getInEdges()); - for (ChannelNode ancestorSrc: ancestorDstChannels) { + for (ChannelNode ancestorSrc : ancestorDstChannels) { inEdges.addAll(ancestorSrc.getInEdges()); } - for (ChannelNode descendantSrc: descendantDstChannels) { + for (ChannelNode descendantSrc : descendantDstChannels) { inEdges.addAll(descendantSrc.getInEdges()); } int inDegree = 0; - for (Edge resToCh2: inEdges) { - DataFlowEdge df =(DataFlowEdge) resToCh2; + for (Edge resToCh2 : inEdges) { + DataFlowEdge df = (DataFlowEdge) resToCh2; if (((PushPullAttribute) df.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { inDegree++; } @@ -2747,14 +2707,14 @@ selType = ((Variable) selExp).getType(); forVarName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm :ch2.getInputChannelMembers()) { + for (ChannelMember cm : ch2.getInputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; } } if (insideChMem == null) { - for (ChannelMember cm :ch2.getReferenceChannelMembers()) { + for (ChannelMember cm : ch2.getReferenceChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -2762,7 +2722,7 @@ } } if (insideChMem == null) { - for (ChannelMember cm :ch2.getOutputChannelMembers()) { + for (ChannelMember cm : ch2.getOutputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -2776,16 +2736,16 @@ insideResPath = insideResPath.getParent(); if (insideResPath != null) { String parent = null; - if (platformSpec.isMonolithic() - || insideResPath.getCommonPrefix(resourceNode.getOutSideResource(directDstCh)) != null + if (platformSpec.isMonolithic() + || insideResPath.getCommonPrefix(resourceNode.getOutSideResource(directDstCh)) != null || !platformSpec.isDifferentTreesAsDifferentServices()) { if (!platformSpec.isMonolithic() && generatesComponent(insideResPath.getResourceHierarchy())) { Expression getter = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, resourceNode.getOutSideResource(directDstCh)); Term valueGetter = new Term(new Symbol(getterOfResourceState, 1, Symbol.Type.METHOD)); valueGetter.addChild(getter); - parent = valueGetter.toImplementation(new String[] {}); + parent = valueGetter.toImplementation(new String[]{}); } else { - parent = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, resourceNode.getOutSideResource(directDstCh)).toImplementation(new String[] {}); + parent = getPullAccessor(platformSpec).getDirectStateAccessorFor(insideResPath, resourceNode.getOutSideResource(directDstCh)).toImplementation(new String[]{}); } } else { // for REST API @@ -2800,13 +2760,13 @@ input.addStatement(langSpec.getForStatementForMap(forVarName, DataConstraintModel.typeString.getInterfaceTypeName(), parent)); addForStatement = true; } - if (!platformSpec.isMonolithic() - && insideResPath.getCommonPrefix(resourceNode.getOutSideResource(directDstCh)) == null + if (!platformSpec.isMonolithic() + && insideResPath.getCommonPrefix(resourceNode.getOutSideResource(directDstCh)) == null && platformSpec.isDifferentTreesAsDifferentServices()) { // for REST API Type parentResType = insideResPath.getResourceStateType(); String parentResName = langSpec.toVariableName(getComponentName(insideResPath.getResourceHierarchy(), langSpec)); - String parentResPath = insideResPath.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + String parentResPath = insideResPath.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); generatePullDataTransfer(input, parentResName, parentResPath, parentResType, true, platformSpec, langSpec); } } @@ -2817,9 +2777,9 @@ } // Get the value of reference member to call the update method. List>> refParams = new ArrayList<>(); - Map> referredResources = new HashMap<>(); + Map> referredResources = new HashMap<>(); Set referredSet = referredResources.get(input); - for (ChannelMember rc: ch2.getReferenceChannelMembers()) { + for (ChannelMember rc : ch2.getReferenceChannelMembers()) { ResourcePath ref = rc.getResource(); if (referredSet == null) { referredSet = new HashSet<>(); @@ -2834,24 +2794,24 @@ srcRes = srcRes.getParent(); } Expression refGetter = getPullAccessor(platformSpec).getDirectStateAccessorFor(ref, srcRes); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String refExp = refGetter.toImplementation(sideEffects); String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); input.addStatement(sideEffects[0] + langSpec.getVariableDeclaration(refTypeName, refVarName) + langSpec.getAssignment() + refExp + langSpec.getStatementDelimiter()); } refParams.add(new AbstractMap.SimpleEntry<>(ref.getResourceStateType(), - new AbstractMap.SimpleEntry<>(refVarName, - refVarName))); + new AbstractMap.SimpleEntry<>(refVarName, + refVarName))); } } - List>> pathParams = new ArrayList<>(); + List>> pathParams = new ArrayList<>(); if (platformSpec.isMonolithic()) { // Update fields to refer to outside resources. ResourcePath filledOutsideResourcePath = null; try { Map>> resourcePaths = ch2.fillOutsideResourcePaths(out2, getPullAccessor(platformSpec)); if (resourcePaths != null && resourcePaths.size() > 0) { - for (ChannelMember outsideMember: resourcePaths.keySet()) { + for (ChannelMember outsideMember : resourcePaths.keySet()) { ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); if (out2.equals(outsideMember)) { filledOutsideResourcePath = outsidePath; @@ -2867,70 +2827,71 @@ if (outsideExp instanceof Field) { outsideExp = new Variable(((Field) outsideExp).getSymbol().getName(), ((Field) outsideExp).getType()); } else if (outsideExp instanceof Term) { - for (Entry fieldEnt: ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { + for (Entry fieldEnt : ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { Position pos = fieldEnt.getKey(); Field field = fieldEnt.getValue(); Variable var = new Variable(field.getSymbol().getName(), field.getType()); ((Term) outsideExp).replaceSubTerm(pos, var); } } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); - input.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. + input.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. } } - } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e) { + } catch (ParameterizedIdentifierIsFutureWork | + ResolvingMultipleDefinitionIsFutureWork + | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } // Values of path parameters to call the update method. if (filledOutsideResourcePath == null) { filledOutsideResourcePath = out2.getResource(); } - for (Expression pathParam: filledOutsideResourcePath.getPathParams()) { + for (Expression pathParam : filledOutsideResourcePath.getPathParams()) { if (pathParam instanceof Variable) { Variable pathVar = (Variable) pathParam; pathParams.add(new AbstractMap.SimpleEntry<>(pathVar.getType(), - new AbstractMap.SimpleEntry<>(pathVar.getName(), - pathVar.getName()))); + new AbstractMap.SimpleEntry<>(pathVar.getName(), + pathVar.getName()))); } else if (pathParam instanceof Constant) { Constant pathVar = (Constant) pathParam; pathParams.add(new AbstractMap.SimpleEntry<>(pathVar.getType(), - new AbstractMap.SimpleEntry<>(pathVar.getSymbol().getName(), - pathVar.getSymbol().getName()))); + new AbstractMap.SimpleEntry<>(pathVar.getSymbol().getName(), + pathVar.getSymbol().getName()))); } } } else { // Values of path parameters to call the update method. - for (Expression pathParam: out2.getResource().getPathParams()) { + for (Expression pathParam : out2.getResource().getPathParams()) { if (pathParam instanceof Variable) { Variable pathVar = (Variable) pathParam; pathParams.add(new AbstractMap.SimpleEntry<>(pathVar.getType(), - new AbstractMap.SimpleEntry<>(pathVar.getName(), - pathVar.getName()))); + new AbstractMap.SimpleEntry<>(pathVar.getName(), + pathVar.getName()))); } } } // Values of channel parameters to call the update method. List>> params = new ArrayList<>(); - for (Selector selector: ch2.getAllSelectors()) { + for (Selector selector : ch2.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); - params.add(new AbstractMap.SimpleEntry<>(selVar.getType(), - new AbstractMap.SimpleEntry<>(selVar.getName(), - selVar.getName()))); + params.add(new AbstractMap.SimpleEntry<>(selVar.getType(), + new AbstractMap.SimpleEntry<>(selVar.getName(), + selVar.getName()))); } } // Value of the source side (input side) resource to call the update method. ResourceHierarchy srcRes = resourceNode.getResourceHierarchy(); if (generatesComponent(srcRes)) { - params.add(new AbstractMap.SimpleEntry<>(srcRes.getResourceStateType(), - new AbstractMap.SimpleEntry<>(langSpec.toVariableName(srcRes.getResourceName()), - langSpec.getFieldAccessor(fieldOfResourceState)))); + params.add(new AbstractMap.SimpleEntry<>(srcRes.getResourceStateType(), + new AbstractMap.SimpleEntry<>(langSpec.toVariableName(srcRes.getResourceName()), + langSpec.getFieldAccessor(fieldOfResourceState)))); } else { params.add(new AbstractMap.SimpleEntry<>(srcRes.getResourceStateType(), - new AbstractMap.SimpleEntry<>(langSpec.toVariableName(srcRes.getResourceName()), - langSpec.getFieldAccessor(langSpec.toVariableName(srcRes.getResourceName()))))); + new AbstractMap.SimpleEntry<>(langSpec.toVariableName(srcRes.getResourceName()), + langSpec.getFieldAccessor(langSpec.toVariableName(srcRes.getResourceName()))))); srcRes = srcRes.getParent(); } params.addAll(refParams); @@ -2938,13 +2899,13 @@ String updateMethodName = null; ResourceHierarchy dstRes = dstNode.getResourceHierarchy(); if (!generatesComponent(dstRes)) { - updateMethodName = updateMethodPrefix + getComponentName(dstRes, langSpec) + from + resComponentName; + updateMethodName = updateMethodPrefix + getComponentName(dstRes, langSpec) + from + resComponentName; dstRes = dstRes.getParent(); } else { - updateMethodName = updateMethodPrefix + from + resComponentName; + updateMethodName = updateMethodPrefix + from + resComponentName; } String dstCompName = langSpec.toVariableName(getComponentName(dstRes, langSpec)); - if (outsideOutputResource2 + if (outsideOutputResource2 || (!platformSpec.isMonolithic() && in.getResource().getCommonPrefix(out2.getResource()) == null && platformSpec.isDifferentTreesAsDifferentServices())) { // Inter-servces if (!platformSpec.isMonolithic()) { @@ -2952,13 +2913,13 @@ RestApiSpecific restApiSpec = (RestApiSpecific) platformSpec; String httpMethod = null; if (out2.getStateTransition().isRightUnary()) { - httpMethod = "put"; + httpMethod = "put"; } else { httpMethod = "post"; } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; List pathParamsUrl = new ArrayList<>(); - for (Expression pathExp: out2.getResource().getPathParams()) { + for (Expression pathExp : out2.getResource().getPathParams()) { pathParamsUrl.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } String resName2 = langSpec.toVariableName(resComponentName); @@ -2969,14 +2930,14 @@ try { filledPaths = ch2.fillOutsideResourcePaths(out2, getPushAccessor(platformSpec)); } catch (ParameterizedIdentifierIsFutureWork - | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage - | UnificationFailed | ValueUndefined e) { + | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage + | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } String dstPath = null; if (filledPaths != null && filledPaths.get(out2) != null) { ResourcePath filledDstPath = filledPaths.get(out2).getKey(); - dstPath = filledDstPath.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + dstPath = filledDstPath.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); } else { dstPath = dstRes.toResourcePath(pathParamsUrl); } @@ -2985,7 +2946,7 @@ // The first call to an update method in this method input.addStatement(restApiSpec.getHttpMethodParamsConstructionStatement(srcRes.getResourceName(), params, true)); input.addStatement(langSpec.getVariableDeclaration(DataConstraintModel.typeString.getInterfaceTypeName(), "result") - + langSpec.getAssignment() + restApiSpec.getHttpMethodCallStatement(restApiSpec.getBaseURL(), dstPath, resName2, httpMethod)); + + langSpec.getAssignment() + restApiSpec.getHttpMethodCallStatement(restApiSpec.getBaseURL(), dstPath, resName2, httpMethod)); hasUpdateMethodinvoked = true; if (component != null && !((RestApiSpecific) platformSpec).hasHttpClientFieldDeclaration(component)) { // Declare a client field to connect to the destination resource of push transfer. @@ -2999,31 +2960,31 @@ } else { // Use the reference field to refer to outside destination resource. List args = new ArrayList<>(); - for (Map.Entry> paramEnt: pathParams) { + for (Map.Entry> paramEnt : pathParams) { args.add(paramEnt.getValue().getValue()); } - for (Map.Entry> paramEnt: params) { + for (Map.Entry> paramEnt : params) { args.add(paramEnt.getValue().getValue()); } input.addStatement(langSpec.getMethodInvocation(langSpec.getFieldAccessor(dstCompName), updateMethodName, args) - + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); + + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); } } else { // Intra-service // The destination resource is not outside. List args = new ArrayList<>(); - for (Map.Entry> paramEnt: pathParams) { + for (Map.Entry> paramEnt : pathParams) { args.add(paramEnt.getValue().getValue()); } - for (Map.Entry> paramEnt: params) { + for (Map.Entry> paramEnt : params) { args.add(paramEnt.getValue().getValue()); } if (srcRes != dstRes) { input.addStatement(langSpec.getMethodInvocation(langSpec.getFieldAccessor(dstCompName), updateMethodName, args) - + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); + + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); } else { input.addStatement(langSpec.getMethodInvocation(updateMethodName, args) - + langSpec.getStatementDelimiter()); // this.updateDstFromSrc(value, refParams); + + langSpec.getStatementDelimiter()); // this.updateDstFromSrc(value, refParams); } } if (addForStatement) { @@ -3039,7 +3000,7 @@ if (outsideInputMembers2.size() > 0) { if (!generatesComponent(resourceNode.getResourceHierarchy())) { ResourcePath srcRes2 = resourceNode.getOutSideResource(directDstCh); - for (ChannelMember out2: directDstCh.getOutputChannelMembers()) { + for (ChannelMember out2 : directDstCh.getOutputChannelMembers()) { if (!generatesComponent(out2.getResource().getResourceHierarchy())) { ResourcePath dstRes2 = out2.getResource(); if (srcRes2.getParent().equals(dstRes2.getParent())) { @@ -3047,8 +3008,8 @@ try { resourcePaths = directDstCh.fillOutsideResourcePaths(out2, getPullAccessor(platformSpec)); if (resourcePaths != null && resourcePaths.size() > 0) { - for (ChannelMember outsideMember: outsideInputMembers2) { - for (ChannelMember dependedMember: resourcePaths.get(outsideMember).getValue()) { + for (ChannelMember outsideMember : outsideInputMembers2) { + for (ChannelMember dependedMember : resourcePaths.get(outsideMember).getValue()) { if (dependedMember.getResource().equals(srcRes2)) { // An outside input resource path depends on srcRes. ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); @@ -3060,23 +3021,24 @@ if (generatesComponent(outsidePath.getResourceHierarchy())) { outsideExp = ((Term) outsideExp).getChild(0); } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); - input.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. + input.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. // Update constructor. String initializingStatement = langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter(); if (component != null) { MethodDeclaration constructor = getConstructor(component); - constructor.addStatement(initializingStatement); // initialize the reference field. + constructor.addStatement(initializingStatement); // initialize the reference field. } else { - constructorStatements.add(initializingStatement); // initialize the reference field. + constructorStatements.add(initializingStatement); // initialize the reference field. } } } } } - } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e) { + } catch (ParameterizedIdentifierIsFutureWork | + ResolvingMultipleDefinitionIsFutureWork + | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } } @@ -3092,9 +3054,9 @@ } return new AbstractMap.SimpleEntry<>(constructorStatements, inputStatements); } - - protected void declareGetterAccessorInTheRootResource(ResourceNode resourceNode, TypeDeclaration rootComponent, - IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + + protected void declareGetterAccessorInTheRootResource(ResourceNode resourceNode, TypeDeclaration rootComponent, + IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { if (resourceNode.getResourceHierarchy().getParent() != null) { // For a non-root resource MethodDeclaration getterAccessor = null; @@ -3107,12 +3069,12 @@ } if (mainGetterParams.size() > 0) { getterAccessor = langSpec.newMethodDeclaration(getterPrefix + getComponentName(resourceNode.getResourceHierarchy(), langSpec) + methoNameOfResourceState, - false, - getImplStateType(resourceNode.getResourceHierarchy(), langSpec), - mainGetterParams); + false, + getImplStateType(resourceNode.getResourceHierarchy(), langSpec), + mainGetterParams); } else { getterAccessor = langSpec.newMethodDeclaration(getterPrefix + getComponentName(resourceNode.getResourceHierarchy(), langSpec) + methoNameOfResourceState, - getImplStateType(resourceNode.getResourceHierarchy(), langSpec)); + getImplStateType(resourceNode.getResourceHierarchy(), langSpec)); } getterAccessor.setBody(new Block()); ResourcePath resPath = new ResourcePath(resourceNode.getPrimaryResourcePath()); @@ -3121,7 +3083,7 @@ resPath.replacePathParam(i, pathParam, null); } Expression getState = getPullAccessor(platformSpec).getDirectStateAccessorFor(resPath, resPath.getRoot()); - getterAccessor.getBody().addStatement(langSpec.getReturnStatement(getState.toImplementation(new String[] {null})) + langSpec.getStatementDelimiter()); + getterAccessor.getBody().addStatement(langSpec.getReturnStatement(getState.toImplementation(new String[]{null})) + langSpec.getStatementDelimiter()); if (!platformSpec.isMonolithic()) { ((RestApiSpecific) platformSpec).addGetAnnotations(getterAccessor); if (resourcePath.length() > 0) { @@ -3131,35 +3093,35 @@ rootComponent.addMethod(getterAccessor); } } - + protected void declareUpdateAccessorInTheRootResource(ResourceNode resourceNode, String updateMethodName, - DataTransferChannel ch, ChannelMember cm, ResourcePath srcResPath, ResourcePath dstResPath, TypeDeclaration rootComponent, - int inDegree, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + DataTransferChannel ch, ChannelMember cm, ResourcePath srcResPath, ResourcePath dstResPath, TypeDeclaration rootComponent, + int inDegree, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { ArrayList parameters; VariableDeclaration param; parameters = new ArrayList<>(); - String resourcePath = getUpdateResourcePathAndPathParams(dstResPath, parameters, true, platformSpec, langSpec); // Path parameters to identify the self resource. + String resourcePath = getUpdateResourcePathAndPathParams(dstResPath, parameters, true, platformSpec, langSpec); // Path parameters to identify the self resource. ResourcePath resPath = new ResourcePath(dstResPath); for (int i = 0; i < parameters.size(); i++) { Parameter pathParam = new Parameter(parameters.get(i).getName()); resPath.replacePathParam(i, pathParam, null); } - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); VariableDeclaration chParam = langSpec.newVariableDeclaration(selVar.getType(), selVar.getName()); if (!platformSpec.isMonolithic()) { ((RestApiSpecific) platformSpec).addFormParamAnnotation(chParam, selVar.getName()); } - parameters.add(chParam); // A channel parameter to specify the context of the collaboration. + parameters.add(chParam); // A channel parameter to specify the context of the collaboration. } } Type srcType = srcResPath.getResourceStateType(); String srcResName = langSpec.toVariableName(getComponentName(srcResPath.getResourceHierarchy(), langSpec)); param = langSpec.newVariableDeclaration(srcType, srcResName); if (!platformSpec.isMonolithic()) ((RestApiSpecific) platformSpec).addFormParamAnnotation(param, srcResName); - parameters.add(param); // The state of the source resource to carry the data-flow. - for (ResourcePath refRes: ch.getReferenceResources()) { + parameters.add(param); // The state of the source resource to carry the data-flow. + for (ResourcePath refRes : ch.getReferenceResources()) { if (!refRes.equals(resourceNode.getInSideResource(ch))) { String refName = langSpec.toVariableName(getComponentName(refRes.getResourceHierarchy(), langSpec)); param = langSpec.newVariableDeclaration(refRes.getResourceStateType(), refName); @@ -3182,10 +3144,11 @@ } } if (inDegree > 1) { - // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. + // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. resourcePath += "/" + langSpec.toVariableName(srcResName); } - if (!platformSpec.isMonolithic()) ((RestApiSpecific) platformSpec).addPathAnnotation(updateAccessor, resourcePath); + if (!platformSpec.isMonolithic()) + ((RestApiSpecific) platformSpec).addPathAnnotation(updateAccessor, resourcePath); // To make the accessor call the update method. Expression resExp = getPullAccessor(platformSpec).getDirectStateAccessorFor(resPath, resPath.getRoot()); @@ -3193,21 +3156,21 @@ if (resExp instanceof Term) { // to access the parent if (((Term) resExp).getChildren().size() > 1 && ((Term) resExp).getChild(1) instanceof Variable) { - args.add(((Variable)((Term) resExp).getChild(1)).getName()); + args.add(((Variable) ((Term) resExp).getChild(1)).getName()); } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {""}); - for (VariableDeclaration var: updateAccessor.getParameters()) { + String resourceAccess = resExp.toImplementation(new String[]{""}); + for (VariableDeclaration var : updateAccessor.getParameters()) { args.add(var.getName()); } updateAccessor.addStatement(langSpec.getMethodInvocation(resourceAccess, updateMethodName, args) + langSpec.getStatementDelimiter()); rootComponent.addMethod(updateAccessor); } - + protected MethodDeclaration declareInputAccessorInTheRootResource(String inputMethodName, - ArrayList rootInputParams, ChannelMember cm, String resourcePath, - TypeDeclaration rootComponent, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { + ArrayList rootInputParams, ChannelMember cm, String resourcePath, + TypeDeclaration rootComponent, IPlatformSpecific platformSpec, ILanguageSpecific langSpec) { MethodDeclaration rootInputAccessor; rootInputAccessor = langSpec.newMethodDeclaration(inputMethodName, false, null, rootInputParams); if (!platformSpec.isMonolithic()) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/DataTransferMethodAnalyzer.java b/AlgebraicDataflowArchitectureModel/src/generators/DataTransferMethodAnalyzer.java index d15f6ad..e2ae5d3 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/DataTransferMethodAnalyzer.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/DataTransferMethodAnalyzer.java @@ -1,42 +1,39 @@ package generators; -import java.util.HashSet; - -import models.*; -import models.algebra.*; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; +import models.Edge; import models.dataFlowModel.*; +import java.util.HashSet; + /** * Algorithm to analyze data transfer methods selected by a user - * + * * @author Nitta * */ public class DataTransferMethodAnalyzer { static private HashSet reachableNodes = new HashSet<>(); - + /** * Determine whether each resource state is stored or not depending on selected data transfer methods. - * + * * @param graph a data flow graph (in/out) */ static public void decideToStoreResourceStates(DataFlowGraph graph) { reachableNodes.clear(); - for (ResourceNode n: graph.getResourceNodes()) { + for (ResourceNode n : graph.getResourceNodes()) { ResourceNode resource = (ResourceNode) n; trackNode(resource); } } - + static private void trackNode(ResourceNode resource) { if (reachableNodes.contains(resource)) return; reachableNodes.add(resource); boolean flag = true; - for (Edge chToRes: resource.getInEdges()) { - for (Edge resToCh: chToRes.getSource().getInEdges()) { + for (Edge chToRes : resource.getInEdges()) { + for (Edge resToCh : chToRes.getSource().getInEdges()) { if (((PushPullAttribute) resToCh.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { // Traverse pull edges only. trackNode((ResourceNode) resToCh.getSource()); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java index 5e5ea4a..660f67a 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java @@ -1,60 +1,96 @@ package generators; -import java.util.ArrayList; -import java.util.List; - -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; +import code.ast.*; import models.algebra.Expression; import models.algebra.Term; import models.algebra.Type; -import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; + +import java.util.List; public interface ILanguageSpecific { CompilationUnit newCompilationUnit(TypeDeclaration component); + TypeDeclaration newTypeDeclaration(String typeName); + VariableDeclaration newVariableDeclaration(Type type, String varName); + MethodDeclaration newMethodDeclaration(String methodName, Type returnType); + MethodDeclaration newMethodDeclaration(String methodName, boolean isConstructor, Type returnType, List parameters); + FieldDeclaration newFieldDeclaration(Type fieldType, String fieldName); + FieldDeclaration newFieldDeclaration(Type fieldType, String fieldName, String fieldInitializer); + Type newListType(String compTypeName); + Type newMapType(Type keyType, String compTypeName); + Type newTupleType(List compTypes); + String getVariableDeclaration(String typeName, String varName); + String getFieldInitializer(Type type, Expression initialValue); + boolean declareField(); + String getSelfExp(); + String getFieldAccessor(String fieldName); + String getMethodInvocation(String methodName); + String getMethodInvocation(String receiverName, List parameters); + String getMethodInvocation(String receiverName, String methodName); + String getMethodInvocation(String receiverName, String methodName, List parameters); + String getConstructorInvocation(String componentName, List parameters); + String getReturnStatement(String returnValue); + String getIfStatement(Term condition, String block); + String getForStatementForList(String varName, String list); + String getForStatementForCollection(String varName, String varType, String collection); + String getForStatementForMap(String varName, String varType, String map); + String getEndForStatement(); + String getEndForStatement(String varName); + String toComponentName(String name); + String toVariableName(String name); + String getMainComponentName(); + String getAssignment(); + String getStatementDelimiter(); + String getStringDelimiter(); + String getOpeningScoreDelimiter(); + String getClosingScoreDelimiter(); + String getValueToStringExp(String typeName, String valueExp); + String getStringToValueExp(String typeName, String strExp); + String getPairExp(String first, String second); + String getFirstEntryFromMapExp(String map); + String getTupleGet(String tupleExp, int idx, int length); + String getDecomposedTuple(String tupleExp, VariableDeclaration tupleVar, List vars); + boolean isValueType(Type type); + boolean isVoidType(Type type); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/IPlatformSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/IPlatformSpecific.java index c609b7a..3c833c0 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/IPlatformSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/IPlatformSpecific.java @@ -1,9 +1,9 @@ package generators; -import java.util.List; - public interface IPlatformSpecific { boolean hasMain(); + boolean isMonolithic(); + boolean isDifferentTreesAsDifferentServices(); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java index b362030..fe84596 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java @@ -1,54 +1,19 @@ package generators; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.Stack; - -import code.ast.Annotation; -import code.ast.Block; -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.ImportDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; +import code.ast.*; import models.Edge; import models.Node; -import models.algebra.Expression; -import models.algebra.Field; -import models.algebra.Parameter; -import models.algebra.Position; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.Variable; -import models.dataConstraintModel.Channel; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.DataTransferChannel; +import models.algebra.*; +import models.dataConstraintModel.*; +import models.dataFlowModel.*; import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; -import models.dataFlowModel.PushPullAttribute; -import models.dataFlowModel.PushPullValue; -import models.dataFlowModel.ChannelNode; -import models.dataFlowModel.DataFlowEdge; -import models.dataFlowModel.DataFlowGraph; -import models.dataFlowModel.ResourceNode; -import models.dataFlowModel.StoreAttribute; + +import java.util.*; +import java.util.Map.Entry; /** * Generator for plain Java prototypes - * + * * @author Nitta * */ @@ -56,19 +21,19 @@ public static final Type typeVoid = new Type("Void", "void"); private static String defaultMainTypeName = "Main"; static String mainTypeName = defaultMainTypeName; - + public static String getMainTypeName() { return mainTypeName; } - + public static void setMainTypeName(String mainTypeName) { JavaCodeGenerator.mainTypeName = mainTypeName; } - + public static void resetMainTypeName() { JavaCodeGenerator.mainTypeName = defaultMainTypeName; } - + public static String getComponentName(ResourceHierarchy res) { String name = res.getResourceName(); if (res.getNumParameters() > 0) { @@ -122,13 +87,15 @@ public static boolean generatesComponent(ResourceHierarchy res) { if (res.getParent() == null) return true; if (res.getChildren() == null || res.getChildren().size() == 0) return false; - if (res.getNumParameters() > 0 && res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0) return false; - if (res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0 - && (res.getChildren().iterator().next().getChildren() == null || res.getChildren().iterator().next().getChildren().size() == 0)) return false; + if (res.getNumParameters() > 0 && res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0) + return false; + if (res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0 + && (res.getChildren().iterator().next().getChildren() == null || res.getChildren().iterator().next().getChildren().size() == 0)) + return false; return true; // return res.getParent() == null || !(res.getChildren() == null || res.getChildren().size() == 0); } - + static public ArrayList doGenerate(DataFlowGraph graph, DataTransferModel model) { ArrayList codes = new ArrayList<>(); Map resourceComponents = new HashMap<>(); @@ -139,7 +106,7 @@ List> fields = new ArrayList<>(); Map> descendantGetters = new HashMap<>(); List> constructorParams = new ArrayList<>(); - + Map> dependedRootComponentGraph = getDependedRootComponentGraph(model); ArrayList resources = determineResourceOrder(graph, dependedRootComponentGraph); TypeDeclaration mainComponent = new TypeDeclaration(mainTypeName); @@ -152,14 +119,14 @@ mainComponent.addMethod(mainConstructor); // For each resource node. - for (ResourceNode resourceNode: resources) { + for (ResourceNode resourceNode : resources) { TypeDeclaration component = null; Set depends = new HashSet<>(); Set refs = new HashSet<>(); if (generatesComponent(resourceNode.getResourceHierarchy())) { boolean f = false; String resourceName = getComponentName(resourceNode.getResourceHierarchy()); - + component = resourceComponents.get(resourceNode.getResourceHierarchy()); if (component == null) { // Add compilation unit for each resource. @@ -173,10 +140,10 @@ if (resourceNode.getResourceHierarchy().getParent() == null) { // For a root resource String fieldInitializer = "new " + resourceName + "("; - for (Edge resToCh: resourceNode.getOutEdges()) { + for (Edge resToCh : resourceNode.getOutEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; if (((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { - for (Edge chToRes: re.getDestination().getOutEdges()) { + for (Edge chToRes : re.getDestination().getOutEdges()) { ResourceHierarchy dstRes = ((ResourceNode) chToRes.getDestination()).getResourceHierarchy(); String resName = getComponentName(dstRes); depends.add(dstRes); @@ -186,7 +153,7 @@ } } for (Edge chToRes : resourceNode.getInEdges()) { - for (Edge resToCh: chToRes.getSource().getInEdges()) { + for (Edge resToCh : chToRes.getSource().getInEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; ResourceHierarchy srcRes = ((ResourceNode) re.getSource()).getResourceHierarchy(); String resName = getComponentName(srcRes); @@ -196,7 +163,7 @@ f = true; } else { ChannelNode cn = (ChannelNode) re.getDestination(); - if (cn.getIndegree() > 1 + if (cn.getIndegree() > 1 || (cn.getIndegree() == 1 && cn.getChannel().getInputChannelMembers().iterator().next().getStateTransition().isRightPartial())) { // Declare a field to cache the state of the source resource in the type of the destination resource. ResourceHierarchy cacheRes = ((ResourceNode) re.getSource()).getResourceHierarchy(); @@ -206,8 +173,8 @@ } } } - for (ResourceHierarchy dependedRes: dependedRootComponentGraph.keySet()) { - for (ResourceHierarchy dependingRes: dependedRootComponentGraph.get(dependedRes)) { + for (ResourceHierarchy dependedRes : dependedRootComponentGraph.keySet()) { + for (ResourceHierarchy dependingRes : dependedRootComponentGraph.get(dependedRes)) { if (resourceNode.getResourceHierarchy().equals(dependingRes)) { // Declare a field to refer to outside resources. depends.add(dependedRes); @@ -220,7 +187,7 @@ for (Channel ch : model.getChannels()) { DataTransferChannel c = (DataTransferChannel) ch; if (resourceNode.getOutSideResource(c) != null) { - for (ResourcePath res: c.getReferenceResources()) { + for (ResourcePath res : c.getReferenceResources()) { if (!refs.contains(res) && !depends.contains(res.getResourceHierarchy())) { refs.add(res); String refResName = res.getLeafResourceName(); @@ -257,14 +224,14 @@ component.addField(new FieldDeclaration(getImplStateType(res), "value", getInitializer(res))); } else { // class - for (ResourceHierarchy c: children) { + for (ResourceHierarchy c : children) { String childTypeName = getComponentName(c); Type childType = null; if (generatesComponent(c)) { // The child has a component. childType = new Type(childTypeName, childTypeName); String fieldName = toVariableName(childTypeName); - component.addField(new FieldDeclaration(childType, fieldName, "new " + childTypeName + "()")); + component.addField(new FieldDeclaration(childType, fieldName, "new " + childTypeName + "()")); } } } @@ -285,7 +252,7 @@ descendants = new HashSet<>(); descendantGetters.put(resourceNode.getResourceHierarchy(), descendants); } - for (ResourceNode child: resourceNode.getChildren()) { + for (ResourceNode child : resourceNode.getChildren()) { // A descendant of the child may generate a component. List params = new ArrayList<>(); int v = 1; @@ -330,23 +297,23 @@ // Declare reference fields for push/pull data transfer. boolean noPullTransfer = true; for (Edge chToRes : resourceNode.getInEdges()) { - for (Edge resToCh: chToRes.getSource().getInEdges()) { + for (Edge resToCh : chToRes.getSource().getInEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; DataTransferChannel ch = ((ChannelNode) re.getDestination()).getChannel(); ResourcePath srcRes = ((ResourceNode) re.getSource()).getOutSideResource(ch); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (cm.getResource().equals(srcRes) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } @@ -390,10 +357,10 @@ } String getterName = "get" + getComponentName(resourceNode.getResourceHierarchy()); boolean bExists = false; - for (Map.Entry entry: getters) { + for (Map.Entry entry : getters) { ResourceHierarchy r = entry.getKey(); MethodDeclaration m = entry.getValue(); - if (r == ancestorNode.getResourceHierarchy() && m.getName().equals(getterName) + if (r == ancestorNode.getResourceHierarchy() && m.getName().equals(getterName) && (m.getParameters() == null ? 0 : m.getParameters().size()) == getterParams.size()) { bExists = true; break; @@ -421,9 +388,9 @@ DataTransferChannel directDstCh = directDstChNode.getChannel(); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: directDstCh.getInputChannelMembers()) { + for (ChannelMember cm : directDstCh.getInputChannelMembers()) { if (cm.getResource().equals(resourceNode.getOutSideResource(directDstCh)) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } @@ -432,30 +399,30 @@ Set descendantDstChannels = directDstChNode.getDescendants(); Set outEdges = new HashSet<>(); outEdges.addAll(directDstChNode.getOutEdges()); - for (ChannelNode ancestorDst: ancestorDstChannels) { + for (ChannelNode ancestorDst : ancestorDstChannels) { outEdges.addAll(ancestorDst.getOutEdges()); } - for (ChannelNode descendantDst: descendantDstChannels) { + for (ChannelNode descendantDst : descendantDstChannels) { outEdges.addAll(descendantDst.getOutEdges()); } - for (Edge chToRes: outEdges) { + for (Edge chToRes : outEdges) { ResourceHierarchy dstRes = ((ResourceNode) chToRes.getDestination()).getResourceHierarchy(); ChannelNode chNode = (ChannelNode) chToRes.getSource(); DataTransferChannel ch = chNode.getChannel(); // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (((ResourceNode) chToRes.getDestination()).getInSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } // Also take into account the channel hierarchy to determine push/pull transfer. if (descendantDstChannels.contains(chNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if (ancestorDstChannels.contains(chNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // Declare a field to refer to the destination resource of push transfer. @@ -515,13 +482,13 @@ Set descendantSrcChannels = directSrcChannel.getDescendants(); Set inEdges = new HashSet<>(); inEdges.addAll(directSrcChannel.getInEdges()); - for (ChannelNode ancestorSrc: ancestorSrcChannels) { + for (ChannelNode ancestorSrc : ancestorSrcChannels) { inEdges.addAll(ancestorSrc.getInEdges()); } - for (ChannelNode descendantSrc: descendantSrcChannels) { + for (ChannelNode descendantSrc : descendantSrcChannels) { inEdges.addAll(descendantSrc.getInEdges()); } - for (Edge resToCh: inEdges) { + for (Edge resToCh : inEdges) { // For each data transfer from srcResPath:ResourcePath to resourceNode:ResourceNode. DataFlowEdge re = (DataFlowEdge) resToCh; ChannelNode indirectSrcChNode = (ChannelNode) re.getDestination(); @@ -529,30 +496,30 @@ ResourcePath srcResPath = ((ResourceNode) re.getSource()).getOutSideResource(indirectSrcCh); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: indirectSrcCh.getInputChannelMembers()) { + for (ChannelMember cm : indirectSrcCh.getInputChannelMembers()) { if (cm.getResource().equals(srcResPath) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; ChannelMember out = null; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(cm.getResource())) { out = cm; if (cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } } // Also take into account the channel hierarchy to determine push/pull transfer. if (ancestorSrcChannels.contains(indirectSrcChNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if (descendantSrcChannels.contains(indirectSrcChNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } String srcResName = getComponentName(srcResPath.getResourceHierarchy()); ResourcePath srcRes2 = srcResPath; @@ -606,29 +573,29 @@ // Declare an update method in the type of the destination resource. ArrayList params = new ArrayList<>(); int v = 1; - for (Expression exp: out.getResource().getPathParams()) { + for (Expression exp : out.getResource().getPathParams()) { if (exp instanceof Variable) { Variable pathVar = (Variable) exp; String varName = "self" + (v > 1 ? v : ""); VariableDeclaration pathParam = new VariableDeclaration(pathVar.getType(), varName); - params.add(pathParam); // A path parameter to identify the self resource. + params.add(pathParam); // A path parameter to identify the self resource. } else if (exp instanceof Term) { Term pathVar = (Term) exp; String varName = "self" + (v > 1 ? v : ""); VariableDeclaration pathParam = new VariableDeclaration(pathVar.getType(), varName); - params.add(pathParam); // A path parameter to identify the self resource. + params.add(pathParam); // A path parameter to identify the self resource. } v++; } - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); VariableDeclaration chParam = new VariableDeclaration(selVar.getType(), selVar.getName()); - params.add(chParam); // A channel parameter to specify the context of the collaboration. + params.add(chParam); // A channel parameter to specify the context of the collaboration. } } - params.add(new VariableDeclaration(srcResPath.getResourceStateType(), toVariableName(getComponentName(srcResPath.getResourceHierarchy())))); // The state of the source resource to carry the data-flow. - for (ResourcePath ref: ch.getReferenceResources()) { + params.add(new VariableDeclaration(srcResPath.getResourceStateType(), toVariableName(getComponentName(srcResPath.getResourceHierarchy())))); // The state of the source resource to carry the data-flow. + for (ResourcePath ref : ch.getReferenceResources()) { if (!ref.equals(resourceNode.getInSideResource(ch))) { params.add(new VariableDeclaration(ref.getResourceStateType(), toVariableName(getComponentName(ref.getResourceHierarchy())))); } @@ -657,8 +624,8 @@ } // Declare a field to refer to outside resources. if (resourceNode.getParent() == null) { - for (ResourceHierarchy dependedRes: dependedRootComponentGraph.keySet()) { - for (ResourceHierarchy dependingRes: dependedRootComponentGraph.get(dependedRes)) { + for (ResourceHierarchy dependedRes : dependedRootComponentGraph.keySet()) { + for (ResourceHierarchy dependingRes : dependedRootComponentGraph.get(dependedRes)) { if (resourceNode.getResourceHierarchy().equals(dependingRes)) { // Declare a field to refer to outside resources. depends.add(dependedRes); @@ -668,7 +635,7 @@ if (component != null) { // A component is created for this resource. boolean existsField = false; - for (FieldDeclaration field: component.getFields()) { + for (FieldDeclaration field : component.getFields()) { if (field.getName().equals(refVar.getName())) { existsField = true; break; @@ -691,7 +658,7 @@ for (Channel ch : model.getChannels()) { DataTransferChannel c = (DataTransferChannel) ch; if (resourceNode.getOutSideResource(c) != null) { - for (ResourcePath res: c.getReferenceResources()) { + for (ResourcePath res : c.getReferenceResources()) { if (!refs.contains(res) && !depends.contains(res.getResourceHierarchy())) { refs.add(res); String refResName = getComponentName(res.getResourceHierarchy()); @@ -710,7 +677,7 @@ } } } - + // Declare the input method in this component and the main component. for (Channel ch : model.getInputChannels()) { for (ChannelMember cm : ((DataTransferChannel) ch).getOutputChannelMembers()) { @@ -725,35 +692,35 @@ // Channel parameters to specify the context of the collaboration. int v = 1; - for (Selector selector: ch.getSelectors()) { + for (Selector selector : ch.getSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); resInputParams.add(new VariableDeclaration(selVar.getType(), selVar.getName())); mainInputParams.add(new VariableDeclaration(selVar.getType(), selVar.getName())); } else if (selector.getExpression() instanceof Term) { Term var = (Term) selector.getExpression(); - resInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); - mainInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); + resInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); + mainInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); } v++; } if (ch.getParent() != null) { - for (Selector selector: ch.getParent().getAllSelectors()) { + for (Selector selector : ch.getParent().getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); mainInputParams.add(new VariableDeclaration(selVar.getType(), selVar.getName())); } else if (selector.getExpression() instanceof Term) { Term var = (Term) selector.getExpression(); - mainInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); + mainInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); } v++; } } // Message parameters to carry the data-flows. - for (Map.Entry varEnt: message.getVariables().entrySet()) { + for (Map.Entry varEnt : message.getVariables().entrySet()) { Variable var = varEnt.getValue(); String refVarName = null; - for (ChannelMember refCm: ((DataTransferChannel) ch).getReferenceChannelMembers()) { + for (ChannelMember refCm : ((DataTransferChannel) ch).getReferenceChannelMembers()) { Expression varExp = refCm.getStateTransition().getMessageExpression().getSubTerm(varEnt.getKey()); if (varExp != null && varExp instanceof Variable) { if (refCm.getStateTransition().getCurStateExpression().contains(varExp)) { @@ -769,8 +736,8 @@ // var has not come from a reference resource. resInputParams.add(new VariableDeclaration(var.getType(), var.getName())); boolean bExists = false; - for (VariableDeclaration mainParam: mainInputParams) { - if (mainParam.getName().equals(var.getName()) ) { + for (VariableDeclaration mainParam : mainInputParams) { + if (mainParam.getName().equals(var.getName())) { bExists = true; break; } @@ -808,9 +775,9 @@ mainComponent.addMethod(input); } else { // Add type to a parameter without type. - for (VariableDeclaration param: input.getParameters()) { + for (VariableDeclaration param : input.getParameters()) { if (param.getType() == null) { - for (VariableDeclaration p: mainInputParams) { + for (VariableDeclaration p : mainInputParams) { if (param.getName().equals(p.getName()) && p.getType() != null) { param.setType(p.getType()); } @@ -827,23 +794,23 @@ Expression param = cm.getResource().getLastParam(); if (param instanceof Variable) { Variable var = (Variable) param; - resInputParams.add(new VariableDeclaration(var.getType(), var.getName())); - mainInputParams.add(new VariableDeclaration(var.getType(), var.getName())); + resInputParams.add(new VariableDeclaration(var.getType(), var.getName())); + mainInputParams.add(new VariableDeclaration(var.getType(), var.getName())); } else if (param instanceof Term) { Term var = (Term) param; - resInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); - mainInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); + resInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); + mainInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); } v++; } if (cm.getResource().getParent() != null) { - for (Expression param: cm.getResource().getParent().getPathParams()) { + for (Expression param : cm.getResource().getParent().getPathParams()) { if (param instanceof Variable) { Variable var = (Variable) param; - mainInputParams.add(new VariableDeclaration(var.getType(), var.getName())); + mainInputParams.add(new VariableDeclaration(var.getType(), var.getName())); } else if (param instanceof Term) { Term var = (Term) param; - mainInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); + mainInputParams.add(new VariableDeclaration(var.getType(), "v" + v)); } v++; } @@ -856,7 +823,7 @@ if (resInputParams.size() > 0) { input = new MethodDeclaration(inputMethodName, false, typeVoid, resInputParams); } else { - input = new MethodDeclaration(inputMethodName, false, typeVoid, null); + input = new MethodDeclaration(inputMethodName, false, typeVoid, null); } if (component != null) { // A component is created for this resource. @@ -891,28 +858,28 @@ } // Add leaf getter methods to the parent components. - for (Map.Entry entry: getters) { + for (Map.Entry entry : getters) { resourceComponents.get(entry.getKey()).addMethod(entry.getValue()); } // Add leaf update methods to the parent components. - for (Map.Entry> entry: updates.entrySet()) { - for (MethodDeclaration update: entry.getValue().values()) { + for (Map.Entry> entry : updates.entrySet()) { + for (MethodDeclaration update : entry.getValue().values()) { resourceComponents.get(entry.getKey()).addMethod(update); } } // Add leaf input methods to the parent components. - for (Map.Entry> entry: inputs.entrySet()) { - for (MethodDeclaration input: entry.getValue().values()) { + for (Map.Entry> entry : inputs.entrySet()) { + for (MethodDeclaration input : entry.getValue().values()) { resourceComponents.get(entry.getKey()).addMethod(input); } } // Add leaf reference fields to the parent components. - for (Map.Entry entry: fields) { + for (Map.Entry entry : fields) { boolean existsField = false; - for (FieldDeclaration field: resourceComponents.get(entry.getKey()).getFields()) { + for (FieldDeclaration field : resourceComponents.get(entry.getKey()).getFields()) { if (field.getName().equals(entry.getValue().getName())) { existsField = true; break; @@ -924,10 +891,10 @@ } // Add constructor parameters to the ancestor components. - for (ResourceNode root: graph.getRootResourceNodes()) { + for (ResourceNode root : graph.getRootResourceNodes()) { addConstructorParameters(root.getResourceHierarchy(), resourceComponents, resourceConstructors, constructorParams); } - + // Declare the Pair class. boolean isCreatedPair = false; for (ResourceNode rn : resources) { @@ -945,24 +912,24 @@ block.addStatement("this.right = right;"); constructor.setBody(block); type.addMethod(constructor); - - for(FieldDeclaration field : type.getFields()) { + + for (FieldDeclaration field : type.getFields()) { MethodDeclaration getter = new MethodDeclaration( - "get" + field.getName().substring(0,1).toUpperCase() + field.getName().substring(1), - new Type("Double","T")); + "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1), + new Type("Double", "T")); getter.setBody(new Block()); getter.getBody().addStatement("return " + field.getName() + ";"); type.addMethod(getter); } - - CompilationUnit cu = new CompilationUnit(type); + + CompilationUnit cu = new CompilationUnit(type); cu.addImport(new ImportDeclaration("java.util.*")); codes.add(cu); isCreatedPair = true; } } - + // HashSet tmps = new HashSet<>(); // HashSet cont = new HashSet<>(); // for (MethodDeclaration method : mainType.getMethods()) { @@ -979,16 +946,16 @@ // } return codes; } - + private static Map> getDependedRootComponentGraph(DataTransferModel model) { Map> dependedComponentGraph = new HashMap<>(); - for (Channel ch: model.getChannels()) { + for (Channel ch : model.getChannels()) { Set inRes = new HashSet<>(); Set outRes = new HashSet<>(); getDependedRootComponentGraphSub(ch, inRes, outRes, true); if (outRes.size() > 0 && inRes.size() > 0) { - for (ResourceHierarchy out: outRes) { - for (ResourceHierarchy in: inRes) { + for (ResourceHierarchy out : outRes) { + for (ResourceHierarchy in : inRes) { Set dependings = dependedComponentGraph.get(out.getRoot()); if (dependings == null) { dependings = new HashSet<>(); @@ -1003,24 +970,24 @@ } return dependedComponentGraph; } - + private static void getDependedRootComponentGraphSub(Channel ch, Set inRes, Set outRes, boolean isRoot) { DataTransferChannel dtCh = (DataTransferChannel) ch; - for (ChannelMember cm: dtCh.getChannelMembers()) { + for (ChannelMember cm : dtCh.getChannelMembers()) { if (!isRoot && !cm.isOutside()) { - outRes.add(cm.getResource().getResourceHierarchy()); // dependency to a descendant channel resource. + outRes.add(cm.getResource().getResourceHierarchy()); // dependency to a descendant channel resource. } if (cm.isOutside()) { - outRes.add(cm.getResource().getResourceHierarchy()); // dependency to an outside resource. + outRes.add(cm.getResource().getResourceHierarchy()); // dependency to an outside resource. } else { - inRes.add(cm.getResource().getResourceHierarchy()); // dependency from an inside resource. + inRes.add(cm.getResource().getResourceHierarchy()); // dependency from an inside resource. } } - for (Channel childCh: ch.getChildren()) { + for (Channel childCh : ch.getChildren()) { getDependedRootComponentGraphSub(childCh, inRes, outRes, false); } } - + private static ArrayList determineResourceOrder(DataFlowGraph graph, Map> dependedRootComponentGraph) { ArrayList resources = new ArrayList<>(); Set visited = new HashSet<>(); @@ -1030,13 +997,13 @@ } return resources; } - + static private void topologicalSort(ResourceNode curResNode, DataFlowGraph graph, Map> dependedRootComponentGraph, Set visited, List orderedList) { if (visited.contains(curResNode)) return; visited.add(curResNode); // For each incoming PUSH transfer. - for (Edge chToRes: curResNode.getInEdges()) { - for (Edge resToCh: chToRes.getSource().getInEdges()) { + for (Edge chToRes : curResNode.getInEdges()) { + for (Edge resToCh : chToRes.getSource().getInEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; if (((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { topologicalSort((ResourceNode) re.getSource(), graph, dependedRootComponentGraph, visited, orderedList); @@ -1044,7 +1011,7 @@ } } // For each outgoing PULL transfer. - for (Edge resToCh: curResNode.getOutEdges()) { + for (Edge resToCh : curResNode.getOutEdges()) { DataFlowEdge de = (DataFlowEdge) resToCh; if (((PushPullAttribute) de.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { for (Edge chToRes : resToCh.getDestination().getOutEdges()) { @@ -1054,8 +1021,8 @@ } // For each depending root node. if (dependedRootComponentGraph.get(curResNode.getResourceHierarchy()) != null) { - for (ResourceHierarchy dependingRes: dependedRootComponentGraph.get(curResNode.getResourceHierarchy())) { - for (ResourceNode root: graph.getRootResourceNodes()) { + for (ResourceHierarchy dependingRes : dependedRootComponentGraph.get(curResNode.getResourceHierarchy())) { + for (ResourceNode root : graph.getRootResourceNodes()) { if (root.getResourceHierarchy().equals(dependingRes)) { topologicalSort(root, graph, dependedRootComponentGraph, visited, orderedList); } @@ -1063,11 +1030,11 @@ } } // For each reference resource. - for (Node n: graph.getResourceNodes()) { + for (Node n : graph.getResourceNodes()) { ResourceNode resNode = (ResourceNode) n; for (Edge resToCh : resNode.getOutEdges()) { ChannelNode chNode = (ChannelNode) resToCh.getDestination(); - for (ChannelMember m: chNode.getChannel().getReferenceChannelMembers()) { + for (ChannelMember m : chNode.getChannel().getReferenceChannelMembers()) { if (curResNode.getOutSideResources().contains(m.getResource())) { topologicalSort(resNode, graph, dependedRootComponentGraph, visited, orderedList); } @@ -1076,12 +1043,12 @@ } orderedList.add(0, curResNode); } - + private static void declareAccessorMethodInMainComponent(ResourceNode resourceNode, TypeDeclaration mainComponent) { MethodDeclaration getterAccessor = null; List mainGetterParams = new ArrayList<>(); int v = 1; - for (Expression param: resourceNode.getPrimaryResourcePath().getPathParams()) { + for (Expression param : resourceNode.getPrimaryResourcePath().getPathParams()) { if (param instanceof Variable) { Variable var = (Variable) param; mainGetterParams.add(new VariableDeclaration(var.getType(), var.getName())); @@ -1098,28 +1065,28 @@ } if (mainGetterParams.size() > 0) { getterAccessor = new MethodDeclaration("get" + getComponentName(resourceNode.getResourceHierarchy()), - false, - getImplStateType(resourceNode.getResourceHierarchy()), - mainGetterParams); + false, + getImplStateType(resourceNode.getResourceHierarchy()), + mainGetterParams); } else { getterAccessor = new MethodDeclaration("get" + getComponentName(resourceNode.getResourceHierarchy()), - getImplStateType(resourceNode.getResourceHierarchy())); + getImplStateType(resourceNode.getResourceHierarchy())); } getterAccessor.setBody(new Block()); Expression getState = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(resPath, null); - getterAccessor.getBody().addStatement("return " + getState.toImplementation(new String[] {null}) + ";"); + getterAccessor.getBody().addStatement("return " + getState.toImplementation(new String[]{null}) + ";"); mainComponent.addMethod(getterAccessor); } - + private static List addConstructorParameters(ResourceHierarchy resource, - Map resourceComponents, - Map resourceConstructors, - List> constructorParams) { + Map resourceComponents, + Map resourceConstructors, + List> constructorParams) { List params = new ArrayList<>(); - for (ResourceHierarchy child: resource.getChildren()) { + for (ResourceHierarchy child : resource.getChildren()) { params.addAll(addConstructorParameters(child, resourceComponents, resourceConstructors, constructorParams)); } - for (Entry paramEnt: constructorParams) { + for (Entry paramEnt : constructorParams) { if (paramEnt.getKey().equals(resource)) { params.add(paramEnt.getValue()); } @@ -1137,10 +1104,10 @@ } } if (constructor != null) { - for (VariableDeclaration param: params) { + for (VariableDeclaration param : params) { boolean existsParam = false; if (constructor.getParameters() != null) { - for (VariableDeclaration constParam: constructor.getParameters()) { + for (VariableDeclaration constParam : constructor.getParameters()) { if (constParam.getName().equals(param.getName())) { existsParam = true; break; @@ -1157,18 +1124,18 @@ if (resource.getNumParameters() > 0) params.clear(); return params; } - + private static String getInitializer(ResourceHierarchy res) { Type stateType = res.getResourceStateType(); String initializer = null; if (res.getInitialValue() != null) { - initializer = res.getInitialValue().toImplementation(new String[] {""}); + initializer = res.getInitialValue().toImplementation(new String[]{""}); } else if (stateType != null) { initializer = DataConstraintModel.getDefaultValue(stateType); } return initializer; } - + static public ArrayList getCodes(ArrayList codeTree) { ArrayList codes = new ArrayList<>(); for (TypeDeclaration type : codeTree) { @@ -1213,9 +1180,9 @@ } return codes; } - + private static MethodDeclaration getMethod(TypeDeclaration type, String methodName, List params) { - for (MethodDeclaration m: type.getMethods()) { + for (MethodDeclaration m : type.getMethods()) { if (m.getName().equals(methodName)) { if (m.getParameters() == null && (params == null || params.size() == 0)) return m; if (m.getParameters() != null && params != null && m.getParameters().size() == params.size()) { @@ -1232,7 +1199,7 @@ } return null; } - + static public IResourceStateAccessor pushAccessor = new IResourceStateAccessor() { @Override public Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from) { @@ -1248,7 +1215,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -1256,7 +1223,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null && targetRes.equals(fromRes)) { @@ -1296,7 +1263,7 @@ return getDirectStateAccessorFor(targetRes, null); } } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -1322,7 +1289,7 @@ return getDirectStateAccessorFor(targetRes, null); } } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null) { @@ -1337,7 +1304,7 @@ ResourcePath curPath = targetRes; do { pathStack.push(curPath); - curPath = curPath.getParent(); + curPath = curPath.getParent(); } while (!curPath.equals(fromRes)); // iterate from the fromRes resource return getRelativePath(targetRes, pathStack); @@ -1355,13 +1322,13 @@ ResourcePath curPath = targetRes; do { pathStack.push(curPath); - curPath = curPath.getParent(); + curPath = curPath.getParent(); } while (curPath != null); // iterate from the root resource return getRelativePath(targetRes, pathStack); } } - + private Expression getRelativePath(ResourcePath targetRes, Stack pathStack) { ResourcePath curPath; Term getter = null; @@ -1445,7 +1412,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -1453,7 +1420,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null && targetRes.equals(fromRes)) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java index f220abd..eac7652 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java @@ -1,68 +1,32 @@ package generators; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Stack; -import java.util.Map.Entry; - import code.ast.CompilationUnit; import code.ast.MethodDeclaration; import code.ast.TypeDeclaration; import code.ast.VariableDeclaration; import models.Edge; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Field; -import models.algebra.InvalidMessage; -import models.algebra.Parameter; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.Position; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.algebra.Variable; -import models.dataConstraintModel.Channel; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.JsonAccessor; -import models.dataConstraintModel.JsonTerm; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.DataTransferChannel; +import models.algebra.*; +import models.dataConstraintModel.*; +import models.dataFlowModel.*; import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; -import models.dataFlowModel.PushPullAttribute; -import models.dataFlowModel.PushPullValue; -import models.dataFlowModel.ChannelNode; -import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; -import models.dataFlowModel.DataFlowEdge; -import models.dataFlowModel.DataFlowGraph; -import models.dataFlowModel.ResourceNode; -import models.dataFlowModel.StoreAttribute; + +import java.util.*; +import java.util.Map.Entry; public class JavaMethodBodyGenerator { public static ArrayList doGenerate(DataFlowGraph graph, DataTransferModel model, ArrayList codes) { // Create a map from type names (lower case) to their types. Map componentMap = new HashMap<>(); - for (CompilationUnit code: codes) { - for (TypeDeclaration component: code.types()) { + for (CompilationUnit code : codes) { + for (TypeDeclaration component : code.types()) { componentMap.put(component.getTypeName(), component); } } // Generate the body of each update or getter method. try { - Map> referredResources = new HashMap<>(); - for (Edge e: graph.getEdges()) { + Map> referredResources = new HashMap<>(); + for (Edge e : graph.getEdges()) { DataFlowEdge resToCh = (DataFlowEdge) e; if (!resToCh.isChannelToResource()) { PushPullAttribute pushPull = (PushPullAttribute) resToCh.getAttribute(); @@ -74,13 +38,13 @@ Set descendantDstChannels = directDstChNode.getDescendants(); Set outEdges = new HashSet<>(); outEdges.addAll(directDstChNode.getOutEdges()); - for (ChannelNode ancestorDst: ancestorDstChannels) { + for (ChannelNode ancestorDst : ancestorDstChannels) { outEdges.addAll(ancestorDst.getOutEdges()); } - for (ChannelNode descendantDst: descendantDstChannels) { + for (ChannelNode descendantDst : descendantDstChannels) { outEdges.addAll(descendantDst.getOutEdges()); } - for (Edge chToRes: outEdges) { + for (Edge chToRes : outEdges) { ResourceNode dst = (ResourceNode) chToRes.getDestination(); String srcResourceName = JavaCodeGenerator.getComponentName(src.getResourceHierarchy()); String dstResourceName = JavaCodeGenerator.getComponentName(dst.getResourceHierarchy()); @@ -88,13 +52,13 @@ TypeDeclaration dstComponent = componentMap.get(dstResourceName); ChannelNode chNode = (ChannelNode) chToRes.getSource(); DataTransferChannel ch = chNode.getChannel(); - for (ChannelMember out: ch.getOutputChannelMembers()) { + for (ChannelMember out : ch.getOutputChannelMembers()) { if (dst.getInSideResources().contains(out.getResource())) { // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (src.getOutSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } @@ -102,10 +66,10 @@ boolean outsideOutputResource = out.isOutside(); // Take into account the channel hierarchy. if (descendantDstChannels.contains(chNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if (ancestorDstChannels.contains(chNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } if ((pushPull.getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // for push data transfer @@ -135,10 +99,10 @@ } else { // if there exists one or more reference channel member. HashMap inputResourceToStateAccessor = new HashMap<>(); - for (ChannelMember in: ch.getInputChannelMembers()) { + for (ChannelMember in : ch.getInputChannelMembers()) { inputResourceToStateAccessor.put(in, JavaCodeGenerator.pushAccessor); } - for (ChannelMember c: ch.getReferenceChannelMembers()) { + for (ChannelMember c : ch.getReferenceChannelMembers()) { inputResourceToStateAccessor.put(c, JavaCodeGenerator.refAccessor); } Term message = ch.fillOutsideResourcePaths(out, JavaCodeGenerator.pushAccessor, inputResourceToStateAccessor).getValue(); @@ -169,7 +133,7 @@ Type fieldType = JavaCodeGenerator.getImplStateType(outRes); if (updateExp instanceof Term) { ((Term) updateExp).setType(fieldType); - for (Map.Entry varEnt: ((Term) updateExp).getVariables().entrySet()) { + for (Map.Entry varEnt : ((Term) updateExp).getVariables().entrySet()) { if (varEnt.getValue().getName().equals("value")) { varEnt.getValue().setType(fieldType); } @@ -178,10 +142,10 @@ ((Variable) updateExp).setType(fieldType); } // Add statements to the update method. - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String newState = updateExp.toImplementation(sideEffects); int numOfOutResourcesWithTheSameHierarchy = 0; - for (ResourcePath outResPath: ch.getOutputResources()) { + for (ResourcePath outResPath : ch.getOutputResources()) { if (outResPath.getResourceHierarchy().equals(outRes)) { numOfOutResourcesWithTheSameHierarchy++; } @@ -198,7 +162,7 @@ } } else { if (sideEffects[0] != null) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; updateStatement = updateStatement.replace(".value", "." + JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(outRes))); if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); @@ -209,7 +173,7 @@ selector.addChild(new Field("value")); selector.addChild(new Variable(update.getParameters().get(update.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newList = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (DataConstraintModel.typeMap.isAncestorOf(outRes.getParent().getResourceStateType())) { @@ -217,7 +181,7 @@ selector.addChild(new Field("value")); selector.addChild(new Variable(update.getParameters().get(update.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newMap = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (!(updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect())) { @@ -231,11 +195,11 @@ Term conditions = null; int v = 1; Map>> resourcePaths = ch.fillOutsideResourcePaths(out, JerseyCodeGenerator.pushAccessor); - for (Expression pathParam: out.getResource().getPathParams()) { + for (Expression pathParam : out.getResource().getPathParams()) { if (pathParam instanceof Variable) { String selfParamName = ((Variable) pathParam).getName(); Expression arg = null; - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); if (selVar.getName().equals(selfParamName)) { @@ -248,20 +212,20 @@ ResourcePath filledPath = resourcePaths.get(out).getKey(); arg = filledPath.getPathParams().get(v - 1); } - Term condition = new Term(DataConstraintModel.eq, new Expression[] { - new Parameter("self" + (v > 1 ? v : ""), DataConstraintModel.typeString), + Term condition = new Term(DataConstraintModel.eq, new Expression[]{ + new Parameter("self" + (v > 1 ? v : ""), DataConstraintModel.typeString), arg}); if (conditions == null) { conditions = condition; } else { - conditions = new Term(DataConstraintModel.and, new Expression[] { - conditions, + conditions = new Term(DataConstraintModel.and, new Expression[]{ + conditions, condition}); } } 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}"); } } @@ -269,14 +233,14 @@ int inDegree = 0; Set inEdges = new HashSet<>(); inEdges.addAll(chNode.getInEdges()); - for (ChannelNode ancestor: chNode.getAncestors()) { + for (ChannelNode ancestor : chNode.getAncestors()) { inEdges.addAll(ancestor.getInEdges()); } - for (ChannelNode descendant: chNode.getDescendants()) { + for (ChannelNode descendant : chNode.getDescendants()) { inEdges.addAll(descendant.getInEdges()); } - for (Edge resToCh2: inEdges) { - DataFlowEdge df =(DataFlowEdge) resToCh2; + for (Edge resToCh2 : inEdges) { + DataFlowEdge df = (DataFlowEdge) resToCh2; if (((PushPullAttribute) df.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { inDegree++; } @@ -287,7 +251,7 @@ String cacheStatement = "this." + JavaCodeGenerator.toVariableName(srcResourceName) + " = " + JavaCodeGenerator.toVariableName(srcResourceName) + ";"; if (update.getBody() == null || !update.getBody().getStatements().contains(cacheStatement)) { update.addStatement(cacheStatement); - } + } } if (((StoreAttribute) dst.getAttribute()).isStored()) { // returns the current state stored in a field. @@ -321,7 +285,7 @@ } } } else { - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; if (DataConstraintModel.typeList.isAncestorOf(dst.getParent().getResourceStateType())) { Term selector = new Term(DataConstraintModel.get); selector.addChild(new Field("value")); @@ -340,7 +304,7 @@ } // src side (for a chain of update method invocations) ChannelMember in = null; - for (ChannelMember cm: directDstCh.getInputChannelMembers()) { + for (ChannelMember cm : directDstCh.getInputChannelMembers()) { if (src.getOutSideResources().contains(cm.getResource())) { in = cm; break; @@ -353,12 +317,12 @@ srcResName = srcResourceName; } // For caller update methods - for (MethodDeclaration srcUpdate: getUpdateMethods(srcComponent, srcResName)) { + for (MethodDeclaration srcUpdate : getUpdateMethods(srcComponent, srcResName)) { ResourcePath dstRes = out.getResource(); // Get the value of reference member to call the update method. String refParams = ""; Set referredSet = referredResources.get(srcUpdate); - for (ChannelMember rc: ch.getReferenceChannelMembers()) { + for (ChannelMember rc : ch.getReferenceChannelMembers()) { ResourcePath ref = rc.getResource(); if (referredSet == null) { referredSet = new HashSet<>(); @@ -373,7 +337,7 @@ srcRes = srcRes.getParent(); } Expression refGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(ref, srcRes); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String refExp = refGetter.toImplementation(sideEffects); String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); srcUpdate.addStatement(sideEffects[0] + refTypeName + " " + refVarName + " = " + refExp + ";"); @@ -385,7 +349,7 @@ ResourcePath filledOutsideResourcePath = null; Map>> resourcePaths = ch.fillOutsideResourcePaths(out, JavaCodeGenerator.pullAccessor); if (resourcePaths != null && resourcePaths.size() > 0) { - for (ChannelMember outsideMember: resourcePaths.keySet()) { + for (ChannelMember outsideMember : resourcePaths.keySet()) { ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); if (out.equals(outsideMember)) { filledOutsideResourcePath = outsidePath; @@ -401,16 +365,16 @@ if (outsideExp instanceof Field) { outsideExp = new Variable(((Field) outsideExp).getSymbol().getName(), ((Field) outsideExp).getType()); } else if (outsideExp instanceof Term) { - for (Entry fieldEnt: ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { + for (Entry fieldEnt : ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { Position pos = fieldEnt.getKey(); Field field = fieldEnt.getValue(); Variable var = new Variable(field.getSymbol().getName(), field.getType()); ((Term) outsideExp).replaceSubTerm(pos, var); } } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); - srcUpdate.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. + srcUpdate.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. } } // Values of path parameters to call the update method. @@ -418,7 +382,7 @@ filledOutsideResourcePath = dstRes; } String pathParams = ""; - for (Expression pathParam: filledOutsideResourcePath.getPathParams()) { + for (Expression pathParam : filledOutsideResourcePath.getPathParams()) { if (pathParam instanceof Variable) { Variable pathVar = (Variable) pathParam; pathParams += pathVar.getName() + ", "; @@ -429,7 +393,7 @@ } // Values of channel parameters to call the update method. String chParams = ""; - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); chParams += selVar.getName() + ", "; @@ -468,14 +432,14 @@ selType = ((Variable) selExp).getType(); forVarName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm :ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; } } if (insideChMem == null) { - for (ChannelMember cm :ch.getReferenceChannelMembers()) { + for (ChannelMember cm : ch.getReferenceChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -483,7 +447,7 @@ } } if (insideChMem == null) { - for (ChannelMember cm :ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -496,10 +460,10 @@ } insideResPath = insideResPath.getParent(); if (insideResPath != null) { - String parent = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getOutSideResource(directDstCh)).toImplementation(new String[] {}); + String parent = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getOutSideResource(directDstCh)).toImplementation(new String[]{}); if (selType.equals(DataConstraintModel.typeInt)) { // make a for loop (for a list) for broadcasting. - srcUpdate.addFirstStatement("for (int " + forVarName + " = 0; " + forVarName +" < " + parent + ".size(); " + forVarName + "++) {"); + srcUpdate.addFirstStatement("for (int " + forVarName + " = 0; " + forVarName + " < " + parent + ".size(); " + forVarName + "++) {"); srcUpdate.addStatement("}"); } else if (selType.equals(DataConstraintModel.typeString)) { // make a for loop (for a map) for broadcasting. @@ -514,12 +478,12 @@ } } // For caller input methods - for (MethodDeclaration srcInput: getInputMethods(srcComponent, src, model)) { + for (MethodDeclaration srcInput : getInputMethods(srcComponent, src, model)) { ResourcePath dstRes = out.getResource(); // Get the value of reference member to call the update method. String refParams = ""; Set referredSet = referredResources.get(srcInput); - for (ChannelMember rc: ch.getReferenceChannelMembers()) { + for (ChannelMember rc : ch.getReferenceChannelMembers()) { ResourcePath ref = rc.getResource(); if (referredSet == null) { referredSet = new HashSet<>(); @@ -534,7 +498,7 @@ srcRes = srcRes.getParent(); } Expression refGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(ref, srcRes); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String refExp = refGetter.toImplementation(sideEffects); String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); srcInput.addStatement(sideEffects[0] + refTypeName + " " + refVarName + " = " + refExp + ";"); @@ -546,7 +510,7 @@ ResourcePath filledOutsideResourcePath = null; Map>> resourcePaths = ch.fillOutsideResourcePaths(out, JavaCodeGenerator.pullAccessor); if (resourcePaths != null && resourcePaths.size() > 0) { - for (ChannelMember outsideMember: resourcePaths.keySet()) { + for (ChannelMember outsideMember : resourcePaths.keySet()) { ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); if (out.equals(outsideMember)) { filledOutsideResourcePath = outsidePath; @@ -562,16 +526,16 @@ if (outsideExp instanceof Field) { outsideExp = new Variable(((Field) outsideExp).getSymbol().getName(), ((Field) outsideExp).getType()); } else if (outsideExp instanceof Term) { - for (Entry fieldEnt: ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { + for (Entry fieldEnt : ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { Position pos = fieldEnt.getKey(); Field field = fieldEnt.getValue(); Variable var = new Variable(field.getSymbol().getName(), field.getType()); ((Term) outsideExp).replaceSubTerm(pos, var); } } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); - srcInput.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. + srcInput.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. } } // Values of path parameters to call the update method. @@ -579,7 +543,7 @@ filledOutsideResourcePath = dstRes; } String pathParams = ""; - for (Expression pathParam: filledOutsideResourcePath.getPathParams()) { + for (Expression pathParam : filledOutsideResourcePath.getPathParams()) { if (pathParam instanceof Variable) { Variable pathVar = (Variable) pathParam; pathParams += pathVar.getName() + ", "; @@ -590,7 +554,7 @@ } // Values of channel parameters to call the update method. String chParams = ""; - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); chParams += selVar.getName() + ", "; @@ -629,14 +593,14 @@ selType = ((Variable) selExp).getType(); varName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm :ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; } } if (insideChMem == null) { - for (ChannelMember cm :ch.getReferenceChannelMembers()) { + for (ChannelMember cm : ch.getReferenceChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -644,7 +608,7 @@ } } if (insideChMem == null) { - for (ChannelMember cm :ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -657,10 +621,10 @@ } insideResPath = insideResPath.getParent(); if (insideResPath != null) { - String parent = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getOutSideResource(directDstCh)).toImplementation(new String[] {}); + String parent = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getOutSideResource(directDstCh)).toImplementation(new String[]{}); if (selType.equals(DataConstraintModel.typeInt)) { // make a for loop (for a list) for broadcasting. - srcInput.addFirstStatement("for (int " + varName + " = 0; " + varName +" < " + parent + ".size(); " + varName + "++) {"); + srcInput.addFirstStatement("for (int " + varName + " = 0; " + varName + " < " + parent + ".size(); " + varName + "++) {"); srcInput.addStatement("}"); } else if (selType.equals(DataConstraintModel.typeString)) { // make a for loop (for a map) for broadcasting. @@ -689,15 +653,15 @@ if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) { // The first time to fill the getter method's body. // Data transfer on the same channel hierarchy. - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; boolean isContainedPush = false; Map inputResourceToStateAccessor = new HashMap<>(); - for (Edge chToRes2: dst.getInEdges()) { + for (Edge chToRes2 : dst.getInEdges()) { DataTransferChannel ch2 = ((ChannelNode) chToRes2.getSource()).getChannel(); - for (Edge resToCh2: chToRes2.getSource().getInEdges()) { + for (Edge resToCh2 : chToRes2.getSource().getInEdges()) { DataFlowEdge dIn = (DataFlowEdge) resToCh2; ChannelMember in = null; - for (ChannelMember cm: ch2.getInputChannelMembers()) { + for (ChannelMember cm : ch2.getInputChannelMembers()) { if (((ResourceNode) dIn.getSource()).getOutSideResources().contains(cm.getResource())) { in = cm; break; @@ -712,8 +676,8 @@ } } // for reference channel members - for (ChannelMember c: ch.getReferenceChannelMembers()) { - inputResourceToStateAccessor.put(c, JavaCodeGenerator.pullAccessor); // by pull data transfer + for (ChannelMember c : ch.getReferenceChannelMembers()) { + inputResourceToStateAccessor.put(c, JavaCodeGenerator.pullAccessor); // by pull data transfer } Map.Entry>>, Term> resourcePathsAndMessage; @@ -737,17 +701,17 @@ if (!chItr.hasNext()) { chItr = channelItrStack.pop(); } else { - curChannel = (DataTransferChannel) chItr.next(); + curChannel = (DataTransferChannel) chItr.next(); // generate pull data transfers. Set chMems = new HashSet<>(curChannel.getInputChannelMembers()); chMems.addAll(curChannel.getReferenceChannelMembers()); - for (ChannelMember cm2: chMems) { + for (ChannelMember cm2 : chMems) { if (resourcePaths == null || !resourcePaths.keySet().contains(cm2)) { // not a depending channel member. ResourcePath src2 = cm2.getResource(); Type srcResType2 = src2.getResourceStateType(); String srcResName2 = JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(src2.getResourceHierarchy())); - String srcGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(src2, dst.getInSideResource(curChannel)).toImplementation(new String[] {}); + String srcGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(src2, dst.getInSideResource(curChannel)).toImplementation(new String[]{}); getter.addStatement(srcResType2.getInterfaceTypeName() + " " + srcResName2 + " = " + srcGetter + ";"); } else { // a depending channel member. @@ -757,7 +721,7 @@ // generate a pull data transfer from a depending in/ref resource. Type srcResType2 = src2.getResourceStateType(); String srcResName2 = JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(src2.getResourceHierarchy())); - String dependingGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(src2, dst.getInSideResource(curChannel)).toImplementation(new String[] {}); + String dependingGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(src2, dst.getInSideResource(curChannel)).toImplementation(new String[]{}); getter.addStatement(srcResType2.getInterfaceTypeName() + " " + srcResName2 + " = " + dependingGetter + ";"); } } @@ -769,13 +733,13 @@ if (resourcePathsAndMessage != null) { resourcePaths = resourcePathsAndMessage.getKey(); Term messageTermSub = resourcePathsAndMessage.getValue(); - for (Entry fieldEnt: ((Term) messageTermSub).getSubTerms(Field.class).entrySet()) { + for (Entry fieldEnt : ((Term) messageTermSub).getSubTerms(Field.class).entrySet()) { Position pos = fieldEnt.getKey(); Field field = fieldEnt.getValue(); Variable var = new Variable(field.getSymbol().getName(), field.getType()); ((Term) messageTermSub).replaceSubTerm(pos, var); } - for (Map.Entry subTermEnt: messageTermSub.getSubTerms(Term.class).entrySet()) { + for (Map.Entry subTermEnt : messageTermSub.getSubTerms(Term.class).entrySet()) { Term subTerm = subTermEnt.getValue(); if (!(subTerm instanceof Constant) && subTerm.getSymbol().isImplWithSideEffect()) { Variable var = new Variable("v" + v, subTerm.getType()); @@ -785,7 +749,7 @@ Position pos = new Position(); pos.addHeadOrder(0); subTerm.replaceSubTerm(pos, var); - sideEffects = new String[] {""}; + sideEffects = new String[]{""}; String curState = messageTermSub.toImplementation(sideEffects); getter.addStatement(sideEffects[0].replaceAll("\n", "")); // Cancel the side effects in the return value. @@ -810,14 +774,14 @@ selType = ((Variable) selExp).getType(); varName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm2 :curChannel.getInputChannelMembers()) { + for (ChannelMember cm2 : curChannel.getInputChannelMembers()) { if (!cm2.isOutside()) { insideChMem = cm2; break; } } if (insideChMem == null) { - for (ChannelMember cm2 :curChannel.getReferenceChannelMembers()) { + for (ChannelMember cm2 : curChannel.getReferenceChannelMembers()) { if (!cm2.isOutside()) { insideChMem = cm2; break; @@ -830,10 +794,10 @@ } insideResPath = insideResPath.getParent(); if (insideResPath != null) { - String parent = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, dst.getInSideResource(ch)).toImplementation(new String[] {}); + String parent = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, dst.getInSideResource(ch)).toImplementation(new String[]{}); if (selType.equals(DataConstraintModel.typeInt)) { // make a for loop (for a list) for data collecting. - getter.addFirstStatement("for (int " + varName + " = 0; " + varName +" < " + parent + ".size(); " + varName + "++) {"); + getter.addFirstStatement("for (int " + varName + " = 0; " + varName + " < " + parent + ".size(); " + varName + "++) {"); } else if (selType.equals(DataConstraintModel.typeString)) { // make a for loop (for a map) for data collecting. getter.addFirstStatement("for (String " + varName + ": " + parent + ".keySet()) {"); @@ -841,7 +805,7 @@ } } // initialize the variables to hold side effects within the loop. - for (Variable var: varsForSideEffects) { + for (Variable var : varsForSideEffects) { getter.addFirstStatement(var.getType().getInterfaceTypeName() + " " + var.getName() + " = new " + var.getType().getImplementationTypeName() + "();"); } // end of the loop @@ -854,7 +818,7 @@ } while (!channelItrStack.isEmpty()); } // generate a return statement. - sideEffects = new String[] {""}; + sideEffects = new String[]{""}; String curState = ch.deriveUpdateExpressionOf(out, messageTerm, JavaCodeGenerator.pullAccessor).toImplementation(sideEffects); getter.addStatement(sideEffects[0] + "return " + curState + ";"); } @@ -862,18 +826,18 @@ // Update fields to refer to outside resources. Map>> resourcePaths = ch.fillOutsideResourcePaths(out, JavaCodeGenerator.pullAccessor); if (resourcePaths != null && resourcePaths.size() > 0) { - for (ChannelMember outsideMember: resourcePaths.keySet()) { + for (ChannelMember outsideMember : resourcePaths.keySet()) { ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); if (!JavaCodeGenerator.generatesComponent(outsidePath.getResourceHierarchy())) { outsidePath = outsidePath.getParent(); } String outsideResName = JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(outsidePath.getResourceHierarchy())); Set dependedMembers = resourcePaths.get(outsideMember).getValue(); - for (ChannelMember dependedMember: dependedMembers) { + for (ChannelMember dependedMember : dependedMembers) { ResourcePath dependedRes = dependedMember.getResource(); ResourceNode dependedNode = null; PushPullAttribute pushPull2 = null; - for (Edge resToCh2: resToCh.getDestination().getInEdges()) { + for (Edge resToCh2 : resToCh.getDestination().getInEdges()) { if (((ResourceNode) resToCh2.getSource()).getOutSideResources().contains(dependedRes)) { dependedNode = (ResourceNode) resToCh2.getSource(); pushPull2 = (PushPullAttribute) resToCh.getAttribute(); @@ -893,31 +857,31 @@ } if (dstComponent == dependedComponent) { // In the common parent. - if (dependedNode != null) { // Inspect further dependency. - for (Edge chToRes2: dependedNode.getInEdges()) { + if (dependedNode != null) { // Inspect further dependency. + for (Edge chToRes2 : dependedNode.getInEdges()) { DataTransferChannel ch2 = ((ChannelNode) chToRes2.getSource()).getChannel(); if (ch2.getInputChannelMembers().size() == 0) { // In an input method of the parent component. Set outs = ch2.getOutputChannelMembers(); MethodDeclaration input = getInputMethod(dependedComponent, outs.iterator().next(), outs.size()); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); - input.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. + input.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. // Update constructor. MethodDeclaration constructor = getConstructor(dependedComponent); - constructor.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // initialize the reference field. + constructor.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // initialize the reference field. } else { boolean isPush = true; - for (Edge resToCh2: chToRes2.getSource().getInEdges()) { + for (Edge resToCh2 : chToRes2.getSource().getInEdges()) { if (((PushPullAttribute) resToCh2.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { isPush = false; break; } } if (isPush) { - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); - for (Edge resToCh2: chToRes2.getSource().getInEdges()) { + for (Edge resToCh2 : chToRes2.getSource().getInEdges()) { // In an update method of the parent component. ResourceNode dependingResSrc = (ResourceNode) resToCh2.getSource(); MethodDeclaration update = null; @@ -925,13 +889,13 @@ update = getUpdateMethod(dependedComponent, null, JavaCodeGenerator.getComponentName(dependingResSrc.getResourceHierarchy())); } else { String dependingResName = JavaCodeGenerator.getComponentName(dependedRes.getResourceHierarchy()); - update = getUpdateMethod(dependedComponent, dependingResName, JavaCodeGenerator.getComponentName(dependingResSrc.getResourceHierarchy())); + update = getUpdateMethod(dependedComponent, dependingResName, JavaCodeGenerator.getComponentName(dependingResSrc.getResourceHierarchy())); } - update.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. + update.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. } // Update constructor. MethodDeclaration constructor = getConstructor(dependedComponent); - constructor.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // initialize the reference field. + constructor.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // initialize the reference field. } } } @@ -946,17 +910,17 @@ String dstResName = JavaCodeGenerator.getComponentName(dst.getResourceHierarchy()); update = getUpdateMethod(dstComponent, dstResName, JavaCodeGenerator.getComponentName(dependedRes.getResourceHierarchy())); } - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); - update.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. + update.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // change the reference field. // Update constructor. MethodDeclaration constructor = getConstructor(dstComponent); - constructor.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // initialize the reference field. + constructor.addStatement("this." + outsideResName + " = " + outsideAccessor + ";"); // initialize the reference field. } } } } - } + } } } } @@ -967,7 +931,7 @@ // for source nodes TypeDeclaration mainComponent = componentMap.get(JavaCodeGenerator.mainTypeName); - for (ResourceHierarchy resource: model.getResourceHierarchies()) { + for (ResourceHierarchy resource : model.getResourceHierarchies()) { String resourceName = JavaCodeGenerator.getComponentName(resource); TypeDeclaration component = componentMap.get(resourceName); if (JavaCodeGenerator.generatesComponent(resource)) { @@ -978,7 +942,7 @@ if (stateGetter != null && (stateGetter.getBody() == null || stateGetter.getBody().getStatements().size() == 0)) { if (model.isPrimitiveType(resourceType)) { // primitive type - stateGetter.addStatement("return value;"); + stateGetter.addStatement("return value;"); } else { if (resource.getChildren() != null && resource.getChildren().size() == 1 && resource.getChildren().iterator().next().getNumParameters() > 0) { // list or map @@ -991,13 +955,13 @@ String implTypeName = resourceType.getImplementationTypeName(); stateGetter.addStatement("return new " + implTypeName + "(value);"); } else { - Term composer = null; + Term composer = null; Term composerSub = new Constant(DataConstraintModel.nil); composerSub.setType(DataConstraintModel.typeMap); - for (ResourceHierarchy child: resource.getChildren()) { + for (ResourceHierarchy child : resource.getChildren()) { String childTypeName = JavaCodeGenerator.getComponentName(child); String fieldName = JavaCodeGenerator.toVariableName(childTypeName); - Term childGetter = null; + Term childGetter = null; if (!JavaCodeGenerator.generatesComponent(child)) { // the child is not a class childGetter = new Term(new Symbol("get" + childTypeName, 1, Symbol.Type.METHOD)); @@ -1009,18 +973,18 @@ } composer = new Term(DataConstraintModel.insert); composer.addChild(composerSub); - composer.addChild(new Constant(fieldName, DataConstraintModel.typeString)); // key - composer.addChild(childGetter); // value + 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[] sideEffects = new String[]{""}; String returnValue = composer.toImplementation(sideEffects); if (sideEffects[0] != null) { - stateGetter.addStatement(sideEffects[0] + "return " + returnValue+ ";"); + stateGetter.addStatement(sideEffects[0] + "return " + returnValue + ";"); } else { - stateGetter.addStatement("return " + returnValue+ ";"); + stateGetter.addStatement("return " + returnValue + ";"); } } } @@ -1029,7 +993,7 @@ // (#4) descendant getter method (the implementation must be kept consistent with #3) if (resource.getChildren().size() > 0) { - for (ResourceHierarchy child: resource.getChildren()) { + for (ResourceHierarchy child : resource.getChildren()) { ResourceHierarchy parent = resource; ResourceHierarchy descendant = child; Set children; @@ -1048,7 +1012,7 @@ do { String methodName = JavaCodeGenerator.getComponentName(descendant); MethodDeclaration descendantGetter = null; - for (MethodDeclaration getter: getGetterMethods(component, methodName)) { + for (MethodDeclaration getter : getGetterMethods(component, methodName)) { if ((getter.getParameters() == null && params == 0) || (getter.getParameters() != null && getter.getParameters().size() == params)) { descendantGetter = getter; break; @@ -1069,7 +1033,7 @@ selector = newSelector; } if (descendantGetter != null && (descendantGetter.getBody() == null || descendantGetter.getBody().getStatements().size() == 0)) { - String[] sideEffects = new String[] {null}; + String[] sideEffects = new String[]{null}; String returnValue = selector.toImplementation(sideEffects); if (sideEffects[0] != null) descendantGetter.addStatement(sideEffects[0]); descendantGetter.addStatement("return " + returnValue + ";"); @@ -1094,10 +1058,10 @@ // methods for input events Map> ioChannelsAndMembers = getIOChannelsAndMembers(resource, model); - for (Map.Entry> entry: ioChannelsAndMembers.entrySet()) { + for (Map.Entry> entry : ioChannelsAndMembers.entrySet()) { Set outs = entry.getValue(); DataTransferChannel ch = entry.getKey(); - for (ChannelMember out: outs) { + for (ChannelMember out : outs) { MethodDeclaration input = null; if (JavaCodeGenerator.generatesComponent(resource)) { // A component is generated for this resource. @@ -1133,7 +1097,7 @@ Type fieldType = JavaCodeGenerator.getImplStateType(outRes); if (updateExp instanceof Term) { ((Term) updateExp).setType(fieldType); - for (Map.Entry varEnt: ((Term) updateExp).getVariables().entrySet()) { + for (Map.Entry varEnt : ((Term) updateExp).getVariables().entrySet()) { if (varEnt.getValue().getName().equals("value")) { varEnt.getValue().setType(fieldType); } @@ -1142,12 +1106,12 @@ ((Variable) updateExp).setType(fieldType); } // Add statements to the input method. - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String newState = updateExp.toImplementation(sideEffects); if (JavaCodeGenerator.generatesComponent(resource)) { String updateStatement; if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); } @@ -1160,7 +1124,7 @@ } else { String updateStatement = ""; if (sideEffects[0] != null) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; updateStatement = updateStatement.replace(".value", "." + JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(resource))); if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); @@ -1171,7 +1135,7 @@ selector.addChild(new Field("value")); selector.addChild(new Variable(input.getParameters().get(input.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newList = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (DataConstraintModel.typeMap.isAncestorOf(resource.getParent().getResourceStateType())) { @@ -1179,7 +1143,7 @@ selector.addChild(new Field("value")); selector.addChild(new Variable(input.getParameters().get(input.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newMap = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (!(updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect())) { @@ -1202,7 +1166,7 @@ MethodDeclaration inputAccessor = getMethod(mainComponent, inputAccessorName); if (inputAccessor != null) { Set referredSet = referredResources.get(input); - for (ChannelMember rc: ch.getReferenceChannelMembers()) { + for (ChannelMember rc : ch.getReferenceChannelMembers()) { // For each reference channel member, get the current state of the reference side resource by pull data transfer. ResourcePath ref = rc.getResource(); if (referredSet == null) { @@ -1214,7 +1178,7 @@ if (!referredSet.contains(ref)) { referredSet.add(ref); Expression refGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(ref, null); - sideEffects = new String[] {""}; + sideEffects = new String[]{""}; String refExp = refGetter.toImplementation(sideEffects); String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); inputAccessor.addFirstStatement(sideEffects[0] + refTypeName + " " + refVarName + " = " + refExp + ";"); @@ -1226,13 +1190,13 @@ if (resExp instanceof Term) { // to access the parent if (((Term) resExp).getChildren().size() > 1 && ((Term) resExp).getChild(1) instanceof Variable) { - args.add(((Variable)((Term) resExp).getChild(1)).getName()); + args.add(((Variable) ((Term) resExp).getChild(1)).getName()); } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {null}); + String resourceAccess = resExp.toImplementation(new String[]{null}); // Values of channel parameters. - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); if (!args.contains(selVar.getName())) { @@ -1242,9 +1206,9 @@ } // Values of message parameters. if (message instanceof Term) { - for (Map.Entry varEnt: message.getVariables().entrySet()) { + for (Map.Entry varEnt : message.getVariables().entrySet()) { String refVarName = null; - for (ChannelMember rc: ch.getReferenceChannelMembers()) { + for (ChannelMember rc : ch.getReferenceChannelMembers()) { Expression varExp = rc.getStateTransition().getMessageExpression().getSubTerm(varEnt.getKey()); if (varExp != null && rc.getStateTransition().getCurStateExpression().contains(varExp)) { refVarName = rc.getResource().getLeafResourceName(); @@ -1264,7 +1228,7 @@ } String argsStr = ""; String delimiter = ""; - for (String arg: args) { + for (String arg : args) { argsStr += delimiter + arg; delimiter = ", "; } @@ -1276,12 +1240,12 @@ } } } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e1) { + | InvalidMessage | UnificationFailed | ValueUndefined e1) { e1.printStackTrace(); } return codes; } - + private static void replaceJsonTermWithConstructorInvocation(Expression exp, Type replacedJsonType, String replacingClassName, TypeDeclaration descendantComponent) { // Replace each json term in exp with the corresponding constructor invocation. Type descendantType = new Type(replacingClassName, replacingClassName); @@ -1297,12 +1261,12 @@ MethodDeclaration descendantConstructor = getConstructor(descendantComponent); String delimiter = ""; if (descendantConstructor != null) { - for (VariableDeclaration var: descendantConstructor.getParameters()) { + for (VariableDeclaration var : descendantConstructor.getParameters()) { // Extract the argument of each constructor parameter from jsonTerm. JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); jsonMember.addChild(jsonTerm); jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); - Expression param = jsonMember.reduce(); // Reduce {"name": "foo", age: 25}.name => "foo" + Expression param = jsonMember.reduce(); // Reduce {"name": "foo", age: 25}.name => "foo" if (param != null) { if (param instanceof Term) { if (((Term) param).getType() == null) { @@ -1329,10 +1293,10 @@ } } 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()) { + 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); @@ -1340,16 +1304,16 @@ } } } - + private static MethodDeclaration getConstructor(TypeDeclaration component) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.isConstructor()) return m; } return null; } - + private static MethodDeclaration getUpdateMethod(TypeDeclaration component, String dstResName, String srcResName) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (dstResName == null) { if (m.getName().equals("updateFrom" + srcResName)) return m; } else { @@ -1358,10 +1322,10 @@ } return null; } - + private static List getUpdateMethods(TypeDeclaration component, String resName) { List updates = new ArrayList<>(); - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (resName == null) { if (m.getName().startsWith("updateFrom")) { updates.add(m); @@ -1376,7 +1340,7 @@ } private static MethodDeclaration getGetterMethod(TypeDeclaration component, String resourceName) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().startsWith("get" + resourceName)) return m; } return null; @@ -1384,7 +1348,7 @@ private static List getGetterMethods(TypeDeclaration component, String resourceName) { List getters = new ArrayList<>(); - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().equals("get" + resourceName)) { getters.add(m); } @@ -1394,10 +1358,10 @@ private static Map> getIOChannelsAndMembers(ResourceHierarchy resource, DataTransferModel model) { Map> ioChannelsAndMembers = new HashMap<>(); - for (Channel c: model.getInputChannels()) { + for (Channel c : model.getInputChannels()) { DataTransferChannel ch = (DataTransferChannel) c; // I/O channel - for (ChannelMember out: ch.getOutputChannelMembers()) { + for (ChannelMember out : ch.getOutputChannelMembers()) { if (resource.equals(out.getResource().getResourceHierarchy())) { if (out.getStateTransition().getMessageExpression() instanceof Term || out.getStateTransition().getMessageExpression() instanceof Variable) { Set channelMembers = ioChannelsAndMembers.get(ch); @@ -1412,13 +1376,13 @@ } return ioChannelsAndMembers; } - + private static List getInputMethods(TypeDeclaration component, ResourceNode resource, DataTransferModel model) { List inputs = new ArrayList<>(); - for (Channel c: model.getInputChannels()) { + for (Channel c : model.getInputChannels()) { DataTransferChannel channel = (DataTransferChannel) c; // I/O channel - for (ChannelMember out: channel.getOutputChannelMembers()) { + for (ChannelMember out : channel.getOutputChannelMembers()) { if (resource.getInSideResources().contains(out.getResource())) { MethodDeclaration input = getInputMethod(component, out, channel.getOutputChannelMembers().size()); inputs.add(input); @@ -1427,13 +1391,13 @@ } return inputs; } - + private static List getInputMethods(TypeDeclaration component, ResourceHierarchy resource, DataTransferModel model) { List inputs = new ArrayList<>(); - for (Channel c: model.getInputChannels()) { + for (Channel c : model.getInputChannels()) { DataTransferChannel channel = (DataTransferChannel) c; // I/O channel - for (ChannelMember out: channel.getOutputChannelMembers()) { + for (ChannelMember out : channel.getOutputChannelMembers()) { if (resource.equals(out.getResource().getResourceHierarchy())) { MethodDeclaration input = getInputMethod(component, out, channel.getOutputChannelMembers().size()); inputs.add(input); @@ -1442,12 +1406,12 @@ } return inputs; } - + private static MethodDeclaration getInputMethod(TypeDeclaration component, ChannelMember cm, int outNumber) { String inputMethodName = null; if (cm.getStateTransition().getMessageExpression() instanceof Term) { Term message = (Term) cm.getStateTransition().getMessageExpression(); - inputMethodName =message.getSymbol().getImplName(); + inputMethodName = message.getSymbol().getImplName(); } else if (cm.getStateTransition().getMessageExpression() instanceof Variable) { Variable message = (Variable) cm.getStateTransition().getMessageExpression(); inputMethodName = message.getName(); @@ -1458,9 +1422,9 @@ MethodDeclaration input = getMethod(component, inputMethodName); return input; } - + private static MethodDeclaration getMethod(TypeDeclaration component, String methodName) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().equals(methodName)) return m; } return null; diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java index 58357f2..ae17189 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java @@ -1,32 +1,25 @@ package generators; -import java.util.ArrayList; -import java.util.List; - -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.ImportDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; +import code.ast.*; import models.algebra.Expression; -import models.algebra.Parameter; import models.algebra.Term; import models.algebra.Type; import models.algebra.Variable; import models.dataConstraintModel.DataConstraintModel; +import java.util.List; + public class JavaSpecific implements ILanguageSpecific { public static final Type typeVoid = new Type("Void", "void"); public static final String self = "this"; - + @Override public CompilationUnit newCompilationUnit(TypeDeclaration component) { CompilationUnit cu = new CompilationUnit(component); cu.addImport(new ImportDeclaration("java.util.*")); return cu; } - + @Override public TypeDeclaration newTypeDeclaration(String typeName) { return new TypeDeclaration(typeName); @@ -36,7 +29,7 @@ public VariableDeclaration newVariableDeclaration(Type type, String varName) { return new VariableDeclaration(type, varName); } - + @Override public MethodDeclaration newMethodDeclaration(String methodName, Type returnType) { if (returnType == null) { @@ -44,7 +37,7 @@ } return new MethodDeclaration(methodName, returnType); } - + @Override public MethodDeclaration newMethodDeclaration(String methodName, boolean isConstructor, Type returnType, List parameters) { if (returnType == null && !isConstructor) { @@ -52,12 +45,12 @@ } return new MethodDeclaration(methodName, isConstructor, returnType, parameters); } - + @Override public FieldDeclaration newFieldDeclaration(Type fieldType, String fieldName) { return new FieldDeclaration(fieldType, fieldName); } - + @Override public FieldDeclaration newFieldDeclaration(Type fieldType, String fieldName, String fieldInitializer) { return new FieldDeclaration(fieldType, fieldName, fieldInitializer); @@ -65,12 +58,12 @@ @Override public Type newListType(String compTypeName) { - return new Type("List", "ArrayList<>", "List<" + compTypeName + ">", DataConstraintModel.typeList); + return new Type("List", "ArrayList<>", "List<" + compTypeName + ">", DataConstraintModel.typeList); } @Override public Type newMapType(Type keyType, String valueTypeName) { - return new Type("Map", "HashMap<>", "Map<" + keyType.getImplementationTypeName() + ", " + valueTypeName + ">", DataConstraintModel.typeMap); + return new Type("Map", "HashMap<>", "Map<" + keyType.getImplementationTypeName() + ", " + valueTypeName + ">", DataConstraintModel.typeMap); } @Override @@ -94,23 +87,23 @@ Type newTupleType = new Type("Tuple", implTypeName, interfaceTypeName, DataConstraintModel.typeTuple); return newTupleType; } - + @Override public String getVariableDeclaration(String typeName, String varName) { return typeName + " " + varName; } - + @Override public String getFieldInitializer(Type type, Expression initialValue) { String initializer = null; if (initialValue != null) { - initializer = initialValue.toImplementation(new String[] {""}); + initializer = initialValue.toImplementation(new String[]{""}); } else if (type != null) { initializer = DataConstraintModel.getDefaultValue(type); } return initializer; } - + @Override public boolean declareField() { return true; @@ -130,10 +123,10 @@ public String getMethodInvocation(String methodName) { return self + "." + methodName + "()"; } - + @Override public String getMethodInvocation(String methodName, List parameters) { - if (parameters == null) return getMethodInvocation( methodName); + if (parameters == null) return getMethodInvocation(methodName); String invocation = self + "." + methodName + "("; if (parameters.size() > 0) { for (int i = 0; i < parameters.size(); i++) { @@ -147,12 +140,12 @@ invocation += ")"; return invocation; } - + @Override public String getMethodInvocation(String receiverName, String methodName) { return receiverName + "." + methodName + "()"; } - + @Override public String getMethodInvocation(String receiverName, String methodName, List parameters) { if (parameters == null) return getMethodInvocation(receiverName, methodName); @@ -169,7 +162,7 @@ invocation += ")"; return invocation; } - + @Override public String getConstructorInvocation(String componentName, List parameters) { String invocation = "new " + componentName + "("; @@ -185,77 +178,77 @@ invocation += ")"; return invocation; } - + @Override public String getReturnStatement(String returnValue) { return "return " + returnValue; } - + @Override public String getIfStatement(Term condition, String block) { - return "if (" + condition.toImplementation(new String[] {})+ ") {\n" + "\t" + block.replace("\n", "\n\t") + "\n}"; + return "if (" + condition.toImplementation(new String[]{}) + ") {\n" + "\t" + block.replace("\n", "\n\t") + "\n}"; } - + @Override public String getForStatementForList(String varName, String list) { return "for (int " + varName + getAssignment() + "0; " + varName + " < " + list + ".size(); " + varName + "++) {"; } - + @Override public String getForStatementForCollection(String varName, String varType, String collection) { return "for (" + varType + " " + varName + ": " + collection + ") {"; } - + @Override public String getForStatementForMap(String varName, String varType, String map) { return "for (" + varType + " " + varName + ": " + map + ".keySet()) {"; } - + @Override public String getEndForStatement() { return "}"; } - + @Override public String getEndForStatement(String varName) { return "}"; } - + @Override public String toComponentName(String name) { return name.substring(0, 1).toUpperCase() + name.substring(1); } - + @Override public String toVariableName(String name) { return name.substring(0, 1).toLowerCase() + name.substring(1); } - + @Override public String getMainComponentName() { return "Main"; } - + @Override public String getAssignment() { return " = "; } - + @Override public String getStatementDelimiter() { return ";"; } - + @Override public String getStringDelimiter() { return "\""; } - + @Override public String getOpeningScoreDelimiter() { return "{"; } - + @Override public String getClosingScoreDelimiter() { return "}"; @@ -271,11 +264,11 @@ return "Double.toString(" + valueExp + ")"; } else if (typeName.equals("boolean")) { return "Boolean.toString(" + valueExp + ")"; - } else { + } else { return valueExp + ".toString()"; } } - + @Override public String getStringToValueExp(String typeName, String strExp) { if (typeName.equals("int")) { @@ -292,22 +285,22 @@ return strExp; } } - + @Override public String getPairExp(String first, String second) { return getConstructorInvocation(DataConstraintModel.typeTuple.getImplementationTypeName() + "<>", List.of(first, second)); } - + @Override public String getFirstEntryFromMapExp(String map) { return getMethodInvocation(map, "entrySet().iterator().next"); } - + @Override public String getTupleGet(String tupleExp, int idx, int length) { Expression t = new Variable(tupleExp, DataConstraintModel.typeTuple); for (int i = 0; i < idx; i++) { - Term next = new Term(DataConstraintModel.snd); + Term next = new Term(DataConstraintModel.snd); next.addChild(t); t = next; } @@ -318,25 +311,25 @@ } return t.toImplementation(new String[]{}); } - + @Override public String getDecomposedTuple(String tupleExp, VariableDeclaration tupleVar, List vars) { String statements = ""; statements += getVariableDeclaration(tupleVar.getType().getInterfaceTypeName(), tupleVar.getName()) - + getAssignment() + tupleExp + getStatementDelimiter(); + + getAssignment() + tupleExp + getStatementDelimiter(); for (int i = 0; i < vars.size(); i++) { VariableDeclaration var = vars.get(i); statements += "\n" + getVariableDeclaration(var.getType().getInterfaceTypeName(), var.getName()) - + getAssignment() - + getTupleGet(tupleVar.getName(), i, vars.size()) - + getStatementDelimiter(); + + getAssignment() + + getTupleGet(tupleVar.getName(), i, vars.size()) + + getStatementDelimiter(); } return statements; } - + @Override public boolean isValueType(Type type) { - if (type == DataConstraintModel.typeInt + if (type == DataConstraintModel.typeInt || type == DataConstraintModel.typeLong || type == DataConstraintModel.typeFloat || type == DataConstraintModel.typeDouble @@ -345,7 +338,7 @@ } return false; } - + @Override public boolean isVoidType(Type type) { @@ -363,7 +356,7 @@ return wrapperType; return type.getImplementationTypeName(); } - + private String getInterfaceTypeName(Type type) { if (type == null) return "Object"; diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java index b744713..33488cb 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java @@ -1,53 +1,18 @@ package generators; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Stack; - -import code.ast.Annotation; -import code.ast.Block; -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.ImportDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; +import code.ast.*; import models.Edge; import models.Node; -import models.algebra.Expression; -import models.algebra.Field; -import models.algebra.Parameter; -import models.algebra.Position; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.Variable; -import models.dataConstraintModel.Channel; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.DataTransferChannel; +import models.algebra.*; +import models.dataConstraintModel.*; +import models.dataFlowModel.*; import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; -import models.dataFlowModel.PushPullAttribute; -import models.dataFlowModel.PushPullValue; -import models.dataFlowModel.DataFlowEdge; -import models.dataFlowModel.DataFlowGraph; -import models.dataFlowModel.ResourceNode; -import models.dataFlowModel.ChannelNode; -import models.dataFlowModel.StoreAttribute; + +import java.util.*; /** * Generator for Jersey prototypes - * + * * @author Nitta * */ @@ -57,19 +22,19 @@ public static boolean differentTreesAsDifferentServices = true; private static String defaultMainTypeName = "Main"; static String mainTypeName = defaultMainTypeName; - + public static String getMainTypeName() { return mainTypeName; } - + public static void setMainTypeName(String mainTypeName) { JerseyCodeGenerator.mainTypeName = mainTypeName; } - + public static void resetMainTypeName() { JerseyCodeGenerator.mainTypeName = defaultMainTypeName; } - + public static String getComponentName(ResourceHierarchy res) { String name = res.getResourceName(); if (res.getNumParameters() > 0) { @@ -119,17 +84,19 @@ } } } - + public static boolean generatesComponent(ResourceHierarchy res) { if (res.getParent() == null) return true; if (res.getChildren() == null || res.getChildren().size() == 0) return false; - if (res.getNumParameters() > 0 && res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0) return false; - if (res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0 - && (res.getChildren().iterator().next().getChildren() == null || res.getChildren().iterator().next().getChildren().size() == 0)) return false; + if (res.getNumParameters() > 0 && res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0) + return false; + if (res.getChildren().size() == 1 && res.getChildren().iterator().next().getNumParameters() > 0 + && (res.getChildren().iterator().next().getChildren() == null || res.getChildren().iterator().next().getChildren().size() == 0)) + return false; return true; // return res.getParent() == null || !(res.getChildren() == null || res.getChildren().size() == 0); } - + static public ArrayList doGenerate(DataFlowGraph graph, DataTransferModel model) { ArrayList codes = new ArrayList<>(); // ArrayList resources = StoreResourceCheck(graph); @@ -145,14 +112,14 @@ Map> inputAccessors = new HashMap<>(); Map> constructorParams = new HashMap<>(); Map priorMemberForInputChannel = new HashMap<>(); - + // For each resource node. for (Node n : resources) { ResourceNode resourceNode = (ResourceNode) n; TypeDeclaration component = null; if (generatesComponent(resourceNode.getResourceHierarchy())) { String resourceName = getComponentName(resourceNode.getResourceHierarchy()); - + component = resourceComponents.get(resourceNode.getResourceHierarchy()); if (component == null) { // Add compilation unit for each resource. @@ -202,14 +169,14 @@ component.addField(new FieldDeclaration(getImplStateType(res), "value", getInitializer(res))); } else { // class - for (ResourceHierarchy c: children) { + for (ResourceHierarchy c : children) { String childTypeName = getComponentName(c); Type childType = null; if (generatesComponent(c)) { // The child has a component. childType = new Type(childTypeName, childTypeName); String fieldName = toVariableName(childTypeName); - component.addField(new FieldDeclaration(childType, fieldName, "new " + childTypeName + "()")); + component.addField(new FieldDeclaration(childType, fieldName, "new " + childTypeName + "()")); } } } @@ -232,7 +199,7 @@ descendants = new HashSet<>(); descendantGetters.put(resourceNode.getResourceHierarchy(), descendants); } - for (ResourceNode child: resourceNode.getChildren()) { + for (ResourceNode child : resourceNode.getChildren()) { // A descendant of the child may generate a component. List pathParams = new ArrayList<>(); int v = 1; @@ -270,7 +237,7 @@ } while (childNodes != null && childNodes.size() == 1 && (descendant = childNodes.iterator().next()) != null); } } - + // // Declare a client field to connect to the source resource of reference transfer. // if (!bDeclareClientField) { // for (ChannelGenerator cg : model.getChannelGenerators()) { @@ -298,13 +265,13 @@ for (Edge resToCh : resourceNode.getOutEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; DataTransferChannel ch = ((ChannelNode) re.getDestination()).getChannel(); - for (Edge chToRes: re.getDestination().getOutEdges()) { + for (Edge chToRes : re.getDestination().getOutEdges()) { ResourceHierarchy dstRes = ((ResourceNode) chToRes.getDestination()).getResourceHierarchy(); // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (((ResourceNode) chToRes.getDestination()).getInSideResources().contains(cm.getResource()) && cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } @@ -315,13 +282,13 @@ } String dstResName = getComponentName(dstRes); // if (resourceNode.getOutSideResource().getCommonPrefix(dstRes) == null && differentTreesAsDifferentServices) { - // Inter-service - if (!bDeclareClientField) { - // Declare a client field to connect to the destination resource of push transfer. - FieldDeclaration clientField = new FieldDeclaration(typeClient, "client", "ClientBuilder.newClient()"); - fields.add(new AbstractMap.SimpleEntry<>(resourceNode.getParent().getResourceHierarchy(), clientField)); - bDeclareClientField = true; - } + // Inter-service + if (!bDeclareClientField) { + // Declare a client field to connect to the destination resource of push transfer. + FieldDeclaration clientField = new FieldDeclaration(typeClient, "client", "ClientBuilder.newClient()"); + fields.add(new AbstractMap.SimpleEntry<>(resourceNode.getParent().getResourceHierarchy(), clientField)); + bDeclareClientField = true; + } // } else { // // Inner-service // // Declare a field to directly refer to the destination resource of push transfer. @@ -334,15 +301,15 @@ } } for (Edge chToRes : resourceNode.getInEdges()) { - for (Edge resToCh: chToRes.getSource().getInEdges()) { + for (Edge resToCh : chToRes.getSource().getInEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; DataTransferChannel ch = ((ChannelNode) re.getDestination()).getChannel(); ResourcePath srcRes = ((ResourceNode) re.getSource()).getOutSideResource(ch); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (cm.getResource().equals(srcRes) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } @@ -353,13 +320,13 @@ } String srcResName = getComponentName(srcRes.getResourceHierarchy()); // if (resourceNode.getOutSideResource().getCommonPrefix(srcRes) == null && differentTreesAsDifferentServices) { - // Inter-service - if (!bDeclareClientField) { - // Declare a client field to connect to the source resource of pull transfer. - FieldDeclaration clientField = new FieldDeclaration(typeClient, "client", "ClientBuilder.newClient()"); - fields.add(new AbstractMap.SimpleEntry<>(resourceNode.getParent().getResourceHierarchy(), clientField)); - bDeclareClientField = true; - } + // Inter-service + if (!bDeclareClientField) { + // Declare a client field to connect to the source resource of pull transfer. + FieldDeclaration clientField = new FieldDeclaration(typeClient, "client", "ClientBuilder.newClient()"); + fields.add(new AbstractMap.SimpleEntry<>(resourceNode.getParent().getResourceHierarchy(), clientField)); + bDeclareClientField = true; + } // } else { // // Inner-service // // Declare a field to directly refer to the source resource of pull transfer. @@ -378,7 +345,7 @@ String resName = getComponentName(res); FieldDeclaration stateField = new FieldDeclaration(res.getResourceStateType(), toVariableName(resName)); fields.add(new AbstractMap.SimpleEntry<>(resourceNode.getParent().getResourceHierarchy(), stateField)); - + Map nameToParam = constructorParams.get(resourceNode.getParent().getResourceHierarchy()); if (nameToParam == null) { @@ -417,10 +384,10 @@ } String getterName = "get" + getComponentName(resourceNode.getResourceHierarchy()); boolean bExists = false; - for (Map.Entry entry: getters) { + for (Map.Entry entry : getters) { ResourceHierarchy r = entry.getKey(); MethodDeclaration m = entry.getValue(); - if (r == ancestorNode.getResourceHierarchy() && m.getName().equals(getterName) + if (r == ancestorNode.getResourceHierarchy() && m.getName().equals(getterName) && (m.getParameters() == null ? 0 : m.getParameters().size()) == pathParams.size()) { bExists = true; break; @@ -451,12 +418,12 @@ } if (mainGetterParams.size() > 0) { getterAccessor = new MethodDeclaration("get" + getComponentName(resourceNode.getResourceHierarchy()) + "Value", - false, - getImplStateType(resourceNode.getResourceHierarchy()), - mainGetterParams); + false, + getImplStateType(resourceNode.getResourceHierarchy()), + mainGetterParams); } else { getterAccessor = new MethodDeclaration("get" + getComponentName(resourceNode.getResourceHierarchy()) + "Value", - getImplStateType(resourceNode.getResourceHierarchy())); + getImplStateType(resourceNode.getResourceHierarchy())); } getterAccessor.setBody(new Block()); ResourcePath resPath = new ResourcePath(resourceNode.getPrimaryResourcePath()); @@ -465,7 +432,7 @@ resPath.replacePathParam(i, pathParam, null); } Expression getState = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(resPath, resPath.getRoot()); - getterAccessor.getBody().addStatement("return " + getState.toImplementation(new String[] {null}) + ";"); + getterAccessor.getBody().addStatement("return " + getState.toImplementation(new String[]{null}) + ";"); getterAccessor.addAnnotation(new Annotation("Produces", "MediaType.APPLICATION_JSON")); getterAccessor.addAnnotation(new Annotation("GET")); @@ -476,15 +443,15 @@ } // Declare a client field for push data transfer. - for (Edge resToCh: resourceNode.getOutEdges()) { + for (Edge resToCh : resourceNode.getOutEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; ChannelNode directDstChNode = (ChannelNode) re.getDestination(); DataTransferChannel directDstCh = directDstChNode.getChannel(); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: directDstCh.getInputChannelMembers()) { + for (ChannelMember cm : directDstCh.getInputChannelMembers()) { if (cm.getResource().equals(resourceNode.getOutSideResource(directDstCh)) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } @@ -493,13 +460,13 @@ Set descendantDstChannels = directDstChNode.getDescendants(); Set outEdges = new HashSet<>(); outEdges.addAll(directDstChNode.getOutEdges()); - for (ChannelNode ancestorDst: ancestorDstChannels) { + for (ChannelNode ancestorDst : ancestorDstChannels) { outEdges.addAll(ancestorDst.getOutEdges()); } - for (ChannelNode descendantDst: descendantDstChannels) { + for (ChannelNode descendantDst : descendantDstChannels) { outEdges.addAll(descendantDst.getOutEdges()); } - for (Edge chToRes: outEdges) { + for (Edge chToRes : outEdges) { // For each data transfer to dstNode:ResourceNode. ResourceNode dstNode = ((ResourceNode) chToRes.getDestination()); ChannelNode chNode = (ChannelNode) chToRes.getSource(); @@ -507,7 +474,7 @@ // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; ChannelMember out = null; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (dstNode.getInSideResources().contains(cm.getResource())) { out = cm; if (cm.isOutside()) { @@ -519,10 +486,10 @@ ResourcePath dstRes = out.getResource(); // Also take into account the channel hierarchy to determine push/pull transfer. if (descendantDstChannels.contains(chNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if (ancestorDstChannels.contains(chNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } if (!bDeclareClientField && ((((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource)) { // For push transfer. @@ -573,13 +540,13 @@ Set descendantSrcChannels = directSrcChannel.getDescendants(); Set inEdges = new HashSet<>(); inEdges.addAll(directSrcChannel.getInEdges()); - for (ChannelNode ancestorSrc: ancestorSrcChannels) { + for (ChannelNode ancestorSrc : ancestorSrcChannels) { inEdges.addAll(ancestorSrc.getInEdges()); } - for (ChannelNode descendantSrc: descendantSrcChannels) { + for (ChannelNode descendantSrc : descendantSrcChannels) { inEdges.addAll(descendantSrc.getInEdges()); } - for (Edge resToCh: inEdges) { + for (Edge resToCh : inEdges) { // For each data transfer from srcResPath:ResourcePath to resourceNode:ResourceNode. DataFlowEdge re = (DataFlowEdge) resToCh; ChannelNode indirectSrcChNode = (ChannelNode) re.getDestination(); @@ -587,30 +554,30 @@ ResourcePath srcResPath = ((ResourceNode) re.getSource()).getOutSideResource(indirectSrcCh); // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; - for (ChannelMember cm: indirectSrcCh.getInputChannelMembers()) { + for (ChannelMember cm : indirectSrcCh.getInputChannelMembers()) { if (cm.getResource().equals(srcResPath) && cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = false; ChannelMember out = null; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(cm.getResource())) { out = cm; if (cm.isOutside()) { - outsideOutputResource = true; // Regarded as push transfer. + outsideOutputResource = true; // Regarded as push transfer. break; } } } // Also take into account the channel hierarchy to determine push/pull transfer. if (ancestorSrcChannels.contains(indirectSrcChNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if (descendantSrcChannels.contains(indirectSrcChNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } String srcResName = getComponentName(srcResPath.getResourceHierarchy()); Type srcType = srcResPath.getResourceStateType(); @@ -663,20 +630,21 @@ } // Declare an update method in the type of the destination resource. ArrayList params = new ArrayList<>(); - getUpdateResourcePathAndPathParams(out.getResource(), params, isRestAPI); // Path parameters to identify the self resource. - for (Selector selector: ch.getAllSelectors()) { + getUpdateResourcePathAndPathParams(out.getResource(), params, isRestAPI); // Path parameters to identify the self resource. + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); VariableDeclaration chParam = new VariableDeclaration(selVar.getType(), selVar.getName()); - if (isRestAPI) chParam.addAnnotation(new Annotation("FormParam", "\"" + selVar.getName() + "\"")); - params.add(chParam); // A channel parameter to specify the context of the collaboration. + if (isRestAPI) + chParam.addAnnotation(new Annotation("FormParam", "\"" + selVar.getName() + "\"")); + params.add(chParam); // A channel parameter to specify the context of the collaboration. } } String srcName = toVariableName(srcResName); VariableDeclaration param = new VariableDeclaration(srcType, srcName); if (isRestAPI) param.addAnnotation(new Annotation("FormParam", "\"" + srcName + "\"")); - params.add(param); // The state of the source resource to carry the data-flow. - for (ResourcePath refRes: ch.getReferenceResources()) { + params.add(param); // The state of the source resource to carry the data-flow. + for (ResourcePath refRes : ch.getReferenceResources()) { if (!refRes.equals(resourceNode.getInSideResource(ch))) { String refName = toVariableName(getComponentName(refRes.getResourceHierarchy())); param = new VariableDeclaration(refRes.getResourceStateType(), refName); @@ -696,7 +664,7 @@ // Determine whether the update method is put or post or delete. boolean isPut = false; boolean isDelete = false; - for (ChannelMember cm: ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (resourceNode.getInSideResources().contains(cm.getResource())) { if (cm.getStateTransition().isRightUnary()) { isPut = true; @@ -740,7 +708,7 @@ update.addAnnotation(new Annotation("PUT")); } else { if (!isDelete) { - update.addAnnotation(new Annotation("POST")); + update.addAnnotation(new Annotation("POST")); } else { update.addAnnotation(new Annotation("DELETE")); } @@ -748,10 +716,10 @@ } // Calculate in-degree of the destination resource. Set inResources = new HashSet<>(); - for (ResourceNode rn: graph.getResourceNodes(out.getResource().getResourceHierarchy())) { + for (ResourceNode rn : graph.getResourceNodes(out.getResource().getResourceHierarchy())) { // ResourceNodes that have the same ResourceHierarchy. - for (Edge chToRes2: rn.getInEdges()) { - for (Edge resToCh2: chToRes2.getSource().getInEdges()) { + for (Edge chToRes2 : rn.getInEdges()) { + for (Edge resToCh2 : chToRes2.getSource().getInEdges()) { inResources.add(((ResourceNode) resToCh2.getSource()).getResourceHierarchy()); } } @@ -770,7 +738,7 @@ fields.add(new AbstractMap.SimpleEntry<>(resourceNode.getParent().getResourceHierarchy(), cacheField)); } if (inDegree > 1) { - // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. + // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. if (isRestAPI) update.addAnnotation(new Annotation("Path", "\"/" + srcName + "\"")); } } @@ -793,24 +761,24 @@ // Declare an update accessor method in the type of root resource. String updateMethodName = update.getName(); params = new ArrayList<>(); - String resourcePath = getUpdateResourcePathAndPathParams(out.getResource(), params, true); // Path parameters to identify the self resource. - for (Selector selector: ch.getAllSelectors()) { + String resourcePath = getUpdateResourcePathAndPathParams(out.getResource(), params, true); // Path parameters to identify the self resource. + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); VariableDeclaration chParam = new VariableDeclaration(selVar.getType(), selVar.getName()); chParam.addAnnotation(new Annotation("FormParam", "\"" + selVar.getName() + "\"")); - params.add(chParam); // A channel parameter to specify the context of the collaboration. + params.add(chParam); // A channel parameter to specify the context of the collaboration. } } param = new VariableDeclaration(srcType, srcName); param.addAnnotation(new Annotation("FormParam", "\"" + srcName + "\"")); - params.add(param); // The state of the source resource to carry the data-flow. - for (ResourcePath refRes: ch.getReferenceResources()) { + params.add(param); // The state of the source resource to carry the data-flow. + for (ResourcePath refRes : ch.getReferenceResources()) { if (!refRes.equals(resourceNode.getInSideResource(ch))) { String refName = toVariableName(getComponentName(refRes.getResourceHierarchy())); param = new VariableDeclaration(refRes.getResourceStateType(), refName); param.addAnnotation(new Annotation("FormParam", "\"" + refName + "\"")); - params.add(param); + params.add(param); } } MethodDeclaration updateAccessor = new MethodDeclaration(updateMethodName, false, typeVoid, params); @@ -818,13 +786,13 @@ updateAccessor.addAnnotation(new Annotation("PUT")); } else { if (!isDelete) { - updateAccessor.addAnnotation(new Annotation("POST")); + updateAccessor.addAnnotation(new Annotation("POST")); } else { updateAccessor.addAnnotation(new Annotation("DELETE")); } } if (inDegree > 1) { - // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. + // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. resourcePath += "/" + toVariableName(srcResName); } updateAccessor.addAnnotation(new Annotation("Path", "\"" + resourcePath + "\"")); @@ -846,7 +814,7 @@ for (ChannelMember cm : ((DataTransferChannel) ch).getOutputChannelMembers()) { if (!cm.isOutside()) { if (priorMemberForInputChannel.get(ch) == null) { - priorMemberForInputChannel.put(ch, cm); // The receiver of the input event when multiple output resources are defined for the channel. + priorMemberForInputChannel.put(ch, cm); // The receiver of the input event when multiple output resources are defined for the channel. } } } @@ -857,7 +825,7 @@ // In each resource. ArrayList resInputParams = new ArrayList<>(); ArrayList rootInputParams = new ArrayList<>(); - String resourcePath = getInputMethodResourcePathAndPathParams(cm.getResource(), rootInputParams); // Path parameters for the input REST API. + String resourcePath = getInputMethodResourcePathAndPathParams(cm.getResource(), rootInputParams); // Path parameters for the input REST API. if (resourcePath.indexOf('/') > 0) { resourcePath = resourcePath.substring(resourcePath.indexOf('/')); } else { @@ -867,7 +835,7 @@ // because they are always equal to either channel selectors or message parameters. // Channel parameters to specify the context of the collaboration. - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); VariableDeclaration chParam = new VariableDeclaration(selVar.getType(), selVar.getName()); @@ -875,10 +843,10 @@ } } // Message parameters to carry the data-flows. - for (Map.Entry varEnt: message.getVariables().entrySet()) { + for (Map.Entry varEnt : message.getVariables().entrySet()) { Variable var = varEnt.getValue(); String refVarName = null; - for (ChannelMember refCm: ((DataTransferChannel) ch).getReferenceChannelMembers()) { + for (ChannelMember refCm : ((DataTransferChannel) ch).getReferenceChannelMembers()) { Expression varExp = refCm.getStateTransition().getMessageExpression().getSubTerm(varEnt.getKey()); if (varExp != null && varExp instanceof Variable) { if (refCm.getStateTransition().getCurStateExpression().contains(varExp)) { @@ -896,7 +864,7 @@ String paramName = var.getName(); VariableDeclaration param = new VariableDeclaration(var.getType(), paramName); resInputParams.add(param); - if (!resourcePath.contains("{" + paramName+ "}")) { + if (!resourcePath.contains("{" + paramName + "}")) { param = new VariableDeclaration(var.getType(), paramName); param.addAnnotation(new Annotation("FormParam", "\"" + paramName + "\"")); rootInputParams.add(param); @@ -927,7 +895,7 @@ } // For the root resource. - if (priorMemberForInputChannel.get(ch) ==null || cm == priorMemberForInputChannel.get(ch)) { + if (priorMemberForInputChannel.get(ch) == null || cm == priorMemberForInputChannel.get(ch)) { // If cm is the receiver of the input event. priorMemberForInputChannel.put(ch, cm); String messageSymbol = ((Term) message).getSymbol().getImplName(); @@ -1024,7 +992,7 @@ } // For the root resource. - if (priorMemberForInputChannel.get(ch) ==null || cm == priorMemberForInputChannel.get(ch)) { + if (priorMemberForInputChannel.get(ch) == null || cm == priorMemberForInputChannel.get(ch)) { // If cm is the receiver of the input event. priorMemberForInputChannel.put(ch, cm); ArrayList rootInputParams = new ArrayList<>(); @@ -1093,31 +1061,31 @@ } // Add leaf getter methods to the parent components. - for (Map.Entry entry: getters) { + for (Map.Entry entry : getters) { resourceComponents.get(entry.getKey()).addMethod(entry.getValue()); } // Add leaf update methods to the parent components. - for (Map.Entry> entry: updates.entrySet()) { - for (MethodDeclaration update: entry.getValue().values()) { + for (Map.Entry> entry : updates.entrySet()) { + for (MethodDeclaration update : entry.getValue().values()) { resourceComponents.get(entry.getKey()).addMethod(update); } } // Add leaf input methods to the parent components. - for (Map.Entry> entry: inputs.entrySet()) { - for (MethodDeclaration input: entry.getValue().values()) { + for (Map.Entry> entry : inputs.entrySet()) { + for (MethodDeclaration input : entry.getValue().values()) { resourceComponents.get(entry.getKey()).addMethod(input); } } // Add leaf reference fields to the parent components. - for (Map.Entry entry: fields) { + for (Map.Entry entry : fields) { ResourceHierarchy resource = entry.getKey(); FieldDeclaration field = entry.getValue(); TypeDeclaration component = resourceComponents.get(resource); boolean existsField = false; - for (FieldDeclaration fld: component.getFields()) { + for (FieldDeclaration fld : component.getFields()) { if (fld.getName().equals(field.getName())) { existsField = true; break; @@ -1126,7 +1094,7 @@ if (!existsField) { component.addField(field); if (field.getType().equals(typeClient)) { - for (CompilationUnit cu: codes) { + for (CompilationUnit cu : codes) { if (cu.types().contains(component)) { cu.addImport(new ImportDeclaration("jakarta.ws.rs.client.*")); break; @@ -1137,25 +1105,25 @@ } // Add constructor parameters to the ancestor components. - for (ResourceNode root: graph.getRootResourceNodes()) { + for (ResourceNode root : graph.getRootResourceNodes()) { addConstructorParameters(root.getResourceHierarchy(), resourceComponents, resourceConstructors, constructorParams); } // Add accessors. - for (ResourceHierarchy rootRes: model.getResourceHierarchies()) { + for (ResourceHierarchy rootRes : model.getResourceHierarchies()) { if (rootRes.getParent() == null) { // root resource TypeDeclaration rootComponent = resourceComponents.get(rootRes); // Add getter accessors. - for (ResourceHierarchy res: getterAccessors.keySet()) { + for (ResourceHierarchy res : getterAccessors.keySet()) { if (rootRes.isAncestorOf(res)) { rootComponent.addMethod(getterAccessors.get(res)); } } // Add input accessors. - for (ResourceHierarchy res: inputAccessors.keySet()) { + for (ResourceHierarchy res : inputAccessors.keySet()) { if (rootRes.isAncestorOf(res)) { - for (MethodDeclaration inputAccessor: inputAccessors.get(res).values()) { + for (MethodDeclaration inputAccessor : inputAccessors.get(res).values()) { rootComponent.addMethod(inputAccessor); } } @@ -1165,10 +1133,10 @@ // Declare the Pair class. boolean isCreatedPair = false; - for(Node n : resources) { + for (Node n : resources) { ResourceNode rn = (ResourceNode) n; - if(isCreatedPair) continue; - if(model.getType("Pair").isAncestorOf(rn.getResourceStateType())) { + if (isCreatedPair) continue; + if (model.getType("Pair").isAncestorOf(rn.getResourceStateType())) { TypeDeclaration type = new TypeDeclaration("Pair"); type.addField(new FieldDeclaration(new Type("Double", "T"), "left")); type.addField(new FieldDeclaration(new Type("Double", "T"), "right")); @@ -1181,43 +1149,43 @@ block.addStatement("this.right = right;"); constructor.setBody(block); type.addMethod(constructor); - - for(FieldDeclaration field : type.getFields()) { + + for (FieldDeclaration field : type.getFields()) { MethodDeclaration getter = new MethodDeclaration( - "get" + field.getName().substring(0,1).toUpperCase() + field.getName().substring(1), - new Type("Double","T")); + "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1), + new Type("Double", "T")); getter.setBody(new Block()); getter.getBody().addStatement("return " + field.getName() + ";"); type.addMethod(getter); } - + // MethodDeclaration toStr = new MethodDeclaration("toString", false, DataConstraintModel.typeString, null); // block = new Block(); // block.addStatement("return \"{\\\"\" + left + \"\\\":\\\"\" + right + \"\\\"}\";"); // toStr.setBody(block); // type.addMethod(toStr); - - CompilationUnit cu = new CompilationUnit(type); + + CompilationUnit cu = new CompilationUnit(type); cu.addImport(new ImportDeclaration("java.util.*")); codes.add(cu); isCreatedPair = true; } } - + return codes; } private static List addConstructorParameters(ResourceHierarchy resource, - Map resourceComponents, - Map resourceConstructors, - Map> constructorParams) { + Map resourceComponents, + Map resourceConstructors, + Map> constructorParams) { List params = new ArrayList<>(); - for (ResourceHierarchy child: resource.getChildren()) { + for (ResourceHierarchy child : resource.getChildren()) { params.addAll(addConstructorParameters(child, resourceComponents, resourceConstructors, constructorParams)); } if (constructorParams.get(resource) != null) { - for (VariableDeclaration param: constructorParams.get(resource).values()) { + for (VariableDeclaration param : constructorParams.get(resource).values()) { params.add(param); } } @@ -1234,7 +1202,7 @@ } } if (constructor != null) { - for (VariableDeclaration param: params) { + for (VariableDeclaration param : params) { constructor.addParameter(param); constructor.getBody().addStatement("this." + toVariableName(param.getName()) + " = " + toVariableName(param.getName()) + ";"); } @@ -1243,11 +1211,11 @@ if (resource.getNumParameters() > 0) params.clear(); return params; } - + private static String getGetterResourcePathAndPathParams(ResourcePath resPath, List pathParams) { int v = 1; List params = new ArrayList<>(); - for (Expression pathParam: resPath.getPathParams()) { + for (Expression pathParam : resPath.getPathParams()) { if (pathParam instanceof Variable) { Variable var = (Variable) pathParam; String paramName = var.getName(); @@ -1271,16 +1239,16 @@ private static String getUpdateResourcePathAndPathParams(ResourcePath resPath, ArrayList rootParams, boolean isRestAPI) { int v = 1; List params = new ArrayList<>(); - for (Expression pathParam: resPath.getPathParams()) { + for (Expression pathParam : resPath.getPathParams()) { if (pathParam instanceof Variable) { Variable var = (Variable) pathParam; String paramName = null; if (isRestAPI) { - paramName = var.getName(); + paramName = var.getName(); } else { paramName = "self" + (v > 1 ? v : ""); } - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = new VariableDeclaration(var.getType(), paramName); if (isRestAPI) param.addAnnotation(new Annotation("PathParam", "\"" + paramName + "\"")); rootParams.add(param); @@ -1288,11 +1256,11 @@ Term var = (Term) pathParam; String paramName = null; if (isRestAPI) { - paramName = "v" + v; + paramName = "v" + v; } else { paramName = "self" + (v > 1 ? v : ""); } - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = new VariableDeclaration(var.getType(), paramName); if (isRestAPI) param.addAnnotation(new Annotation("PathParam", "\"" + paramName + "\"")); rootParams.add(param); @@ -1301,7 +1269,7 @@ } return resPath.getResourceHierarchy().toResourcePath(params); } - + private static String getInputMethodResourcePathAndPathParams(ResourcePath resPath, ArrayList rootInputParams) { int v = 1; List params = new ArrayList<>(); @@ -1310,14 +1278,14 @@ if (pathParam instanceof Variable) { Variable var = (Variable) pathParam; String paramName = var.getName(); - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = new VariableDeclaration(var.getType(), paramName); param.addAnnotation(new Annotation("PathParam", "\"" + paramName + "\"")); rootInputParams.add(param); } else if (pathParam instanceof Term) { Term var = (Term) pathParam; String paramName = "v" + v; - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = new VariableDeclaration(var.getType(), paramName); param.addAnnotation(new Annotation("PathParam", "\"" + paramName + "\"")); rootInputParams.add(param); @@ -1325,18 +1293,18 @@ v++; } if (resPath.getParent() != null) { - for (Expression pathParam: resPath.getParent().getPathParams()) { + for (Expression pathParam : resPath.getParent().getPathParams()) { if (pathParam instanceof Variable) { Variable var = (Variable) pathParam; String paramName = var.getName(); - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = new VariableDeclaration(var.getType(), paramName); param.addAnnotation(new Annotation("PathParam", "\"" + paramName + "\"")); rootInputParams.add(param); } else if (pathParam instanceof Term) { Term var = (Term) pathParam; String paramName = "v" + v; - params.add("{" + paramName + "}"); + params.add("{" + paramName + "}"); VariableDeclaration param = new VariableDeclaration(var.getType(), paramName); param.addAnnotation(new Annotation("PathParam", "\"" + paramName + "\"")); rootInputParams.add(param); @@ -1346,18 +1314,18 @@ } return resPath.getResourceHierarchy().toResourcePath(params); } - + private static String getInitializer(ResourceHierarchy res) { Type stateType = res.getResourceStateType(); String initializer = null; if (res.getInitialValue() != null) { - initializer = res.getInitialValue().toImplementation(new String[] {""}); + initializer = res.getInitialValue().toImplementation(new String[]{""}); } else if (stateType != null) { initializer = DataConstraintModel.getDefaultValue(stateType); } return initializer; } - + static public ArrayList getCodes(ArrayList codeTree) { ArrayList codes = new ArrayList<>(); for (TypeDeclaration type : codeTree) { @@ -1402,7 +1370,7 @@ } return codes; } - + static public IResourceStateAccessor pushAccessor = new IResourceStateAccessor() { @Override public Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from) { @@ -1418,7 +1386,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -1426,7 +1394,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null && targetRes.equals(fromRes)) { @@ -1452,7 +1420,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -1487,7 +1455,7 @@ do { if (fromRes != null && curPath.equals(fromRes)) break; pathStack.push(curPath); - curPath = curPath.getParent(); + curPath = curPath.getParent(); } while (curPath != null); // iterate from the `from' resource Term getter = null; @@ -1572,7 +1540,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -1580,7 +1548,7 @@ targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { if (fromRes != null && targetRes.equals(fromRes)) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java index 42c2067..f2691ff 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java @@ -1,65 +1,27 @@ package generators; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.Stack; - import algorithms.TypeInference; -import code.ast.CodeUtil; import code.ast.CompilationUnit; import code.ast.MethodDeclaration; import code.ast.TypeDeclaration; import code.ast.VariableDeclaration; import models.Edge; -import models.Node; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Field; -import models.algebra.InvalidMessage; -import models.algebra.Parameter; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.Position; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.algebra.Variable; -import models.dataConstraintModel.Channel; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.JsonAccessor; -import models.dataConstraintModel.JsonTerm; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.DataTransferChannel; -import models.dataFlowModel.PushPullAttribute; -import models.dataFlowModel.PushPullValue; -import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; -import models.dataFlowModel.ChannelNode; -import models.dataFlowModel.DataFlowEdge; -import models.dataFlowModel.DataFlowGraph; -import models.dataFlowModel.ResourceNode; -import models.dataFlowModel.StoreAttribute; +import models.algebra.*; +import models.dataConstraintModel.*; +import models.dataFlowModel.*; import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; +import java.util.*; +import java.util.Map.Entry; + public class JerseyMethodBodyGenerator { private static String baseURL = "http://localhost:8080"; - + public static ArrayList doGenerate(DataFlowGraph graph, DataTransferModel model, ArrayList codes) { // Create a map from type names (lower case) to their types. Map componentMap = new HashMap<>(); - for (CompilationUnit code: codes) { - for (TypeDeclaration component: code.types()) { + for (CompilationUnit code : codes) { + for (TypeDeclaration component : code.types()) { componentMap.put(component.getTypeName(), component); } } @@ -67,8 +29,8 @@ // Generate the body of each update or getter method. try { Set chainedCalls = new HashSet<>(); - Map> referredResources = new HashMap<>(); - for (Edge e: graph.getEdges()) { + Map> referredResources = new HashMap<>(); + for (Edge e : graph.getEdges()) { DataFlowEdge resToCh = (DataFlowEdge) e; if (!resToCh.isChannelToResource()) { PushPullAttribute pushPull = (PushPullAttribute) resToCh.getAttribute(); @@ -80,13 +42,13 @@ Set descendantDstChannels = directDstChNode.getDescendants(); Set outEdges = new HashSet<>(); outEdges.addAll(directDstChNode.getOutEdges()); - for (ChannelNode ancestorDst: ancestorDstChannels) { + for (ChannelNode ancestorDst : ancestorDstChannels) { outEdges.addAll(ancestorDst.getOutEdges()); } - for (ChannelNode descendantDst: descendantDstChannels) { + for (ChannelNode descendantDst : descendantDstChannels) { outEdges.addAll(descendantDst.getOutEdges()); } - for (Edge chToRes: outEdges) { + for (Edge chToRes : outEdges) { // For each data transfer from src:ResourceNode to dst:ResourceNode. ResourceNode dst = (ResourceNode) chToRes.getDestination(); String srcResourceName = JerseyCodeGenerator.getComponentName(src.getResourceHierarchy()); @@ -96,16 +58,16 @@ // DataTransferChannel ch = ((ChannelNode) resToCh.getDestination()).getChannel(); ChannelNode chNode = (ChannelNode) chToRes.getSource(); DataTransferChannel ch = chNode.getChannel(); - for (ChannelMember out: ch.getOutputChannelMembers()) { + for (ChannelMember out : ch.getOutputChannelMembers()) { if (dst.getInSideResources().contains(out.getResource())) { // Check if the input resource is outside of the channel scope. boolean outsideInputResource = false; ChannelMember in = null; - for (ChannelMember cm: directDstCh.getInputChannelMembers()) { + for (ChannelMember cm : directDstCh.getInputChannelMembers()) { if (src.getOutSideResources().contains(cm.getResource())) { in = cm; if (cm.isOutside()) { - outsideInputResource = true; // Regarded as pull transfer. + outsideInputResource = true; // Regarded as pull transfer. break; } } @@ -114,10 +76,10 @@ boolean outsideOutputResource = out.isOutside(); // Also take into account the channel hierarchy to determine push/pull transfer. if (descendantDstChannels.contains(chNode)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource = true; // Regarded as (broadcasting) push transfer. } if (ancestorDstChannels.contains(chNode)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource = true; // Regarded as (collecting) pull transfer. } if ((pushPull.getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // for push data transfer @@ -147,10 +109,10 @@ } else { // if there exists one or more reference channel member. HashMap inputResourceToStateAccessor = new HashMap<>(); - for (ChannelMember c: ch.getInputChannelMembers()) { + for (ChannelMember c : ch.getInputChannelMembers()) { inputResourceToStateAccessor.put(c, JerseyCodeGenerator.pushAccessor); } - for (ChannelMember c: ch.getReferenceChannelMembers()) { + for (ChannelMember c : ch.getReferenceChannelMembers()) { inputResourceToStateAccessor.put(c, JerseyCodeGenerator.refAccessor); } Term message = ch.fillOutsideResourcePaths(out, JerseyCodeGenerator.pushAccessor, inputResourceToStateAccessor).getValue(); @@ -181,7 +143,7 @@ Type fieldType = JerseyCodeGenerator.getImplStateType(outRes); if (updateExp instanceof Term) { ((Term) updateExp).setType(fieldType); - for (Map.Entry varEnt: ((Term) updateExp).getVariables().entrySet()) { + for (Map.Entry varEnt : ((Term) updateExp).getVariables().entrySet()) { if (varEnt.getValue().getName().equals("value")) { varEnt.getValue().setType(fieldType); } @@ -190,10 +152,10 @@ ((Variable) updateExp).setType(fieldType); } // Add statements to the update method. - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String newState = updateExp.toImplementation(sideEffects); int numOfOutResourcesWithTheSameHierarchy = 0; - for (ResourcePath outResPath: ch.getOutputResources()) { + for (ResourcePath outResPath : ch.getOutputResources()) { if (outResPath.getResourceHierarchy().equals(outRes)) { numOfOutResourcesWithTheSameHierarchy++; } @@ -201,7 +163,7 @@ String updateStatement = ""; if (JerseyCodeGenerator.generatesComponent(outRes)) { if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); } @@ -210,7 +172,7 @@ } } else { if (sideEffects[0] != null) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; updateStatement = updateStatement.replace(".value", "." + JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(outRes))); if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); @@ -221,7 +183,7 @@ selector.addChild(new Field("value")); selector.addChild(new Variable(update.getParameters().get(update.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newList = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (DataConstraintModel.typeMap.isAncestorOf(outRes.getParent().getResourceStateType())) { @@ -229,7 +191,7 @@ selector.addChild(new Field("value")); selector.addChild(new Variable(update.getParameters().get(update.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newMap = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (!(updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect())) { @@ -243,11 +205,11 @@ Term conditions = null; int v = 1; Map>> resourcePaths = ch.fillOutsideResourcePaths(out, JerseyCodeGenerator.pushAccessor); - for (Expression pathParam: out.getResource().getPathParams()) { + for (Expression pathParam : out.getResource().getPathParams()) { if (pathParam instanceof Variable) { String selfParamName = ((Variable) pathParam).getName(); Expression arg = null; - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); if (selVar.getName().equals(selfParamName)) { @@ -260,20 +222,20 @@ ResourcePath filledPath = resourcePaths.get(out).getKey(); arg = filledPath.getPathParams().get(v - 1); } - Term condition = new Term(DataConstraintModel.eq, new Expression[] { - new Parameter("self" + (v > 1 ? v : ""), DataConstraintModel.typeString), + Term condition = new Term(DataConstraintModel.eq, new Expression[]{ + new Parameter("self" + (v > 1 ? v : ""), DataConstraintModel.typeString), arg}); if (conditions == null) { conditions = condition; } else { - conditions = new Term(DataConstraintModel.and, new Expression[] { - conditions, + conditions = new Term(DataConstraintModel.and, new Expression[]{ + conditions, condition}); } } 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,19 +243,19 @@ int inDegree = 0; Set inEdges = new HashSet<>(); inEdges.addAll(chNode.getInEdges()); - for (ChannelNode ancestor: chNode.getAncestors()) { + for (ChannelNode ancestor : chNode.getAncestors()) { inEdges.addAll(ancestor.getInEdges()); } - for (ChannelNode descendant: chNode.getDescendants()) { + for (ChannelNode descendant : chNode.getDescendants()) { inEdges.addAll(descendant.getInEdges()); } - for (Edge resToCh2: inEdges) { - DataFlowEdge df =(DataFlowEdge) resToCh2; + for (Edge resToCh2 : inEdges) { + DataFlowEdge df = (DataFlowEdge) resToCh2; if (((PushPullAttribute) df.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { inDegree++; } } - if (inDegree > 1 + if (inDegree > 1 || (inDegree == 1 && directDstCh.getInputChannelMembers().iterator().next().getStateTransition().isRightPartial())) { // update a cache of src side resource (when incoming edges are multiple) String cacheStatement = "this." + JerseyCodeGenerator.toVariableName(srcResourceName) + " = " + JerseyCodeGenerator.toVariableName(srcResourceName) + ";"; @@ -302,14 +264,14 @@ } } // For a post/put REST API. - if (outsideOutputResource + if (outsideOutputResource || (in.getResource().getCommonPrefix(out.getResource()) == null && JerseyCodeGenerator.differentTreesAsDifferentServices)) { // Inter-services if (dst.getResourceHierarchy().getParent() != null) { // If not a root resource. TypeDeclaration rootComponent = componentMap.get(JerseyCodeGenerator.getComponentName(dst.getResourceHierarchy().getRoot())); MethodDeclaration update2 = update; - update = getMethod(rootComponent, update2.getName()); // get the accessor to the update method. + update = getMethod(rootComponent, update2.getName()); // get the accessor to the update method. // To make the accessor call the update method. ResourcePath outResPath = new ResourcePath(out.getResource()); for (int i = 0; i < outResPath.getPathParams().size(); i++) { @@ -322,14 +284,14 @@ if (resExp instanceof Term) { // to access the parent if (((Term) resExp).getChildren().size() > 1 && ((Term) resExp).getChild(1) instanceof Variable) { - args += delimiter + ((Variable)((Term) resExp).getChild(1)).getName(); + args += delimiter + ((Variable) ((Term) resExp).getChild(1)).getName(); delimiter = ", "; } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {""}); + String resourceAccess = resExp.toImplementation(new String[]{""}); int v = 0; - for (VariableDeclaration var: update2.getParameters()) { + for (VariableDeclaration var : update2.getParameters()) { if (v < out.getResource().getPathParams().size()) { if (out.getResource().getPathParams().get(v) instanceof Variable) { args += delimiter + ((Variable) out.getResource().getPathParams().get(v)).getName(); @@ -345,7 +307,7 @@ update.addStatement(resourceAccess + "." + update2.getName() + "(" + args + ");"); } // to convert a json param to a tuple, pair or map object. - for (VariableDeclaration param: update.getParameters()) { + for (VariableDeclaration param : update.getParameters()) { Type paramType = param.getType(); String paramName = param.getName(); String paramConverter = ""; @@ -430,7 +392,7 @@ getter.addStatement("return " + dstResName + ";"); } } else { - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; if (DataConstraintModel.typeList.isAncestorOf(dst.getParent().getResourceStateType())) { Term selector = new Term(DataConstraintModel.get); selector.addChild(new Field("value")); @@ -450,7 +412,7 @@ // src side (for a chain of update method invocations) String httpMethod = null; if (out.getStateTransition().isRightUnary()) { - httpMethod = "put"; + httpMethod = "put"; } else { httpMethod = "post"; } @@ -461,16 +423,16 @@ srcName = srcResourceName; } // For caller update methods - for (MethodDeclaration srcUpdate: getUpdateMethods(srcComponent, srcName)) { + for (MethodDeclaration srcUpdate : getUpdateMethods(srcComponent, srcName)) { if (srcUpdate != null) { List>> params = new ArrayList<>(); ResourcePath dstRes = out.getResource(); // Values of channel parameters. - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); - params.add(new AbstractMap.SimpleEntry<>(selVar.getType(), - new AbstractMap.SimpleEntry<>(selVar.getName(), selVar.getName()))); + params.add(new AbstractMap.SimpleEntry<>(selVar.getType(), + new AbstractMap.SimpleEntry<>(selVar.getName(), selVar.getName()))); } } // Value of the source side (input side) resource. @@ -478,12 +440,12 @@ if (!JerseyCodeGenerator.generatesComponent(src.getResourceHierarchy())) { srcFieldName = JerseyCodeGenerator.toVariableName(srcResourceName); } - params.add(new AbstractMap.SimpleEntry<>(src.getResourceStateType(), - new AbstractMap.SimpleEntry<>(JerseyCodeGenerator.toVariableName(srcResourceName), srcFieldName))); + params.add(new AbstractMap.SimpleEntry<>(src.getResourceStateType(), + new AbstractMap.SimpleEntry<>(JerseyCodeGenerator.toVariableName(srcResourceName), srcFieldName))); // Get the value of reference member to call the update method. Set referredSet = referredResources.get(srcUpdate); if (ch.getReferenceChannelMembers().size() > 0) { - for (ChannelMember rc: ch.getReferenceChannelMembers()) { + for (ChannelMember rc : ch.getReferenceChannelMembers()) { // For each reference channel member, get the current state of the reference side resource by pull data transfer. ResourcePath ref = rc.getResource(); if (referredSet == null) { @@ -495,12 +457,12 @@ Type refResourceType = ref.getResourceStateType(); if (!referredSet.contains(ref)) { referredSet.add(ref); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; if (rc.isOutside()) { List pathParams = new ArrayList<>(); - for (Expression pathExp: ref.getPathParams()) { + for (Expression pathExp : ref.getPathParams()) { pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); - } + } generatePullDataTransfer(srcUpdate, refResourceName, ref.getResourceHierarchy().toResourcePath(pathParams), refResourceType); } else { ResourcePath srcRes = in.getResource(); @@ -520,9 +482,9 @@ } if (outsideOutputResource || (in.getResource().getCommonPrefix(dstRes) == null && JerseyCodeGenerator.differentTreesAsDifferentServices)) { // Inter-servces - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; List pathParams = new ArrayList<>(); - for (Expression pathExp: dstRes.getPathParams()) { + for (Expression pathExp : dstRes.getPathParams()) { pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } String srcResName = JerseyCodeGenerator.toVariableName(srcResourceName); @@ -533,7 +495,7 @@ String dstPath = null; if (filledPaths != null && filledPaths.get(out) != null) { ResourcePath filledDstPath = filledPaths.get(out).getKey(); - dstPath = filledDstPath.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + dstPath = filledDstPath.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); } else { dstPath = dstRes.getResourceHierarchy().toResourcePath(pathParams); } @@ -558,14 +520,14 @@ selType = ((Variable) selExp).getType(); varName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm :ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; } } if (insideChMem == null) { - for (ChannelMember cm :ch.getReferenceChannelMembers()) { + for (ChannelMember cm : ch.getReferenceChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -573,7 +535,7 @@ } } if (insideChMem == null) { - for (ChannelMember cm :ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -590,14 +552,14 @@ Expression getter = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getPrimaryResourcePath()); Term valueGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); valueGetter.addChild(getter); - parent = valueGetter.toImplementation(new String[] {}); + parent = valueGetter.toImplementation(new String[]{}); } else { - parent = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getPrimaryResourcePath()).toImplementation(new String[] {}); + parent = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getPrimaryResourcePath()).toImplementation(new String[]{}); } if (insideResPath != null) { if (selType.equals(DataConstraintModel.typeInt)) { // make a for loop (for a list) for broadcasting. - srcUpdate.addFirstStatement("for (int " + varName + " = 0; " + varName +" < " + parent + ".size(); " + varName + "++) {"); + srcUpdate.addFirstStatement("for (int " + varName + " = 0; " + varName + " < " + parent + ".size(); " + varName + "++) {"); srcUpdate.addStatement("}"); } else if (selType.equals(DataConstraintModel.typeString)) { // make a for loop (for a map) for broadcasting. @@ -622,7 +584,7 @@ String callParams = ""; String delimiter = ""; // Values of path parameters. - for (Expression pathParam: dstRes.getPathParams()) { + for (Expression pathParam : dstRes.getPathParams()) { if (pathParam instanceof Variable) { Variable pathVar = (Variable) pathParam; callParams += delimiter + pathVar.getName(); @@ -630,15 +592,15 @@ } } // Values of other parameters. - for (Map.Entry> paramEnt: params) { + for (Map.Entry> paramEnt : params) { callParams += delimiter + paramEnt.getValue().getValue(); delimiter = ", "; } // Call the update method. if (srcComponent != dstComponent) { - srcUpdate.addStatement("this." + JerseyCodeGenerator.toVariableName(dstResourceName) + "." + updateMethodName + "(" + callParams + ");"); + srcUpdate.addStatement("this." + JerseyCodeGenerator.toVariableName(dstResourceName) + "." + updateMethodName + "(" + callParams + ");"); } else { - srcUpdate.addStatement("this." + updateMethodName + "(" + callParams + ");"); + srcUpdate.addStatement("this." + updateMethodName + "(" + callParams + ");"); } if (update != null && update.getThrows() != null && update.getThrows().getExceptions().contains("JsonProcessingException")) { srcUpdate.addThrow("JsonProcessingException"); @@ -647,15 +609,15 @@ } } // For caller input methods - for (MethodDeclaration srcInput: getInputMethods(srcComponent, src, model)) { + for (MethodDeclaration srcInput : getInputMethods(srcComponent, src, model)) { List>> params = new ArrayList<>(); ResourcePath dstRes = out.getResource(); // Values of channel parameters. - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); - params.add(new AbstractMap.SimpleEntry<>(selVar.getType(), - new AbstractMap.SimpleEntry<>(selVar.getName(), selVar.getName()))); + params.add(new AbstractMap.SimpleEntry<>(selVar.getType(), + new AbstractMap.SimpleEntry<>(selVar.getName(), selVar.getName()))); } } // Value of the source side (input side) resource. @@ -663,11 +625,11 @@ if (!JerseyCodeGenerator.generatesComponent(src.getResourceHierarchy())) { srcFieldName = JerseyCodeGenerator.toVariableName(srcResourceName); } - params.add(new AbstractMap.SimpleEntry<>(src.getResourceStateType(), - new AbstractMap.SimpleEntry<>(JerseyCodeGenerator.toVariableName(srcResourceName), srcFieldName))); + params.add(new AbstractMap.SimpleEntry<>(src.getResourceStateType(), + new AbstractMap.SimpleEntry<>(JerseyCodeGenerator.toVariableName(srcResourceName), srcFieldName))); // Get the value of reference member to call the update method. Set referredSet = referredResources.get(srcInput); - for (ChannelMember rc: ch.getReferenceChannelMembers()) { + for (ChannelMember rc : ch.getReferenceChannelMembers()) { // For each reference channel member, get the current state of the reference side resource by pull data transfer. ResourcePath ref = rc.getResource(); if (referredSet == null) { @@ -679,12 +641,12 @@ Type refResourceType = ref.getResourceStateType(); if (!referredSet.contains(ref)) { referredSet.add(ref); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; if (rc.isOutside()) { List pathParams = new ArrayList<>(); - for (Expression pathExp: ref.getPathParams()) { + for (Expression pathExp : ref.getPathParams()) { pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); - } + } generatePullDataTransfer(srcInput, refResourceName, ref.getResourceHierarchy().toResourcePath(pathParams), refResourceType); } else { ResourcePath srcRes = in.getResource(); @@ -699,13 +661,13 @@ } // Value of a reference side resource. params.add(new AbstractMap.SimpleEntry<>(refResourceType, new AbstractMap.SimpleEntry<>(refResourceName, refResourceName))); - } + } } if (outsideOutputResource || (in.getResource().getCommonPrefix(dstRes) == null && JerseyCodeGenerator.differentTreesAsDifferentServices)) { // Inter-services - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; List pathParams = new ArrayList<>(); - for (Expression pathExp: dstRes.getPathParams()) { + for (Expression pathExp : dstRes.getPathParams()) { pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } String srcResName = JerseyCodeGenerator.toVariableName(srcResourceName); @@ -716,7 +678,7 @@ String dstPath = null; if (filledPaths != null && filledPaths.get(out) != null) { ResourcePath filledDstPath = filledPaths.get(out).getKey(); - dstPath = filledDstPath.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + dstPath = filledDstPath.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); } else { dstPath = dstRes.getResourceHierarchy().toResourcePath(pathParams); } @@ -741,14 +703,14 @@ selType = ((Variable) selExp).getType(); forVarName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm :ch.getInputChannelMembers()) { + for (ChannelMember cm : ch.getInputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; } } if (insideChMem == null) { - for (ChannelMember cm :ch.getReferenceChannelMembers()) { + for (ChannelMember cm : ch.getReferenceChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -756,7 +718,7 @@ } } if (insideChMem == null) { - for (ChannelMember cm :ch.getOutputChannelMembers()) { + for (ChannelMember cm : ch.getOutputChannelMembers()) { if (!cm.isOutside()) { insideChMem = cm; break; @@ -773,14 +735,14 @@ Expression getter = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getPrimaryResourcePath()); Term valueGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); valueGetter.addChild(getter); - parent = valueGetter.toImplementation(new String[] {}); + parent = valueGetter.toImplementation(new String[]{}); } else { - parent = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getPrimaryResourcePath()).toImplementation(new String[] {}); + parent = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, src.getPrimaryResourcePath()).toImplementation(new String[]{}); } if (insideResPath != null) { if (selType.equals(DataConstraintModel.typeInt)) { // make a for loop (for a list) for broadcasting. - srcInput.addFirstStatement("for (int " + forVarName + " = 0; " + forVarName +" < " + parent + ".size(); " + forVarName + "++) {"); + srcInput.addFirstStatement("for (int " + forVarName + " = 0; " + forVarName + " < " + parent + ".size(); " + forVarName + "++) {"); srcInput.addStatement("}"); } else if (selType.equals(DataConstraintModel.typeString)) { // make a for loop (for a map) for broadcasting. @@ -805,7 +767,7 @@ String callParams = ""; String delimiter = ""; // Values of path parameters. - for (Expression pathParam: dstRes.getPathParams()) { + for (Expression pathParam : dstRes.getPathParams()) { if (pathParam instanceof Variable) { Variable pathVar = (Variable) pathParam; callParams += delimiter + pathVar.getName(); @@ -813,15 +775,15 @@ } } // Values of other parameters. - for (Map.Entry> paramEnt: params) { + for (Map.Entry> paramEnt : params) { callParams += delimiter + paramEnt.getValue().getValue(); delimiter = ", "; } // Call the update method. if (srcComponent != dstComponent) { - srcInput.addStatement("this." + JerseyCodeGenerator.toVariableName(dstResourceName) + "." + updateMethodName + "(" + callParams + ");"); + srcInput.addStatement("this." + JerseyCodeGenerator.toVariableName(dstResourceName) + "." + updateMethodName + "(" + callParams + ");"); } else { - srcInput.addStatement("this." + updateMethodName + "(" + callParams + ");"); + srcInput.addStatement("this." + updateMethodName + "(" + callParams + ");"); } if (update != null && update.getThrows() != null && update.getThrows().getExceptions().contains("JsonProcessingException")) { srcInput.addThrow("JsonProcessingException"); @@ -844,16 +806,16 @@ // The first time to fill the getter method's body. // Data transfer on the same channel hierarchy. - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; // For each reference channel member, get the current state of the reference side resource by pull data transfer. - for (ChannelMember rc: ch.getReferenceChannelMembers()) { + for (ChannelMember rc : ch.getReferenceChannelMembers()) { ResourcePath refRes = rc.getResource(); String refResourceName = JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(refRes.getResourceHierarchy())); Type refResourceType = refRes.getResourceStateType(); if (rc.isOutside()) { List pathParams = new ArrayList<>(); - for (Expression pathExp: refRes.getPathParams()) { - sideEffects = new String[] {""}; + for (Expression pathExp : refRes.getPathParams()) { + sideEffects = new String[]{""}; pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } generatePullDataTransfer(getter, refResourceName, refRes.getResourceHierarchy().toResourcePath(pathParams), refResourceType); @@ -863,7 +825,7 @@ dstRes = dstRes.getParent(); } Expression refGetter = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(refRes, dstRes); - sideEffects = new String[] {""}; + sideEffects = new String[]{""}; String refExp = refGetter.toImplementation(sideEffects); String refTypeName = refResourceType.getInterfaceTypeName(); getter.addFirstStatement(sideEffects[0] + refTypeName + " " + refResourceName + " = " + refExp + ";"); @@ -876,15 +838,15 @@ Term messageTerm = resourcePathsAndMessage.getValue(); // Data transfer from path depending resource. - for (Entry>> pathEnt: resourcePaths.entrySet()) { + for (Entry>> pathEnt : resourcePaths.entrySet()) { ChannelMember cm = pathEnt.getKey(); ResourcePath src2 = pathEnt.getValue().getKey(); // get outside src2 resource state by pull data transfer. if (cm.isOutside() || src2.getCommonPrefix(dst.getInSideResource(ch)) == null) { // Data transfer from an outside input resource is regarded as PULL transfer. List pathParams = new ArrayList<>(); - for (Expression pathExp: src2.getPathParams()) { - sideEffects = new String[] {""}; + for (Expression pathExp : src2.getPathParams()) { + sideEffects = new String[]{""}; pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } // generate a pull data transfer from a depending in/ref resource. @@ -910,13 +872,13 @@ // generate pull data transfers. Set chMems = new HashSet<>(curChannel.getInputChannelMembers()); chMems.addAll(curChannel.getReferenceChannelMembers()); - for (ChannelMember cm2: chMems) { + for (ChannelMember cm2 : chMems) { if (resourcePaths == null || !resourcePaths.keySet().contains(cm2)) { // not a depending channel member. ResourcePath src2 = cm2.getResource(); Type srcResType2 = src2.getResourceStateType(); String srcResName2 = JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(src2.getResourceHierarchy())); - String srcPath2 = src2.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + String srcPath2 = src2.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); generatePullDataTransfer(getter, srcResName2, srcPath2, srcResType2); } else { // a depending channel member. @@ -926,7 +888,7 @@ // generate a pull data transfer from a depending in/ref resource. Type srcResType2 = src2.getResourceStateType(); String srcResName2 = JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(src2.getResourceHierarchy())); - String srcPath2 = src2.toResourcePath().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + String srcPath2 = src2.toResourcePath().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); generatePullDataTransfer(getter, srcResName2, srcPath2, srcResType2); } } @@ -938,7 +900,7 @@ if (resourcePathsAndMessage != null) { resourcePaths = resourcePathsAndMessage.getKey(); Term messageTermSub = resourcePathsAndMessage.getValue(); - for (Map.Entry subTermEnt: messageTermSub.getSubTerms(Term.class).entrySet()) { + for (Map.Entry subTermEnt : messageTermSub.getSubTerms(Term.class).entrySet()) { Term subTerm = subTermEnt.getValue(); if (!(subTerm instanceof Constant) && subTerm.getSymbol().isImplWithSideEffect()) { Variable var = new Variable("v" + v, subTerm.getType()); @@ -948,7 +910,7 @@ Position pos = new Position(); pos.addHeadOrder(0); subTerm.replaceSubTerm(pos, var); - sideEffects = new String[] {""}; + sideEffects = new String[]{""}; String curState = messageTermSub.toImplementation(sideEffects); getter.addStatement(sideEffects[0].replaceAll("\n", "")); // Cancel the side effects in the return value. @@ -973,14 +935,14 @@ selType = ((Variable) selExp).getType(); varName = ((Variable) selExp).getName(); ChannelMember insideChMem = null; - for (ChannelMember cm2 :curChannel.getInputChannelMembers()) { + for (ChannelMember cm2 : curChannel.getInputChannelMembers()) { if (!cm2.isOutside()) { insideChMem = cm2; break; } } if (insideChMem == null) { - for (ChannelMember cm2 :curChannel.getReferenceChannelMembers()) { + for (ChannelMember cm2 : curChannel.getReferenceChannelMembers()) { if (!cm2.isOutside()) { insideChMem = cm2; break; @@ -999,16 +961,16 @@ Expression parentGetter = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, dst.getInSideResource(ch)); Term valueGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); valueGetter.addChild(parentGetter); - parent = valueGetter.toImplementation(new String[] {}); + parent = valueGetter.toImplementation(new String[]{}); } else { - parent = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, dst.getInSideResource(ch)).toImplementation(new String[] {}); + parent = JerseyCodeGenerator.pullAccessor.getDirectStateAccessorFor(insideResPath, dst.getInSideResource(ch)).toImplementation(new String[]{}); } } else { parent = JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(insideResPath.getResourceHierarchy())); } if (selType.equals(DataConstraintModel.typeInt)) { // make a for loop (for a list) for data collecting. - getter.addFirstStatement("for (int " + varName + " = 0; " + varName +" < " + parent + ".size(); " + varName + "++) {"); + getter.addFirstStatement("for (int " + varName + " = 0; " + varName + " < " + parent + ".size(); " + varName + "++) {"); } else if (selType.equals(DataConstraintModel.typeString)) { // make a for loop (for a map) for data collecting. getter.addFirstStatement("for (String " + varName + ": " + parent + ".keySet()) {"); @@ -1016,13 +978,13 @@ if (insideResPath.getCommonPrefix(dst.getInSideResource(ch)) == null) { Type parentResType = insideResPath.getResourceStateType(); String parentResName = JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(insideResPath.getResourceHierarchy())); - String parentResPath = insideResPath.toString().replaceAll(":.*\\}","\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); + String parentResPath = insideResPath.toString().replaceAll(":.*\\}", "\\}").replaceAll("\\{", "\"+").replaceAll("\\}", "+\""); generatePullDataTransfer(getter, parentResName, parentResPath, parentResType); } } } // initialize the variables to hold side effects within the loop - for (Variable var: varsForSideEffects) { + for (Variable var : varsForSideEffects) { getter.addFirstStatement(var.getType().getInterfaceTypeName() + " " + var.getName() + " = new " + var.getType().getImplementationTypeName() + "();"); } // end of the loop @@ -1036,7 +998,7 @@ } // generate a return statement. Expression curExp = ch.deriveUpdateExpressionOf(out, messageTerm, JerseyCodeGenerator.pullAccessor); - sideEffects = new String[] {""}; + sideEffects = new String[]{""}; String curState = curExp.toImplementation(sideEffects); if (ch.getChildren() == null || ch.getChildren().size() == 0) { getter.addStatement(sideEffects[0] + "return " + curState + ";"); @@ -1050,7 +1012,7 @@ List pathParams = new ArrayList<>(); generatePullDataTransfer(getter, src.getResourceName(), src.getResourceHierarchy().toResourcePath(pathParams), srcResourceType); } - } + } } } } @@ -1058,7 +1020,7 @@ } // for source nodes - for (ResourceHierarchy resource: model.getResourceHierarchies()) { + for (ResourceHierarchy resource : model.getResourceHierarchies()) { String resourceName = JerseyCodeGenerator.getComponentName(resource); TypeDeclaration component = componentMap.get(resourceName); if (JavaCodeGenerator.generatesComponent(resource)) { @@ -1082,13 +1044,13 @@ String implTypeName = resourceType.getImplementationTypeName(); stateGetter.addStatement("return new " + implTypeName + "(value);"); } else { - Term composer = null; + Term composer = null; Term composerSub = new Constant(DataConstraintModel.nil); composerSub.setType(DataConstraintModel.typeMap); - for (ResourceHierarchy child: resource.getChildren()) { + for (ResourceHierarchy child : resource.getChildren()) { String childTypeName = JerseyCodeGenerator.getComponentName(child); String fieldName = JerseyCodeGenerator.toVariableName(childTypeName); - Term childGetter = null; + Term childGetter = null; if (!JerseyCodeGenerator.generatesComponent(child)) { // the child is not a class childGetter = new Term(new Symbol("get" + childTypeName, 1, Symbol.Type.METHOD)); @@ -1100,18 +1062,18 @@ } composer = new Term(DataConstraintModel.insert); composer.addChild(composerSub); - composer.addChild(new Constant(fieldName, DataConstraintModel.typeString)); // key - composer.addChild(childGetter); // value + 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[] sideEffects = new String[]{null}; String returnValue = composer.toImplementation(sideEffects); if (sideEffects[0] != null) { - stateGetter.addStatement(sideEffects[0] + "return " + returnValue+ ";"); + stateGetter.addStatement(sideEffects[0] + "return " + returnValue + ";"); } else { - stateGetter.addStatement("return " + returnValue+ ";"); + stateGetter.addStatement("return " + returnValue + ";"); } } } @@ -1120,7 +1082,7 @@ // (#4) descendant getter method (the implementation must be kept consistent with #3) if (resource.getChildren().size() > 0) { - for (ResourceHierarchy child: resource.getChildren()) { + for (ResourceHierarchy child : resource.getChildren()) { ResourceHierarchy parent = resource; ResourceHierarchy descendant = child; Set children; @@ -1139,7 +1101,7 @@ do { String methodName = JerseyCodeGenerator.getComponentName(descendant); MethodDeclaration descendantGetter = null; - for (MethodDeclaration getter: getGetterMethods(component, methodName)) { + for (MethodDeclaration getter : getGetterMethods(component, methodName)) { if ((getter.getParameters() == null && params == 0) || (getter.getParameters() != null && getter.getParameters().size() == params)) { descendantGetter = getter; break; @@ -1160,7 +1122,7 @@ selector = newSelector; } if (descendantGetter != null && (descendantGetter.getBody() == null || descendantGetter.getBody().getStatements().size() == 0)) { - String[] sideEffects = new String[] {null}; + String[] sideEffects = new String[]{null}; String returnValue = selector.toImplementation(sideEffects); if (sideEffects[0] != null) descendantGetter.addStatement(sideEffects[0]); descendantGetter.addStatement("return " + returnValue + ";"); @@ -1179,16 +1141,16 @@ children = descendant.getChildren(); } while (children != null && children.size() == 1 && (descendant = children.iterator().next()) != null); } - } + } } } // methods for input events Map> ioChannelsAndMembers = getIOChannelsAndMembers(resource, model); - for (Map.Entry> entry: ioChannelsAndMembers.entrySet()) { + for (Map.Entry> entry : ioChannelsAndMembers.entrySet()) { DataTransferChannel ch = entry.getKey(); Set outs = entry.getValue(); - for (ChannelMember out: outs) { + for (ChannelMember out : outs) { MethodDeclaration input = null; if (JerseyCodeGenerator.generatesComponent(resource)) { // A component is generated for this resource. @@ -1204,7 +1166,7 @@ if (input != null) { // In each resource Set referredSet = referredResources.get(input); - for (ChannelMember rc: ch.getReferenceChannelMembers()) { + for (ChannelMember rc : ch.getReferenceChannelMembers()) { // For each reference channel member, get the current state of the reference side resource by pull data transfer. ResourcePath ref = rc.getResource(); if (referredSet == null) { @@ -1216,13 +1178,13 @@ Type refResourceType = ref.getResourceStateType(); if (!referredSet.contains(ref)) { referredSet.add(ref); - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; if (rc.isOutside()) { List pathParams = new ArrayList<>(); - for (Expression pathExp: ref.getPathParams()) { + for (Expression pathExp : ref.getPathParams()) { pathParams.add("\" + " + pathExp.toImplementation(sideEffects) + " + \""); } - generatePullDataTransfer(input, refResourceName, ref.getResourceHierarchy().toResourcePath(pathParams), refResourceType); + generatePullDataTransfer(input, refResourceName, ref.getResourceHierarchy().toResourcePath(pathParams), refResourceType); } else { ResourcePath dstRes = out.getResource(); if (!JerseyCodeGenerator.generatesComponent(dstRes.getResourceHierarchy())) { @@ -1257,7 +1219,7 @@ Type fieldType = JerseyCodeGenerator.getImplStateType(outRes); if (updateExp instanceof Term) { ((Term) updateExp).setType(fieldType); - for (Map.Entry varEnt: ((Term) updateExp).getVariables().entrySet()) { + for (Map.Entry varEnt : ((Term) updateExp).getVariables().entrySet()) { if (varEnt.getValue().getName().equals("value")) { varEnt.getValue().setType(fieldType); } @@ -1266,12 +1228,12 @@ ((Variable) updateExp).setType(fieldType); } // Add statements to the input method. - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; String newState = updateExp.toImplementation(sideEffects); if (JerseyCodeGenerator.generatesComponent(resource)) { String updateStatement; if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); } @@ -1284,7 +1246,7 @@ } else { String updateStatement = ""; if (sideEffects[0] != null) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; updateStatement = updateStatement.replace(".value", "." + JerseyCodeGenerator.toVariableName(JerseyCodeGenerator.getComponentName(resource))); if (updateStatement.endsWith("\n")) { updateStatement = updateStatement.substring(0, updateStatement.length() - 1); @@ -1295,7 +1257,7 @@ selector.addChild(new Field("value")); selector.addChild(new Variable(input.getParameters().get(input.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newList = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (DataConstraintModel.typeMap.isAncestorOf(resource.getParent().getResourceStateType())) { @@ -1303,7 +1265,7 @@ selector.addChild(new Field("value")); selector.addChild(new Variable(input.getParameters().get(input.getParameters().size() - 2).getName())); selector.addChild(new Constant(newState)); - String[] sideEffects2 = new String[] {""}; + String[] sideEffects2 = new String[]{""}; String newMap = selector.toImplementation(sideEffects2); updateStatement += sideEffects2[0]; } else if (!(updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect())) { @@ -1337,14 +1299,14 @@ if (resExp instanceof Term) { // to access the parent if (((Term) resExp).getChildren().size() > 1 && ((Term) resExp).getChild(1) instanceof Variable) { - args += delimiter + ((Variable)((Term) resExp).getChild(1)).getName(); + args += delimiter + ((Variable) ((Term) resExp).getChild(1)).getName(); delimiter = ", "; } resExp = ((Term) resExp).getChild(0); } - String resourceAccess = resExp.toImplementation(new String[] {""}); + String resourceAccess = resExp.toImplementation(new String[]{""}); // Values of channel parameters. - for (Selector selector: ch.getAllSelectors()) { + for (Selector selector : ch.getAllSelectors()) { if (selector.getExpression() instanceof Variable) { Variable selVar = (Variable) selector.getExpression(); args += delimiter + selVar.getName(); @@ -1353,7 +1315,7 @@ } // Values of message parameters. if (message instanceof Term) { - for (Variable mesVar: message.getVariables().values()) { + for (Variable mesVar : message.getVariables().values()) { args += delimiter + mesVar.getName(); delimiter = ", "; } @@ -1369,12 +1331,12 @@ } } } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork - | InvalidMessage | UnificationFailed | ValueUndefined e1) { + | InvalidMessage | UnificationFailed | ValueUndefined e1) { e1.printStackTrace(); } return codes; } - + private static void replaceJsonTermWithConstructorInvocation(Expression exp, Type replacedJsonType, String replacingClassName, TypeDeclaration descendantComponent) { // Replace each json term in exp with the corresponding constructor invocation. Type descendantType = new Type(replacingClassName, replacingClassName); @@ -1390,12 +1352,12 @@ MethodDeclaration descendantConstructor = getConstructor(descendantComponent); if (descendantConstructor != null) { String delimiter = ""; - for (VariableDeclaration var: descendantConstructor.getParameters()) { + for (VariableDeclaration var : descendantConstructor.getParameters()) { // Extract the argument of each constructor parameter from jsonTerm. JsonAccessor jsonMember = new JsonAccessor(DataConstraintModel.dot); jsonMember.addChild(jsonTerm); jsonMember.addChild(new Constant(var.getName(), DataConstraintModel.typeString)); - Expression param = jsonMember.reduce(); // Reduce {"name": "foo", age: 25}.name => "foo" + Expression param = jsonMember.reduce(); // Reduce {"name": "foo", age: 25}.name => "foo" if (param != null) { if (param instanceof Term) { if (((Term) param).getType() == null) { @@ -1422,10 +1384,10 @@ } } 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()) { + 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); @@ -1433,7 +1395,7 @@ } } } - + private static void generatePullDataTransfer(MethodDeclaration methodBody, String fromResourceName, String fromResourcePath, Type fromResourceType) { String varName = new String(fromResourceName); String respTypeName = fromResourceType.getInterfaceTypeName(); @@ -1475,7 +1437,7 @@ } methodBody.addFirstStatement(respTypeName + " " + varName + " = " + getHttpMethodCallStatementWithResponse(baseURL, fromResourcePath, "get", respImplTypeName)); } - + private static String convertFromEntryToMapType(Type type) { String mapTypeName = null; if (DataConstraintModel.typePair.isAncestorOf(type)) { @@ -1500,18 +1462,18 @@ for (int idx = mapTypeName.indexOf("<", 0); idx >= 0; idx = mapTypeName.indexOf("<", idx + 1)) { int to = mapTypeName.indexOf(",", idx); if (to > idx) { - mapTypeName = mapTypeName.substring(0, idx + 1) + "String" + mapTypeName.substring(to); // All elements except for the last one have the string type. + mapTypeName = mapTypeName.substring(0, idx + 1) + "String" + mapTypeName.substring(to); // All elements except for the last one have the string type. } } } return mapTypeName; } - + private static String getCodeForConversionFromMapToTuple(Type tupleType, String mapVar) { String decoded = "$x"; List elementsTypes = TypeInference.getTupleComponentTypes(tupleType); String elementBase = mapVar; - for (Type elmType: elementsTypes.subList(0, elementsTypes.size() - 1)) { + for (Type elmType : elementsTypes.subList(0, elementsTypes.size() - 1)) { elementBase += ".entrySet().iterator().next()"; if (elmType == DataConstraintModel.typeBoolean || elmType == DataConstraintModel.typeInt @@ -1530,14 +1492,14 @@ decoded = decoded.replace("$x", elementBase); return decoded; } - + private static String getCodeForConversionFromMapToPair(Type pairType, String mapVar) { String decoded = "$x"; decoded = decoded.replace("$x", "new Pair<>(" + mapVar + ".get(\"left\"), $x)"); decoded = decoded.replace("$x", mapVar + ".get(\"right\")"); return decoded; } - + private static String getCodeForConversionFromMapToMap(Type mapType, String mapVal, String mapVar) { List elementsTypes = TypeInference.getMapComponentTypes(mapType); Type keyType = elementsTypes.get(0); @@ -1559,14 +1521,14 @@ } return decoded; } - + private static String getHttpMethodParamsStatement(String callerResourceName, List>> params, boolean isFirstCall) { String statements = ""; if (isFirstCall) { statements += "Form "; } statements += "form = new Form();\n"; - for (Map.Entry> param: params) { + for (Map.Entry> param : params) { Type paramType = param.getKey(); String paramName = param.getValue().getKey(); String value = param.getValue().getValue(); @@ -1579,7 +1541,7 @@ statements += "for (" + wrapperType + " i: " + value + ") {\n"; } if (DataConstraintModel.typeTuple.isAncestorOf(compType) || DataConstraintModel.typePair.isAncestorOf(paramType) || DataConstraintModel.typeList.isAncestorOf(compType) || DataConstraintModel.typeMap.isAncestorOf(paramType)) { - statements += "\tform.param(\"" + paramName + "\", new ObjectMapper().writeValueAsString(i));\n"; // typeTuple: {"1.0":2.0}, typePair: {"left": 1.0, "right":2.0} + statements += "\tform.param(\"" + paramName + "\", new ObjectMapper().writeValueAsString(i));\n"; // typeTuple: {"1.0":2.0}, typePair: {"left": 1.0, "right":2.0} } else { statements += "\tform.param(\"" + paramName + "\", i.toString());\n"; } @@ -1587,7 +1549,7 @@ // return "Entity entity = Entity.entity(" + paramName + ".toString(), MediaType.APPLICATION_JSON);"; } else if (DataConstraintModel.typeTuple.isAncestorOf(paramType) || DataConstraintModel.typePair.isAncestorOf(paramType) || DataConstraintModel.typeMap.isAncestorOf(paramType)) { // typeTuple: {"1.0":2.0}, typePair: {"left": 1.0, "right":2.0} - statements += "form.param(\"" + paramName + "\", new ObjectMapper().writeValueAsString(" + value + "));\n"; + statements += "form.param(\"" + paramName + "\", new ObjectMapper().writeValueAsString(" + value + "));\n"; } else { statements += "form.param(\"" + paramName + "\", " + new JavaSpecific().getValueToStringExp(paramType.getImplementationTypeName(), value) + ");\n"; } @@ -1598,12 +1560,12 @@ statements += "entity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED);"; return statements; } - + private static String getHttpMethodCallStatement(String baseURL, String resourceName, String srcResName, String httpMethod) { if (srcResName == null) { return "client.target(\"" + baseURL + "\").path(\"/" + resourceName + "\").request()." + httpMethod + "(entity, String.class);"; } else { - // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. + // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. return "client.target(\"" + baseURL + "\").path(\"/" + resourceName + "/" + srcResName + "\").request()." + httpMethod + "(entity, String.class);"; } } @@ -1613,18 +1575,18 @@ if (respImplName.contains("<")) { responseShortTypeName = respImplName.substring(0, respImplName.indexOf("<")); } - return "client.target(\"" + baseURL + "\").path(\"/" + resourceName + "\").request()." + httpMethod + "(" + responseShortTypeName + ".class);"; + return "client.target(\"" + baseURL + "\").path(\"/" + resourceName + "\").request()." + httpMethod + "(" + responseShortTypeName + ".class);"; } - + private static MethodDeclaration getConstructor(TypeDeclaration component) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.isConstructor()) return m; } return null; } - + private static MethodDeclaration getUpdateMethod(TypeDeclaration component, String dstResName, String srcResName) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (dstResName == null) { if (m.getName().equals("updateFrom" + srcResName)) return m; } else { @@ -1636,7 +1598,7 @@ private static List getUpdateMethods(TypeDeclaration component, String resName) { List updates = new ArrayList<>(); - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (resName == null) { if (m.getName().startsWith("updateFrom")) { updates.add(m); @@ -1651,7 +1613,7 @@ } private static MethodDeclaration getGetterMethod(TypeDeclaration component, String resourceName) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().startsWith("get" + resourceName)) return m; } return null; @@ -1659,7 +1621,7 @@ private static List getGetterMethods(TypeDeclaration component, String resourceName) { List getters = new ArrayList<>(); - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().equals("get" + resourceName)) { getters.add(m); } @@ -1669,10 +1631,10 @@ private static Map> getIOChannelsAndMembers(ResourceHierarchy resource, DataTransferModel model) { Map> ioChannelsAndMembers = new HashMap<>(); - for (Channel c: model.getInputChannels()) { + for (Channel c : model.getInputChannels()) { DataTransferChannel ch = (DataTransferChannel) c; // I/O channel - for (ChannelMember out: ch.getOutputChannelMembers()) { + for (ChannelMember out : ch.getOutputChannelMembers()) { if (resource.equals(out.getResource().getResourceHierarchy())) { if (out.getStateTransition().getMessageExpression() instanceof Term || out.getStateTransition().getMessageExpression() instanceof Variable) { Set channelMembers = ioChannelsAndMembers.get(ch); @@ -1687,13 +1649,13 @@ } return ioChannelsAndMembers; } - + private static List getInputMethods(TypeDeclaration component, ResourceNode resource, DataTransferModel model) { List inputs = new ArrayList<>(); - for (Channel c: model.getInputChannels()) { + for (Channel c : model.getInputChannels()) { DataTransferChannel channel = (DataTransferChannel) c; // I/O channel - for (ChannelMember out: channel.getOutputChannelMembers()) { + for (ChannelMember out : channel.getOutputChannelMembers()) { if (resource.getInSideResources().contains(out.getResource())) { MethodDeclaration input = getInputMethod(component, out, channel.getOutputChannelMembers().size()); inputs.add(input); @@ -1702,7 +1664,7 @@ } return inputs; } - + private static MethodDeclaration getInputMethod(TypeDeclaration component, ChannelMember cm, int outNumber) { String inputMethodName = null; if (cm.getStateTransition().getMessageExpression() instanceof Term) { @@ -1718,9 +1680,9 @@ MethodDeclaration input = getMethod(component, inputMethodName); return input; } - + private static MethodDeclaration getMethod(TypeDeclaration component, String methodName) { - for (MethodDeclaration m: component.getMethods()) { + for (MethodDeclaration m : component.getMethods()) { if (m.getName().equals(methodName)) return m; } return null; diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JerseySpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/JerseySpecific.java index a9f4c3c..1d61be4 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JerseySpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JerseySpecific.java @@ -1,53 +1,47 @@ package generators; -import java.util.List; -import java.util.Map; - import algorithms.TypeInference; -import code.ast.Annotation; -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.ImportDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; +import code.ast.*; import models.algebra.Type; import models.dataConstraintModel.DataConstraintModel; -public class JerseySpecific extends RestApiSpecific { +import java.util.List; +import java.util.Map; + +public class JerseySpecific extends RestApiSpecific { public static final Type typeClient = new Type("Client", "Client"); public JerseySpecific() { langSpec = new JavaSpecific(); } - + @Override public void addComponentAnnotations(TypeDeclaration component, String resourcePath) { component.addAnnotation(new Annotation("Component")); component.addAnnotation(new Annotation("Path", "\"/" + resourcePath + "\"")); } - + @Override public void addGetAnnotations(MethodDeclaration getMethod) { getMethod.addAnnotation(new Annotation("Produces", "MediaType.APPLICATION_JSON")); getMethod.addAnnotation(new Annotation("GET")); } - + @Override public void addPutAnnotations(MethodDeclaration putMethod) { putMethod.addAnnotation(new Annotation("PUT")); } - + @Override public void addPostAnnotations(MethodDeclaration postMethod) { - postMethod.addAnnotation(new Annotation("POST")); + postMethod.addAnnotation(new Annotation("POST")); } - + @Override public void addDeleteAnnotations(MethodDeclaration deleteMethod) { deleteMethod.addAnnotation(new Annotation("DELETE")); } - + @Override public void addPathAnnotation(MethodDeclaration method, String resourcePath) { method.addAnnotation(new Annotation("Path", "\"" + resourcePath + "\"")); @@ -75,23 +69,23 @@ cu.addImport(new ImportDeclaration("com.fasterxml.jackson.databind.ObjectMapper")); cu.addImport(new ImportDeclaration("com.fasterxml.jackson.core.JsonProcessingException")); } - + @Override public boolean hasHttpClientFieldDeclaration(TypeDeclaration component) { - for (FieldDeclaration field: component.getFields()) { + for (FieldDeclaration field : component.getFields()) { if (field.getType().equals(typeClient)) { return true; } } return false; } - + @Override public void addHttpClientFieldDeclaration(TypeDeclaration component) { FieldDeclaration clientField = new FieldDeclaration(typeClient, "client", "ClientBuilder.newClient()"); component.addField(clientField); } - + @Override public String getConversionFromJsonString(String fromStrVarName, String toVarName, String toVarType) { return toVarType + toVarName + langSpec.getAssignment() + langSpec.getConstructorInvocation("ObjectMapper", null) + ".readValue(" + fromStrVarName + ", HashMap.class)"; @@ -104,7 +98,7 @@ statements += "Form "; } statements += "form" + langSpec.getAssignment() + langSpec.getConstructorInvocation("Form", null) + langSpec.getStatementDelimiter() + "\n"; - for (Map.Entry> param: params) { + for (Map.Entry> param : params) { Type paramType = param.getKey(); String paramName = param.getValue().getKey(); String value = param.getValue().getValue(); @@ -117,7 +111,7 @@ statements += langSpec.getForStatementForCollection("i", wrapperType, value) + "\n"; } if (DataConstraintModel.typeTuple.isAncestorOf(compType) || DataConstraintModel.typePair.isAncestorOf(paramType) || DataConstraintModel.typeList.isAncestorOf(compType) || DataConstraintModel.typeMap.isAncestorOf(paramType)) { - statements += "\tform.param(\"" + paramName + "\", " + langSpec.getConstructorInvocation("ObjectMapper", null) + ".writeValueAsString(i))" + langSpec.getStatementDelimiter() + "\n"; // typeTuple: {"1.0":2.0}, typePair: {"left": 1.0, "right":2.0} + statements += "\tform.param(\"" + paramName + "\", " + langSpec.getConstructorInvocation("ObjectMapper", null) + ".writeValueAsString(i))" + langSpec.getStatementDelimiter() + "\n"; // typeTuple: {"1.0":2.0}, typePair: {"left": 1.0, "right":2.0} } else { statements += "\tform.param(\"" + paramName + "\", i.toString())" + langSpec.getStatementDelimiter() + "\n"; } @@ -125,7 +119,7 @@ // return "Entity entity = Entity.entity(" + paramName + ".toString(), MediaType.APPLICATION_JSON);"; } else if (DataConstraintModel.typeTuple.isAncestorOf(paramType) || DataConstraintModel.typePair.isAncestorOf(paramType) || DataConstraintModel.typeMap.isAncestorOf(paramType)) { // typeTuple: {"1.0":2.0}, typePair: {"left": 1.0, "right":2.0} - statements += "form.param(\"" + paramName + "\", " + langSpec.getConstructorInvocation("ObjectMapper", null) + ".writeValueAsString(" + value + "))" + langSpec.getStatementDelimiter() + "\n"; + statements += "form.param(\"" + paramName + "\", " + langSpec.getConstructorInvocation("ObjectMapper", null) + ".writeValueAsString(" + value + "))" + langSpec.getStatementDelimiter() + "\n"; } else { statements += "form.param(\"" + paramName + "\", " + new JavaSpecific().getValueToStringExp(paramType.getImplementationTypeName(), value) + ")" + langSpec.getStatementDelimiter() + "\n"; } @@ -136,13 +130,13 @@ statements += "entity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED)" + langSpec.getStatementDelimiter(); return statements; } - + @Override public String getHttpMethodCallStatement(String baseURL, String resourceName, String senderResName, String httpMethod) { if (senderResName == null) { return "client.target(\"" + baseURL + "\").path(\"/" + resourceName + "\").request()." + httpMethod + "(entity, String.class)" + langSpec.getStatementDelimiter(); } else { - // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. + // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. return "client.target(\"" + baseURL + "\").path(\"/" + resourceName + "/" + senderResName + "\").request()." + httpMethod + "(entity, String.class)" + langSpec.getStatementDelimiter(); } } @@ -153,14 +147,14 @@ if (responseTypeName.contains("<")) { responseShortTypeName = responseTypeName.substring(0, responseTypeName.indexOf("<")); } - return "client.target(\"" + baseURL + "\").path(\"/" + resourceName + "\").request()." + httpMethod + "(" + responseShortTypeName + ".class)" + langSpec.getStatementDelimiter(); + return "client.target(\"" + baseURL + "\").path(\"/" + resourceName + "\").request()." + httpMethod + "(" + responseShortTypeName + ".class)" + langSpec.getStatementDelimiter(); } - + @Override public void addJsonException(MethodDeclaration method) { method.addThrow("JsonProcessingException"); } - + @Override public boolean hasJsonException(MethodDeclaration method) { if (method.getThrows() == null || method.getThrows().getExceptions() == null) return false; diff --git a/AlgebraicDataflowArchitectureModel/src/generators/RestApiSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/RestApiSpecific.java index 3ddf549..8c1a355 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/RestApiSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/RestApiSpecific.java @@ -1,46 +1,42 @@ package generators; -import java.util.ArrayList; -import java.util.List; -import java.util.Map.Entry; - -import code.ast.Annotation; import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.ImportDeclaration; import code.ast.MethodDeclaration; import code.ast.TypeDeclaration; import code.ast.VariableDeclaration; import models.algebra.Type; +import java.util.List; +import java.util.Map.Entry; + abstract public class RestApiSpecific implements IPlatformSpecific { protected ILanguageSpecific langSpec = null; - + @Override public boolean hasMain() { return false; } - + @Override public boolean isMonolithic() { return false; } - + @Override public boolean isDifferentTreesAsDifferentServices() { return true; } - + abstract public void addComponentAnnotations(TypeDeclaration component, String resourcePath); - + abstract public void addGetAnnotations(MethodDeclaration getMethod); - + abstract public void addPutAnnotations(MethodDeclaration putMethod); - + abstract public void addPostAnnotations(MethodDeclaration postMethod); - + abstract public void addDeleteAnnotations(MethodDeclaration deleteMethod); - + abstract public void addPathAnnotation(MethodDeclaration method, String resourcePath); abstract public void addPathParamAnnotation(VariableDeclaration var, String paramName); @@ -48,7 +44,7 @@ abstract public void addFormParamAnnotation(VariableDeclaration var, String paramName); abstract public void addPlatformSpecificImports(CompilationUnit cu); - + abstract public boolean hasHttpClientFieldDeclaration(TypeDeclaration component); abstract public void addHttpClientFieldDeclaration(TypeDeclaration component); @@ -56,17 +52,17 @@ abstract public String getConversionFromJsonString(String fromStrVarName, String toVarName, String toVarType); abstract public String getHttpMethodParamsConstructionStatement(String callerResourceName, List>> params, boolean isFirstCall); - + abstract public String getHttpMethodCallStatement(String baseURL, String resourceName, String senderResName, String httpMethod); - + abstract public String getHttpMethodCallWithResponseStatement(String baseURL, String resourceName, String httpMethod, String responseTypeName); - + abstract public void addJsonException(MethodDeclaration method); abstract public boolean hasJsonException(MethodDeclaration method); - + public String getBaseURL() { return "http://localhost:8080"; } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/StandaloneSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/StandaloneSpecific.java index ce4acd5..081edf3 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/StandaloneSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/StandaloneSpecific.java @@ -1,28 +1,19 @@ package generators; -import java.util.List; - -import code.ast.Annotation; -import code.ast.CompilationUnit; -import code.ast.ImportDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; - public class StandaloneSpecific implements IPlatformSpecific { - + @Override public boolean hasMain() { return true; } - + @Override public boolean isMonolithic() { return true; } - + @Override public boolean isDifferentTreesAsDifferentServices() { - return false; // meaningless + return false; // meaningless } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/DirectedGraph.java b/AlgebraicDataflowArchitectureModel/src/models/DirectedGraph.java index 42b7208..f57532c 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/DirectedGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/DirectedGraph.java @@ -28,7 +28,7 @@ nodes.remove(node); node.clearInEdges(); node.clearOutEdges(); - for (Edge edge: edges) { + for (Edge edge : edges) { if (edge.getSource().equals(node)) { edges.remove(edge); } else if (edge.getDestination().equals(node)) { @@ -43,7 +43,7 @@ public void setEdges(Set edges) { this.edges = edges; - for (Edge edge: edges) { + for (Edge edge : edges) { if (!nodes.contains(edge.getSource())) nodes.add(edge.getSource()); if (!nodes.contains(edge.getDestination())) nodes.add(edge.getDestination()); edge.getSource().addOutEdge(edge); diff --git a/AlgebraicDataflowArchitectureModel/src/models/Edge.java b/AlgebraicDataflowArchitectureModel/src/models/Edge.java index 9ea2037..1a522f1 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/Edge.java +++ b/AlgebraicDataflowArchitectureModel/src/models/Edge.java @@ -25,11 +25,11 @@ public void setDestination(Node destination) { this.destination = destination; } - + public EdgeAttribute getAttribute() { return attribute; } - + public void setAttribute(EdgeAttribute attribute) { this.attribute = attribute; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/EdgeAttribute.java b/AlgebraicDataflowArchitectureModel/src/models/EdgeAttribute.java index ea6cdec..765fe59 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/EdgeAttribute.java +++ b/AlgebraicDataflowArchitectureModel/src/models/EdgeAttribute.java @@ -1,5 +1,4 @@ package models; public class EdgeAttribute { - } diff --git a/AlgebraicDataflowArchitectureModel/src/models/Node.java b/AlgebraicDataflowArchitectureModel/src/models/Node.java index 2954012..8c92924 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/Node.java +++ b/AlgebraicDataflowArchitectureModel/src/models/Node.java @@ -45,11 +45,11 @@ public void removeOutEdge(Edge edge) { outEdges.remove(edge); } - + public void clearInEdges() { inEdges.clear(); } - + public void clearOutEdges() { outEdges.clear(); } @@ -64,7 +64,7 @@ public Set getPredecessors() { Set predecessors = new HashSet(); - for (Edge edge: inEdges) { + for (Edge edge : inEdges) { predecessors.add(edge.getSource()); } return predecessors; @@ -72,16 +72,16 @@ public Set getSuccessors() { Set successors = new HashSet(); - for (Edge edge: outEdges) { + for (Edge edge : outEdges) { successors.add(edge.getDestination()); } return successors; } - + public NodeAttribute getAttribute() { return attribute; } - + public void setAttribute(NodeAttribute attribute) { this.attribute = attribute; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/NodeAttribute.java b/AlgebraicDataflowArchitectureModel/src/models/NodeAttribute.java index 7d1ded2..538d3f7 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/NodeAttribute.java +++ b/AlgebraicDataflowArchitectureModel/src/models/NodeAttribute.java @@ -1,5 +1,4 @@ package models; public class NodeAttribute { - } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java index 50207b6..fe8de06 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java @@ -3,14 +3,14 @@ import java.util.ArrayList; public class Constant extends Term { - + public Constant(String value) { super(new Symbol(value, 0), new ArrayList()); } public Constant(String value, Type type) { - super(new Symbol((type == null ? value: type.valueToRepresentation(value)), 0), new ArrayList()); - symbol.setSignature(new Type[] {type}); + super(new Symbol((type == null ? value : type.valueToRepresentation(value)), 0), new ArrayList()); + symbol.setSignature(new Type[]{type}); } public Constant(Symbol symbol) { @@ -25,7 +25,7 @@ @Override public Object clone() { - Constant c = new Constant(symbol); + Constant c = new Constant(symbol); c.setType(type); return c; } @@ -43,7 +43,7 @@ public String toImplementation(String[] sideEffects) { if (symbol.isImplGenerative()) { - String exp = symbol.generate(getType(), new Type[] {}, new String[] {}, new String[] {}, sideEffects); + String exp = symbol.generate(getType(), new Type[]{}, new String[]{}, new String[]{}, sideEffects); return exp; } return symbol.getImplName(); diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java index 7695979..a6a9409 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java @@ -4,21 +4,28 @@ public abstract class Expression implements Cloneable { public abstract Expression getSubTerm(Position pos); + /** * Get the unification between this expression and another expression. + * * @param another another expression * @return unified expression */ public abstract Expression unify(Expression another); + /** * Get the inverse map to obtain a sub-term of a given output value back from the output value itself. + * * @param outputValue an output value (usually a term) - * @param targetPos a position in outputValue + * @param targetPos a position in outputValue * @return inverse map */ public abstract Expression getInverseMap(Expression outputValue, Position targetPos); + public abstract boolean contains(Expression exp); + public abstract Object clone(); + public abstract HashMap getSubTerms(Class clazz); public HashMap getVariables() { @@ -27,6 +34,7 @@ /** * Get the implementation of this expression. + * * @param sideEffects an array with an optional implementation that should be written before the evaluation of this expression * @return the implementation to represent the value of this expression */ diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java index 6702d3f..9389de4 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java @@ -1,21 +1,20 @@ package models.algebra; -import java.util.ArrayList; - /** * A field in the implementation (regarded as a constant in the algebraic system) + * * @author Nitta * */ public class Field extends Constant { - + public Field(String name) { super(name); } public Field(String name, Type type) { super(name); - symbol.setSignature(new Type[] {type}); + symbol.setSignature(new Type[]{type}); } public Field(Symbol symbol) { @@ -28,7 +27,7 @@ } return null; } - + @Override public boolean equals(Object another) { if (!(another instanceof Field)) return false; diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/LambdaAbstraction.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/LambdaAbstraction.java index 9898224..c740729 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/LambdaAbstraction.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/LambdaAbstraction.java @@ -19,11 +19,11 @@ this.variables = variables; this.term = term; } - + public List getVariables() { return variables; } - + public Term getTerm() { return term; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Parameter.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Parameter.java index ab84998..93d5286 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Parameter.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Parameter.java @@ -2,18 +2,19 @@ /** * A parameter in the implementation (regarded as a constant in the algebraic system) + * * @author Nitta * */ public class Parameter extends Constant { - + public Parameter(String name) { super(name); } public Parameter(String name, Type type) { super(name); - symbol.setSignature(new Type[] {type}); + symbol.setSignature(new Type[]{type}); } public Parameter(Symbol symbol) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Position.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Position.java index de90a73..a27449a 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Position.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Position.java @@ -20,7 +20,7 @@ public int removeHeadOrder() { return orders.remove(0); } - + public List getOrders() { return orders; } @@ -28,7 +28,7 @@ public boolean isEmpty() { return (orders == null || orders.size() == 0); } - + public boolean isAncestorOf(Position another) { if (another.orders.size() < this.orders.size()) return false; for (int i = 0; i < orders.size(); i++) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java index b358747..96b3290 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java @@ -5,7 +5,7 @@ public class Symbol { protected String name; protected String implName; - protected int arity = 0; // -1: variable number + protected int arity = 0; // -1: variable number protected Type operatorType = Type.PREFIX; protected Type implOperatorType = Type.PREFIX; protected Symbol[] inverses = null; @@ -109,11 +109,11 @@ public void setArity(int arity) { this.arity = arity; } - + public int getArity() { return arity; } - + public String getName() { return name; } @@ -122,7 +122,7 @@ this.name = name; this.implName = name; } - + public Type getOperatorType() { return operatorType; } @@ -138,31 +138,31 @@ public boolean isLambda() { return (operatorType == Type.LAMBDA); } - + public Symbol[] getInverses() { return inverses; } - + public void setInverses(Symbol[] inverses) { this.inverses = inverses; } - + public models.algebra.Type[] getSignature() { return signature; } - + public void setSignature(models.algebra.Type[] signature) { this.signature = signature; } - + public String getImplName() { return implName; } - + public void setImplName(String implName) { this.implName = implName; } - + public Type getImplOperatorType() { return implOperatorType; } @@ -184,11 +184,11 @@ } public boolean isImplWithSideEffect() { - return (implOperatorType == Type.METHOD_WITH_SIDE_EFFECT - || implOperatorType == Type.LAMBDA_WITH_SIDE_EFFECT + return (implOperatorType == Type.METHOD_WITH_SIDE_EFFECT + || implOperatorType == Type.LAMBDA_WITH_SIDE_EFFECT || implOperatorType == Type.GENERATIVE_WITH_SIDE_EFFECT); } - + public void setImplOperatorType(Type implOperatorType) { this.implOperatorType = implOperatorType; } @@ -198,16 +198,17 @@ } public void setGenerator(IImplGenerator generator) { - this.generator = generator; + this.generator = generator; } /** * Generate the implementation of this symbol - * @param type the type of this symbol - * @param childrenTypes - * @param childrenImpl the implementations of the children + * + * @param type the type of this symbol + * @param childrenTypes + * @param childrenImpl the implementations of the children * @param childrenSideEffects (input) an array of the side effects of the children - * @param sideEffect (output) an array of the side effect of this symbol + * @param sideEffect (output) an array of the side effect of this symbol * @return the implementation */ public String generate(models.algebra.Type type, models.algebra.Type[] childrenTypes, String[] childrenImpl, String[] childrenSideEffects, String[] sideEffect) { @@ -227,7 +228,7 @@ } return null; } - + public boolean equals(Object another) { if (!(another instanceof Symbol)) return false; return name.equals(((Symbol) another).name) && arity == ((Symbol) another).arity; @@ -279,11 +280,12 @@ public interface IImplGenerator { /** * Generate the implementation - * @param type the type of this expression - * @param childrenTypes - * @param children the implementations of the children + * + * @param type the type of this expression + * @param childrenTypes + * @param children the implementations of the children * @param childrenSideEffects (input) an array of the side effects of the children - * @param sideEffect (output) an array of the side effect of this generator + * @param sideEffect (output) an array of the side effect of this generator * @return the generated implementation */ public String generate(models.algebra.Type type, models.algebra.Type[] childrenTypes, String children[], String[] childrenSideEffects, String[] sideEffect); diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java index 07993fa..d96bfec 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java @@ -15,19 +15,19 @@ super(); this.symbol = symbol; } - + public Term(Symbol symbol, List children) { super(); this.symbol = symbol; this.children = children; } - + public Term(Symbol symbol, Expression[] children) { super(); this.symbol = symbol; this.children = new ArrayList<>(Arrays.asList(children)); } - + public Symbol getSymbol() { return symbol; } @@ -40,14 +40,14 @@ this.type = type; } - public Type getType() { + public Type getType() { if (type == null) { if (symbol.getSignature() == null) return null; return symbol.getSignature()[0]; } return type; } - + public boolean addChild(Expression child) { if (getArity() != -1 && children.size() >= getArity()) return false; children.add(child); @@ -59,7 +59,7 @@ children.set(n, child); return true; } - + public void addChild(Expression child, boolean bForced) { if (!bForced && getArity() != -1 && children.size() >= getArity()) return; children.add(child); @@ -86,7 +86,7 @@ for (int i = 0; i < children.size(); i++) { if (children.get(i) != null) { HashMap terms = children.get(i).getSubTerms(clazz); - for (Entry term: terms.entrySet()) { + for (Entry term : terms.entrySet()) { Position pos = term.getKey(); pos.addHeadOrder(i); subTerms.put(pos, term.getValue()); @@ -107,7 +107,7 @@ public Term substitute(Variable variable, Expression value) { Term newTerm = (Term) this.clone(); HashMap variables = getVariables(); - for (Entry varEnt: variables.entrySet()) { + for (Entry varEnt : variables.entrySet()) { if (varEnt.getValue().equals(variable)) { newTerm.replaceSubTerm(varEnt.getKey(), value); } @@ -143,7 +143,7 @@ return unifiedTerm; } else { return null; - } + } } public Expression reduce() { @@ -166,7 +166,7 @@ } } else if (symbol.isCalculatable()) { List newChildren = new ArrayList<>(); - for (Expression child: children) { + for (Expression child : children) { if (child instanceof Term) { child = ((Term) child).reduce(); } @@ -179,7 +179,7 @@ // Calculate inverse map List newChildren = new ArrayList<>(); boolean bReduced = false; - for (Expression child: children) { + for (Expression child : children) { if (child instanceof Term && !(child instanceof Constant)) { Expression newChild = ((Term) (child)).reduce(); if (newChild != child) { @@ -229,7 +229,7 @@ @Override public boolean contains(Expression exp) { if (equals(exp)) return true; - for (Expression e: children) { + for (Expression e : children) { if (e.contains(exp)) return true; } return false; @@ -260,7 +260,7 @@ @Override public Object clone() { Term newTerm = new Term(symbol); - for (Expression e: children) { + for (Expression e : children) { if (e != null) { newTerm.addChild((Expression) e.clone()); } else { @@ -287,7 +287,7 @@ } else { String exp = symbol.toString() + "("; String delimiter = ""; - for (Expression e: children) { + for (Expression e : children) { if (e != null) { exp += (delimiter + e.toString()); } else { @@ -298,7 +298,7 @@ return exp + ")"; } } - + public String toImplementation(String[] sideEffects) { int[] implParamOrder = symbol.getImplParamOrder(); @@ -339,14 +339,14 @@ } else if (child instanceof Term) { childrenTypes[i] = ((Term) child).getType(); } - String childSideEffect[] = new String[] {""}; + String childSideEffect[] = new String[]{""}; childrenImpl[i] = child.toImplementation(childSideEffect); childrenSideEffects[i] = childSideEffect[0]; } String exp = symbol.generate(getType(), childrenTypes, childrenImpl, childrenSideEffects, sideEffects); if (symbol.isImplWithSideEffect()) { sideEffects[0] = sideEffects[0] + exp; - exp = childrenImpl[0]; // the value of this term + exp = childrenImpl[0]; // the value of this term } return exp; } else { @@ -357,14 +357,14 @@ } else if (child instanceof Term) { childrenTypes[i] = ((Term) child).getType(); } - String childSideEffect[] = new String[] {""}; + String childSideEffect[] = new String[]{""}; childrenImpl[i] = child.toImplementation(childSideEffect); childrenSideEffects[i] = childSideEffect[0]; } String exp = symbol.generate(getType(), childrenTypes, childrenImpl, childrenSideEffects, sideEffects); if (symbol.isImplWithSideEffect()) { sideEffects[0] = sideEffects[0] + exp; - exp = childrenImpl[0]; // the value of this term + exp = childrenImpl[0]; // the value of this term } return exp; } @@ -418,7 +418,7 @@ if (implParamOrder == null) { String exp = symbol.toImplementation() + "("; String delimiter = ""; - for (Expression e: children) { + for (Expression e : children) { exp += (delimiter + e.toImplementation(sideEffects)); delimiter = ","; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Type.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Type.java index 9e3eecb..a2d6a35 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Type.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Type.java @@ -20,7 +20,7 @@ this.implementationTypeName = implementationTypeName; this.interfaceTypeName = interfaceTypeName; } - + public Type(String typeName, String implementationTypeName, Type parentType) { this.typeName = typeName; this.implementationTypeName = implementationTypeName; @@ -34,7 +34,7 @@ this.interfaceTypeName = interfaceTypeName; this.parentTypes.add(parentType); } - + public String getTypeName() { return typeName; } @@ -62,11 +62,11 @@ public List getParentTypes() { return parentTypes; } - + public void addParentType(Type parentType) { parentTypes.add(parentType); } - + public void replaceParentType(Type oldParentType, Type newParentType) { parentTypes.set(parentTypes.indexOf(oldParentType), newParentType); } @@ -74,7 +74,7 @@ public boolean isAncestorOf(Type another) { if (this.equals(another)) return true; if (another == null || another.getParentTypes() == null) return false; - for (Type anothersParentType: another.getParentTypes()) { + for (Type anothersParentType : another.getParentTypes()) { if (isAncestorOf(anothersParentType)) return true; } return false; @@ -99,7 +99,7 @@ if (!interfaceTypeName.equals(((Type) another).interfaceTypeName)) return false; return true; } - + public Memento createMemento() { return new Memento(implementationTypeName, interfaceTypeName, parentTypes); } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java index fa0095b..4652c54 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java @@ -10,13 +10,13 @@ super(); this.name = name; } - + public Variable(String name, Type type) { super(); this.name = name; this.type = type; } - + public String getName() { return name; } @@ -24,11 +24,11 @@ public Type getType() { return type; } - + public void setType(Type type) { this.type = type; } - + @Override public HashMap getSubTerms(Class clazz) { HashMap subTerms = new HashMap<>(); @@ -48,18 +48,18 @@ public Expression unify(Expression another) { return (Expression) another.clone(); } - + @Override public Expression getInverseMap(Expression outputValue, Position targetPos) { if (targetPos.isEmpty()) return outputValue; return null; } - + @Override public boolean contains(Expression exp) { return equals(exp); } - + @Override public boolean equals(Object another) { if (!(another instanceof Variable)) return false; diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdge.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdge.java index e19986e..d7af3fb 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdge.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdge.java @@ -8,7 +8,7 @@ public CallEdge(ObjectNode src, ObjectNode dst, PushPullValue selectedOption) { super(src, dst); - this.selectedOption = selectedOption; + this.selectedOption = selectedOption; } public PushPullValue getSelectedOption() { diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallGraph.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallGraph.java index 8928877..dc881c9 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallGraph.java @@ -1,15 +1,15 @@ package models.controlFlowModel; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import models.DirectedGraph; import models.Node; import models.dataFlowModel.PushPullValue; import models.dataFlowModel.ResourceNode; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + public class CallGraph extends DirectedGraph { protected Map statefulObjMap = null; @@ -36,7 +36,7 @@ super.addNode(node); } } - + public void addEdge(ResourceNode srcResNode, ResourceNode dstResNode, PushPullValue selectedOption) { addNode(srcResNode); addNode(dstResNode); @@ -58,7 +58,7 @@ public Set getRootNodes() { Set roots = new HashSet<>(getNodes()); - for (Node n: getNodes()) { + for (Node n : getNodes()) { roots.removeAll(n.getSuccessors()); } return roots; diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java index 00d38ad..b349a4f 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowGraph.java @@ -1,11 +1,6 @@ package models.controlFlowModel; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - +import models.DirectedGraph; import models.Edge; import models.Node; import models.algebra.Expression; @@ -13,9 +8,13 @@ import models.algebra.Variable; import models.dataConstraintModel.Channel; import models.dataConstraintModel.ChannelMember; -import models.DirectedGraph; import models.dataFlowModel.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + public class ControlFlowGraph extends DirectedGraph implements IFlowGraph { private DataFlowGraph dataFlowGraph; private CallGraph pushCallGraph; @@ -25,14 +24,14 @@ this.dataFlowGraph = dataFlowGraph; this.pushCallGraph = new CallGraph(); this.pullCallGraph = new CallGraph(); - for (Edge resToCh: dataFlowGraph.getEdges()) { + for (Edge resToCh : dataFlowGraph.getEdges()) { if (!((DataFlowEdge) resToCh).isChannelToResource()) { // A resource to channel edge PushPullAttribute pushPull = ((PushPullAttribute) ((DataFlowEdge) resToCh).getAttribute()); ResourceNode srcResNode = (ResourceNode) resToCh.getSource(); ChannelNode chNode = (ChannelNode) resToCh.getDestination(); - for (Edge chToRes: chNode.getOutEdges()) { - ResourceNode dstResNode = (ResourceNode) chToRes.getDestination(); + for (Edge chToRes : chNode.getOutEdges()) { + ResourceNode dstResNode = (ResourceNode) chToRes.getDestination(); if (pushPull.getOptions().get(0) == PushPullValue.PUSH) { // same direction as the data flow pushCallGraph.addEdge(srcResNode, dstResNode, PushPullValue.PUSH); @@ -43,10 +42,10 @@ } } } - for (Channel ch: model.getInputChannels()) { + for (Channel ch : model.getInputChannels()) { DataTransferChannel evCh = (DataTransferChannel) ch; EventChannelObjectNode srcNode = new EventChannelObjectNode(evCh); - for (ChannelMember cm: evCh.getChannelMembers()) { + for (ChannelMember cm : evCh.getChannelMembers()) { if (srcNode.getName() == null) { Expression exp = cm.getStateTransition().getMessageExpression(); if (exp instanceof Term) { @@ -55,7 +54,7 @@ srcNode.setName(((Variable) exp).getName()); } } - for (ResourceNode dstResNode: dataFlowGraph.getResourceNodes(cm.getResource().getResourceHierarchy())) { + for (ResourceNode dstResNode : dataFlowGraph.getResourceNodes(cm.getResource().getResourceHierarchy())) { StatefulObjectNode dstNode = pushCallGraph.getStatefulObjectNode(dstResNode); if (dstNode == null) { pushCallGraph.addNode(dstResNode); @@ -79,16 +78,16 @@ public CallGraph getPullCallGraph() { return pullCallGraph; } - + @Override public Map> getAllComponentNodes() { Map> allNodeSets = new HashMap<>(); - for (Node n: pushCallGraph.getNodes()) { + for (Node n : pushCallGraph.getNodes()) { Set nodeSet = new HashSet<>(); nodeSet.add(n); allNodeSets.put(n, nodeSet); } - for (Node n: pullCallGraph.getNodes()) { + for (Node n : pullCallGraph.getNodes()) { if (n instanceof StatefulObjectNode) { ResourceNode resNode = ((StatefulObjectNode) n).getResource(); Set nodeSet = null; diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/EventChannelObjectNode.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/EventChannelObjectNode.java index 913ead5..8b98e34 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/EventChannelObjectNode.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/EventChannelObjectNode.java @@ -4,7 +4,7 @@ public class EventChannelObjectNode extends ObjectNode { DataTransferChannel eventChannel = null; - + public EventChannelObjectNode(DataTransferChannel ioChannel) { super(null); this.eventChannel = ioChannel; @@ -18,7 +18,7 @@ public DataTransferChannel getIOChannel() { return eventChannel; } - + public void setIOChannel(DataTransferChannel ioChannel) { this.eventChannel = ioChannel; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ObjectNode.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ObjectNode.java index b754e72..a2b27e6 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ObjectNode.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ObjectNode.java @@ -1,25 +1,25 @@ package models.controlFlowModel; -import java.util.ArrayList; -import java.util.List; - import models.Edge; import models.Node; +import java.util.ArrayList; +import java.util.List; + public class ObjectNode extends Node { protected String name = ""; public ObjectNode(String name) { inEdges = new ArrayList<>(); - outEdges = new ArrayList<>(); + outEdges = new ArrayList<>(); this.name = name; } - + public String getName() { return name; } - + public void setName(String name) { this.name = name; } @@ -27,14 +27,14 @@ public CallEdge getInEdge(int i) { return (CallEdge) ((List) inEdges).get(i); } - + public CallEdge getOutEdge(int i) { return (CallEdge) ((List) outEdges).get(i); } - + public CallEdge findEdgeInInEdges(final CallEdge edge) { for (Edge e : inEdges) { - if (e instanceof CallEdge) return (CallEdge)e; + if (e instanceof CallEdge) return (CallEdge) e; } return null; } @@ -42,7 +42,7 @@ public void insertOutEdge(CallEdge edge, int n) { ((List) outEdges).add(n, edge); } - + public int getChildrenNum() { return outEdges.size(); } @@ -53,7 +53,7 @@ } return -1; } - + public ObjectNode getChildren(int i) { return (ObjectNode) ((List) outEdges).get(i).getDestination(); } @@ -64,10 +64,10 @@ * @param newCallOrder 新しい呼び出し順 */ public void sortOutEdgesByCallOrder(final int curOrder, final int newCallOrder) { - ArrayList edges = ((ArrayList)outEdges); - Edge selectedEdge = ((List)outEdges).get(curOrder); - - Edge tempEdge = ((List)outEdges).get(newCallOrder - 1); + ArrayList edges = ((ArrayList) outEdges); + Edge selectedEdge = ((List) outEdges).get(curOrder); + + Edge tempEdge = ((List) outEdges).get(newCallOrder - 1); edges.set(newCallOrder - 1, selectedEdge); edges.set(curOrder, tempEdge); diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/StatefulObjectNode.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/StatefulObjectNode.java index a1e50cd..baae52f 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/StatefulObjectNode.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/StatefulObjectNode.java @@ -9,7 +9,7 @@ super(resource.getResourceName()); this.resource = resource; } - + public ResourceNode getResource() { return resource; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/Channel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/Channel.java index 2bec47e..8d09110 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/Channel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/Channel.java @@ -1,13 +1,13 @@ package models.dataConstraintModel; +import models.algebra.Expression; +import models.algebra.Variable; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import models.algebra.Expression; -import models.algebra.Variable; - public class Channel { protected String channelName; protected Channel parent = null; @@ -39,16 +39,16 @@ this.parent = null; this.children = new ArrayList<>(); selectors = new ArrayList<>(); - for (Variable var: variables) { + for (Variable var : variables) { selectors.add(new Selector(var)); } channelMembers = new HashSet<>(); } - + public String getChannelName() { return channelName; } - + public Channel getParent() { return parent; } @@ -56,32 +56,32 @@ public List getChildren() { return children; } - + public void addChild(Channel child) { children.add(child); child.parent = this; child.refleshOutside(); } - + public List getSelectors() { return selectors; } - + public List getAllSelectors() { List allSelectors = new ArrayList<>(); if (parent != null) allSelectors.addAll(parent.getAllSelectors()); allSelectors.addAll(selectors); return allSelectors; } - + public void setSelectors(List selectors) { this.selectors = selectors; } - + public void addSelector(Variable var) { selectors.add(new Selector(var)); } - + public void addSelector(Selector selector) { selectors.add(selector); } @@ -89,16 +89,16 @@ public List getAllSelectorVariables() { List allSelectorVariables = new ArrayList<>(); if (parent != null) allSelectorVariables.addAll(parent.getAllSelectorVariables()); - for (Selector sel: selectors) { + for (Selector sel : selectors) { allSelectorVariables.add(sel.getExpression()); } return allSelectorVariables; } - + public Set getChannelMembers() { return channelMembers; } - + public void setChannelMembers(Set channelMembers) { this.channelMembers = channelMembers; } @@ -107,7 +107,7 @@ channelMembers.add(channelMember); if (getAllSelectors().size() > 0) { Set params = new HashSet<>(); - for (Selector s: getAllSelectors()) { + for (Selector s : getAllSelectors()) { params.add(s.getExpression()); } if (!params.containsAll(channelMember.getResource().getPathParams())) { @@ -126,10 +126,10 @@ } public void refleshOutside() { - for (ChannelMember channelMember: channelMembers) { + for (ChannelMember channelMember : channelMembers) { if (getAllSelectors().size() > 0) { Set params = new HashSet<>(); - for (Selector s: getAllSelectors()) { + for (Selector s : getAllSelectors()) { params.add(s.getExpression()); } if (!params.containsAll(channelMember.getResource().getPathParams())) { @@ -148,29 +148,29 @@ } public void removeChannelMember(ResourcePath res) { - for (ChannelMember cm: channelMembers) { + for (ChannelMember cm : channelMembers) { if (cm.getResource() == res) { channelMembers.remove(cm); break; } } } - + public Set getResources() { Set resources = new HashSet<>(); - for (ChannelMember member: channelMembers) { + for (ChannelMember member : channelMembers) { resources.add(member.getResource()); } return resources; } - + public boolean isNative() { return isNative; } - + public void setNative(boolean isNative) { this.isNative = isNative; - for (ChannelMember member: channelMembers) { + for (ChannelMember member : channelMembers) { member.getResource().getResourceHierarchy().setNative(isNative); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ChannelMember.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ChannelMember.java index 370c3f7..b6dc4ee 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ChannelMember.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ChannelMember.java @@ -1,8 +1,5 @@ package models.dataConstraintModel; -import java.util.ArrayList; -import java.util.List; - public class ChannelMember { private ResourcePath resourcePath = null; private StateTransition stateTransition = null; @@ -13,19 +10,19 @@ stateTransition = new StateTransition(); isOutside = false; } - + public ResourcePath getResource() { return resourcePath; } - + public void setResource(ResourcePath resourcePath) { this.resourcePath = resourcePath; } - + public StateTransition getStateTransition() { return stateTransition; } - + public void setStateTransition(StateTransition stateTransition) { this.stateTransition = stateTransition; } @@ -33,7 +30,7 @@ public boolean isOutside() { return this.isOutside; } - + public void setOutside(boolean isOutside) { this.isOutside = isOutside; } @@ -46,8 +43,8 @@ + stateTransition.getMessageExpression() + ")"; } return resourcePath.toString() + "(" - + stateTransition.getCurStateExpression() + "," - + stateTransition.getMessageExpression() + ")" - + " = " + stateTransition.getNextStateExpression(); + + stateTransition.getCurStateExpression() + "," + + stateTransition.getMessageExpression() + ")" + + " = " + stateTransition.getNextStateExpression(); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java index 4a498b1..6421a5c 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java @@ -1,24 +1,10 @@ package models.dataConstraintModel; -import java.util.AbstractMap; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Stack; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.LambdaAbstraction; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.Variable; +import models.algebra.*; import parser.Parser; +import java.util.*; + public class DataConstraintModel { protected List resourcePaths = null; protected HashMap resourceHierarchies = null; @@ -38,6 +24,7 @@ } return value.toString(); } + public Object representationToValue(String representation) { if (representation.startsWith(Parser.DOUBLE_QUOT) && representation.endsWith(Parser.DOUBLE_QUOT)) { return representation.substring(1, representation.length() - 1); @@ -233,10 +220,10 @@ public static final Symbol eq = new Symbol(Parser.EQ, 2, Symbol.Type.INFIX, new Symbol.IImplGenerator() { @Override public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, String[] sideEffect) { - for (String s: childrenSideEffects) { + for (String s : childrenSideEffects) { sideEffect[0] += s; } - if (childrenTypes[0] != null && childrenTypes[0].equals(typeString) + if (childrenTypes[0] != null && childrenTypes[0].equals(typeString) && childrenTypes[1] != null && childrenTypes[1].equals(typeString)) { return children[0] + ".equals(" + children[1] + ")"; } @@ -284,10 +271,10 @@ public static final Symbol neq = new Symbol(Parser.NEQ, 2, Symbol.Type.INFIX, new Symbol.IImplGenerator() { @Override public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, String[] sideEffect) { - for (String s: childrenSideEffects) { + for (String s : childrenSideEffects) { sideEffect[0] += s; } - if (childrenTypes[0] != null && childrenTypes[0].equals(typeString) + if (childrenTypes[0] != null && childrenTypes[0].equals(typeString) && childrenTypes[1] != null && childrenTypes[1].equals(typeString)) { return "!" + children[0] + ".equals(" + children[1] + ")"; } @@ -550,9 +537,9 @@ } } }); - public static final Symbol cons = new Symbol("cons", 2, Symbol.Type.PREFIX, "($x,$y)->$x.add(0, $y)", Symbol.Type.LAMBDA_WITH_SIDE_EFFECT, new int[] {1, 0}); - public static final Symbol append = new Symbol("append", 2, Symbol.Type.PREFIX, "add", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). - public static final Symbol remove = new Symbol("remove", 2, Symbol.Type.PREFIX, "remove", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). + public static final Symbol cons = new Symbol("cons", 2, Symbol.Type.PREFIX, "($x,$y)->$x.add(0, $y)", Symbol.Type.LAMBDA_WITH_SIDE_EFFECT, new int[]{1, 0}); + public static final Symbol append = new Symbol("append", 2, Symbol.Type.PREFIX, "add", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). + public static final Symbol remove = new Symbol("remove", 2, Symbol.Type.PREFIX, "remove", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). public static final Symbol head = new Symbol("head", 1, Symbol.Type.PREFIX, "($x)->$x.get(0)", Symbol.Type.LAMBDA); public static final Symbol tail = new Symbol("tail", 1, Symbol.Type.PREFIX, "($x)->$x.subList(1, $x.size())", Symbol.Type.LAMBDA); public static final Symbol length = new Symbol("length", 1, Symbol.Type.PREFIX, "($x)->$x.size()", Symbol.Type.LAMBDA, new Symbol.ICalculator() { @@ -637,7 +624,7 @@ } if (term instanceof ListTerm) { ListTerm listTerm = (ListTerm) term.clone(); - for (Expression child: appendedChldren) { + for (Expression child : appendedChldren) { listTerm.append(child); } return listTerm.get(idx); @@ -648,11 +635,11 @@ return null; } }); - public static final Symbol set = new Symbol("set", 3, Symbol.Type.PREFIX, "set", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). + public static final Symbol set = new Symbol("set", 3, Symbol.Type.PREFIX, "set", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). public static final Symbol contains = new Symbol("contains", 2, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { @Override public String generate(Type type, Type[] childrenTypes, String[] childrenImpl, String[] childrenSideEffects, String[] sideEffect) { - for (String s: childrenSideEffects) { + for (String s : childrenSideEffects) { sideEffect[0] += s; } if (childrenTypes[0] != null && (typeMap.isAncestorOf(childrenTypes[0]) || typeJson.isAncestorOf(childrenTypes[0]))) { @@ -680,7 +667,7 @@ term = (Term) term.getChild(0); } if (term instanceof ListTerm) { - for (Expression element: term.getChildren()) { + for (Expression element : term.getChildren()) { if (element.equals(args.get(1))) { return new Constant(true_); } @@ -754,13 +741,13 @@ if (term instanceof ListTerm) { int idx = 0; ListTerm listTerm = (ListTerm) term; - for (Expression child: listTerm.getChildren()) { + for (Expression child : listTerm.getChildren()) { if (child.equals(args.get(1))) { return new Constant(Integer.toString(idx), typeInt); } idx++; } - for (Expression child: appendedChldren) { + for (Expression child : appendedChldren) { if (child.equals(args.get(1))) { return new Constant(Integer.toString(idx), typeInt); } @@ -774,6 +761,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 = ""; @@ -797,7 +785,7 @@ count[0]++; return temp; } - } + } return "new ArrayList<" + compType + ">()"; } }, true); @@ -806,18 +794,21 @@ public static final Symbol false_ = new Symbol("false", 0, Symbol.Type.PREFIX, "false", Symbol.Type.PREFIX); public static final Symbol cond = new Symbol("if", 3, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { final int count[] = {0}; + @Override public String generate(Type type, Type[] childrenTypes, String[] childrenImpl, String[] childrenSideEffects, String[] sideEffect) { String temp = "temp_if" + count[0]; - String impl = ""; + String impl = ""; impl += type.getInterfaceTypeName() + " " + temp + ";\n"; if (childrenSideEffects[0] != null && childrenSideEffects[0].length() > 0) impl += childrenSideEffects[0]; impl += "if (" + childrenImpl[0] + ") {\n"; - if (childrenSideEffects[1] != null && childrenSideEffects[1].length() > 0) impl += "\t" + childrenSideEffects[1]; + if (childrenSideEffects[1] != null && childrenSideEffects[1].length() > 0) + impl += "\t" + childrenSideEffects[1]; impl += "\t" + temp + " = " + childrenImpl[1] + ";\n"; impl += "} else {\n"; - if (childrenSideEffects[2] != null && childrenSideEffects[2].length() > 0) impl += "\t" + childrenSideEffects[2]; + if (childrenSideEffects[2] != null && childrenSideEffects[2].length() > 0) + impl += "\t" + childrenSideEffects[2]; impl += "\t" + temp + " = " + childrenImpl[2] + ";\n"; impl += "}\n"; @@ -841,7 +832,7 @@ public static final Symbol pair = new Symbol("pair", -1, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { @Override public String generate(Type type, Type[] childrenTypes, String[] childrenImpl, String[] childrenSideEffects, String[] sideEffect) { - for (String s: childrenSideEffects) { + for (String s : childrenSideEffects) { sideEffect[0] += s; } String impl = "new Pair<>(" + childrenImpl[0] + "," + childrenImpl[1] + ")"; @@ -851,7 +842,7 @@ public static final Symbol tuple = new Symbol("tuple", -1, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { @Override public String generate(Type type, Type[] childrenTypes, String[] childrenImpl, String[] childrenSideEffects, String[] sideEffect) { - for (String s: childrenSideEffects) { + for (String s : childrenSideEffects) { sideEffect[0] += s; } String impl = "new AbstractMap.SimpleEntry<>(" + childrenImpl[0] + "$x)"; @@ -866,8 +857,8 @@ public static final Symbol snd = new Symbol("snd", 1, Symbol.Type.PREFIX, "getValue", Symbol.Type.METHOD); public static final Symbol left = new Symbol("left", 1, Symbol.Type.PREFIX, "getLeft", Symbol.Type.METHOD); public static final Symbol right = new Symbol("right", 1, Symbol.Type.PREFIX, "getRight", Symbol.Type.METHOD); - public static final Symbol insert = new Symbol("insert", 3, Symbol.Type.PREFIX, "put", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). - public static final Symbol delete = new Symbol("delete", 2, Symbol.Type.PREFIX, "remove", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). + public static final Symbol insert = new Symbol("insert", 3, Symbol.Type.PREFIX, "put", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). + public static final Symbol delete = new Symbol("delete", 2, Symbol.Type.PREFIX, "remove", Symbol.Type.METHOD_WITH_SIDE_EFFECT); // Don't calculate here (Calculated in simulator). public static final Symbol lookup = new Symbol("lookup", 2, Symbol.Type.PREFIX, "get", Symbol.Type.METHOD, new Symbol.ICalculator() { @Override public Expression calculate(List args) { @@ -887,9 +878,9 @@ } if (term instanceof MapTerm) { MapTerm mapTerm = (MapTerm) term.clone(); - for (Map.Entry childEnt: appendedChldren) { + for (Map.Entry childEnt : appendedChldren) { if (childEnt.getKey().getClass() == Constant.class) - mapTerm.insert((String) ((Constant) childEnt.getKey()).getValue(), childEnt.getValue()); + mapTerm.insert((String) ((Constant) childEnt.getKey()).getValue(), childEnt.getValue()); } return mapTerm.get(key); } @@ -906,12 +897,14 @@ @Override public Expression calculate(List args) { return new Constant(Double.toString(Math.PI), typeDouble); - }}); + } + }); public static final Symbol E = new Symbol("E", 0, Symbol.Type.PREFIX, "Math.E", Symbol.Type.PREFIX, new Symbol.ICalculator() { @Override public Expression calculate(List args) { return new Constant(Double.toString(Math.E), typeDouble); - }}); + } + }); public static final Symbol sqrt = new Symbol("sqrt", 1, Symbol.Type.PREFIX, "Math.sqrt", Symbol.Type.PREFIX, new Symbol.ICalculator() { @Override public Expression calculate(List args) { @@ -923,7 +916,8 @@ } } return null; - }}); + } + }); public static final Symbol sin = new Symbol("sin", 1, Symbol.Type.PREFIX, "Math.sin", Symbol.Type.PREFIX); public static final Symbol cos = new Symbol("cos", 1, Symbol.Type.PREFIX, "Math.cos", Symbol.Type.PREFIX); public static final Symbol tan = new Symbol("tan", 1, Symbol.Type.PREFIX, "Math.tan", Symbol.Type.PREFIX); @@ -934,71 +928,71 @@ public static final Symbol exp = new Symbol("exp", 1, Symbol.Type.PREFIX, "Math.exp", Symbol.Type.PREFIX); public static final Symbol log = new Symbol("log", 1, Symbol.Type.PREFIX, "Math.log", Symbol.Type.PREFIX); public static final Symbol abs = new Symbol("abs", 1, Symbol.Type.PREFIX, "Math.abs", Symbol.Type.PREFIX); - + static { - add.setInverses(new Symbol[] {sub, sub}); - mul.setInverses(new Symbol[] {div, div}); - sub.setInverses(new Symbol[] {add}); - div.setInverses(new Symbol[] {mul}); - minus.setInverses(new Symbol[] {minus}); - mod.setSignature(new Type[] {typeInt, null, null}); - eq.setSignature(new Type[] {typeBoolean, null, null}); - neq.setSignature(new Type[] {typeBoolean, null, null}); - gt.setSignature(new Type[] {typeBoolean, null, null}); - lt.setSignature(new Type[] {typeBoolean, null, null}); - ge.setSignature(new Type[] {typeBoolean, null, null}); - le.setSignature(new Type[] {typeBoolean, null, null}); - and.setSignature(new Type[] {typeBoolean, typeBoolean, typeBoolean}); - or.setSignature(new Type[] {typeBoolean, typeBoolean, typeBoolean}); - neg.setSignature(new Type[] {typeBoolean, typeBoolean}); - cons.setInverses(new Symbol[] {head, tail}); - cons.setSignature(new Type[] {typeList, null, typeList}); - append.setSignature(new Type[] {typeList, typeList, null}); - remove.setSignature(new Type[] {typeList, typeList, typeInt}); - head.setSignature(new Type[] {null, typeList}); - tail.setSignature(new Type[] {typeList, typeList}); - contains.setSignature(new Type[] {typeBoolean, null, null}); - indexOf.setSignature(new Type[] {typeInt, typeList, null}); - length.setSignature(new Type[] {typeInt, null}); - get.setSignature(new Type[] {null, typeList, typeInt}); - set.setSignature(new Type[] {typeList, typeList, typeInt, null}); - null_.setSignature(new Type[] {null}); - true_.setSignature(new Type[] {typeBoolean}); - false_.setSignature(new Type[] {typeBoolean}); - pair.setSignature(new Type[] {typePair,null,null}); - pair.setInverses(new Symbol[] {left, right}); - left.setSignature(new Type[] {null, typePair}); - right.setSignature(new Type[] {null, typePair}); - tuple.setSignature(new Type[] {typeTuple, null, null}); - tuple.setInverses(new Symbol[] {fst, snd}); - fst.setSignature(new Type[] {null, typeTuple}); - fst.setInverses(new Symbol[] {new LambdaAbstraction(new Variable("x"), new Term(tuple, new Expression[] {new Variable("x"), new Variable("y")}))}); - snd.setSignature(new Type[] {null, typeTuple}); - snd.setInverses(new Symbol[] {new LambdaAbstraction(new Variable("y"), new Term(tuple, new Expression[] {new Variable("x"), new Variable("y")}))}); - insert.setSignature(new Type[] {typeMap, typeMap, null, null}); - delete.setSignature(new Type[] {typeMap, typeMap, null}); - lookup.setSignature(new Type[] {null, typeMap, null}); - addMember.setSignature(new Type[] {typeJson, typeJson, typeString, null}); - dot.setSignature(new Type[] {null, typeJson, typeString}); - dotParam.setSignature(new Type[] {null, typeJson, null}); - pi.setSignature(new Type[] {typeDouble}); - E.setSignature(new Type[] {typeDouble}); - sqrt.setSignature(new Type[] {typeDouble, typeDouble}); - sin.setSignature(new Type[] {typeDouble, typeDouble}); - cos.setSignature(new Type[] {typeDouble, typeDouble}); - tan.setSignature(new Type[] {typeDouble, typeDouble}); - asin.setSignature(new Type[] {typeDouble, typeDouble}); - asin.setInverses(new Symbol[] {sin}); - acos.setSignature(new Type[] {typeDouble, typeDouble}); - acos.setInverses(new Symbol[] {cos}); - atan.setSignature(new Type[] {typeDouble, typeDouble}); - atan.setInverses(new Symbol[] {tan}); - pow.setSignature(new Type[] {typeDouble, typeDouble, typeDouble}); - exp.setSignature(new Type[] {typeDouble, typeDouble}); - exp.setInverses(new Symbol[] {log}); - log.setSignature(new Type[] {typeDouble, typeDouble}); - log.setInverses(new Symbol[] {exp}); - abs.setSignature(new Type[] {typeDouble, typeDouble}); + add.setInverses(new Symbol[]{sub, sub}); + mul.setInverses(new Symbol[]{div, div}); + sub.setInverses(new Symbol[]{add}); + div.setInverses(new Symbol[]{mul}); + minus.setInverses(new Symbol[]{minus}); + mod.setSignature(new Type[]{typeInt, null, null}); + eq.setSignature(new Type[]{typeBoolean, null, null}); + neq.setSignature(new Type[]{typeBoolean, null, null}); + gt.setSignature(new Type[]{typeBoolean, null, null}); + lt.setSignature(new Type[]{typeBoolean, null, null}); + ge.setSignature(new Type[]{typeBoolean, null, null}); + le.setSignature(new Type[]{typeBoolean, null, null}); + and.setSignature(new Type[]{typeBoolean, typeBoolean, typeBoolean}); + or.setSignature(new Type[]{typeBoolean, typeBoolean, typeBoolean}); + neg.setSignature(new Type[]{typeBoolean, typeBoolean}); + cons.setInverses(new Symbol[]{head, tail}); + cons.setSignature(new Type[]{typeList, null, typeList}); + append.setSignature(new Type[]{typeList, typeList, null}); + remove.setSignature(new Type[]{typeList, typeList, typeInt}); + head.setSignature(new Type[]{null, typeList}); + tail.setSignature(new Type[]{typeList, typeList}); + contains.setSignature(new Type[]{typeBoolean, null, null}); + indexOf.setSignature(new Type[]{typeInt, typeList, null}); + length.setSignature(new Type[]{typeInt, null}); + get.setSignature(new Type[]{null, typeList, typeInt}); + set.setSignature(new Type[]{typeList, typeList, typeInt, null}); + null_.setSignature(new Type[]{null}); + true_.setSignature(new Type[]{typeBoolean}); + false_.setSignature(new Type[]{typeBoolean}); + pair.setSignature(new Type[]{typePair, null, null}); + pair.setInverses(new Symbol[]{left, right}); + left.setSignature(new Type[]{null, typePair}); + right.setSignature(new Type[]{null, typePair}); + tuple.setSignature(new Type[]{typeTuple, null, null}); + tuple.setInverses(new Symbol[]{fst, snd}); + fst.setSignature(new Type[]{null, typeTuple}); + fst.setInverses(new Symbol[]{new LambdaAbstraction(new Variable("x"), new Term(tuple, new Expression[]{new Variable("x"), new Variable("y")}))}); + snd.setSignature(new Type[]{null, typeTuple}); + snd.setInverses(new Symbol[]{new LambdaAbstraction(new Variable("y"), new Term(tuple, new Expression[]{new Variable("x"), new Variable("y")}))}); + insert.setSignature(new Type[]{typeMap, typeMap, null, null}); + delete.setSignature(new Type[]{typeMap, typeMap, null}); + lookup.setSignature(new Type[]{null, typeMap, null}); + addMember.setSignature(new Type[]{typeJson, typeJson, typeString, null}); + dot.setSignature(new Type[]{null, typeJson, typeString}); + dotParam.setSignature(new Type[]{null, typeJson, null}); + pi.setSignature(new Type[]{typeDouble}); + E.setSignature(new Type[]{typeDouble}); + sqrt.setSignature(new Type[]{typeDouble, typeDouble}); + sin.setSignature(new Type[]{typeDouble, typeDouble}); + cos.setSignature(new Type[]{typeDouble, typeDouble}); + tan.setSignature(new Type[]{typeDouble, typeDouble}); + asin.setSignature(new Type[]{typeDouble, typeDouble}); + asin.setInverses(new Symbol[]{sin}); + acos.setSignature(new Type[]{typeDouble, typeDouble}); + acos.setInverses(new Symbol[]{cos}); + atan.setSignature(new Type[]{typeDouble, typeDouble}); + atan.setInverses(new Symbol[]{tan}); + pow.setSignature(new Type[]{typeDouble, typeDouble, typeDouble}); + exp.setSignature(new Type[]{typeDouble, typeDouble}); + exp.setInverses(new Symbol[]{log}); + log.setSignature(new Type[]{typeDouble, typeDouble}); + log.setInverses(new Symbol[]{exp}); + abs.setSignature(new Type[]{typeDouble, typeDouble}); } public DataConstraintModel() { @@ -1104,7 +1098,7 @@ do { hierarchy = resourcePath.getResourceHierarchy(); if (hierarchy != null && resourceHierarchies.get(hierarchy.toString()) == null) { - resourceHierarchies.put(hierarchy.toString(), hierarchy); + resourceHierarchies.put(hierarchy.toString(), hierarchy); } else { hierarchy = resourceHierarchies.get(hierarchy.toString()); resourcePath.setResourceHierarchy(hierarchy); @@ -1122,7 +1116,7 @@ } public ResourcePath getResourcePath(String path) { - for (ResourcePath resourcePath: resourcePaths) { + for (ResourcePath resourcePath : resourcePaths) { if (resourcePath.toString().equals(path)) return resourcePath; } return null; @@ -1134,20 +1128,20 @@ resourcePaths.remove(resourcePath); removeResourcePath(resourcePath); } - + public void removeResourcePath(ResourcePath resourcePath) { - for (Channel ch: channels.values()) { + for (Channel ch : channels.values()) { ch.removeChannelMember(resourcePath); } - for (Channel ch: inputChannels.values()) { + for (Channel ch : inputChannels.values()) { ch.removeChannelMember(resourcePath); } } - + public Collection getChannels() { return channels.values(); } - + public Channel getChannel(String channelName) { return channels.get(channelName); } @@ -1216,20 +1210,20 @@ } public boolean isPrimitiveType(Type type) { - if (type == typeInt - || type == typeLong - || type == typeFloat - || type == typeDouble - || type == typeBoolean) { + if (type == typeInt + || type == typeLong + || type == typeFloat + || type == typeDouble + || type == typeBoolean) { return true; } return false; } - + public static boolean isListType(Type type) { return typeList.isAncestorOf(type); } - + public static String getDefaultValue(Type type) { if (type == typeInt) { return "0"; @@ -1273,10 +1267,10 @@ @Override public String toString() { String out = ""; - for (Channel channel: inputChannels.values()) { + for (Channel channel : inputChannels.values()) { out += channel.toString(); } - for (Channel channel: channels.values()) { + for (Channel channel : channels.values()) { out += channel.toString(); } return out; @@ -1285,7 +1279,7 @@ public String getSourceText() { String out = ""; String init = ""; - for (ResourceHierarchy resource: resourceHierarchies.values()) { + for (ResourceHierarchy resource : resourceHierarchies.values()) { String initializer = resource.getInitText(); if (initializer != null) { init += resource.toString() + " := " + initializer + "\n"; @@ -1294,10 +1288,10 @@ if (init.length() > 0) { out += "init {\n" + init + "}\n"; } - for (Channel channel: inputChannels.values()) { + for (Channel channel : inputChannels.values()) { out += channel.getSourceText(); } - for (Channel channel: channels.values()) { + for (Channel channel : channels.values()) { out += channel.getSourceText(); } return out; diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java index 43e428c..6ac9176 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java @@ -1,22 +1,14 @@ package models.dataConstraintModel; +import models.algebra.*; + import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.LambdaAbstraction; -import models.algebra.Position; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.Variable; - public class JsonAccessor extends Term { - + public JsonAccessor(Symbol symbol) { super(symbol); } @@ -61,10 +53,10 @@ } return value; } - if (json.getChild(0) == null - || (json.getChild(0) instanceof Term && - (((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.null_)) - || ((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.nil))) return null; + if (json.getChild(0) == null + || (json.getChild(0) instanceof Term && + (((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.null_)) + || ((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.nil))) return null; return getValue((Term) json.getChild(0), key); } } @@ -83,10 +75,10 @@ } return value; } - if (json.getChild(0) == null - || (json.getChild(0) instanceof Term && - (((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.null_)) - || ((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.nil))) return null; + if (json.getChild(0) == null + || (json.getChild(0) instanceof Term && + (((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.null_)) + || ((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.nil))) return null; return getValue((Term) json.getChild(0), key); } if (json.getSymbol().equals(DataConstraintModel.insert)) { @@ -97,15 +89,15 @@ } return value; } - if (json.getChild(0) == null - || (json.getChild(0) instanceof Term && - (((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.null_)) - || ((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.nil))) return null; + if (json.getChild(0) == null + || (json.getChild(0) instanceof Term && + (((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.null_)) + || ((Term) json.getChild(0)).getSymbol().equals(DataConstraintModel.nil))) return null; return getValue((Term) json.getChild(0), key); } return new Constant(DataConstraintModel.null_); } - + @Override public Expression getInverseMap(Expression outputValue, Position targetPos) { if (targetPos.isEmpty()) return outputValue; @@ -139,8 +131,8 @@ keySet.add(keyName); } } - for (String key: keySet) { - Term addMemberTerm = new Term(DataConstraintModel.addMember); // addMember(jsonTerm, key, v) + for (String key : keySet) { + Term addMemberTerm = new Term(DataConstraintModel.addMember); // addMember(jsonTerm, key, v) addMemberTerm.addChild(jsonTerm); addMemberTerm.addChild(new Constant(key, DataConstraintModel.typeString)); Variable var = new Variable("v" + v); @@ -150,8 +142,8 @@ v++; } Variable var = vars.get(keyName); - LambdaAbstraction lambdaAbstraction = new LambdaAbstraction(var, jsonTerm); // v -> addMember(jsonTerm, key, v) - inverseSymbols = new Symbol[] { lambdaAbstraction }; + LambdaAbstraction lambdaAbstraction = new LambdaAbstraction(var, jsonTerm); // v -> addMember(jsonTerm, key, v) + inverseSymbols = new Symbol[]{lambdaAbstraction}; } } else if (symbol == DataConstraintModel.dotParam && getChildren().size() >= 2) { // this term is `json.{param}`. @@ -169,23 +161,23 @@ } else if (expKey instanceof Term) { keyType = ((Term) expKey).getType(); } - if (jsonType != null && keyType != null) { + if (jsonType != null && keyType != null) { if (DataConstraintModel.typeList.isAncestorOf(jsonType) || keyType.equals(DataConstraintModel.typeInt)) { - Term setElementTerm = new Term(DataConstraintModel.set); // set(list, idx, v) + Term setElementTerm = new Term(DataConstraintModel.set); // set(list, idx, v) setElementTerm.addChild(new Constant(DataConstraintModel.nil)); setElementTerm.addChild(expKey); Variable var = new Variable("v"); setElementTerm.addChild(var); - LambdaAbstraction lambdaAbstraction = new LambdaAbstraction(var, setElementTerm); // v -> set(list, idx, v) - inverseSymbols = new Symbol[] { lambdaAbstraction }; + LambdaAbstraction lambdaAbstraction = new LambdaAbstraction(var, setElementTerm); // v -> set(list, idx, v) + inverseSymbols = new Symbol[]{lambdaAbstraction}; } else if (DataConstraintModel.typeMap.isAncestorOf(jsonType) || keyType.equals(DataConstraintModel.typeString)) { - Term insertEntryTerm = new Term(DataConstraintModel.insert); // insert(map, key, v) + Term insertEntryTerm = new Term(DataConstraintModel.insert); // insert(map, key, v) insertEntryTerm.addChild(new Constant(DataConstraintModel.nil)); insertEntryTerm.addChild(expKey); Variable var = new Variable("v"); insertEntryTerm.addChild(var); - LambdaAbstraction lambdaAbstraction = new LambdaAbstraction(var, insertEntryTerm); // v -> insert(map, key, v) - inverseSymbols = new Symbol[] { lambdaAbstraction }; + LambdaAbstraction lambdaAbstraction = new LambdaAbstraction(var, insertEntryTerm); // v -> insert(map, key, v) + inverseSymbols = new Symbol[]{lambdaAbstraction}; } } } @@ -221,7 +213,7 @@ @Override public Object clone() { JsonAccessor newTerm = new JsonAccessor(symbol); - for (Expression e: children) { + for (Expression e : children) { newTerm.addChild((Expression) e.clone()); } newTerm.type = type; diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java index 3998afa..7183110 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java @@ -1,20 +1,16 @@ package models.dataConstraintModel; +import models.algebra.*; +import parser.Parser; + import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Variable; -import parser.Parser; - public class JsonTerm extends Term { private Map keyToIndex = new HashMap<>(); - + public JsonTerm() { super(new Symbol("json", -1)); setType(DataConstraintModel.typeJson); @@ -32,17 +28,17 @@ public Set keySet() { return keyToIndex.keySet(); } - + public Expression get(String key) { if (keyToIndex.get(key) == null) return null; return getChild(keyToIndex.get(key)); } - + public Expression get(Constant key) { if (keyToIndex.get(key.getValue()) == null) return null; return getChild(keyToIndex.get(key.getValue())); } - + public Expression get(Variable key) { if (keyToIndex.get(key.getName()) == null) return null; return getChild(keyToIndex.get(key.getName())); @@ -55,8 +51,8 @@ JsonTerm unifiedTerm = new JsonTerm(); Set keySet = new HashSet<>(); keySet.addAll(this.keySet()); - keySet.addAll(anotherTerm.keySet()); - for (String key: keySet) { + keySet.addAll(anotherTerm.keySet()); + for (String key : keySet) { if (this.keySet().contains(key)) { if (anotherTerm.keySet().contains(key)) { unifiedTerm.addMember(key, this.get(key).unify(anotherTerm.get(key))); @@ -75,7 +71,7 @@ @Override public Object clone() { JsonTerm newTerm = new JsonTerm(); - for (Expression e: children) { + for (Expression e : children) { newTerm.addChild((Expression) e.clone()); } newTerm.keyToIndex = new HashMap(keyToIndex); @@ -85,7 +81,7 @@ public String toString() { String jsonStr = "{"; String delim = ""; - for (String key: keyToIndex.keySet()) { + for (String key : keyToIndex.keySet()) { jsonStr += delim + Parser.DOUBLE_QUOT + key + Parser.DOUBLE_QUOT + ": " + getChild(keyToIndex.get(key)).toString(); delim = ", "; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonType.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonType.java index 9f9e835..0bfb9b5 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonType.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonType.java @@ -1,11 +1,11 @@ package models.dataConstraintModel; +import models.algebra.Type; + import java.util.HashMap; import java.util.Map; import java.util.Set; -import models.algebra.Type; - public class JsonType extends Type { protected boolean isListOrMap = false; protected Map memberTypes = null; @@ -20,7 +20,7 @@ super(typeName, implementationTypeName, interfaceTypeName); memberTypes = new HashMap<>(); } - + public JsonType(String typeName, String implementationTypeName, Type parentType) { super(typeName, implementationTypeName, parentType); memberTypes = new HashMap<>(); @@ -54,11 +54,11 @@ // public void setListOrMap(boolean isListOrMap) { // this.isListOrMap = isListOrMap; // } - + public Type getElementType() { return listOrMapElementType; } - + public void setElementType(Type listElementType) { this.listOrMapElementType = listElementType; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ListTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ListTerm.java index afc4212..651d83e 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ListTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ListTerm.java @@ -5,16 +5,16 @@ import models.algebra.Term; public class ListTerm extends Term { - + public ListTerm() { super(new Symbol("list", -1)); setType(DataConstraintModel.typeList); } - + public void append(Expression value) { addChild(value); } - + public Expression get(int index) { return getChild(index); } @@ -40,7 +40,7 @@ @Override public Object clone() { ListTerm newTerm = new ListTerm(); - for (Expression e: children) { + for (Expression e : children) { newTerm.addChild((Expression) e.clone()); } return newTerm; @@ -49,7 +49,7 @@ public String toString() { String listStr = "["; String delim = ""; - for (Expression child: getChildren()) { + for (Expression child : getChildren()) { listStr += delim + child.toString(); delim = ", "; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/MapTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/MapTerm.java index 18f2c9b..4f3875c 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/MapTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/MapTerm.java @@ -1,19 +1,19 @@ package models.dataConstraintModel; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Symbol; import models.algebra.Term; import parser.Parser; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + public class MapTerm extends Term { private Map keyToIndex = new HashMap<>(); - + public MapTerm() { super(new Symbol("map", -1)); setType(DataConstraintModel.typeMap); @@ -31,11 +31,11 @@ public Set keySet() { return keyToIndex.keySet(); } - + public Expression get(String key) { return getChild(keyToIndex.get(key)); } - + public Expression get(Constant key) { if (keyToIndex.get(key.getValue()) == null) return null; return getChild(keyToIndex.get(key.getValue())); @@ -48,8 +48,8 @@ MapTerm unifiedTerm = new MapTerm(); Set keySet = new HashSet<>(); keySet.addAll(this.keySet()); - keySet.addAll(anotherTerm.keySet()); - for (String key: keySet) { + keySet.addAll(anotherTerm.keySet()); + for (String key : keySet) { if (this.keySet().contains(key)) { if (anotherTerm.keySet().contains(key)) { unifiedTerm.insert(key, this.get(key).unify(anotherTerm.get(key))); @@ -68,7 +68,7 @@ @Override public Object clone() { MapTerm newTerm = new MapTerm(); - for (Expression e: children) { + for (Expression e : children) { newTerm.addChild((Expression) e.clone()); } newTerm.keyToIndex = new HashMap(keyToIndex); @@ -78,7 +78,7 @@ public String toString() { String mapStr = "{"; String delim = ""; - for (String key: keyToIndex.keySet()) { + for (String key : keyToIndex.keySet()) { mapStr += delim + Parser.DOUBLE_QUOT + key + Parser.DOUBLE_QUOT + ": " + getChild(keyToIndex.get(key)).toString(); delim = ", "; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourceHierarchy.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourceHierarchy.java index 9ce7e94..8684cb5 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourceHierarchy.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourceHierarchy.java @@ -1,15 +1,15 @@ package models.dataConstraintModel; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import models.algebra.Expression; import models.algebra.Term; import models.algebra.Type; import models.algebra.Variable; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + public class ResourceHierarchy { private ResourceHierarchy parent = null; private Set children = null; @@ -34,7 +34,7 @@ this.numParameters = 0; this.resourceStateType = resourceStateType; } - + public ResourceHierarchy(ResourceHierarchy parent, String resourceName) { this.parent = parent; this.children = new HashSet<>(); @@ -47,7 +47,7 @@ } } } - + public ResourceHierarchy(ResourceHierarchy parent, String resourceName, Type resourceStateType) { this.parent = parent; this.children = new HashSet<>(); @@ -84,7 +84,7 @@ if (parameterExp instanceof Variable) { paramType = ((Variable) parameterExp).getType(); } else if (parameterExp instanceof Term) { - paramType = ((Term) parameterExp).getType(); + paramType = ((Term) parameterExp).getType(); } if (paramType != null) { if (paramType.equals(DataConstraintModel.typeInt)) { @@ -110,7 +110,7 @@ if (parameterExp instanceof Variable) { paramType = ((Variable) parameterExp).getType(); } else if (parameterExp instanceof Term) { - paramType = ((Term) parameterExp).getType(); + paramType = ((Term) parameterExp).getType(); } if (paramType.equals(DataConstraintModel.typeInt)) { parent.setResourceStateType(DataConstraintModel.typeList); @@ -131,11 +131,11 @@ parent.addChild(this); } } - + public ResourceHierarchy getParent() { return parent; } - + public void setParent(ResourceHierarchy parent) { this.parent = parent; if (parent != null) { @@ -146,11 +146,11 @@ public Set getChildren() { return children; } - + protected void addChild(ResourceHierarchy child) { children.add(child); } - + public ResourceHierarchy getRoot() { if (parent == null) return this; return parent.getRoot(); @@ -161,20 +161,20 @@ if (this == another) return true; return isAncestorOf(another.getParent()); } - + public String getResourceName() { if (resourceName == null) return parent.getResourceName(); return resourceName; } - + public void setResourceName(String resourceName) { this.resourceName = resourceName; } - + public Type getResourceStateType() { return resourceStateType; } - + public void setResourceStateType(Type resourceStateType) { this.resourceStateType = resourceStateType; if (initialValue != null) { @@ -187,12 +187,12 @@ public int getNumParameters() { return numParameters; } - + public int getTotalNumParameters() { if (parent == null) return numParameters; return numParameters + parent.getTotalNumParameters(); - } - + } + public void setNumParameters(int numParameters) { this.numParameters = numParameters; } @@ -200,23 +200,23 @@ public Expression getInitialValue() { return initialValue; } - + public void setInitialValue(Expression initialValue) { this.initialValue = initialValue; } - + public String getInitText() { return initText; } - + public void setInitText(String initText) { this.initText = initText; } - + public boolean isNative() { return isNative; } - + public void setNative(boolean isNative) { this.isNative = isNative; } @@ -229,7 +229,7 @@ return parent.toString() + ".{}"; } } - + public String toString(List> pathParams) { if (parent == null) return resourceName; if (resourceName != null) { @@ -238,9 +238,9 @@ Map.Entry lastParam = pathParams.get(pathParams.size() - 1); pathParams = pathParams.subList(0, pathParams.size() - 1); if (lastParam.getValue() == null) { - return parent.toString(pathParams) + ".{" + lastParam.getKey() +"}"; + return parent.toString(pathParams) + ".{" + lastParam.getKey() + "}"; } - return parent.toString(pathParams) + ".{" + lastParam.getKey() + "=" + lastParam.getValue() +"}"; + return parent.toString(pathParams) + ".{" + lastParam.getKey() + "=" + lastParam.getValue() + "}"; } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourcePath.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourcePath.java index bfd163b..b96c5fa 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourcePath.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/ResourcePath.java @@ -1,48 +1,40 @@ package models.dataConstraintModel; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.AbstractMap; -import java.util.AbstractMap.SimpleEntry; - import models.algebra.Expression; -import models.algebra.Type; import models.algebra.Symbol; -import models.algebra.Term; + +import java.util.*; public class ResourcePath extends Symbol { protected ResourcePath parent = null; protected ResourceHierarchy resourceHierarchy = null; protected List> pathParams = null; - + public ResourcePath(String fullResourceName) { super(fullResourceName); this.parent = null; - this.resourceHierarchy = new ResourceHierarchy(null, fullResourceName); + this.resourceHierarchy = new ResourceHierarchy(null, fullResourceName); this.pathParams = new ArrayList<>(); } public ResourcePath(String fullResourceName, ResourceHierarchy resourceHierarchy) { super(fullResourceName); this.parent = null; - this.resourceHierarchy = resourceHierarchy; + this.resourceHierarchy = resourceHierarchy; this.pathParams = new ArrayList<>(); } public ResourcePath(ResourcePath parent, String leafResourceName) { super(parent.toString() + "." + leafResourceName); this.parent = parent; - this.resourceHierarchy = new ResourceHierarchy(parent.getResourceHierarchy(), leafResourceName); + this.resourceHierarchy = new ResourceHierarchy(parent.getResourceHierarchy(), leafResourceName); this.pathParams = parent.getPathParamsAndConstraints(); } public ResourcePath(ResourcePath parent, String leafResourceName, ResourceHierarchy resourceHierarchy) { super(parent.toString() + "." + leafResourceName); this.parent = parent; - this.resourceHierarchy = resourceHierarchy; + this.resourceHierarchy = resourceHierarchy; this.pathParams = parent.getPathParamsAndConstraints(); } @@ -85,18 +77,18 @@ } else { this.parent = null; } - this.resourceHierarchy = another.resourceHierarchy; + this.resourceHierarchy = another.resourceHierarchy; this.pathParams = new ArrayList<>(another.getPathParamsAndConstraints()); } - + public ResourceHierarchy getResourceHierarchy() { return resourceHierarchy; } - + public void setResourceHierarchy(ResourceHierarchy resourceHierarchy) { this.resourceHierarchy = resourceHierarchy; } - + public String getLeafResourceName() { return resourceHierarchy.getResourceName(); } @@ -104,18 +96,18 @@ public int getNumberOfParameters() { return resourceHierarchy.getTotalNumParameters(); } - + public models.algebra.Type getResourceStateType() { return resourceHierarchy.getResourceStateType(); } - + public void setResourceStateType(models.algebra.Type resourceStateType) { this.resourceHierarchy.setResourceStateType(resourceStateType); } public List getPathParams() { List params = new ArrayList<>(); - for (Map.Entry paramEnt: this.pathParams) { + for (Map.Entry paramEnt : this.pathParams) { params.add(paramEnt.getKey()); } return params; @@ -124,19 +116,19 @@ public List> getPathParamsAndConstraints() { return pathParams; } - + public void setPathParams(List> pathParams) { this.pathParams = pathParams; } - + public void addPathParam(Expression pathParam) { pathParams.add(new AbstractMap.SimpleEntry<>(pathParam, null)); } - + public void addPathParamWithConstraint(Expression pathParam, Expression pathConstraint) { pathParams.add(new AbstractMap.SimpleEntry<>(pathParam, pathConstraint)); } - + public void replacePathParam(int i, Expression pathParam, Expression pathConstraint) { if (i < pathParams.size()) { pathParams.set(i, new AbstractMap.SimpleEntry<>(pathParam, pathConstraint)); @@ -166,7 +158,7 @@ public ResourcePath getParent() { return parent; } - + public ResourcePath getRoot() { if (parent == null) return this; return parent.getRoot(); @@ -198,11 +190,11 @@ public String toString() { return resourceHierarchy.toString(pathParams); } - + public String toResourcePath() { List params = new ArrayList<>(); - String[] sideEffects = new String[] {""}; - for (Map.Entry param: pathParams) { + String[] sideEffects = new String[]{""}; + for (Map.Entry param : pathParams) { params.add("{" + param.getKey().toString() + "}"); } return resourceHierarchy.toResourcePath(params); diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/Selector.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/Selector.java index f170a07..0609bc2 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/Selector.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/Selector.java @@ -8,11 +8,11 @@ public Selector(Expression exp) { this.exp = exp; } - + public Expression getExpression() { return exp; } - + public void setExpression(Expression exp) { this.exp = exp; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java index 997d1f6..89d9bcb 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java @@ -1,19 +1,13 @@ package models.dataConstraintModel; +import models.algebra.*; +import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; + import java.util.ArrayList; import java.util.HashMap; import java.util.Map.Entry; import java.util.Set; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.Position; -import models.algebra.Term; -import models.algebra.ValueUndefined; -import models.algebra.Variable; -import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; - public class StateTransition { private Expression curStateExpression = null; private Expression nextStateExpression = null; @@ -34,39 +28,39 @@ public void setNextStateExpression(Expression nextStateExpression) { this.nextStateExpression = nextStateExpression; } - + public Expression getMessageExpression() { return messageExpression; } - + public void setMessageExpression(Expression messageExpression) { this.messageExpression = messageExpression; } public boolean isRightUnary() { - for (Variable var: curStateExpression.getVariables().values()) { + for (Variable var : curStateExpression.getVariables().values()) { if (nextStateExpression.contains(var)) return false; } return true; } public boolean isRightPartial() { - for (Variable var: curStateExpression.getVariables().values()) { + for (Variable var : curStateExpression.getVariables().values()) { if (messageExpression.contains(var)) return true; } if (isRightUnary()) return false; - for (Variable var: messageExpression.getVariables().values()) { + for (Variable var : messageExpression.getVariables().values()) { if (nextStateExpression.contains(var)) return true; } return false; } - + public Expression deriveMessageConstraintFor(Expression curStateValue, Expression nextStateValue, Set substitutedPositions) throws InvalidMessage, ResolvingMultipleDefinitionIsFutureWork { HashMap> bindings = new HashMap<>(); Expression curStateTerm = getCurStateExpression(); - HashMap curStateVars = curStateTerm.getVariables(); - for (Entry curStateVarEnt: curStateVars.entrySet()) { + HashMap curStateVars = curStateTerm.getVariables(); + for (Entry curStateVarEnt : curStateVars.entrySet()) { Variable var = curStateVarEnt.getValue(); Position varPos = curStateVarEnt.getKey(); Expression valueCalc = curStateTerm.getInverseMap(curStateValue, varPos); @@ -84,9 +78,9 @@ } Expression nextStateTerm = (Expression) getNextStateExpression().clone(); - for (Variable var: bindings.keySet()) { + for (Variable var : bindings.keySet()) { HashMap vars2 = nextStateTerm.getVariables(); - for (Variable var2: vars2.values()) { + for (Variable var2 : vars2.values()) { if (var.equals(var2) && bindings.get(var).size() == 1) { if (nextStateTerm instanceof Term) { nextStateTerm = ((Term) nextStateTerm).substitute(var, bindings.get(var).get(0)); @@ -98,7 +92,7 @@ } HashMap nextStateVars = nextStateTerm.getVariables(); - for (Entry nextStateVarEnt: nextStateVars.entrySet()) { + for (Entry nextStateVarEnt : nextStateVars.entrySet()) { Variable var = nextStateVarEnt.getValue(); Position varPos = nextStateVarEnt.getKey(); Expression valueCalc = nextStateTerm.getInverseMap(nextStateValue, varPos); @@ -118,13 +112,13 @@ Expression messageTerm = getMessageExpression(); return substituteValues(messageTerm, bindings, substitutedPositions); } - + public Expression deriveMessageConstraintFor(Expression curStateValue, Set substitutedPositions) throws InvalidMessage, ResolvingMultipleDefinitionIsFutureWork { HashMap> bindings = new HashMap<>(); Expression curStateTerm = getCurStateExpression(); - HashMap curStateVars = curStateTerm.getVariables(); - for (Entry curStateVarEnt: curStateVars.entrySet()) { + HashMap curStateVars = curStateTerm.getVariables(); + for (Entry curStateVarEnt : curStateVars.entrySet()) { Variable var = curStateVarEnt.getValue(); Position varPos = curStateVarEnt.getKey(); Expression valueCalc = curStateTerm.getInverseMap(curStateValue, varPos); @@ -144,12 +138,12 @@ Expression messageTerm = getMessageExpression(); return substituteValues(messageTerm, bindings, substitutedPositions); } - + private Expression substituteValues(Expression messageTerm, HashMap> bindings, Set substitutedPositions) throws InvalidMessage, ResolvingMultipleDefinitionIsFutureWork { if (!(messageTerm instanceof Term) && !(messageTerm instanceof Variable)) throw new InvalidMessage(); HashMap messageVars = messageTerm.getVariables(); - for (Entry varEnt: messageVars.entrySet()) { + for (Entry varEnt : messageVars.entrySet()) { Variable var = varEnt.getValue(); if (bindings.get(var) != null) { if (bindings.get(var).size() > 1) throw new ResolvingMultipleDefinitionIsFutureWork(); @@ -166,14 +160,14 @@ } return messageTerm; } - - public Expression deriveNextStateExpressionFor(Expression curStateValue, Term concreteMessage) + + public Expression deriveNextStateExpressionFor(Expression curStateValue, Term concreteMessage) throws ResolvingMultipleDefinitionIsFutureWork, ValueUndefined { HashMap bindings = new HashMap<>(); - + Expression curStateTerm = getCurStateExpression(); HashMap curStateVars = curStateTerm.getVariables(); - for (Entry curStateVarEnt: curStateVars.entrySet()) { + for (Entry curStateVarEnt : curStateVars.entrySet()) { Variable var = curStateVarEnt.getValue(); Position varPos = curStateVarEnt.getKey(); Expression valueCalc = curStateTerm.getInverseMap(curStateValue, varPos); @@ -189,7 +183,7 @@ Expression messageTerm = getMessageExpression(); HashMap messageVars = messageTerm.getVariables(); if (concreteMessage != null) { - for (Entry messageVarEnt: messageVars.entrySet()) { + for (Entry messageVarEnt : messageVars.entrySet()) { Variable var = messageVarEnt.getValue(); Position varPos = messageVarEnt.getKey(); Expression valueCalc = concreteMessage.getSubTerm(varPos); @@ -205,7 +199,7 @@ nextStateTerm = bindings.get((Variable) nextStateTerm); if (nextStateTerm == null) throw new ValueUndefined(); } else { - for (Variable var: bindings.keySet()) { + for (Variable var : bindings.keySet()) { nextStateTerm = ((Term) nextStateTerm).substitute(var, bindings.get(var)); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransitionTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransitionTerm.java index 6baeff1..65ea95a 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransitionTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransitionTerm.java @@ -1,12 +1,11 @@ package models.dataConstraintModel; -import models.algebra.Symbol; import models.algebra.Term; public class StateTransitionTerm extends Term { - + public StateTransitionTerm(ResourcePath path) { super(path); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ChannelNode.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ChannelNode.java index 0371ca0..ee28087 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ChannelNode.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ChannelNode.java @@ -1,10 +1,10 @@ package models.dataFlowModel; +import models.Node; + import java.util.HashSet; import java.util.Set; -import models.Node; - public class ChannelNode extends Node { protected ChannelNode parent = null; protected Set children = null; @@ -19,12 +19,12 @@ public ChannelNode getParent() { return parent; } - + public Set getChildren() { return children; } - public Set getAncestors(){ + public Set getAncestors() { if (parent == null) { return new HashSet<>(); } @@ -38,22 +38,22 @@ return new HashSet<>(); } Set descendants = new HashSet<>(); - for (ChannelNode child: children) { + for (ChannelNode child : children) { descendants.addAll(child.getDescendants()); descendants.add(child); } return descendants; } - + public void addChild(ChannelNode child) { children.add(child); child.parent = this; } - + public DataTransferChannel getChannel() { return channel; } - + public void setChannel(DataTransferChannel channel) { this.channel = channel; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowEdge.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowEdge.java index 6b35380..e6ad2df 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowEdge.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowEdge.java @@ -1,20 +1,20 @@ package models.dataFlowModel; -import models.*; +import models.Edge; public class DataFlowEdge extends Edge { protected boolean channelToResource = false; - + public DataFlowEdge(ResourceNode src, ChannelNode dst) { super(src, dst); channelToResource = false; } - + public DataFlowEdge(ChannelNode src, ResourceNode dst) { super(src, dst); channelToResource = true; } - + public boolean isChannelToResource() { return channelToResource; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowGraph.java index 1722d40..bf39e5e 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataFlowGraph.java @@ -1,17 +1,12 @@ package models.dataFlowModel; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import models.DirectedGraph; import models.Node; import models.dataConstraintModel.ResourceHierarchy; import models.dataConstraintModel.ResourcePath; +import java.util.*; + public class DataFlowGraph extends DirectedGraph implements IFlowGraph { protected Set rootResourceNodes = null; protected Set rootChannelNodes = null; @@ -26,7 +21,7 @@ resourceNodeMap = new HashMap<>(); } - public ResourceNode addResourceNode(ResourceNode parent, + public ResourceNode addResourceNode(ResourceNode parent, ResourcePath outSideResource, DataTransferChannel outSideChannel) { ResourceNode node = null; @@ -56,8 +51,8 @@ return node; } - public ResourceNode addTerminalResourceNode(ResourceNode parent, - DataTransferChannel inSideChannel, + public ResourceNode addTerminalResourceNode(ResourceNode parent, + DataTransferChannel inSideChannel, ResourcePath inSideResource) { ResourceNode node = null; if (inSideResource.getNumberOfParameters() == 0) { @@ -82,15 +77,15 @@ return node; } - public ResourceNode addResourceNode(ResourceNode parent, - Map inSide, + public ResourceNode addResourceNode(ResourceNode parent, + Map inSide, Map outSide) { ResourceNode node = null; - for (ResourcePath outRes: outSide.values()) { + for (ResourcePath outRes : outSide.values()) { node = resourceNodeMap.get(System.identityHashCode(outRes)); if (node != null) return node; } - for (ResourcePath inRes: inSide.values()) { + for (ResourcePath inRes : inSide.values()) { node = resourceNodeMap.get(System.identityHashCode(inRes)); if (node != null) return node; } @@ -101,15 +96,15 @@ } else { parent.addChild(node); } - for (ResourcePath outRes: outSide.values()) { + for (ResourcePath outRes : outSide.values()) { resourceNodeMap.put(System.identityHashCode(outRes), node); } - for (ResourcePath inRes: inSide.values()) { + for (ResourcePath inRes : inSide.values()) { resourceNodeMap.put(System.identityHashCode(inRes), node); } return node; } - + public ChannelNode addChannelNode(ChannelNode parent, DataTransferChannel ch) { ChannelNode node = channelNodeMap.get(ch); if (node != null) return node; @@ -131,11 +126,11 @@ public ChannelNode getChannelNode(DataTransferChannel channel) { return channelNodeMap.get(channel); } - + @Override public Map> getAllComponentNodes() { Map> allNodeSets = new HashMap<>(); - for (Node n: getResourceNodes()) { + for (Node n : getResourceNodes()) { Set nodeSet = new HashSet<>(); nodeSet.add(n); allNodeSets.put(n, nodeSet); @@ -150,33 +145,33 @@ public Collection getResourceNodes(ResourceHierarchy resourceHierarchy) { Collection resourceNodes = new ArrayList<>(); - for (ResourceNode rn: resourceNodeMap.values()) { + for (ResourceNode rn : resourceNodeMap.values()) { if (rn.getResourceHierarchy() == resourceHierarchy) { resourceNodes.add(rn); } } return resourceNodes; } - + public Collection getChannelNodes() { return channelNodeMap.values(); } - + public Set getRootResourceNodes() { return rootResourceNodes; } - + public Set getRootChannelNodes() { return rootChannelNodes; } - + public DataFlowEdge addEdge(ResourceNode srcNode, ChannelNode dstNode) { - DataFlowEdge edge =new DataFlowEdge(srcNode, dstNode); + DataFlowEdge edge = new DataFlowEdge(srcNode, dstNode); addEdge(edge); return edge; } - + public DataFlowEdge addEdge(ChannelNode srcNode, ResourceNode dstNode) { DataFlowEdge edge = new DataFlowEdge(srcNode, dstNode); addEdge(edge); diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferChannel.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferChannel.java index 6ab539a..d304108 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferChannel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferChannel.java @@ -1,29 +1,15 @@ package models.dataFlowModel; -import java.util.AbstractMap; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.Parameter; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.Position; -import models.algebra.Term; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.algebra.Variable; +import models.algebra.*; import models.dataConstraintModel.Channel; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.ResourcePath; import models.dataConstraintModel.Selector; import parser.Parser; +import java.util.*; +import java.util.Map.Entry; + public class DataTransferChannel extends Channel { protected Set inputChannelMembers = null; protected Set outputChannelMembers = null; @@ -49,7 +35,7 @@ outputChannelMembers = new HashSet<>(); referenceChannelMembers = new HashSet<>(); } - + public Set getInputChannelMembers() { return inputChannelMembers; } @@ -57,7 +43,7 @@ public Set getAllInputChannelMembers() { Set allInputChannelMembers = new HashSet<>(); allInputChannelMembers.addAll(inputChannelMembers); - for (Channel child: children) { + for (Channel child : children) { allInputChannelMembers.addAll(((DataTransferChannel) child).getAllInputChannelMembers()); } return allInputChannelMembers; @@ -94,7 +80,7 @@ private void addReferenceChannelMember(ChannelMember referenceChannelMember) { referenceChannelMembers.add(referenceChannelMember); } - + public void addChannelMemberAsInput(ChannelMember inputChannelMember) { addChannelMember(inputChannelMember); addInputChannelMember(inputChannelMember); @@ -111,21 +97,21 @@ } public void removeChannelMember(ResourcePath id) { - for (ChannelMember cm: inputChannelMembers) { + for (ChannelMember cm : inputChannelMembers) { if (cm.getResource() == id) { inputChannelMembers.remove(cm); super.removeChannelMember(id); return; } } - for (ChannelMember cm: outputChannelMembers) { + for (ChannelMember cm : outputChannelMembers) { if (cm.getResource() == id) { outputChannelMembers.remove(cm); super.removeChannelMember(id); return; } } - for (ChannelMember cm: referenceChannelMembers) { + for (ChannelMember cm : referenceChannelMembers) { if (cm.getResource() == id) { referenceChannelMembers.remove(cm); super.removeChannelMember(id); @@ -136,7 +122,7 @@ public Set getInputResources() { Set inputResources = new HashSet<>(); - for (ChannelMember member: inputChannelMembers) { + for (ChannelMember member : inputChannelMembers) { inputResources.add(member.getResource()); } return inputResources; @@ -144,7 +130,7 @@ public Set getOutputResources() { Set outputResources = new HashSet<>(); - for (ChannelMember member: outputChannelMembers) { + for (ChannelMember member : outputChannelMembers) { outputResources.add(member.getResource()); } return outputResources; @@ -152,7 +138,7 @@ public Set getReferenceResources() { Set referenceResources = new HashSet<>(); - for (ChannelMember member: referenceChannelMembers) { + for (ChannelMember member : referenceChannelMembers) { referenceResources.add(member.getResource()); } return referenceResources; @@ -160,6 +146,7 @@ /** * Derive the update expression of the state of the target channel member. + * * @param targetMember a channel member whose state is to be updated * @return the derived update expression * @throws ParameterizedIdentifierIsFutureWork @@ -172,7 +159,7 @@ IResourceStateAccessor defaultStateAccessor = new IResourceStateAccessor() { HashMap curStateParams = new HashMap<>(); HashMap nextStateParams = new HashMap<>(); - + @Override public Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from) { String resource = target.getResource().getLeafResourceName(); @@ -183,7 +170,7 @@ } return curStateParam; } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { String resource = target.getResource().getLeafResourceName(); @@ -194,7 +181,7 @@ } return nextStateParam; } - + @Override public Expression getDirectStateAccessorFor(ResourcePath target, ResourcePath from) { String resource = target.getLeafResourceName(); @@ -211,7 +198,8 @@ /** * Derive the state update calculation of the target channel member with a given resource push/pull state accessor. - * @param targetMember a channel member whose state is to be updated + * + * @param targetMember a channel member whose state is to be updated * @param stateAccessor a push/pull resource state accessor * @return the derived update calculation and the unified message * @throws ParameterizedIdentifierIsFutureWork @@ -220,15 +208,16 @@ * @throws UnificationFailed * @throws ValueUndefined */ - public Map.Entry deriveUpdateExpressionOf(ChannelMember targetMember, IResourceStateAccessor stateAccessor) + public Map.Entry deriveUpdateExpressionOf(ChannelMember targetMember, IResourceStateAccessor stateAccessor) throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { return deriveUpdateExpressionOf(targetMember, stateAccessor, null); } - + /** * Derive the state update calculation of the target channel member with a given resource push/pull state accessor. - * @param targetMember a channel member whose state is to be updated - * @param stateAccessor a push/pull resource state accessor + * + * @param targetMember a channel member whose state is to be updated + * @param stateAccessor a push/pull resource state accessor * @param inputResourceToStateAccessor push/pull resource state accessors (if null, stateAccessor is used.) * @return the derived update calculation and the unified message * @throws ParameterizedIdentifierIsFutureWork @@ -237,7 +226,7 @@ * @throws UnificationFailed * @throws ValueUndefined */ - public Map.Entry deriveUpdateExpressionOf(ChannelMember targetMember, IResourceStateAccessor stateAccessor, Map inputResourceToStateAccessor) + public Map.Entry deriveUpdateExpressionOf(ChannelMember targetMember, IResourceStateAccessor stateAccessor, Map inputResourceToStateAccessor) throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { if (!getOutputChannelMembers().contains(targetMember)) return null; @@ -258,8 +247,9 @@ /** * Derive the state update calculation of the target channel member with a message and a given resource push/pull state accessor. - * @param targetMember a channel member whose state is to be updated - * @param message a message on the channel + * + * @param targetMember a channel member whose state is to be updated + * @param message a message on the channel * @param stateAccessor a push/pull resource state accessor * @return the derived update calculation * @throws ParameterizedIdentifierIsFutureWork @@ -268,7 +258,7 @@ * @throws UnificationFailed * @throws ValueUndefined */ - public Expression deriveUpdateExpressionOf(ChannelMember targetMember, Term message, IResourceStateAccessor stateAccessor) + public Expression deriveUpdateExpressionOf(ChannelMember targetMember, Term message, IResourceStateAccessor stateAccessor) throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { if (!getOutputChannelMembers().contains(targetMember)) return null; @@ -279,7 +269,8 @@ /** * Fill outside resource paths with a given resource push/pull state accessor. - * @param targetMember a channel member whose state is to be updated + * + * @param targetMember a channel member whose state is to be updated * @param stateAccessor a push/pull resource state accessor * @return map from a depending channel member to the pair of the filled resource path and the set of the depended channel members * @throws ParameterizedIdentifierIsFutureWork @@ -288,16 +279,17 @@ * @throws UnificationFailed * @throws ValueUndefined */ - public Map>> fillOutsideResourcePaths(ChannelMember targetMember, IResourceStateAccessor stateAccessor) - throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { + public Map>> fillOutsideResourcePaths(ChannelMember targetMember, IResourceStateAccessor stateAccessor) + throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { if (!getOutputChannelMembers().contains(targetMember)) return null; return fillOutsideResourcePaths(targetMember, stateAccessor, null).getKey(); } - + /** * Fill outside resource paths with a given resource push/pull state accessor. - * @param targetMember a channel member whose state is to be updated - * @param stateAccessor a push/pull resource state accessor + * + * @param targetMember a channel member whose state is to be updated + * @param stateAccessor a push/pull resource state accessor * @param inputResourceToStateAccessor push/pull resource state accessors (if null, stateAccessor is used.) * @return map from a depending channel member to the pair of the filled resource path and the set of the depended channel members * @throws ParameterizedIdentifierIsFutureWork @@ -306,7 +298,7 @@ * @throws UnificationFailed * @throws ValueUndefined */ - public Map.Entry>>, Term> fillOutsideResourcePaths(ChannelMember targetMember, IResourceStateAccessor stateAccessor, Map inputResourceToStateAccessor) + public Map.Entry>>, Term> fillOutsideResourcePaths(ChannelMember targetMember, IResourceStateAccessor stateAccessor, Map inputResourceToStateAccessor) throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { Map>> resourcePaths = new HashMap<>(); @@ -316,14 +308,14 @@ // Fill outside resource paths if (unifiedMessage != null) { - for (ChannelMember cm: getInputChannelMembers()) { + for (ChannelMember cm : getInputChannelMembers()) { if (cm.isOutside()) { Set dependingVarPosInMessage = new HashSet<>(); ResourcePath filledResPath = fillOutsideResourcePath(cm.getResource(), unifiedMessage, targetMember.getStateTransition().getMessageExpression(), dependingVarPosInMessage); - Set dependingChannelMembers = new HashSet<>(); - for (ChannelMember otherCm: substitutedPositionsInMessageFromChannels.keySet()) { - for (Position otherPos: substitutedPositionsInMessageFromChannels.get(otherCm)) { - for (Position thisPos: dependingVarPosInMessage) { + Set dependingChannelMembers = new HashSet<>(); + for (ChannelMember otherCm : substitutedPositionsInMessageFromChannels.keySet()) { + for (Position otherPos : substitutedPositionsInMessageFromChannels.get(otherCm)) { + for (Position thisPos : dependingVarPosInMessage) { if (thisPos.isAncestorOf(otherPos)) { dependingChannelMembers.add(otherCm); break; @@ -335,14 +327,14 @@ resourcePaths.put(cm, new AbstractMap.SimpleEntry<>(filledResPath, dependingChannelMembers)); } } - for (ChannelMember cm: getReferenceChannelMembers()) { + for (ChannelMember cm : getReferenceChannelMembers()) { if (cm.isOutside()) { Set dependingVarPosInMessage = new HashSet<>(); ResourcePath filledResPath = fillOutsideResourcePath(cm.getResource(), unifiedMessage, targetMember.getStateTransition().getMessageExpression(), dependingVarPosInMessage); - Set dependingChannelMembers = new HashSet<>(); - for (ChannelMember otherCm: substitutedPositionsInMessageFromChannels.keySet()) { - for (Position otherPos: substitutedPositionsInMessageFromChannels.get(otherCm)) { - for (Position thisPos: dependingVarPosInMessage) { + Set dependingChannelMembers = new HashSet<>(); + for (ChannelMember otherCm : substitutedPositionsInMessageFromChannels.keySet()) { + for (Position otherPos : substitutedPositionsInMessageFromChannels.get(otherCm)) { + for (Position thisPos : dependingVarPosInMessage) { if (thisPos.isAncestorOf(otherPos)) { dependingChannelMembers.add(otherCm); break; @@ -354,14 +346,14 @@ resourcePaths.put(cm, new AbstractMap.SimpleEntry<>(filledResPath, dependingChannelMembers)); } } - for (ChannelMember cm: getOutputChannelMembers()) { + for (ChannelMember cm : getOutputChannelMembers()) { if (cm.isOutside()) { Set dependingVarPosInMessage = new HashSet<>(); ResourcePath filledResPath = fillOutsideResourcePath(cm.getResource(), unifiedMessage, targetMember.getStateTransition().getMessageExpression(), dependingVarPosInMessage); - Set dependingChannelMembers = new HashSet<>(); - for (ChannelMember otherCm: substitutedPositionsInMessageFromChannels.keySet()) { - for (Position otherPos: substitutedPositionsInMessageFromChannels.get(otherCm)) { - for (Position thisPos: dependingVarPosInMessage) { + Set dependingChannelMembers = new HashSet<>(); + for (ChannelMember otherCm : substitutedPositionsInMessageFromChannels.keySet()) { + for (Position otherPos : substitutedPositionsInMessageFromChannels.get(otherCm)) { + for (Position thisPos : dependingVarPosInMessage) { if (thisPos.isAncestorOf(otherPos)) { dependingChannelMembers.add(otherCm); break; @@ -378,9 +370,9 @@ } /** - * Get the dependency from the values of the 'path parameters' of a channel member to the state values of other channel members. - * - * @return a map from a depending channel member to depended channel members + * Get the dependency from the values of the 'path parameters' of a channel member to the state values of other channel members. + * + * @return a map from a depending channel member to depended channel members */ public Map> getMemberDependency() { Map> dependency = new HashMap<>(); @@ -390,13 +382,13 @@ // Resolve dependency for each outside resource path if (substitutedPositionsInMessage != null) { - for (ChannelMember cm: getInputChannelMembers()) { + for (ChannelMember cm : getInputChannelMembers()) { if (cm.isOutside()) { Set dependingVarPosInMessage = getPossitionsInMessageThatChannelMemberDependsOn(cm.getResource(), cm.getStateTransition().getMessageExpression()); - Set dependingChannelMembers = new HashSet<>(); - for (ChannelMember otherCm: substitutedPositionsInMessage.keySet()) { - for (Position otherPos: substitutedPositionsInMessage.get(otherCm)) { - for (Position thisPos: dependingVarPosInMessage) { + Set dependingChannelMembers = new HashSet<>(); + for (ChannelMember otherCm : substitutedPositionsInMessage.keySet()) { + for (Position otherPos : substitutedPositionsInMessage.get(otherCm)) { + for (Position thisPos : dependingVarPosInMessage) { if (thisPos.isAncestorOf(otherPos) && otherCm != cm) { dependingChannelMembers.add(otherCm); break; @@ -408,13 +400,13 @@ dependency.put(cm, dependingChannelMembers); } } - for (ChannelMember cm: getReferenceChannelMembers()) { + for (ChannelMember cm : getReferenceChannelMembers()) { if (cm.isOutside()) { Set dependingVarPosInMessage = getPossitionsInMessageThatChannelMemberDependsOn(cm.getResource(), cm.getStateTransition().getMessageExpression()); - Set dependingChannelMembers = new HashSet<>(); - for (ChannelMember otherCm: substitutedPositionsInMessage.keySet()) { - for (Position otherPos: substitutedPositionsInMessage.get(otherCm)) { - for (Position thisPos: dependingVarPosInMessage) { + Set dependingChannelMembers = new HashSet<>(); + for (ChannelMember otherCm : substitutedPositionsInMessage.keySet()) { + for (Position otherPos : substitutedPositionsInMessage.get(otherCm)) { + for (Position thisPos : dependingVarPosInMessage) { if (thisPos.isAncestorOf(otherPos) && otherCm != cm) { dependingChannelMembers.add(otherCm); break; @@ -426,13 +418,13 @@ dependency.put(cm, dependingChannelMembers); } } - for (ChannelMember cm: getOutputChannelMembers()) { + for (ChannelMember cm : getOutputChannelMembers()) { if (cm.isOutside()) { Set dependingVarPosInMessage = getPossitionsInMessageThatChannelMemberDependsOn(cm.getResource(), cm.getStateTransition().getMessageExpression()); - Set dependingChannelMembers = new HashSet<>(); - for (ChannelMember otherCm: substitutedPositionsInMessage.keySet()) { - for (Position otherPos: substitutedPositionsInMessage.get(otherCm)) { - for (Position thisPos: dependingVarPosInMessage) { + Set dependingChannelMembers = new HashSet<>(); + for (ChannelMember otherCm : substitutedPositionsInMessage.keySet()) { + for (Position otherPos : substitutedPositionsInMessage.get(otherCm)) { + for (Position thisPos : dependingVarPosInMessage) { if (thisPos.isAncestorOf(otherPos) && otherCm != cm) { dependingChannelMembers.add(otherCm); break; @@ -448,26 +440,26 @@ return dependency; } - private Term calcUnifiedMessage(ChannelMember targetMember, IResourceStateAccessor stateAccessor, - Map inputResourceToStateAccessor, Map> substitutedPositionsInMessageFromChannels) + private Term calcUnifiedMessage(ChannelMember targetMember, IResourceStateAccessor stateAccessor, + Map inputResourceToStateAccessor, Map> substitutedPositionsInMessageFromChannels) throws InvalidMessage, ResolvingMultipleDefinitionIsFutureWork, UnificationFailed { Set messageConstraints = new HashSet<>(); // Calculate message constraints from input state transitions - for (ChannelMember inputMember: getInputChannelMembers()) { + for (ChannelMember inputMember : getInputChannelMembers()) { Expression messageConstraintByInput = calcMessageConstraintForInputMember(inputMember, targetMember, stateAccessor, inputResourceToStateAccessor, substitutedPositionsInMessageFromChannels); messageConstraints.add((Term) messageConstraintByInput); } - + // Calculate message constraints from reference state transitions - for (ChannelMember referenceMember: getReferenceChannelMembers()) { + for (ChannelMember referenceMember : getReferenceChannelMembers()) { Expression messageConstraintByReference = calcMessageConstraintForReferenceMember(referenceMember, targetMember, stateAccessor, inputResourceToStateAccessor, substitutedPositionsInMessageFromChannels); messageConstraints.add((Term) messageConstraintByReference); } - + // Unify message constraints Term unifiedMessage = null; - for (Term messageContraint: messageConstraints) { + for (Term messageContraint : messageConstraints) { if (unifiedMessage == null) { unifiedMessage = messageContraint; } else { @@ -479,9 +471,9 @@ } return unifiedMessage; } - - public Expression calcMessageConstraintForInputMember(ChannelMember inputMember, ChannelMember targetMember, IResourceStateAccessor stateAccessor, - Map inputResourceToStateAccessor, Map> substitutedPositionsInMessageFromChannels) + + public Expression calcMessageConstraintForInputMember(ChannelMember inputMember, ChannelMember targetMember, IResourceStateAccessor stateAccessor, + Map inputResourceToStateAccessor, Map> substitutedPositionsInMessageFromChannels) throws InvalidMessage, ResolvingMultipleDefinitionIsFutureWork { Expression curInputStateAccessor = null; Expression nextInputStateAccessor = null; @@ -494,12 +486,13 @@ } Set substitutedPositionsInMessage = new HashSet<>(); Expression messageConstraintByInput = inputMember.getStateTransition().deriveMessageConstraintFor(curInputStateAccessor, nextInputStateAccessor, substitutedPositionsInMessage); - if (substitutedPositionsInMessage.size() > 0) substitutedPositionsInMessageFromChannels.put(inputMember, substitutedPositionsInMessage); + if (substitutedPositionsInMessage.size() > 0) + substitutedPositionsInMessageFromChannels.put(inputMember, substitutedPositionsInMessage); return messageConstraintByInput; } - + public Expression calcMessageConstraintForReferenceMember(ChannelMember referenceMember, ChannelMember targetMember, IResourceStateAccessor stateAccessor, - Map inputResourceToStateAccessor, Map> substitutedPositionsInMessageFromChannels) + Map inputResourceToStateAccessor, Map> substitutedPositionsInMessageFromChannels) throws InvalidMessage, ResolvingMultipleDefinitionIsFutureWork { Expression curInputStateAccessor = null; if (inputResourceToStateAccessor == null) { @@ -509,25 +502,26 @@ } Set substitutedPositions = new HashSet<>(); Expression messageConstraintByReference = referenceMember.getStateTransition().deriveMessageConstraintFor(curInputStateAccessor, substitutedPositions); - if (substitutedPositions.size() > 0) substitutedPositionsInMessageFromChannels.put(referenceMember, substitutedPositions); + if (substitutedPositions.size() > 0) + substitutedPositionsInMessageFromChannels.put(referenceMember, substitutedPositions); return messageConstraintByReference; } /** * Get depended channel members and their positions in the message. - * + * * @return depended channel members and their positions in the message */ private Map> getDependedChannelMembersAndTheirPositionsInMessage() { Map> channelMembersMessageDependsOn = new HashMap<>(); // Collect channel members that the message depends on from input state transitions - for (ChannelMember inputMember: getInputChannelMembers()) { + for (ChannelMember inputMember : getInputChannelMembers()) { Set substitutedPositionsInMessage = new HashSet<>(); Expression messageTerm = inputMember.getStateTransition().getMessageExpression(); Expression curStateTerm = inputMember.getStateTransition().getCurStateExpression(); Expression nextStateTerm = inputMember.getStateTransition().getNextStateExpression(); HashMap messageVars = messageTerm.getVariables(); - for (Entry varEnt: messageVars.entrySet()) { + for (Entry varEnt : messageVars.entrySet()) { Variable var = varEnt.getValue(); if (curStateTerm.getVariables().values().contains(var) || nextStateTerm.getVariables().values().contains(var)) { if (messageTerm instanceof Term) { @@ -539,17 +533,18 @@ } } } - if (substitutedPositionsInMessage.size() > 0) channelMembersMessageDependsOn.put(inputMember, substitutedPositionsInMessage); + if (substitutedPositionsInMessage.size() > 0) + channelMembersMessageDependsOn.put(inputMember, substitutedPositionsInMessage); } - + // Collect channel members that the message depends on from reference state transitions - for (ChannelMember referenceMember: getReferenceChannelMembers()) { + for (ChannelMember referenceMember : getReferenceChannelMembers()) { Set substitutedPositionsInMessage = new HashSet<>(); Expression messageTerm = referenceMember.getStateTransition().getMessageExpression(); Expression curStateTerm = referenceMember.getStateTransition().getCurStateExpression(); // Expression nextStateTerm = referenceMember.getStateTransition().getNextStateExpression(); HashMap messageVars = messageTerm.getVariables(); - for (Entry varEnt: messageVars.entrySet()) { + for (Entry varEnt : messageVars.entrySet()) { Variable var = varEnt.getValue(); if (curStateTerm.getVariables().values().contains(var)) { if (messageTerm instanceof Term) { @@ -561,18 +556,19 @@ } } } - if (substitutedPositionsInMessage.size() > 0) channelMembersMessageDependsOn.put(referenceMember, substitutedPositionsInMessage); + if (substitutedPositionsInMessage.size() > 0) + channelMembersMessageDependsOn.put(referenceMember, substitutedPositionsInMessage); } return channelMembersMessageDependsOn; } - - public ResourcePath fillOutsideResourcePath(ResourcePath resource, Expression unifiedMessage, Expression messageTerm, Set dependingVarPosInMessage) + + public ResourcePath fillOutsideResourcePath(ResourcePath resource, Expression unifiedMessage, Expression messageTerm, Set dependingVarPosInMessage) throws ResolvingMultipleDefinitionIsFutureWork { ResourcePath filledResourcePath = new ResourcePath(resource); Map> bindings = new HashMap<>(); Map messageVars = messageTerm.getVariables(); - for (Entry messageVarEnt: messageVars.entrySet()) { + for (Entry messageVarEnt : messageVars.entrySet()) { Variable var = messageVarEnt.getValue(); Position varPos = messageVarEnt.getKey(); Expression valueCalc = unifiedMessage.getSubTerm(varPos); @@ -589,37 +585,37 @@ if (pathParam instanceof Variable) { if (pathValue == null) { if (bindings.get((Variable) pathParam) != null) { - filledResourcePath.replacePathParam(i, bindings.get((Variable) pathParam).getValue(), null); // Replace a path parameter with a value in the unified message. - dependingVarPosInMessage.add(bindings.get((Variable) pathParam).getKey()); // The position of the replaced variable in the message. + filledResourcePath.replacePathParam(i, bindings.get((Variable) pathParam).getValue(), null); // Replace a path parameter with a value in the unified message. + dependingVarPosInMessage.add(bindings.get((Variable) pathParam).getKey()); // The position of the replaced variable in the message. } } else { // If the path parameter has a constraint. if (pathValue instanceof Term) { Map pathValueVars = ((Term) pathValue).getVariables(); - for (Variable var: bindings.keySet()) { - if (pathValueVars.values().contains(var)) { // var is a subterm of a path parameter - pathValue = ((Term) pathValue).substitute(var, bindings.get(var).getValue()); // Substitute a value in the unified message to var. - dependingVarPosInMessage.add(bindings.get((Variable) var).getKey()); // The position of the replaced variable in the message. + for (Variable var : bindings.keySet()) { + if (pathValueVars.values().contains(var)) { // var is a subterm of a path parameter + pathValue = ((Term) pathValue).substitute(var, bindings.get(var).getValue()); // Substitute a value in the unified message to var. + dependingVarPosInMessage.add(bindings.get((Variable) var).getKey()); // The position of the replaced variable in the message. } } if (!(pathValue instanceof Constant)) { pathValue = ((Term) pathValue).reduce(); } - filledResourcePath.replacePathParam(i, pathValue, null); // Replace a path parameter with the substituted term. + filledResourcePath.replacePathParam(i, pathValue, null); // Replace a path parameter with the substituted term. } } } else if (pathParam instanceof Term) { Map pathParamVars = ((Term) pathParam).getVariables(); - for (Variable var: bindings.keySet()) { - if (pathParamVars.values().contains(var)) { // var is a subterm of a path parameter - pathParam = ((Term) pathParam).substitute(var, bindings.get(var).getValue()); // Substitute a value in the unified message to var. - dependingVarPosInMessage.add(bindings.get((Variable) var).getKey()); // The position of the replaced variable in the message. + for (Variable var : bindings.keySet()) { + if (pathParamVars.values().contains(var)) { // var is a subterm of a path parameter + pathParam = ((Term) pathParam).substitute(var, bindings.get(var).getValue()); // Substitute a value in the unified message to var. + dependingVarPosInMessage.add(bindings.get((Variable) var).getKey()); // The position of the replaced variable in the message. } } if (!(pathParam instanceof Constant)) { pathParam = ((Term) pathParam).reduce(); } - filledResourcePath.replacePathParam(i, pathParam, null); // Replace a path parameter with the substituted term. + filledResourcePath.replacePathParam(i, pathParam, null); // Replace a path parameter with the substituted term. } } return filledResourcePath; @@ -628,10 +624,10 @@ private Set getPossitionsInMessageThatChannelMemberDependsOn(ResourcePath resourcePath, Expression messageTerm) { Set dependingVarPosInMessage = new HashSet<>(); Map messageVars = messageTerm.getVariables(); - for (Map.Entry pathParamEnt: resourcePath.getPathParamsAndConstraints()) { + for (Map.Entry pathParamEnt : resourcePath.getPathParamsAndConstraints()) { Expression pathParam = pathParamEnt.getKey(); if (pathParam instanceof Variable) { - for (Entry messageVarEnt: messageVars.entrySet()) { + for (Entry messageVarEnt : messageVars.entrySet()) { Variable var = messageVarEnt.getValue(); Position varPos = messageVarEnt.getKey(); if (pathParam.equals(var)) { @@ -640,7 +636,7 @@ } } else if (pathParam instanceof Term) { Map pathParamVars = ((Term) pathParam).getVariables(); - for (Entry messageVarEnt: messageVars.entrySet()) { + for (Entry messageVarEnt : messageVars.entrySet()) { Variable var = messageVarEnt.getValue(); Position varPos = messageVarEnt.getKey(); if (pathParamVars.values().contains(var)) { @@ -666,23 +662,23 @@ if (getSelectors().size() > 0) { channelSource += "("; String delimitor = ""; - for (Selector selector: getSelectors()) { + for (Selector selector : getSelectors()) { channelSource += delimitor + selector.getExpression().toString(); delimitor = ", "; } - channelSource += ")"; + channelSource += ")"; } channelSource += " {\n"; - for (ChannelMember inputMember: inputChannelMembers) { + for (ChannelMember inputMember : inputChannelMembers) { channelSource += "\t " + Parser.IN + " " + inputMember + "\n"; } - for (ChannelMember refMember: referenceChannelMembers) { + for (ChannelMember refMember : referenceChannelMembers) { channelSource += "\t " + Parser.REF + " " + refMember + "\n"; } - for (ChannelMember outputMember: outputChannelMembers) { + for (ChannelMember outputMember : outputChannelMembers) { channelSource += "\t " + Parser.OUT + " " + outputMember + "\n"; } - for (Channel childCh: getChildren()) { + for (Channel childCh : getChildren()) { channelSource += childCh.toString(); } channelSource += "}\n"; @@ -691,7 +687,9 @@ public interface IResourceStateAccessor { Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from); + Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from); + Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferModel.java index ad92b74..8b7878c 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferModel.java @@ -1,39 +1,39 @@ package models.dataFlowModel; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import models.dataConstraintModel.Channel; import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.ResourceHierarchy; import models.dataConstraintModel.ResourcePath; -public class DataTransferModel extends DataConstraintModel { +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class DataTransferModel extends DataConstraintModel { public DataFlowGraph getDataFlowGraph() { DataFlowGraph dataFlowGraph = new DataFlowGraph(); Map>> channelLocalResMap = new HashMap<>(); - for (Channel channel: getChannels()) { + for (Channel channel : getChannels()) { addResourceToChannelEdges(dataFlowGraph, channel, null, channelLocalResMap); } - for (Channel channel: getChannels()) { + for (Channel channel : getChannels()) { addReferenceResources(dataFlowGraph, channel, null, channelLocalResMap); } - for (Channel channel: getChannels()) { + for (Channel channel : getChannels()) { addChannelToResourceEdges(dataFlowGraph, channel, null, channelLocalResMap); } - for (Channel channel: getInputChannels()) { + for (Channel channel : getInputChannels()) { addChannelToResourceEdges(dataFlowGraph, channel, null, channelLocalResMap); } return dataFlowGraph; } - - private void addResourceToChannelEdges(DataFlowGraph dataFlowGraph, Channel dstChannel, ChannelNode parentChannelNode, - Map>> channelLocalResMap) { + + private void addResourceToChannelEdges(DataFlowGraph dataFlowGraph, Channel dstChannel, ChannelNode parentChannelNode, + Map>> channelLocalResMap) { DataTransferChannel dstDfChannel = (DataTransferChannel) dstChannel; ChannelNode dstChannelNode = dataFlowGraph.addChannelNode(parentChannelNode, dstDfChannel); - for (ResourcePath srcRes: dstDfChannel.getInputResources()) { + for (ResourcePath srcRes : dstDfChannel.getInputResources()) { Map> chLocalResNodes = channelLocalResMap.get(srcRes.getResourceHierarchy()); if (srcRes.getNumberOfParameters() == 0) { // ResourcePath without parameter corresponds to a global ResourceNode. @@ -47,12 +47,12 @@ dataFlowGraph.addEdge(srcResNode, dstChannelNode); } else { // There already has been a channel-local ResourceNode. - Set nodes = chLocalResNodes.get(dstChannel); // channel-local ResourceNodes. + Set nodes = chLocalResNodes.get(dstChannel); // channel-local ResourceNodes. boolean bExists = false; - for (ResourceNode node: nodes) { + for (ResourceNode node : nodes) { ResourcePath r = node.getOutSideResource(dstDfChannel); if (r.toString().equals(srcRes.toString())) { - bExists = true; // There exists a textually identical ResourecPath within the same channel. + bExists = true; // There exists a textually identical ResourecPath within the same channel. break; } } @@ -64,16 +64,16 @@ } } } - for (Channel childChannel: dstDfChannel.getChildren()) { + for (Channel childChannel : dstDfChannel.getChildren()) { addResourceToChannelEdges(dataFlowGraph, childChannel, dstChannelNode, channelLocalResMap); } } - private void addReferenceResources(DataFlowGraph dataFlowGraph, Channel dstChannel, ChannelNode parentChannelNode, - Map>> channelLocalResMap) { + private void addReferenceResources(DataFlowGraph dataFlowGraph, Channel dstChannel, ChannelNode parentChannelNode, + Map>> channelLocalResMap) { DataTransferChannel dstDfChannel = (DataTransferChannel) dstChannel; ChannelNode dstChannelNode = dataFlowGraph.addChannelNode(parentChannelNode, dstDfChannel); - for (ResourcePath srcRes: dstDfChannel.getReferenceResources()) { + for (ResourcePath srcRes : dstDfChannel.getReferenceResources()) { Map> chLocalResNodes = channelLocalResMap.get(srcRes.getResourceHierarchy()); if (srcRes.getNumberOfParameters() == 0) { // ResourcePath without parameter corresponds to a global ResourceNode. @@ -85,12 +85,12 @@ ResourceNode srcResNode = addResourceNodes(dataFlowGraph, srcRes, dstDfChannel, channelLocalResMap, false); } else { boolean bExists = false; - for (Channel ch: chLocalResNodes.keySet()) { + for (Channel ch : chLocalResNodes.keySet()) { Set nodes = chLocalResNodes.get(ch); - for (ResourceNode node: nodes) { + for (ResourceNode node : nodes) { ResourcePath r = node.getOutSideResource((DataTransferChannel) ch); if (r.toString().equals(srcRes.toString())) { - bExists = true; // There exists the same ResourecPath within some channel. + bExists = true; // There exists the same ResourecPath within some channel. break; } } @@ -102,17 +102,17 @@ } } } - for (Channel childChannel: dstDfChannel.getChildren()) { + for (Channel childChannel : dstDfChannel.getChildren()) { addReferenceResources(dataFlowGraph, childChannel, dstChannelNode, channelLocalResMap); } } - private void addChannelToResourceEdges(DataFlowGraph dataFlowGraph, Channel srcChannel, ChannelNode parentChannelNode, - Map>> channelLocalResMap) { + private void addChannelToResourceEdges(DataFlowGraph dataFlowGraph, Channel srcChannel, ChannelNode parentChannelNode, + Map>> channelLocalResMap) { DataTransferChannel srcDfChannel = (DataTransferChannel) srcChannel; - ChannelNode srcChannelNode = dataFlowGraph.addChannelNode(parentChannelNode, srcDfChannel); - for (ResourcePath dstRes: srcDfChannel.getOutputResources()) { - Map> chLocalResNodes = channelLocalResMap.get(dstRes.getResourceHierarchy()); // ResourceNodes that have the same ResourceHierarchy. + ChannelNode srcChannelNode = dataFlowGraph.addChannelNode(parentChannelNode, srcDfChannel); + for (ResourcePath dstRes : srcDfChannel.getOutputResources()) { + Map> chLocalResNodes = channelLocalResMap.get(dstRes.getResourceHierarchy()); // ResourceNodes that have the same ResourceHierarchy. Set dstResSet = new HashSet<>(); if (dstRes.getNumberOfParameters() == 0) { // ResourcePath without parameter corresponds to a global ResourceNode. @@ -122,7 +122,7 @@ dstResSet.add(dstResNode); } else { // Select all (usually one) global ResourceNodes. - for (Set resSet: chLocalResNodes.values()) { + for (Set resSet : chLocalResNodes.values()) { dstResSet.addAll(resSet); } } @@ -135,16 +135,16 @@ } else { if (chLocalResNodes.get(srcDfChannel) == null) { // Select all non-terminal ResourceNodes. - for (Set resSet: chLocalResNodes.values()) { + for (Set resSet : chLocalResNodes.values()) { dstResSet.addAll(resSet); } } else { // There already has been a channel-local terminal ResourceNode. if (chLocalResNodes.size() > 0) { // There already has been a channel-local ResourceNode. - for (Set resNodes: chLocalResNodes.values()) { - for (ResourceNode localResNode: resNodes) { - for (ResourcePath localResPath: localResNode.getInSideResources()) { + for (Set resNodes : chLocalResNodes.values()) { + for (ResourceNode localResNode : resNodes) { + for (ResourcePath localResPath : localResNode.getInSideResources()) { if (localResPath.toString().equals(dstRes.toString())) { // Channel-local ResourcePath should be identical, and the identical ResourcePath is selected on top priority. dstResSet.add(localResNode); @@ -159,12 +159,12 @@ while (dstParent != null && dstParent.getNumberOfParameters() > 0) { Map> chToLocalDstNodes = channelLocalResMap.get(dstParent.getResourceHierarchy()); if (chToLocalDstNodes != null) { - for (Channel dstCh: chToLocalDstNodes.keySet()) { - for (ResourceNode localParentNode: chToLocalDstNodes.get(dstCh)) { - for (ResourcePath localParentPath: localParentNode.getInSideResources()) { + for (Channel dstCh : chToLocalDstNodes.keySet()) { + for (ResourceNode localParentNode : chToLocalDstNodes.get(dstCh)) { + for (ResourcePath localParentPath : localParentNode.getInSideResources()) { if (localParentPath.toString().equals(dstParent.toString())) { // There already has been a common channel-local ancestor. - ResourceNode dstResNode = addResourceNodes(dataFlowGraph, dstRes, (DataTransferChannel)dstCh, channelLocalResMap, false); + ResourceNode dstResNode = addResourceNodes(dataFlowGraph, dstRes, (DataTransferChannel) dstCh, channelLocalResMap, false); dstResSet.add(dstResNode); break; } @@ -179,7 +179,7 @@ } } if (dstResSet.size() == 0) { - for (Set nodes: chLocalResNodes.values()) { + for (Set nodes : chLocalResNodes.values()) { // Select all corresponding ResourceNodes. dstResSet.addAll(nodes); } @@ -192,24 +192,24 @@ } } } - for (ResourceNode dstResNode: dstResSet) { + for (ResourceNode dstResNode : dstResSet) { dstResNode.addInSideResource(srcDfChannel, dstRes); - dataFlowGraph.addEdge(srcChannelNode, dstResNode); // Connect to each ResourceNode that has the same ResourceHierarchy. + dataFlowGraph.addEdge(srcChannelNode, dstResNode); // Connect to each ResourceNode that has the same ResourceHierarchy. } } - for (Channel childChannel: srcDfChannel.getChildren()) { + for (Channel childChannel : srcDfChannel.getChildren()) { addChannelToResourceEdges(dataFlowGraph, childChannel, srcChannelNode, channelLocalResMap); } } - private ResourceNode addResourceNodes(DataFlowGraph dataFlowGraph, ResourcePath resPath, DataTransferChannel dfChannel, - Map>> channelLocalResMap, boolean isTerminal) { + private ResourceNode addResourceNodes(DataFlowGraph dataFlowGraph, ResourcePath resPath, DataTransferChannel dfChannel, + Map>> channelLocalResMap, boolean isTerminal) { ResourceNode resNode = null; if (resPath.getParent() == null) { if (!isTerminal) { resNode = dataFlowGraph.addResourceNode(null, resPath, dfChannel); } else { - resNode = dataFlowGraph.addTerminalResourceNode(null, dfChannel, resPath); + resNode = dataFlowGraph.addTerminalResourceNode(null, dfChannel, resPath); } } else { // Search an identical parent ResourceNode. @@ -221,15 +221,15 @@ if (channelLocalResMap.get(resPath.getResourceHierarchy().getParent()) != null) { Set chLocalNodes = channelLocalResMap.get(resPath.getResourceHierarchy().getParent()).get(parentDfChannel); if (chLocalNodes != null) { - for (ResourceNode node: chLocalNodes) { - for (ResourcePath r: node.getOutSideResources()) { + for (ResourceNode node : chLocalNodes) { + for (ResourcePath r : node.getOutSideResources()) { if (r.toString().equals(resPath.getParent().toString())) { parent = node; break; } } if (parent != null) break; - for (ResourcePath r: node.getInSideResources()) { + for (ResourcePath r : node.getInSideResources()) { if (r.toString().equals(resPath.getParent().toString())) { parent = node; break; @@ -251,12 +251,12 @@ Map> chToLocalNodes = channelLocalResMap.get(resPath.getResourceHierarchy()); if (chToLocalNodes == null) { chToLocalNodes = new HashMap<>(); - channelLocalResMap.put(resPath.getResourceHierarchy(), chToLocalNodes); + channelLocalResMap.put(resPath.getResourceHierarchy(), chToLocalNodes); } Set chLocalNodes = chToLocalNodes.get(dfChannel); if (chLocalNodes == null) { chLocalNodes = new HashSet<>(); - chToLocalNodes.put(dfChannel, chLocalNodes); + chToLocalNodes.put(dfChannel, chLocalNodes); } chLocalNodes.add(resNode); return resNode; diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/IFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/IFlowGraph.java index 06a950b..78ce600 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/IFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/IFlowGraph.java @@ -1,11 +1,10 @@ package models.dataFlowModel; -import java.util.Collection; +import models.Node; + import java.util.Map; import java.util.Set; -import models.Node; - public interface IFlowGraph { public Map> getAllComponentNodes(); } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ModelExtension.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ModelExtension.java index bff95f8..7ab0850 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ModelExtension.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ModelExtension.java @@ -10,7 +10,7 @@ private static Symbol.Memento mergeMem; private static Symbol.Memento extractFaceDownMem; private static Symbol.Memento sortByKeyMem; - + public static void extendModel(DataTransferModel model) { Symbol floor = model.getSymbol("floor"); floorMem = null; @@ -23,7 +23,7 @@ sumMem = null; if (sum != null) { sumMem = sum.createMemento(); - final int[] count = new int[] {0}; + final int[] count = new int[]{0}; sum.setGenerator(new Symbol.IImplGenerator() { @Override public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, String[] sideEffect) { @@ -32,7 +32,7 @@ String interfaceType = type.getInterfaceTypeName(); if (interfaceType.contains("<")) { compType = interfaceType.substring(interfaceType.indexOf("<") + 1, interfaceType.lastIndexOf(">")); - } + } } count[0]++; String impl = compType + " " + "temp_sum" + count[0] + " = 0;\n"; @@ -44,7 +44,7 @@ } }); sum.setImplOperatorType(Symbol.Type.GENERATIVE); - sum.setSignature(new Type[] {DataConstraintModel.typeInt, DataConstraintModel.typeList}); + sum.setSignature(new Type[]{DataConstraintModel.typeInt, DataConstraintModel.typeList}); // sum.setImplName("stream().mapToInt(x->x).sum"); // sum.setImplOperatorType(Symbol.Type.METHOD); } @@ -53,7 +53,7 @@ if (merge != null) { mergeMem = merge.createMemento(); merge.setArity(2); - final int[] count = new int[] {0}; + final int[] count = new int[]{0}; merge.setGenerator(new Symbol.IImplGenerator() { @Override public String generate(Type type, Type[] childrenTypes, String[] childrenImpl, String[] childrenSideEffects, String[] sideEffect) { @@ -87,7 +87,7 @@ impl += "\t\t\tt2 = i2.next();\n"; impl += "\t\t}\n"; impl += "\t\tif (t1 == null || (t2 != null && t1" + idxGetter + " < t2" + idxGetter + ")) {\n"; - impl += "\t\t\ttemp_l" + count[0] +".add(t2);\n"; + impl += "\t\t\ttemp_l" + count[0] + ".add(t2);\n"; impl += "\t\t\tt2 = null;\n"; impl += "\t\t} else {\n"; impl += "\t\t\ttemp_l" + count[0] + ".add(t1);\n"; @@ -100,8 +100,8 @@ } }); merge.setImplOperatorType(Symbol.Type.GENERATIVE); - merge.setSignature(new Type[] {DataConstraintModel.typeList, DataConstraintModel.typeList, DataConstraintModel.typeList}); - } + merge.setSignature(new Type[]{DataConstraintModel.typeList, DataConstraintModel.typeList, DataConstraintModel.typeList}); + } Symbol extractFaceDown = model.getSymbol("extractFaceDown"); extractFaceDownMem = null; if (extractFaceDown != null) { @@ -109,24 +109,24 @@ extractFaceDown.setArity(1); extractFaceDown.setGenerator(new Symbol.IImplGenerator() { @Override - public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, String[] sideEffect) { - return children[0]+".stream().filter(item -> item.getValue()==false).collect(Collectors.toList())"; + public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, String[] sideEffect) { + return children[0] + ".stream().filter(item -> item.getValue()==false).collect(Collectors.toList())"; } }); extractFaceDown.setImplOperatorType(Symbol.Type.GENERATIVE); - extractFaceDown.setSignature(new Type[] {DataConstraintModel.typeList, null}); + extractFaceDown.setSignature(new Type[]{DataConstraintModel.typeList, null}); } Symbol sortByKey = model.getSymbol("sortByKey"); sortByKeyMem = null; - if(sortByKey != null) { + if (sortByKey != null) { sortByKeyMem = sortByKey.createMemento(); sortByKey.setArity(1); sortByKey.setGenerator(new Symbol.IImplGenerator() { @Override - public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, String[] sideEffect) { + public String generate(Type type, Type[] childrenTypes, String[] children, String[] childrenSideEffects, String[] sideEffect) { String compType = ""; - String temp_sort="temp_sort"; + String temp_sort = "temp_sort"; if (type != null) { String interfaceType = type.getInterfaceTypeName(); if (interfaceType.contains("<")) { @@ -136,27 +136,27 @@ if (implType.indexOf('<') >= 0) { implType = implType.substring(0, implType.indexOf('<')); } - - } - for (String s: childrenSideEffects) { + + } + for (String s : childrenSideEffects) { sideEffect[0] += s; } - temp_sort=children[0]+".sort(Comparator.comparing("+compType+"::getKey));\n"; + temp_sort = children[0] + ".sort(Comparator.comparing(" + compType + "::getKey));\n"; return temp_sort; } }); - sortByKey.setSignature(new Type[] {DataConstraintModel.typeList, DataConstraintModel.typeList}); + sortByKey.setSignature(new Type[]{DataConstraintModel.typeList, DataConstraintModel.typeList}); sortByKey.setImplOperatorType(Symbol.Type.GENERATIVE); } } public static void recoverModel(DataTransferModel model) { - Symbol floor = model.getSymbol("floor"); + Symbol floor = model.getSymbol("floor"); if (floor != null) floor.setMemento(floorMem); Symbol sum = model.getSymbol("sum"); if (sum != null) sum.setMemento(sumMem); Symbol merge = model.getSymbol("merge"); - if (merge != null) merge.setMemento(mergeMem); + if (merge != null) merge.setMemento(mergeMem); Symbol extractFaceDown = model.getSymbol("extractFaceDown"); if (extractFaceDown != null) extractFaceDown.setMemento(extractFaceDownMem); Symbol sortByKey = model.getSymbol("sortByKey"); diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullAttribute.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullAttribute.java index ad0da87..575b015 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullAttribute.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullAttribute.java @@ -1,11 +1,11 @@ package models.dataFlowModel; +import models.EdgeAttribute; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import models.EdgeAttribute; - public class PushPullAttribute extends EdgeAttribute { private List options; @@ -13,10 +13,10 @@ options = new ArrayList<>(); } - public PushPullAttribute(PushPullValue[] options) { + public PushPullAttribute(PushPullValue[] options) { this.options = new ArrayList<>(Arrays.asList(options)); } - + public List getOptions() { return options; } @@ -24,15 +24,15 @@ public PushPullValue getSelectedOption() { return options.get(0); } - + public void setOptions(List options) { this.options = options; } - + public void addOption(PushPullValue option) { options.add(option); } - + public void removeOption(PushPullValue option) { options.remove(option); } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullValue.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullValue.java index 28307c6..a9d2fc8 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullValue.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullValue.java @@ -7,14 +7,14 @@ public String toString() { switch (this) { - case PUSHorPULL: - return "PUSH/PULL"; - case PUSH: - return "PUSH"; - case PULL: - return "PULL"; - default: - return ""; + case PUSHorPULL: + return "PUSH/PULL"; + case PUSH: + return "PUSH"; + case PULL: + return "PULL"; + default: + return ""; } } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ReferenceEdge.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ReferenceEdge.java index c8ff371..b6ac7ed 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ReferenceEdge.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ReferenceEdge.java @@ -3,9 +3,9 @@ import models.Edge; public class ReferenceEdge extends Edge { - + public ReferenceEdge(ResourceNode src, ResourceNode dst) { super(src, dst); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ResourceNode.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ResourceNode.java index 6c56bcb..96557b8 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ResourceNode.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/ResourceNode.java @@ -1,15 +1,5 @@ package models.dataFlowModel; -import java.util.AbstractMap; -import java.util.AbstractMap.SimpleEntry; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import models.Node; import models.algebra.Expression; import models.algebra.Type; @@ -17,11 +7,13 @@ import models.dataConstraintModel.ResourcePath; import models.dataConstraintModel.Selector; +import java.util.*; + public class ResourceNode extends Node { protected ResourceNode parent = null; protected Set children = null; protected ResourceHierarchy resourceHierarchy = null; - protected ResourcePath primaryResourcePath = null; // for temporal use at the modeling stage + protected ResourcePath primaryResourcePath = null; // for temporal use at the modeling stage protected Map inSide = null; protected Map outSide = null; protected List selectors = null; @@ -39,7 +31,7 @@ selectors.add(new Selector(pathParams.get(pathParams.size() - 1))); } } - + public ResourceNode(ResourceNode parent, ResourcePath outSideResource, DataTransferChannel outSideChannel) { this.parent = parent; this.children = new HashSet<>(); @@ -57,7 +49,7 @@ } } } - + public ResourceNode(ResourceNode parent, ResourcePath resource, DataTransferChannel channel, boolean isInside) { this.parent = parent; this.children = new HashSet<>(); @@ -86,10 +78,10 @@ this.inSide = inSide; this.outSide = outSide; this.selectors = new ArrayList<>(); - for (Map.Entry outsideEnt: outSide.entrySet()) { + for (Map.Entry outsideEnt : outSide.entrySet()) { DataTransferChannel outSideChannel = outsideEnt.getKey(); ResourcePath outSideResource = outsideEnt.getValue(); - if (this.resourceHierarchy == null) { + if (this.resourceHierarchy == null) { this.resourceHierarchy = outSideResource.getResourceHierarchy(); } if (resourceHierarchy.getNumParameters() > 0) { @@ -126,7 +118,7 @@ public Set getChildren() { return children; } - + public void addChild(ResourceNode child) { children.add(child); child.parent = this; @@ -137,7 +129,7 @@ if (outSide.size() > 0) return outSide.values().iterator().next(); return inSide.values().iterator().next(); } - + public Collection getInSideResources() { return inSide.values(); } @@ -171,15 +163,15 @@ primaryResourcePath = null; outSide.put(channel, outResource); } - + public List getSelectors() { return selectors; } - + public Selector getLastSelector() { return selectors.get(resourceHierarchy.getTotalNumParameters() - 1); } - + public List getAllSelectors() { List selectors = new ArrayList<>(); if (parent != null) { @@ -188,7 +180,7 @@ selectors.addAll(this.selectors); return selectors; } - + // public boolean equals(Object another) { // if (this == another) return true; // if (!(another instanceof ResourceNode)) return false; diff --git a/AlgebraicDataflowArchitectureModel/src/models/visualModel/FormulaChannel.java b/AlgebraicDataflowArchitectureModel/src/models/visualModel/FormulaChannel.java index 2fb57ee..c00a207 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/visualModel/FormulaChannel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/visualModel/FormulaChannel.java @@ -1,25 +1,24 @@ package models.visualModel; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - import models.algebra.Expression; import models.algebra.Symbol; import models.algebra.Term; import models.algebra.Variable; import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.ResourcePath; import models.dataConstraintModel.StateTransition; import models.dataFlowModel.DataTransferChannel; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + public class FormulaChannel extends DataTransferChannel { private Symbol defaultOperator = null; private String formula = null; private Expression formulaRhs = null; - + public FormulaChannel(String channelName, Symbol defaultOperator) { super(channelName); this.defaultOperator = defaultOperator; @@ -43,7 +42,7 @@ Term newTerm = new Term(defaultOperator); newTerm.addChild(formulaRhs); newTerm.addChild(new Variable(channelMember.getResource().getLeafResourceName())); - formulaRhs = newTerm; + formulaRhs = newTerm; } } } else { @@ -55,7 +54,7 @@ setFormulaTerm(formulaRhs); } } - + public void addChannelMemberAsOutput(ChannelMember channelMember) { // StateTransition st = new StateTransition(); // st.setCurStateExpression(new Variable(channelMember.getIdentifierTemplate().getResourceName() + "1")); @@ -68,14 +67,14 @@ } } if (formulaRhs != null) { - setFormulaTerm(formulaRhs); + setFormulaTerm(formulaRhs); } } - + public Symbol getDefaultOperator() { return defaultOperator; } - + public void setDefaultOperator(Symbol defaultOperator) { this.defaultOperator = defaultOperator; } @@ -94,14 +93,14 @@ Map curStates = new HashMap<>(); Map nextStates = new HashMap<>(); Map resToNextVar = new HashMap<>(); - for (ChannelMember cm: this.getInputChannelMembers()) { + for (ChannelMember cm : this.getInputChannelMembers()) { ResourcePath id = cm.getResource(); String resName = id.getLeafResourceName(); Variable curVar = new Variable(resName + "1"); Variable nextVar = new Variable(resName + "2"); curStates.put(id, curVar); nextStates.put(id, nextVar); - for (Variable var: variables) { + for (Variable var : variables) { if (var.getName().equals(resName)) { resToNextVar.put(var, nextVar); break; @@ -110,13 +109,13 @@ } Symbol update = new Symbol("update"); update.setArity(resToNextVar.keySet().size()); - for (ChannelMember cm: getInputChannelMembers()) { + for (ChannelMember cm : getInputChannelMembers()) { ResourcePath id = cm.getResource(); StateTransition st = new StateTransition(); st.setCurStateExpression(curStates.get(id)); st.setNextStateExpression(nextStates.get(id)); Term message = new Term(update); - for (Variable var: resToNextVar.values()) { + for (Variable var : resToNextVar.values()) { message.addChild(var); } st.setMessageExpression(message); @@ -127,11 +126,11 @@ rhs = resToNextVar.get((Variable) rhs); } else if (rhs instanceof Term) { formulaRhs = rhs; - for (Variable var: resToNextVar.keySet()) { + for (Variable var : resToNextVar.keySet()) { rhs = ((Term) rhs).substitute(var, resToNextVar.get(var)); } } - for (ChannelMember cm: getOutputChannelMembers()) { + for (ChannelMember cm : getOutputChannelMembers()) { ResourcePath id = cm.getResource(); StateTransition st = new StateTransition(); String resName = id.getLeafResourceName(); @@ -139,7 +138,7 @@ st.setCurStateExpression(curVar); st.setNextStateExpression(rhs); Term message = new Term(update); - for (Variable var: resToNextVar.values()) { + for (Variable var : resToNextVar.values()) { message.addChild(var); } st.setMessageExpression(message); diff --git a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java index 951bcb0..62d9718 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java @@ -1,47 +1,19 @@ package parser; +import models.algebra.*; +import models.dataConstraintModel.*; +import models.dataFlowModel.DataTransferChannel; +import models.dataFlowModel.DataTransferModel; +import parser.exceptions.*; + import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.Variable; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.JsonAccessor; -import models.dataConstraintModel.JsonTerm; -import models.dataConstraintModel.ListTerm; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.StateTransition; -import models.dataConstraintModel.StateTransitionTerm; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.DataTransferChannel; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; - -public class Parser { +public class Parser { protected TokenStream stream; - + public static final String CHANNEL = "channel"; public static final String INIT = "init"; public static final String IN = "in"; @@ -88,12 +60,12 @@ public static final String DOT = "."; public static final String DOT_REGX = "\\."; public static final String DOUBLE_QUOT = "\""; - + public Parser(final TokenStream stream) { this.stream = stream; } - - public Parser(final BufferedReader reader) { + + public Parser(final BufferedReader reader) { this.stream = new TokenStream(); try { String line; @@ -106,17 +78,17 @@ } } - public DataTransferModel doParse() - throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, - ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, - ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public DataTransferModel doParse() + throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, + ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, + ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { return parseDataFlowModel(); } - - public DataTransferModel parseDataFlowModel() - throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, - ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, - ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + + public DataTransferModel parseDataFlowModel() + throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, + ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, + ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { DataTransferModel model = new DataTransferModel(); DataTransferChannel channel; while ((channel = parseChannel(model)) != null) { @@ -128,15 +100,15 @@ } return model; } - - public DataTransferChannel parseChannel(DataTransferModel model) - throws ExpectedLeftCurlyBracket, ExpectedRightBracket, ExpectedRightCurlyBracket, ExpectedAssignment, - ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, - ExpectedChannel, ExpectedChannelName, ExpectedInOrOutOrRefOrSubKeyword, - ExpectedStateTransition, ExpectedEquals, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + + public DataTransferChannel parseChannel(DataTransferModel model) + throws ExpectedLeftCurlyBracket, ExpectedRightBracket, ExpectedRightCurlyBracket, ExpectedAssignment, + ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, + ExpectedChannel, ExpectedChannelName, ExpectedInOrOutOrRefOrSubKeyword, + ExpectedStateTransition, ExpectedEquals, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { if (!stream.hasNext()) return null; if (stream.checkNext().equals(RIGHT_CURLY_BRACKET)) return null; - + boolean isNative = false; String channelOrInitOrNativeKeyword = stream.next(); if (channelOrInitOrNativeKeyword.equals(NATIVE)) { @@ -145,7 +117,7 @@ channelOrInitOrNativeKeyword = stream.next(); } if (!channelOrInitOrNativeKeyword.equals(CHANNEL) && !channelOrInitOrNativeKeyword.equals(SUB_CHANNEL)) { - if (!channelOrInitOrNativeKeyword.equals(INIT)) throw new ExpectedChannel(stream.getLine()); + if (!channelOrInitOrNativeKeyword.equals(INIT)) throw new ExpectedChannel(stream.getLine()); parseInit(model); channelOrInitOrNativeKeyword = stream.next(); if (channelOrInitOrNativeKeyword.equals(NATIVE)) { @@ -155,10 +127,10 @@ } } if (!stream.hasNext()) throw new ExpectedChannelName(stream.getLine()); - + String channelName = stream.next(); if (channelName.equals(LEFT_CURLY_BRACKET)) throw new ExpectedChannelName(stream.getLine()); - + int fromLine = stream.getLine(); DataTransferChannel channel = new DataTransferChannel(channelName); if (isNative) { @@ -178,7 +150,7 @@ leftBracket = stream.next(); } if (!leftBracket.equals(LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine()); - + String inOrOutOrRefOrSub = null; while (stream.hasNext() && !(inOrOutOrRefOrSub = stream.checkNext()).equals(RIGHT_CURLY_BRACKET)) { ChannelMember channelMember = null; @@ -193,7 +165,7 @@ channelMember = parseChannelMember(model, inOrOutOrRefOrSub); if (channelMember != null) { channel.addChannelMemberAsOutput(channelMember); - } + } } else if (inOrOutOrRefOrSub.equals(REF)) { stream.next(); channelMember = parseChannelMember(model, inOrOutOrRefOrSub); @@ -214,53 +186,53 @@ channel.setSourceText(stream.getSourceText(fromLine, toLine)); return channel; } - - public void parseInit(DataTransferModel model) - throws ExpectedLeftCurlyBracket, ExpectedAssignment, ExpectedRHSExpression, WrongRHSExpression, - ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + + public void parseInit(DataTransferModel model) + throws ExpectedLeftCurlyBracket, ExpectedAssignment, ExpectedRHSExpression, WrongRHSExpression, + ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { String leftBracket = stream.next(); if (!leftBracket.equals(LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine()); while (stream.hasNext() && !stream.checkNext().equals(RIGHT_CURLY_BRACKET)) { int fromLine = stream.getLine(); ResourceHierarchy resourceHierarchy = parseResourceHierarchy(stream, model); - + if (!stream.hasNext()) throw new ExpectedAssignment(stream.getLine()); String colon = stream.next(); if (!colon.equals(COLON)) throw new ExpectedAssignment(stream.getLine()); if (!stream.hasNext()) throw new ExpectedAssignment(stream.getLine()); String equals = stream.next(); if (!equals.equals(ASSIGNMENT)) throw new ExpectedAssignment(stream.getLine()); - + int toLine = stream.getLine(); Expression rightTerm = null; - if (!stream.hasNext()) throw new ExpectedRHSExpression(stream.getLine()); - rightTerm = parseTerm(stream, model); + if (!stream.hasNext()) throw new ExpectedRHSExpression(stream.getLine()); + rightTerm = parseTerm(stream, model); if (rightTerm == null) throw new WrongRHSExpression(stream.getLine()); - + resourceHierarchy.setInitialValue(rightTerm); resourceHierarchy.setInitText(stream.getSourceText(fromLine, toLine)); } if (stream.hasNext()) stream.next(); } - - public ChannelMember parseChannelMember(DataTransferModel model, final String inOrOutOrRef) - throws ExpectedRightBracket, ExpectedRightCurlyBracket, ExpectedStateTransition, ExpectedEquals, - ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + + public ChannelMember parseChannelMember(DataTransferModel model, final String inOrOutOrRef) + throws ExpectedRightBracket, ExpectedRightCurlyBracket, ExpectedStateTransition, ExpectedEquals, + ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { if (!stream.hasNext()) throw new ExpectedStateTransition(stream.getLine()); StateTransitionTerm leftTerm = parseStateTransitionTerm(stream, model); if (leftTerm == null || !(leftTerm instanceof Term)) throw new WrongLHSExpression(stream.getLine()); Expression rightTerm = null; - + if (!inOrOutOrRef.equals(REF)) { if (!stream.hasNext()) throw new ExpectedEquals(stream.getLine()); String equals = stream.next(); if (!equals.equals(EQUALS)) throw new ExpectedEquals(stream.getLine()); - - if (!stream.hasNext()) throw new ExpectedRHSExpression(stream.getLine()); - rightTerm = parseTerm(stream, model); + + if (!stream.hasNext()) throw new ExpectedRHSExpression(stream.getLine()); + rightTerm = parseTerm(stream, model); if (rightTerm == null) throw new WrongRHSExpression(stream.getLine()); } - + ResourcePath resourcePath = (ResourcePath) leftTerm.getSymbol(); ChannelMember channelMember = new ChannelMember(resourcePath); StateTransition stateTransition = new StateTransition(); @@ -280,7 +252,7 @@ if (messageTerm.getSymbol().getSignature() == null && messageTerm.getChildren().size() > 0) { Type[] signature = new Type[messageTerm.getChildren().size() + 1]; int i = 1; - for (Expression e: messageTerm.getChildren()) { + for (Expression e : messageTerm.getChildren()) { if (e instanceof Variable && ((Variable) e).getType() != null) { signature[i] = ((Variable) e).getType(); } @@ -291,12 +263,12 @@ } return channelMember; } - + public Expression parseTerm(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { ArrayList expressions = new ArrayList<>(); ArrayList operators = new ArrayList<>(); String operator = null; - for (;;) { + for (; ; ) { String leftBracketOrMinusOrNeg = stream.next(); if (leftBracketOrMinusOrNeg.equals(LEFT_BRACKET)) { Expression exp = parseTerm(stream, model); @@ -317,7 +289,7 @@ Symbol minusOrNeg = null; String symbolName = null; if (leftBracketOrMinusOrNeg.equals(MINUS)) { - minusOrNeg = DataTransferModel.minus; // not sub + minusOrNeg = DataTransferModel.minus; // not sub symbolName = stream.next(); } else if (leftBracketOrMinusOrNeg.equals(NEG)) { minusOrNeg = DataTransferModel.neg; @@ -340,7 +312,7 @@ Term term = new Term(symbol); int arity = 0; do { - stream.next(); // LEFT_BRACKET or COMMA + stream.next(); // LEFT_BRACKET or COMMA if (stream.checkNext().equals(RIGHT_BRACKET)) break; arity++; Expression subTerm = parseTerm(stream, model); @@ -363,7 +335,7 @@ if (stream.checkNext() != null && stream.checkNext().equals(DOT)) { // Because tokens are separated by a DOT. stream.next(); - symbolName += DOT + stream.next(); // decimal fraction + symbolName += DOT + stream.next(); // decimal fraction } Double d = Double.parseDouble(symbolName); // a numerical value @@ -399,7 +371,7 @@ operators.add(DataTransferModel.mul); stream.next(); } else if (operator.equals(SUB)) { - operators.add(DataTransferModel.sub); // not minus + operators.add(DataTransferModel.sub); // not minus stream.next(); } else if (operator.equals(DIV)) { operators.add(DataTransferModel.div); @@ -435,7 +407,7 @@ // json accessor while (operator.equals(DOT)) { Expression exp = expressions.remove(expressions.size() - 1); - stream.next(); // DOT + stream.next(); // DOT if (stream.checkNext() == null) throw new WrongJsonExpression(stream.getLine()); String literalOrLeftCurlyBracket = stream.next(); Expression paramTerm = null; @@ -443,7 +415,8 @@ // parameter paramTerm = parseTerm(stream, model); String rightCurlyBracket = stream.next(); - if (rightCurlyBracket == null || !rightCurlyBracket.equals(RIGHT_CURLY_BRACKET)) throw new WrongJsonExpression(stream.getLine()); + if (rightCurlyBracket == null || !rightCurlyBracket.equals(RIGHT_CURLY_BRACKET)) + throw new WrongJsonExpression(stream.getLine()); } else { // literal paramTerm = new Constant(literalOrLeftCurlyBracket, DataTransferModel.typeString); @@ -486,7 +459,7 @@ operators.add(DataTransferModel.mul); stream.next(); } else if (operator.equals(SUB)) { - operators.add(DataTransferModel.sub); // not minus + operators.add(DataTransferModel.sub); // not minus stream.next(); } else if (operator.equals(DIV)) { operators.add(DataTransferModel.div); @@ -534,7 +507,7 @@ Expression first = expressions.get(0); int i = 1; Term rootTerm = null; - for (Symbol op: operators) { + for (Symbol op : operators) { Expression second = expressions.get(i); if (op.getName().equals(MUL) || op.getName().equals(DIV) || op.getName().equals(MOD)) { // higher priority than add and sub @@ -543,12 +516,12 @@ term.addChild(second); first = term; } else if (op.getName().equals(EQ) || op.getName().equals(NEQ) || op.getName().equals(GT) || op.getName().equals(LT) - || op.getName().equals(GE) || op.getName().equals(LE) || op.getName().equals(AND) || op.getName().equals(OR)) { + || op.getName().equals(GE) || op.getName().equals(LE) || op.getName().equals(AND) || op.getName().equals(OR)) { // lower priority than add and sub if (first != null) monomials.add(first); Expression firstMonomial = monomials.get(0); int j = 1; - for (Symbol op2: addSubs) { + for (Symbol op2 : addSubs) { Expression secondMonomial = monomials.get(j); Term term = new Term(op2); term.addChild(firstMonomial); @@ -579,7 +552,7 @@ if (first != null) monomials.add(first); Expression firstMonomial = monomials.get(0); i = 1; - for (Symbol op: addSubs) { + for (Symbol op : addSubs) { Expression secondMonomial = monomials.get(i); Term term = new Term(op); term.addChild(firstMonomial); @@ -619,12 +592,15 @@ private Expression parseJsonTerm(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { JsonTerm jsonTerm = new JsonTerm(); while (stream.checkNext() != null && !stream.checkNext().equals(RIGHT_CURLY_BRACKET)) { - if (stream.checkNext() == null || !stream.checkNext().equals(DOUBLE_QUOT)) throw new ExpectedDoubleQuotation(stream.getLine()); + if (stream.checkNext() == null || !stream.checkNext().equals(DOUBLE_QUOT)) + throw new ExpectedDoubleQuotation(stream.getLine()); String doubleQuot = stream.next(); String key = stream.next(); - if (stream.checkNext() == null || !stream.checkNext().equals(DOUBLE_QUOT)) throw new ExpectedDoubleQuotation(stream.getLine()); + if (stream.checkNext() == null || !stream.checkNext().equals(DOUBLE_QUOT)) + throw new ExpectedDoubleQuotation(stream.getLine()); doubleQuot = stream.next(); - if (stream.checkNext() == null || !stream.checkNext().equals(COLON)) throw new ExpectedColon(stream.getLine()); + if (stream.checkNext() == null || !stream.checkNext().equals(COLON)) + throw new ExpectedColon(stream.getLine()); String colon = stream.next(); Expression value = parseTerm(stream, model); jsonTerm.addMember(key, value); @@ -633,7 +609,7 @@ } return jsonTerm; } - + private Expression parseListTerm(TokenStream stream2, DataTransferModel model) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { ListTerm listTerm = new ListTerm(); listTerm.setType(DataTransferModel.typeList); @@ -645,7 +621,7 @@ } return listTerm; } - + public Variable parseVariable(TokenStream stream, DataTransferModel model, String symbolName) { Variable var; if (stream.checkNext() != null && stream.checkNext().equals(COLON)) { @@ -656,20 +632,20 @@ if (type == null) { type = new Type(typeName, typeName); } - var = new Variable(symbolName, type); + var = new Variable(symbolName, type); } else { var = new Variable(symbolName); } return var; } - public StateTransitionTerm parseStateTransitionTerm(TokenStream stream, DataTransferModel model) + public StateTransitionTerm parseStateTransitionTerm(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { ResourcePath resourcePath = parseResourcePath(stream, model); StateTransitionTerm term = new StateTransitionTerm(resourcePath); int arity = 0; do { - stream.next(); // LEFT_BRACKET or COMMA + stream.next(); // LEFT_BRACKET or COMMA arity++; Expression subTerm = parseTerm(stream, model); term.addChild(subTerm, true); @@ -681,7 +657,7 @@ return term; } - public ResourceHierarchy parseResourceHierarchy(TokenStream stream, DataTransferModel model) + public ResourceHierarchy parseResourceHierarchy(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression { ResourceHierarchy hierarchy = null; do { @@ -689,7 +665,8 @@ if (literalOrLeftCurlyBracket.equals(LEFT_CURLY_BRACKET)) { // No path parameter String rightCurlyBracket = stream.next(); - if (rightCurlyBracket == null || !rightCurlyBracket.equals(RIGHT_CURLY_BRACKET)) throw new ExpectedRightCurlyBracket(stream.getLine()); + if (rightCurlyBracket == null || !rightCurlyBracket.equals(RIGHT_CURLY_BRACKET)) + throw new ExpectedRightCurlyBracket(stream.getLine()); hierarchy = new ResourceHierarchy(hierarchy, 1); } else { // Path literal @@ -703,7 +680,7 @@ return hierarchy; } - public ResourcePath parseResourcePath(TokenStream stream, DataTransferModel model) + public ResourcePath parseResourcePath(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { ResourcePath path = null; do { @@ -720,7 +697,8 @@ rightCurlyBracket = stream.next(); if (rightCurlyBracket == null) throw new ExpectedRightCurlyBracket(stream.getLine()); } - if (!rightCurlyBracket.equals(RIGHT_CURLY_BRACKET)) throw new ExpectedRightCurlyBracket(stream.getLine()); + if (!rightCurlyBracket.equals(RIGHT_CURLY_BRACKET)) + throw new ExpectedRightCurlyBracket(stream.getLine()); if (paramConstraint == null) { path = new ResourcePath(path, paramTerm); } else { @@ -729,7 +707,7 @@ } else { // Path literal if (path == null) { - path = new ResourcePath(literalOrLeftCurlyBracket); + path = new ResourcePath(literalOrLeftCurlyBracket); } else { path = new ResourcePath(path, literalOrLeftCurlyBracket); } @@ -740,24 +718,24 @@ model.addResourcePath(path); return path; } - + protected Boolean doesMatchToKeyword(final String token, final String specificTokenName) { - if(token == null) return false; - if(specificTokenName == null) return false; + if (token == null) return false; + if (specificTokenName == null) return false; return token.equals(specificTokenName); } - + public static class TokenStream { private ArrayList> tokens = new ArrayList<>(); private ArrayList lines = new ArrayList<>(); private int line = 0; private int n = 0; - + public TokenStream() { line = 0; n = 0; } - + public void addLine(String line) { lines.add(line); line = line.trim(); @@ -791,13 +769,13 @@ private ArrayList splitBy(final List tokens, final String delimiter, final String delimiterRegx) { ArrayList newTokens = new ArrayList<>(); - for (Token token: tokens) { + for (Token token : tokens) { if (token.isAtomic()) { newTokens.add(token); } else { String[] splitTokens = token.split(delimiterRegx); boolean fFirstToken = true; - for (String t: splitTokens) { + for (String t : splitTokens) { if (!fFirstToken) { newTokens.add(new Token(delimiter, true)); } @@ -826,7 +804,7 @@ } if (!fFirstToken || token.length() > 0) { if (i % 2 == 0) { - for (String t: token.split("[ \t]")) { + for (String t : token.split("[ \t]")) { newTokens.add(new Token(t)); } } else { @@ -841,7 +819,7 @@ } return newTokens; } - + public String next() { if (line >= tokens.size()) return null; while (n >= tokens.get(line).size()) { @@ -853,7 +831,7 @@ n++; return token; } - + public String checkNext() { if (line >= tokens.size()) return null; while (n >= tokens.get(line).size()) { @@ -863,7 +841,7 @@ } return tokens.get(line).get(n).getTokenStr(); } - + public boolean hasNext() { if (line >= tokens.size()) return false; while (n >= tokens.get(line).size()) { @@ -873,11 +851,11 @@ } return true; } - + public int getLine() { return line; } - + public String getSourceText(int from, int to) { String text = ""; for (int l = from; l <= to; l++) { @@ -894,7 +872,7 @@ public Token(String token) { this.token = token; } - + public Token(String token, boolean isAtomic) { this.token = token; this.isAtomic = isAtomic; @@ -911,15 +889,15 @@ public String[] split(String delimiterRegx) { return token.split(delimiterRegx); } - + public boolean endsWith(String delimiter) { return token.endsWith(delimiter); } - + public int length() { return token.length(); } - + public Token substring(int beginIdx, int endIdx) { return new Token(token.substring(beginIdx, endIdx)); } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/ParserDTRAM.java b/AlgebraicDataflowArchitectureModel/src/parser/ParserDTRAM.java index 2ea990b..d4f7efa 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/ParserDTRAM.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/ParserDTRAM.java @@ -1,8 +1,5 @@ package parser; -import java.io.BufferedReader; -import java.io.IOException; - import application.editor.Stage; import com.mxgraph.model.mxCell; import com.mxgraph.model.mxGeometry; @@ -10,33 +7,13 @@ import com.mxgraph.view.mxCellState; import com.mxgraph.view.mxGraph; import com.mxgraph.view.mxGraphView; - import models.dataFlowModel.DataTransferModel; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedFormulaChannel; -import parser.exceptions.ExpectedGeometry; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedIoChannel; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedModel; -import parser.exceptions.ExpectedNode; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedResource; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; +import parser.exceptions.*; + +import java.io.BufferedReader; public class ParserDTRAM extends Parser { - + private static final String MODEL_GROUP = "model"; private static final String GEOMETRY_GROUP = "geometry"; private static final String GEOMETORY_NODE = "node"; @@ -44,159 +21,168 @@ private static final String CHANNEL_NODE = "c"; private static final String FORMULA_CHANNEL_NODE = "fc"; private static final String IO_CHANNEL_NODE = "ioc"; - - /**-------------------------------------------------------------------------------- + + /** + * -------------------------------------------------------------------------------- * [Constructor] - /**-------------------------------------------------------------------------------- - * + * /**-------------------------------------------------------------------------------- + * * @param stream */ public ParserDTRAM(final TokenStream stream) { super(stream); } - /**-------------------------------------------------------------------------------- - * + + /** + * -------------------------------------------------------------------------------- + * * @param reader */ public ParserDTRAM(final BufferedReader reader) { super(reader); } - - /**-------------------------------------------------------------------------------- + + /** + * -------------------------------------------------------------------------------- * [public] - /**-------------------------------------------------------------------------------- - * + * /**-------------------------------------------------------------------------------- + * * @param reader - * @throws WrongJsonExpression - * @throws ExpectedColon - * @throws ExpectedDoubleQuotation + * @throws WrongJsonExpression + * @throws ExpectedColon + * @throws ExpectedDoubleQuotation */ - public DataTransferModel doParseModel() + public DataTransferModel doParseModel() throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { DataTransferModel model = getParsedModel(); return model; } - - /**-------------------------------------------------------------------------------- - * + + /** + * -------------------------------------------------------------------------------- + * * @param graph */ - public void doParseGeometry(mxGraph graph) - throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedNode, ExpectedResource, ExpectedFormulaChannel, ExpectedIoChannel{ - + public void doParseGeometry(mxGraph graph) + throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedNode, ExpectedResource, ExpectedFormulaChannel, ExpectedIoChannel { + parseGeometry(graph); } - - /**-------------------------------------------------------------------------------- + + /** + * -------------------------------------------------------------------------------- * [private] - /**-------------------------------------------------------------------------------- - * + * /**-------------------------------------------------------------------------------- + * * @param stream - * @throws WrongJsonExpression - * @throws ExpectedColon - * @throws ExpectedDoubleQuotation + * @throws WrongJsonExpression + * @throws ExpectedColon + * @throws ExpectedDoubleQuotation */ private DataTransferModel getParsedModel() - throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { - + throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + if (!stream.hasNext()) throw new NullPointerException(); - + String modelKeyword = stream.next(); if (!modelKeyword.equals(MODEL_GROUP)) throw new ExpectedModel(stream.getLine()); if (!stream.hasNext()) throw new ExpectedModel(stream.getLine()); - + String leftBracket = stream.next(); if (!leftBracket.equals(LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine()); - + DataTransferModel model = parseDataFlowModel(); - + String rightBracket = stream.next(); - if(!rightBracket.equals(RIGHT_CURLY_BRACKET))throw new ExpectedRightBracket(stream.getLine()); - + if (!rightBracket.equals(RIGHT_CURLY_BRACKET)) throw new ExpectedRightBracket(stream.getLine()); + return model; } - - /**-------------------------------------------------------------------------------- - * change graph's geometries from "DTRAM" file. + + /** + * -------------------------------------------------------------------------------- + * change graph's geometries from "DTRAM" file. + * * @param stream * @param graph */ private void parseGeometry(mxGraph graph) - throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment,ExpectedModel, ExpectedGeometry, ExpectedNode, ExpectedResource, ExpectedFormulaChannel, ExpectedIoChannel { - + throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedNode, ExpectedResource, ExpectedFormulaChannel, ExpectedIoChannel { + if (!doesMatchToKeyword(stream.next(), GEOMETRY_GROUP)) throw new ExpectedGeometry(stream.getLine()); - - if (!doesMatchToKeyword(stream.next(), LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine()); - + + if (!doesMatchToKeyword(stream.next(), LEFT_CURLY_BRACKET)) + throw new ExpectedLeftCurlyBracket(stream.getLine()); + String node = stream.next(); while (node.equals(GEOMETORY_NODE)) { - + String rOrFcOrIocOrC = stream.next(); if (!rOrFcOrIocOrC.equals(RESOURCE_NODE) && !rOrFcOrIocOrC.equals(FORMULA_CHANNEL_NODE) && !rOrFcOrIocOrC.equals(CHANNEL_NODE) && !rOrFcOrIocOrC.equals(IO_CHANNEL_NODE)) throw new ExpectedNode(stream.getLine()); - + String name = stream.next(); - + if (!doesMatchToKeyword(stream.next(), COLON)) throw new ExpectedAssignment(stream.getLine()); - + String x = stream.next(); int xC = Integer.parseInt(x); // C = Coordinate(x,y,w,h) - - if (!doesMatchToKeyword(stream.next(), COMMA))throw new ExpectedAssignment(stream.getLine()); - + + if (!doesMatchToKeyword(stream.next(), COMMA)) throw new ExpectedAssignment(stream.getLine()); + String y = stream.next(); int yC = Integer.parseInt(y); - - if (!doesMatchToKeyword(stream.next(), COMMA))throw new ExpectedAssignment(stream.getLine()); - + + if (!doesMatchToKeyword(stream.next(), COMMA)) throw new ExpectedAssignment(stream.getLine()); + String w = stream.next(); int wC = Integer.parseInt(w); - - if (!doesMatchToKeyword(stream.next(), COMMA))throw new ExpectedAssignment(stream.getLine()); - + + if (!doesMatchToKeyword(stream.next(), COMMA)) throw new ExpectedAssignment(stream.getLine()); + String h = stream.next(); int hC = Integer.parseInt(h); - + Object root = graph.getDefaultParent(); mxCell nodeLayer = (mxCell) ((mxCell) root).getChildAt(Stage.NODE_LAYER); mxCell dataFlowLayer = (mxCell) ((mxCell) root).getChildAt(Stage.DATA_FLOW_LAYER); mxIGraphModel graphModel = graph.getModel(); for (int i = 0; i < graph.getModel().getChildCount(nodeLayer); i++) { - + Object cell = graph.getModel().getChildAt(nodeLayer, i); if (!graph.getModel().isVertex(cell)) continue; - + mxGeometry geom = (mxGeometry) ((mxCell) cell).getGeometry().clone(); mxGraphView view = graph.getView(); mxCellState state = view.getState(cell); - + if (!name.equals(state.getLabel())) continue; - + geom.setX(xC); geom.setY(yC); graphModel.setGeometry(cell, geom); } for (int i = 0; i < graph.getModel().getChildCount(dataFlowLayer); i++) { - + Object cell = graph.getModel().getChildAt(dataFlowLayer, i); if (!graph.getModel().isVertex(cell)) continue; - + mxGeometry geom = (mxGeometry) ((mxCell) cell).getGeometry().clone(); mxGraphView view = graph.getView(); mxCellState state = view.getState(cell); - + if (!name.equals(state.getLabel())) continue; - + geom.setX(xC); geom.setY(yC); graphModel.setGeometry(cell, geom); } node = stream.next(); } - + if (!node.equals(RIGHT_CURLY_BRACKET)) throw new ExpectedRightBracket(stream.getLine()); } } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedAssignment.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedAssignment.java index 90a6c3e..07dd16c 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedAssignment.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedAssignment.java @@ -1,7 +1,7 @@ package parser.exceptions; public class ExpectedAssignment extends ParseException { - + public ExpectedAssignment(int line) { super(line); } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedChannel.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedChannel.java index 385248a..f9ba6c5 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedChannel.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedChannel.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedChannel extends ParseException { - + public ExpectedChannel(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedChannelName.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedChannelName.java index 72d0336..d12043f 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedChannelName.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedChannelName.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedChannelName extends ParseException { - + public ExpectedChannelName(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedColon.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedColon.java index 426aaf1..f6753f2 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedColon.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedColon.java @@ -1,7 +1,7 @@ package parser.exceptions; public class ExpectedColon extends ParseException { - + public ExpectedColon(int line) { super(line); } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedEquals.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedEquals.java index ed322d8..c19d9d1 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedEquals.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedEquals.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedEquals extends ParseException { - + public ExpectedEquals(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedFormulaChannel.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedFormulaChannel.java index e1e9f2b..415e2e6 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedFormulaChannel.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedFormulaChannel.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedFormulaChannel extends ParseException { - + public ExpectedFormulaChannel(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedGeometry.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedGeometry.java index 1521507..e82f993 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedGeometry.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedGeometry.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedGeometry extends ParseException { - + public ExpectedGeometry(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedInOrOutOrRefOrSubKeyword.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedInOrOutOrRefOrSubKeyword.java index 8d99767..1e8da66 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedInOrOutOrRefOrSubKeyword.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedInOrOutOrRefOrSubKeyword.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedInOrOutOrRefOrSubKeyword extends ParseException { - + public ExpectedInOrOutOrRefOrSubKeyword(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedIoChannel.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedIoChannel.java index fba4cc7..62fac8f 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedIoChannel.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedIoChannel.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedIoChannel extends ParseException { - + public ExpectedIoChannel(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedLeftCurlyBracket.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedLeftCurlyBracket.java index 30f92b0..94c49a0 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedLeftCurlyBracket.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedLeftCurlyBracket.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedLeftCurlyBracket extends ParseException { - + public ExpectedLeftCurlyBracket(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedModel.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedModel.java index 222522a..16a5b88 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedModel.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedModel.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedModel extends ParseException { - + public ExpectedModel(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedNode.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedNode.java index b3af50c..dfc3c61 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedNode.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedNode.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedNode extends ParseException { - + public ExpectedNode(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRHSExpression.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRHSExpression.java index 994bf77..e8939a8 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRHSExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRHSExpression.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedRHSExpression extends ParseException { - + public ExpectedRHSExpression(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedResource.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedResource.java index dd5f00a..7465413 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedResource.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedResource.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedResource extends ParseException { - + public ExpectedResource(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRightBracket.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRightBracket.java index 627c57b..41b8a62 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRightBracket.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRightBracket.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedRightBracket extends ParseException { - + public ExpectedRightBracket(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRightCurlyBracket.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRightCurlyBracket.java index df87cb3..26dd9bf 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRightCurlyBracket.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedRightCurlyBracket.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedRightCurlyBracket extends ParseException { - + public ExpectedRightCurlyBracket(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedStateTransition.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedStateTransition.java index 02d27b4..0c0adc8 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedStateTransition.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/ExpectedStateTransition.java @@ -1,9 +1,9 @@ package parser.exceptions; public class ExpectedStateTransition extends ParseException { - + public ExpectedStateTransition(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongJsonExpression.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongJsonExpression.java index 6a84d6f..8637624 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongJsonExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongJsonExpression.java @@ -1,9 +1,9 @@ package parser.exceptions; public class WrongJsonExpression extends ParseException { - + public WrongJsonExpression(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongLHSExpression.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongLHSExpression.java index 0ed087a..289a610 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongLHSExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongLHSExpression.java @@ -1,9 +1,9 @@ package parser.exceptions; public class WrongLHSExpression extends ParseException { - + public WrongLHSExpression(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongPathExpression.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongPathExpression.java index 7f580a5..7436430 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongPathExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongPathExpression.java @@ -1,9 +1,9 @@ package parser.exceptions; public class WrongPathExpression extends ParseException { - + public WrongPathExpression(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongRHSExpression.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongRHSExpression.java index 0a82a6c..f97c49b 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongRHSExpression.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/WrongRHSExpression.java @@ -1,9 +1,9 @@ package parser.exceptions; public class WrongRHSExpression extends ParseException { - + public WrongRHSExpression(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedBaseURL.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedBaseURL.java index 1136029..a091095 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedBaseURL.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedBaseURL.java @@ -2,7 +2,7 @@ import parser.exceptions.ParseException; -public class ExpectedBaseURL extends ParseException{ +public class ExpectedBaseURL extends ParseException { public ExpectedBaseURL(int line) { super(line); diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedResources.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedResources.java index ec01cf1..45229eb 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedResources.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedResources.java @@ -2,7 +2,7 @@ import parser.exceptions.ParseException; -public class ExpectedResources extends ParseException{ +public class ExpectedResources extends ParseException { public ExpectedResources(int line) { super(line); diff --git a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedWebService.java b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedWebService.java index 29e8557..91d8ab9 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedWebService.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/exceptions/webService/ExpectedWebService.java @@ -2,10 +2,10 @@ import parser.exceptions.ParseException; -public class ExpectedWebService extends ParseException{ +public class ExpectedWebService extends ParseException { public ExpectedWebService(int line) { super(line); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java b/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java index 4178d73..cb50a86 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java @@ -1,18 +1,17 @@ package simulator; -import java.util.Map; +import models.algebra.Constant; +import models.algebra.Expression; +import models.dataFlowModel.DataTransferChannel; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.DataTransferChannel; +import java.util.Map; /** * State of a channel, which represents the map from the values of the depended channel selectors to those of the depending channel selectors - * + * * @author Nitta * */ @@ -23,11 +22,11 @@ public ChannelState(DataTransferChannel channel) { this.channel = channel; } - + public DataTransferChannel getChannel() { return channel; } - + public Map getDependingParamAndValues(List channelValues) { if (referenceStructure == null) { return new HashMap<>(); @@ -53,10 +52,10 @@ /** * Add a value of a depending channel selector - * - * @param channelValues the values of depended channel selectors + * + * @param channelValues the values of depended channel selectors * @param dependingVariable a depending channel selector - * @param itsValue its new value + * @param itsValue its new value */ public void addDependingParamAndValue(List channelValues, Expression dependingVariable, Expression itsValue) { if (referenceStructure == null) { @@ -67,7 +66,8 @@ public Object clone() { ChannelState newChannelState = new ChannelState(channel); - if (referenceStructure != null) newChannelState.referenceStructure = (ReferenceStructure) referenceStructure.clone(); + if (referenceStructure != null) + newChannelState.referenceStructure = (ReferenceStructure) referenceStructure.clone(); return newChannelState; } @@ -81,7 +81,7 @@ public Map getDependingParamAndValues(List channelValues) { ReferenceStructure subStructure = this; - for (Constant chVal: channelValues) { + for (Constant chVal : channelValues) { if (subStructure.getDependentParamAndValues() == null) { subStructure = subStructure.getReferenceStructure(chVal); } else { @@ -95,7 +95,7 @@ List> channelValuesList = new ArrayList<>(); if (dependingParamAndValues != null) { boolean doesMatch = true; - for (Expression dependingVariable: dependingVarToVal.keySet()) { + for (Expression dependingVariable : dependingVarToVal.keySet()) { if (dependingParamAndValues.keySet().contains(dependingVariable)) { if (!dependingParamAndValues.get(dependingVariable).equals(dependingVarToVal.get(dependingVariable))) { doesMatch = false; @@ -110,10 +110,10 @@ return null; } } else { - for (Constant chVal: referenceStructure.keySet()) { + for (Constant chVal : referenceStructure.keySet()) { List> chValsList = referenceStructure.get(chVal).getDependedChannelSelectorValues(dependingVarToVal); if (chValsList != null) { - for (List chVals: chValsList) { + for (List chVals : chValsList) { chVals.add(0, chVal); channelValuesList.add(chVals); } @@ -132,7 +132,7 @@ public void addDependingParamAndValue(List channelValues, Expression dependingVariable, Expression itsValue) { ReferenceStructure subStructure = this; - for (Constant chVal: channelValues) { + for (Constant chVal : channelValues) { if (subStructure.referenceStructure == null) { subStructure.referenceStructure = new HashMap<>(); } @@ -157,7 +157,7 @@ } if (referenceStructure != null) { newReferenceStructure.referenceStructure = new HashMap<>(); - for (Map.Entry refEnt: referenceStructure.entrySet()) { + for (Map.Entry refEnt : referenceStructure.entrySet()) { newReferenceStructure.referenceStructure.put(refEnt.getKey(), (ReferenceStructure) refEnt.getValue().clone()); } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Event.java b/AlgebraicDataflowArchitectureModel/src/simulator/Event.java index 9cc7e6a..79ef282 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Event.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Event.java @@ -1,20 +1,6 @@ package simulator; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.Position; -import models.algebra.Term; -import models.algebra.UnificationFailed; -import models.algebra.Variable; +import models.algebra.*; import models.dataConstraintModel.Channel; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.ResourcePath; @@ -23,9 +9,11 @@ import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; +import java.util.*; + /** - * Event occurred at a channel - * + * Event occurred at a channel + * * @author Nitta * */ @@ -45,10 +33,10 @@ /** * Constructor for an input event channel - * - * @param channel an input event channel - * @param message an message for the channel - * @param outputResPath an output side resource path of the channel + * + * @param channel an input event channel + * @param message an message for the channel + * @param outputResPath an output side resource path of the channel * @param outputResource an output side resource of the channel */ public Event(DataTransferChannel channel, Expression message, ResourcePath outputResPath, Resource outputResource) { @@ -60,7 +48,7 @@ // Extract the values of the channel selectors from the output resource. List channelSelectors = channel.getAllSelectors(); - for (Selector sel: channelSelectors) { + for (Selector sel : channelSelectors) { Map.Entry> paramIdxAndPos = channelSelectorToOutputResourcePathParam.get(sel).get(outputResPath); Resource ancestor = outputResource; int idx = outputResPath.getPathParams().size(); @@ -71,15 +59,16 @@ } ancestor = ancestor.getParent(); } - if (ancestor!= null) channelSelectorAndValues.add(new AbstractMap.SimpleEntry<>(sel, ancestor.getParameter())); + if (ancestor != null) + channelSelectorAndValues.add(new AbstractMap.SimpleEntry<>(sel, ancestor.getParameter())); } } /** * Constructor for a non-event channel - * - * @param channel a non-event channel - * @param inputResPath an input side resource path of the channel + * + * @param channel a non-event channel + * @param inputResPath an input side resource path of the channel * @param inputResource an input side resource of the channel */ public Event(DataTransferChannel channel, ResourcePath inputResPath, Resource inputResource) { @@ -88,10 +77,10 @@ this.inputResourcePath = inputResPath; this.inputResource = inputResource; connectChannelSelectorAndPathParameters(); - + // Extract the values of the channel selectors from the input resource. List channelSelectors = channel.getAllSelectors(); - for (Selector sel: channelSelectors) { + for (Selector sel : channelSelectors) { if (inputResPath != null) { Map.Entry> paramIdxAndPos = channelSelectorToInputOrReferenceResourcePathParam.get(sel).get(inputResPath); if (paramIdxAndPos != null) { @@ -112,12 +101,12 @@ /** * Constructor for a non-event channel - * - * @param channel a non-event channel - * @param inputResPath an input side resource path of the channel - * @param inputResource an input side resource of the channel + * + * @param channel a non-event channel + * @param inputResPath an input side resource path of the channel + * @param inputResource an input side resource of the channel * @param channelSelectorValues the values of depended channel selectors - * @param dependingVarToVal the values of depending channel selectors + * @param dependingVarToVal the values of depending channel selectors */ public Event(DataTransferChannel channel, ResourcePath inputResPath, Resource inputResource, List channelSelectorValues, Map dependingVarToVal) { this.channel = channel; @@ -125,7 +114,7 @@ this.inputResourcePath = inputResPath; this.inputResource = inputResource; connectChannelSelectorAndPathParameters(); - + // Extract the values of the channel selectors from channelSelectorValues. List channelSelectors = channel.getAllSelectors(); for (int i = 0; i < channelSelectors.size(); i++) { @@ -134,17 +123,17 @@ } this.dependingParameters = dependingVarToVal; } - + private void connectChannelSelectorAndPathParameters() { List channelSelectors = channel.getAllSelectors(); - for (Selector sel: channelSelectors) { + for (Selector sel : channelSelectors) { Set inputAndReferenceResPaths = new HashSet<>(channel.getInputResources()); inputAndReferenceResPaths.addAll(channel.getReferenceResources()); - for (ResourcePath resPath: inputAndReferenceResPaths) { + for (ResourcePath resPath : inputAndReferenceResPaths) { for (int paramIdx = 0; paramIdx < resPath.getPathParams().size(); paramIdx++) { Expression pathParam = resPath.getPathParams().get(paramIdx); if (pathParam.contains(sel.getExpression())) { - for (Map.Entry posAndVar: pathParam.getVariables().entrySet()) { + for (Map.Entry posAndVar : pathParam.getVariables().entrySet()) { Position p = posAndVar.getKey(); Variable v = posAndVar.getValue(); if (v.equals(sel.getExpression())) { @@ -164,11 +153,11 @@ } } } - for (ResourcePath resPath: channel.getOutputResources()) { + for (ResourcePath resPath : channel.getOutputResources()) { for (int paramIdx = 0; paramIdx < resPath.getPathParams().size(); paramIdx++) { Expression pathParam = resPath.getPathParams().get(paramIdx); if (pathParam.contains(sel.getExpression())) { - for (Map.Entry posAndVar: pathParam.getVariables().entrySet()) { + for (Map.Entry posAndVar : pathParam.getVariables().entrySet()) { Position p = posAndVar.getKey(); Variable v = posAndVar.getValue(); if (v.equals(sel.getExpression())) { @@ -194,7 +183,7 @@ public DataTransferChannel getChannel() { return channel; } - + public Expression getMessage() { return message; } @@ -202,18 +191,18 @@ public void setMessage(Expression message) { this.message = message; } - + public boolean isInput() { return isInput; } - + public List> getChannelSelectorAndValues() { return channelSelectorAndValues; } - + public List getChannelSelectorValues() { List channelValues = new ArrayList<>(); - for (Map.Entry chEnt: channelSelectorAndValues) { + for (Map.Entry chEnt : channelSelectorAndValues) { channelValues.add(chEnt.getValue()); } return channelValues; @@ -240,12 +229,12 @@ /** * Construct channel message, collect descendant events of this event and update the values of the depending channel selectors - * + * * @param resourceStateValueProvider a resourceStateValueProvider to provide current and next resource states * @return calculated message constraint by this event */ public Expression constructMessageAndDescendantEvents(IResourceStateValueProvider resourceStateValueProvider, boolean doesUpdateDependingParameters) { - + try { Map> substitutedPositionsInMessageFromChannels = new HashMap<>(); return constructMessageAndDesdendantEvents(resourceStateValueProvider, substitutedPositionsInMessageFromChannels, doesUpdateDependingParameters); @@ -254,9 +243,9 @@ } return null; } - - private Expression constructMessageAndDesdendantEvents(IResourceStateValueProvider resourceStateValueProvider, - Map> substitutedPositionsInMessageFromChannels, boolean doesUpdateDependingParameters) + + private Expression constructMessageAndDesdendantEvents(IResourceStateValueProvider resourceStateValueProvider, + Map> substitutedPositionsInMessageFromChannels, boolean doesUpdateDependingParameters) throws InvalidMessage, ResolvingMultipleDefinitionIsFutureWork, UnificationFailed { Expression unifiedMessage = null; Expression messageConstraint = null; @@ -269,13 +258,13 @@ ResourceIdentifier resId = getInputResourceIdentifier(target.getResource()); return resourceStateValueProvider.getCurrentStateValueOf(resId); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourceIdentifier resId = getInputResourceIdentifier(target.getResource()); return resourceStateValueProvider.getNextStateValueOf(resId); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath target, ResourcePath from) { ResourceIdentifier resId = getInputResourceIdentifier(target); @@ -287,7 +276,7 @@ Map> dependency = channel.getMemberDependency(); if (dependency.size() == 0) { // No channel member dependency. - for (ChannelMember channelMember: channel.getInputChannelMembers()) { + for (ChannelMember channelMember : channel.getInputChannelMembers()) { // Calculate message constraint from an input state transition messageConstraint = channel.calcMessageConstraintForInputMember(channelMember, null, resouceStateAccessor, null, substitutedPositionsInMessageFromChannels); if (unifiedMessage == null) { @@ -299,7 +288,7 @@ } } } - for (ChannelMember channelMember: channel.getReferenceChannelMembers()) { + for (ChannelMember channelMember : channel.getReferenceChannelMembers()) { // Calculate message constraint from a reference state transition messageConstraint = channel.calcMessageConstraintForReferenceMember(channelMember, null, resouceStateAccessor, null, substitutedPositionsInMessageFromChannels); if (unifiedMessage == null) { @@ -314,16 +303,16 @@ } else { Set toResolve = new HashSet<>(); Set resolved = new HashSet<>(); - for (Set depended: dependency.values()) { + for (Set depended : dependency.values()) { toResolve.addAll(depended); } - for (ChannelMember depending: dependency.keySet()) { + for (ChannelMember depending : dependency.keySet()) { toResolve.remove(depending); } if ((messageConstraint = getMessage()) instanceof Term) { unifiedMessage = messageConstraint; } - for (ChannelMember leafMember: toResolve) { + for (ChannelMember leafMember : toResolve) { if (channel.getInputChannelMembers().contains(leafMember)) { // Calculate message constraint from an input state transition messageConstraint = channel.calcMessageConstraintForInputMember(leafMember, null, resouceStateAccessor, null, substitutedPositionsInMessageFromChannels); @@ -344,9 +333,9 @@ toResolve.clear(); // 2. Calculate message constraints from remaining members on the channel member dependency graph. - for (;;) { + for (; ; ) { // Identify the channel members to resolve next. - for (Map.Entry> dependEnt: dependency.entrySet()) { + for (Map.Entry> dependEnt : dependency.entrySet()) { ChannelMember dependingMem = dependEnt.getKey(); Set dependedMems = dependEnt.getValue(); if (!resolved.contains(dependingMem) && resolved.containsAll(dependedMems)) { @@ -354,7 +343,7 @@ } } if (toResolve.size() == 0) break; - for (ChannelMember dependingMem: toResolve) { + for (ChannelMember dependingMem : toResolve) { // Fill the path parameters of the resource path of a depending channel member. if (doesUpdateDependingParameters) { Set dependingVarPosInMessage = new HashSet<>(); @@ -366,7 +355,7 @@ Expression constraint = unfilledResPath.getPathParamsAndConstraints().get(i).getValue(); if (constraint != null && !constraint.equals(val)) { // The value of the path parameter does not satisfy the constraint defined for the parameter. - return null; // Not to fire this event. + return null; // Not to fire this event. } if (!channel.getAllSelectorVariables().contains(var)) { // Update a depending channel parameter @@ -396,7 +385,7 @@ toResolve.clear(); } // For the channel members that are depended by and depend on no other member. - for (ChannelMember remainingMem: channel.getChannelMembers()) { + for (ChannelMember remainingMem : channel.getChannelMembers()) { if (!resolved.contains(remainingMem)) { resolved.add(remainingMem); // Calculate message constraint @@ -430,12 +419,12 @@ baseResource = baseResource.getParent(); } Expression parentEventMessage = (Expression) unifiedMessage.clone(); - for (Channel childChannel: channel.getChildren()) { + for (Channel childChannel : channel.getChildren()) { // Search the deepest input or reference side resource path in each child channel that matches the channel parameters. ChannelMember inOrRef = null; Set channelMembers = new HashSet<>(((DataTransferChannel) childChannel).getInputChannelMembers()); channelMembers.addAll(((DataTransferChannel) childChannel).getReferenceChannelMembers()); - for (ChannelMember cm: channelMembers) { + for (ChannelMember cm : channelMembers) { if (!cm.isOutside()) { ResourcePath resPath = cm.getResource(); if (resPath.getPathParams().containsAll(childChannel.getAllSelectorVariables())) { @@ -446,7 +435,7 @@ } if (inOrRef != null) { // Collect events for all resources under this event's input resource that matches the deepest input side resource path. - for (Resource res: baseResource.getDescendants(inOrRef.getResource().getResourceHierarchy())) { + for (Resource res : baseResource.getDescendants(inOrRef.getResource().getResourceHierarchy())) { Event childEvent = new Event((DataTransferChannel) childChannel, inOrRef.getResource(), res); childEvent.setMessage(parentEventMessage); messageConstraint = childEvent.constructMessageAndDesdendantEvents(resourceStateValueProvider, substitutedPositionsInMessageFromChannels, true); @@ -466,7 +455,7 @@ } else { // Search the deepest output side resource path in each child channel that matches the channel parameters. ChannelMember out = null; - for (ChannelMember cm: ((DataTransferChannel) childChannel).getOutputChannelMembers()) { + for (ChannelMember cm : ((DataTransferChannel) childChannel).getOutputChannelMembers()) { if (!cm.isOutside()) { ResourcePath resPath = cm.getResource(); if (resPath.getPathParams().containsAll(childChannel.getAllSelectorVariables())) { @@ -477,7 +466,7 @@ } if (out != null) { // Collect events for all resources under this event's input resource that matches the deepest output side resource path. - for (Resource res: baseResource.getDescendants(out.getResource().getResourceHierarchy())) { + for (Resource res : baseResource.getDescendants(out.getResource().getResourceHierarchy())) { Event childEvent = new Event((DataTransferChannel) childChannel, parentEventMessage, out.getResource(), res); childEvent.constructMessageAndDesdendantEvents(resourceStateValueProvider, substitutedPositionsInMessageFromChannels, true); childEvents.add(childEvent); @@ -492,22 +481,22 @@ public void updateDependingParameter(Expression variable, Expression value) { dependingParameters.put(variable, value); } - + public ResourcePath getInputResourcePath() { return inputResourcePath; } - + public Resource getInputResource() { return inputResource; } - + public Set getOutputResources() { return outputResources; } public ResourceIdentifier getResourceIdentifier(ResourcePath resPath) { ResourceIdentifier resId = ResourceIdentifier.createFrom(resPath); - for (Map.Entry chParamEnt: channelSelectorAndValues) { + for (Map.Entry chParamEnt : channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); Map>> inputPathToIdxAndPos = channelSelectorToInputOrReferenceResourcePathParam.get(sel); if (inputPathToIdxAndPos != null) { @@ -523,7 +512,7 @@ } } } - for (Map.Entry chParamEnt: channelSelectorAndValues) { + for (Map.Entry chParamEnt : channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); Map>> outputPathToIdxAndPos = channelSelectorToOutputResourcePathParam.get(sel); if (outputPathToIdxAndPos != null) { @@ -539,13 +528,13 @@ } } } - for (Expression var: dependingParameters.keySet()) { + for (Expression var : dependingParameters.keySet()) { int paramIdx = resId.getPathParams().indexOf(var); if (paramIdx >= 0) { resId.setPathParam(paramIdx, (Constant) dependingParameters.get(var)); } } - for (Map.Entry chParamEnt: channelSelectorAndValues) { + for (Map.Entry chParamEnt : channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); Map>> inputPathToIdxAndPos = channelSelectorToInputOrReferenceResourcePathParam.get(sel); if (inputPathToIdxAndPos != null) { @@ -562,13 +551,13 @@ } } } - for (Map.Entry chParamEnt: channelSelectorAndValues) { + for (Map.Entry chParamEnt : channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); Map>> outputPathToIdxAndPos = channelSelectorToOutputResourcePathParam.get(sel); if (outputPathToIdxAndPos != null) { Map.Entry> pathParamEnt = outputPathToIdxAndPos.get(resPath); if (pathParamEnt != null) { - Integer paramIdx = pathParamEnt.getKey(); + Integer paramIdx = pathParamEnt.getKey(); if (paramIdx != null) { Expression pathParamExp = resId.getPathParams().get(paramIdx); if (pathParamExp instanceof Term && sel.getExpression() instanceof Variable) { @@ -584,7 +573,7 @@ public ResourceIdentifier getInputResourceIdentifier(ResourcePath inputResPath) { ResourceIdentifier resId = ResourceIdentifier.createFrom(inputResPath); - for (Map.Entry chParamEnt: channelSelectorAndValues) { + for (Map.Entry chParamEnt : channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); if (channelSelectorToInputOrReferenceResourcePathParam.get(sel) != null) { Map.Entry> pathParamEnt = channelSelectorToInputOrReferenceResourcePathParam.get(sel).get(inputResPath); @@ -599,13 +588,13 @@ } } } - for (Expression var: dependingParameters.keySet()) { + for (Expression var : dependingParameters.keySet()) { int paramIdx = resId.getPathParams().indexOf(var); if (paramIdx >= 0) { resId.setPathParam(paramIdx, (Constant) dependingParameters.get(var)); } } - for (Map.Entry chParamEnt: channelSelectorAndValues) { + for (Map.Entry chParamEnt : channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); if (channelSelectorToInputOrReferenceResourcePathParam.get(sel) != null) { Map.Entry> pathParamEnt = channelSelectorToInputOrReferenceResourcePathParam.get(sel).get(inputResPath); @@ -623,10 +612,10 @@ } return resId; } - + public ResourceIdentifier getOutputResourceIdentifier(ResourcePath outputResPath) { ResourceIdentifier resId = ResourceIdentifier.createFrom(outputResPath); - for (Map.Entry chParamEnt: channelSelectorAndValues) { + for (Map.Entry chParamEnt : channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); if (channelSelectorToOutputResourcePathParam.get(sel) != null) { Map.Entry> pathParamEnt = channelSelectorToOutputResourcePathParam.get(sel).get(outputResPath); @@ -641,13 +630,13 @@ } } } - for (Expression var: dependingParameters.keySet()) { + for (Expression var : dependingParameters.keySet()) { int paramIdx = resId.getPathParams().indexOf(var); if (paramIdx >= 0) { resId.setPathParam(paramIdx, dependingParameters.get(var)); } } - for (Map.Entry chParamEnt: channelSelectorAndValues) { + for (Map.Entry chParamEnt : channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); if (channelSelectorToOutputResourcePathParam.get(sel) != null) { Map.Entry> pathParamEnt = channelSelectorToOutputResourcePathParam.get(sel).get(outputResPath); @@ -669,6 +658,7 @@ public interface IResourceStateValueProvider { Expression getCurrentStateValueOf(ResourceIdentifier resId); + Expression getNextStateValueOf(ResourceIdentifier resId); } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java b/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java index 8cd943f..7ab46cb 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java @@ -1,11 +1,5 @@ package simulator; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Type; @@ -13,8 +7,11 @@ import models.dataConstraintModel.ResourceHierarchy; import simulator.states.*; +import java.util.*; + /** * A runtime instance of a resource + * * @author Nitta * */ @@ -35,7 +32,7 @@ public Resource(ResourceHierarchy resourceHierarchy) { this.resourceHierarchy = resourceHierarchy; Type resType = resourceHierarchy.getResourceStateType(); - if (resourceHierarchy.getChildren().size() > 0 + if (resourceHierarchy.getChildren().size() > 0 || DataConstraintModel.typeList.isAncestorOf(resType) || DataConstraintModel.typeMap.isAncestorOf(resType) || DataConstraintModel.typeJson.isAncestorOf(resType)) { @@ -53,7 +50,7 @@ } state = new JsonResourceState(); children = new LinkedHashMap<>(); - for (ResourceHierarchy child: resourceHierarchy.getChildren()) { + for (ResourceHierarchy child : resourceHierarchy.getChildren()) { Resource cRes = new Resource(child, this); ((JsonResourceState) state).addChildState(child.getResourceName(), cRes.getState()); children.put(child.getResourceName(), cRes); @@ -86,11 +83,11 @@ this.parameter = parameter; this.state = state; } - + public Resource getParent() { return parent; } - + public void setParent(Resource parent) { this.parent = parent; } @@ -113,7 +110,7 @@ } return resId; } - + public ResourceState getState() { return state; } @@ -121,7 +118,7 @@ public void changeState(ResourceState state) { this.state = state; } - + public Constant getParameter() { return parameter; } @@ -131,7 +128,7 @@ if (childrenMap == null) return null; return childrenMap.values(); } - + public Map getChildrenMap() { Map children = null; if (resourceHierarchy.getChildren().size() > 0) { @@ -142,14 +139,14 @@ if (state instanceof CompositeResourceState) { // If the list or map is not nil. Map childStates = ((CompositeResourceState) state).getChildStates(); - for (Map.Entry childEnt: childStates.entrySet()) { + for (Map.Entry childEnt : childStates.entrySet()) { String childParam = childEnt.getKey(); ResourceState childState = childEnt.getValue(); Type thisType = resourceHierarchy.getResourceStateType(); if (DataConstraintModel.typeList.isAncestorOf(thisType)) { children.put(childParam, new Resource(childRes, this, new Constant(childParam, DataConstraintModel.typeInt), childState)); } else if (DataConstraintModel.typeMap.isAncestorOf(thisType)) { - children.put(childParam, new Resource(childRes, this, new Constant(childParam, DataConstraintModel.typeString), childState)); + children.put(childParam, new Resource(childRes, this, new Constant(childParam, DataConstraintModel.typeString), childState)); } } } @@ -157,11 +154,11 @@ // Json type. Map childStates = ((CompositeResourceState) state).getChildStates(); if (this.children == null || this.children.size() < childStates.size()) { - for (Map.Entry childEnt: childStates.entrySet()) { + for (Map.Entry childEnt : childStates.entrySet()) { String childParam = childEnt.getKey(); ResourceState childState = childEnt.getValue(); Type thisType = resourceHierarchy.getResourceStateType(); - for (ResourceHierarchy c: resourceHierarchy.getChildren()) { + for (ResourceHierarchy c : resourceHierarchy.getChildren()) { if (c.getResourceName().equals(childParam.replace("\"", ""))) { childRes = c; break; @@ -187,7 +184,7 @@ } if (!res.toString().startsWith(this.getResourceHierarchy().toString())) return new HashSet<>(); Set descendants = new HashSet<>(); - for (Resource child: getChildren()) { + for (Resource child : getChildren()) { descendants.addAll(child.getDescendants(res)); } return descendants; @@ -196,8 +193,8 @@ public Resource getDescendant(ResourceIdentifier resId) { if (this.getResourceIdentifier().equals(resId)) return this; if (!resId.startsWith(this.getResourceIdentifier())) return null; - for (Resource child: getChildren()) { - Resource res = child.getDescendant(resId); + for (Resource child : getChildren()) { + Resource res = child.getDescendant(resId); if (res != null) return res; } return null; @@ -206,8 +203,8 @@ public Resource getDescendant(String resId) { if (this.getResourceIdentifier().toString().equals(resId)) return this; if (!resId.startsWith(this.getResourceIdentifier().toString())) return null; - for (Resource child: getChildren()) { - Resource res = child.getDescendant(resId); + for (Resource child : getChildren()) { + Resource res = child.getDescendant(resId); if (res != null) return res; } return null; diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/ResourceIdentifier.java b/AlgebraicDataflowArchitectureModel/src/simulator/ResourceIdentifier.java index 13b2c92..f2ee2fc 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/ResourceIdentifier.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/ResourceIdentifier.java @@ -1,30 +1,28 @@ package simulator; -import java.util.HashMap; -import java.util.Map; -import java.util.AbstractMap; -import java.util.AbstractMap.SimpleEntry; - import models.algebra.Constant; import models.algebra.Expression; import models.dataConstraintModel.ResourceHierarchy; import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; + +import java.util.AbstractMap; +import java.util.HashMap; +import java.util.Map; public class ResourceIdentifier extends ResourcePath { - + public ResourceIdentifier(String fullResourceName, ResourceHierarchy resourceHierarchy) { super(fullResourceName, resourceHierarchy); } - + public ResourceIdentifier(ResourceIdentifier parentResId, String leafResourceName, ResourceHierarchy resourceHierarchy) { super(parentResId, leafResourceName, resourceHierarchy); } - + public ResourceIdentifier(ResourceIdentifier parentResId, Expression exp, ResourceHierarchy resourceHierarchy) { super(parentResId, exp, resourceHierarchy); } - + public void setPathParam(int paramIdx, Expression param) { if (paramIdx < pathParams.size()) { pathParams.set(paramIdx, new AbstractMap.SimpleEntry<>(param, null)); @@ -116,7 +114,7 @@ } return paramMap; } - + public static ResourceIdentifier createFrom(ResourcePath resPath) { ResourceIdentifier parent = null; if (resPath.getParent() != null) { @@ -133,5 +131,5 @@ return new ResourceIdentifier(parent, (Expression) resPath.getLastParam().clone(), res); } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java b/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java index 2a93a6e..5d8438f 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java @@ -1,38 +1,20 @@ package simulator; -import java.util.AbstractMap; -import java.util.AbstractMap.SimpleEntry; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.Term; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.algebra.Variable; -import models.dataConstraintModel.Channel; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.ResourceHierarchy; -import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; +import models.algebra.*; +import models.dataConstraintModel.*; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; +import models.dataFlowModel.DataTransferModel; +import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; import simulator.Event.IResourceStateValueProvider; import simulator.interfaces.INativeInitializer; import simulator.interfaces.INativeReceiver; +import java.util.*; + /** * Simulator to run a model + * * @author Nitta * */ @@ -41,8 +23,8 @@ private SystemState curState; private List systemReceivers = new ArrayList<>(); private List systemInitializers = new ArrayList<>(); - private Map> nativeReceivers = new HashMap<>(); - private Map nativeChannelReceivers = new HashMap<>(); + private Map> nativeReceivers = new HashMap<>(); + private Map nativeChannelReceivers = new HashMap<>(); public Simulator(DataTransferModel model) { this.model = model; @@ -55,7 +37,7 @@ public SystemState init() { curState = new SystemState(); - for (ResourceHierarchy res: model.getResourceHierarchies()) { + for (ResourceHierarchy res : model.getResourceHierarchies()) { if (res.getParent() == null) { // root resource Resource resource = new Resource(res); @@ -74,10 +56,10 @@ } } } - for (Channel channel: model.getChannels()) { + for (Channel channel : model.getChannels()) { curState.addChannel((DataTransferChannel) channel); } - for (INativeInitializer initializer: systemInitializers) { + for (INativeInitializer initializer : systemInitializers) { initializer.onInitFromModel(curState); } return curState; @@ -89,7 +71,7 @@ /** * Change the state of the system for a given input event. - * + * * @param inputEvent an input event * @return the next system state * @throws ParameterizedIdentifierIsFutureWork @@ -98,7 +80,7 @@ * @throws UnificationFailed * @throws ValueUndefined */ - public SystemState transition(Event inputEvent) + public SystemState transition(Event inputEvent) throws ParameterizedIdentifierIsFutureWork, ResolvingMultipleDefinitionIsFutureWork, InvalidMessage, UnificationFailed, ValueUndefined { SystemState nextSystemState = new SystemState(curState); inputEvent.constructMessageAndDescendantEvents(new ResourceStateValueProvider(curState, nextSystemState), true); @@ -107,7 +89,7 @@ fireEvent(inputEvent, curState, nextSystemState); curState = nextSystemState; - for (INativeReceiver receiver: systemReceivers) { + for (INativeReceiver receiver : systemReceivers) { receiver.onReceiveFromModel(inputEvent, nextSystemState); } return nextSystemState; @@ -155,12 +137,12 @@ } } } - + /** * Fire an given event and construct the next system state from the current system state. - * - * @param event an event - * @param curSystemState the current state of the system + * + * @param event an event + * @param curSystemState the current state of the system * @param nextSystemState the next state of the system to be constructed * @throws ParameterizedIdentifierIsFutureWork * @throws ResolvingMultipleDefinitionIsFutureWork @@ -175,13 +157,14 @@ IResourceStateAccessor resouceStateAccessor = new IResourceStateAccessor() { @Override public Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from) { - if (target == outTarget[0]) return outResVar[0]; // the current state of each output resource is not to be replaced with its value. + if (target == outTarget[0]) + return outResVar[0]; // the current state of each output resource is not to be replaced with its value. ResourceIdentifier resId = event.getResourceIdentifier(target.getResource()); Resource res = curSystemState.getResource(resId); if (res == null) return null; return res.getState().getValue(); } - + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourceIdentifier resId = event.getResourceIdentifier(target.getResource()); @@ -189,7 +172,7 @@ if (res == null) return null; return res.getState().getValue(); } - + @Override public Expression getDirectStateAccessorFor(ResourcePath target, ResourcePath from) { ResourceIdentifier resId = event.getResourceIdentifier(target); @@ -198,28 +181,28 @@ return res.getState().getValue(); } }; - + // First, fire the all child events. - for (Event childEvent: event.getChildren()) { + for (Event childEvent : event.getChildren()) { fireEvent(childEvent, curSystemState, nextSystemState); } - + // Fire this event. - DataTransferChannel channel = event.getChannel(); + DataTransferChannel channel = event.getChannel(); if (channel.getOutputResources().size() > 0) { // For each output resource, calculate the next state. - for (ChannelMember out: channel.getOutputChannelMembers()) { + for (ChannelMember out : channel.getOutputChannelMembers()) { // Calculate the next state expression. Expression nextResState = null; outTarget[0] = out; - outResVar[0] = new Variable(channel.getChannelName() + "$" + out.getResource().toString() + "$this"); // A special variable to represent the current state of each output resource. + outResVar[0] = new Variable(channel.getChannelName() + "$" + out.getResource().toString() + "$this"); // A special variable to represent the current state of each output resource. if (event.getMessage() instanceof Variable) { nextResState = channel.deriveUpdateExpressionOf(out, resouceStateAccessor).getKey(); } else { nextResState = channel.deriveUpdateExpressionOf(out, (Term) event.getMessage(), resouceStateAccessor); } // Substitute each channel selector in the expression to a value. - for (Map.Entry selestorAndVal: event.getChannelSelectorAndValues()) { + 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()); @@ -235,16 +218,16 @@ if (updatedOutResIds != null) { if (out.getResource().getResourceHierarchy().isNative()) { // For a native output resource, neither ancestor nor descendants are changed. - for (Event nextEvent: getNextEvents(outResId, curSystemState, nextSystemState)) { + for (Event nextEvent : getNextEvents(outResId, curSystemState, nextSystemState)) { fireEvent(nextEvent, curSystemState, nextSystemState); } } else { // When a normal resource is updated. Set ancestors = new HashSet<>(); - for (ResourceIdentifier updatedOutResId: updatedOutResIds) { - while (updatedOutResId != null && !ancestors.contains(updatedOutResId)) { // In addition to the target state, its ancestors' states are also changed. + for (ResourceIdentifier updatedOutResId : updatedOutResIds) { + while (updatedOutResId != null && !ancestors.contains(updatedOutResId)) { // In addition to the target state, its ancestors' states are also changed. ancestors.add(updatedOutResId); - for (Event nextEvent: getNextEvents(updatedOutResId, curSystemState, nextSystemState)) { + for (Event nextEvent : getNextEvents(updatedOutResId, curSystemState, nextSystemState)) { fireEvent(nextEvent, curSystemState, nextSystemState); } updatedOutResId = (ResourceIdentifier) updatedOutResId.getParent(); @@ -255,19 +238,19 @@ } } else if (channel.isNative()) { // A native output event channel - INativeReceiver receiver = nativeChannelReceivers.get(channel); // receiver for the channel + INativeReceiver receiver = nativeChannelReceivers.get(channel); // receiver for the channel if (receiver != null) receiver.onReceiveFromModel(event, nextSystemState); if (nativeReceivers.get(channel) != null) { - receiver = nativeReceivers.get(channel).get(event.getInputResource().getResourceIdentifier()); // receiver for the channel and resource + receiver = nativeReceivers.get(channel).get(event.getInputResource().getResourceIdentifier()); // receiver for the channel and resource if (receiver != null) receiver.onReceiveFromModel(event, nextSystemState); } } } - + private Set getNextEvents(ResourceIdentifier inResId, SystemState curSystemState, SystemState nextSystemState) { IResourceStateValueProvider resourceStateValueProvider = new ResourceStateValueProvider(curSystemState, nextSystemState); Set nextEvents = new HashSet<>(); - for (Channel ch: model.getChannels()) { + for (Channel ch : model.getChannels()) { DataTransferChannel channel = (DataTransferChannel) ch; ChannelState nextChannelState = nextSystemState.getChannelState(channel); if (nextChannelState == null) { @@ -276,8 +259,8 @@ } Map> dependency = channel.getMemberDependency(); Map> invDependency = new HashMap<>(); - for (ChannelMember dependingMem: dependency.keySet()) { - for (ChannelMember dependedMem: dependency.get(dependingMem)) { + for (ChannelMember dependingMem : dependency.keySet()) { + for (ChannelMember dependedMem : dependency.get(dependingMem)) { Set dependings = invDependency.get(dependedMem); if (dependings == null) { dependings = new HashSet<>(); @@ -286,11 +269,11 @@ dependings.add(dependingMem); } } - for (ResourcePath inResPath: channel.getInputResources()) { + for (ResourcePath inResPath : channel.getInputResources()) { if (inResId.isInstanceOf(inResPath)) { // Update the channel state and resource identifiers by the update of the input resource. boolean isInputResourceDepended = false; - for (ChannelMember dependedMem: invDependency.keySet()) { + for (ChannelMember dependedMem : invDependency.keySet()) { if (inResPath == dependedMem.getResource()) { // 1) If some depending resources are to be updated by the update of an 'depended' input resource. if (doesSatifsyPathConstraints(inResPath, inResId)) { @@ -300,8 +283,8 @@ nextEvent.setMessage(message); nextSystemState.updateChannelState(channel, nextChannelState); List channelSelValues = nextEvent.getChannelSelectorValues(); - for (Map.Entry paramEnt: nextEvent.getDependingParameters().entrySet()) { - nextChannelState.addDependingParamAndValue(channelSelValues, paramEnt.getKey(), paramEnt.getValue()); + for (Map.Entry paramEnt : nextEvent.getDependingParameters().entrySet()) { + nextChannelState.addDependingParamAndValue(channelSelValues, paramEnt.getKey(), paramEnt.getValue()); } nextEvents.add(nextEvent); } @@ -310,7 +293,7 @@ } } boolean isInputResourceDepending = false; - for (ChannelMember dependingMem: dependency.keySet()) { + for (ChannelMember dependingMem : dependency.keySet()) { if (inResPath == dependingMem.getResource()) { isInputResourceDepending = true; } @@ -325,7 +308,7 @@ } } } - for (ChannelMember dependingMem: dependency.keySet()) { + for (ChannelMember dependingMem : dependency.keySet()) { if (inResPath == dependingMem.getResource()) { // 2) If a 'depending' resource is directly updated. ResourcePath filledResPath = inResId; @@ -352,10 +335,10 @@ if (doesSatisfyConstraint) { List> dependedChannelSelectorValues = nextChannelState.getDependedChannelSelectorValues(dependingVarToVal); if (dependedChannelSelectorValues != null) { - for (List channelSelectorValues: dependedChannelSelectorValues) { + for (List channelSelectorValues : dependedChannelSelectorValues) { // Guess every tuple of channel selector values that may affects the updated resource. boolean doesMatch = true; - for (Expression var: selectorVarToVal.keySet()) { + for (Expression var : selectorVarToVal.keySet()) { for (int i = 0; i < channel.getAllSelectors().size(); i++) { if (channel.getAllSelectors().get(i).getExpression().equals(var)) { if (!channelSelectorValues.get(i).equals(selectorVarToVal.get(var))) { @@ -382,13 +365,13 @@ } // 3) If a resource in a descendant channel is directly updated. ResourcePath inResPath = null; - for (ResourcePath path: channel.getInputResources()) { + for (ResourcePath path : channel.getInputResources()) { if (path.getPathParams().containsAll(channel.getAllSelectorVariables())) { inResPath = path; } } if (inResPath != null) { - for (Map.Entry, Event> childEventEnt: collectDescendantEvents(channel, channel, inResId, nextSystemState, resourceStateValueProvider)) { + for (Map.Entry, Event> childEventEnt : collectDescendantEvents(channel, channel, inResId, nextSystemState, resourceStateValueProvider)) { Event childEvent = childEventEnt.getValue(); nextEvents.add(childEvent); } @@ -397,16 +380,16 @@ return nextEvents; } - private List, Event>> collectDescendantEvents(DataTransferChannel rootChannel, DataTransferChannel channel, ResourceIdentifier inResId, - SystemState nextSystemState, IResourceStateValueProvider resourceStateValueProvider) { + private List, Event>> collectDescendantEvents(DataTransferChannel rootChannel, DataTransferChannel channel, ResourceIdentifier inResId, + SystemState nextSystemState, IResourceStateValueProvider resourceStateValueProvider) { List, Event>> childEvents = new ArrayList<>(); ChannelState nextChannelState = nextSystemState.getChannelState(rootChannel); - for (Channel childCh: channel.getChildren()) { + for (Channel childCh : channel.getChildren()) { DataTransferChannel childChannel = (DataTransferChannel) childCh; Map> dependency = childChannel.getMemberDependency(); Map> invDependency = new HashMap<>(); - for (ChannelMember dependingMem: dependency.keySet()) { - for (ChannelMember dependedMem: dependency.get(dependingMem)) { + for (ChannelMember dependingMem : dependency.keySet()) { + for (ChannelMember dependedMem : dependency.get(dependingMem)) { Set dependings = invDependency.get(dependedMem); if (dependings == null) { dependings = new HashSet<>(); @@ -415,10 +398,10 @@ dependings.add(dependingMem); } } - for (ResourcePath childInResPath: childChannel.getInputResources()) { + for (ResourcePath childInResPath : childChannel.getInputResources()) { if (inResId.isInstanceOf(childInResPath)) { boolean isInputResourceDepended = false; - for (ChannelMember dependedMem: invDependency.keySet()) { + for (ChannelMember dependedMem : invDependency.keySet()) { if (childInResPath == dependedMem.getResource()) { // 1) If some depending resources are to be updated by the update of an 'depended' input resource. if (doesSatifsyPathConstraints(childInResPath, inResId)) { @@ -427,8 +410,8 @@ if (message != null) { childEvent.setMessage(message); List childChannelSelValues = childEvent.getChannelSelectorValues(); - for (Map.Entry paramEnt: childEvent.getDependingParameters().entrySet()) { - nextChannelState.addDependingParamAndValue(childChannelSelValues, paramEnt.getKey(), paramEnt.getValue()); + for (Map.Entry paramEnt : childEvent.getDependingParameters().entrySet()) { + nextChannelState.addDependingParamAndValue(childChannelSelValues, paramEnt.getKey(), paramEnt.getValue()); } if (childChannelSelValues.size() >= childChannel.getSelectors().size()) { List channelSelectorValues = new ArrayList<>(childChannelSelValues); @@ -443,7 +426,7 @@ } } boolean isInputResourceDepending = false; - for (ChannelMember dependingMem: dependency.keySet()) { + for (ChannelMember dependingMem : dependency.keySet()) { if (childInResPath == dependingMem.getResource()) { isInputResourceDepending = true; } @@ -455,8 +438,8 @@ if (message != null) { childEvent.setMessage(message); List childChannelSelValues = childEvent.getChannelSelectorValues(); - for (Map.Entry paramEnt: childEvent.getDependingParameters().entrySet()) { - nextChannelState.addDependingParamAndValue(childChannelSelValues, paramEnt.getKey(), paramEnt.getValue()); + for (Map.Entry paramEnt : childEvent.getDependingParameters().entrySet()) { + nextChannelState.addDependingParamAndValue(childChannelSelValues, paramEnt.getKey(), paramEnt.getValue()); } if (childChannelSelValues.size() >= childChannel.getSelectors().size()) { List channelSelectorValues = new ArrayList<>(childChannelSelValues); @@ -468,7 +451,7 @@ } } } - for (ChannelMember dependingMem: dependency.keySet()) { + for (ChannelMember dependingMem : dependency.keySet()) { if (childInResPath == dependingMem.getResource()) { // 2) If a 'depending' resource is directly updated. ResourcePath filledResPath = inResId; @@ -495,10 +478,10 @@ if (doesSatisfyConstraint) { List> dependedChannelSelectorValues = nextChannelState.getDependedChannelSelectorValues(dependingVarToVal); if (dependedChannelSelectorValues != null) { - for (List childChannelSelectorValues: dependedChannelSelectorValues) { + for (List childChannelSelectorValues : dependedChannelSelectorValues) { // Guess every tuple of channel selector values that may affects the updated resource. boolean doesMatch = true; - for (Expression var: selectorVarToVal.keySet()) { + for (Expression var : selectorVarToVal.keySet()) { for (int i = 0; i < channel.getAllSelectors().size(); i++) { if (channel.getAllSelectors().get(i).getExpression().equals(var)) { if (!childChannelSelectorValues.get(i).equals(selectorVarToVal.get(var))) { @@ -534,12 +517,12 @@ } List, Event>> events = new ArrayList<>(); ResourcePath inResPath = null; - for (ResourcePath path: channel.getInputResources()) { + for (ResourcePath path : channel.getInputResources()) { if (path.getPathParams().containsAll(channel.getAllSelectorVariables())) { inResPath = path; } } - for (Map.Entry, Event> childEventEnt: childEvents) { + for (Map.Entry, Event> childEventEnt : childEvents) { List channelSelectorValues = childEventEnt.getKey(); Event childEvent = childEventEnt.getValue(); Map dependingVarToVal = nextChannelState.getDependingParamAndValues(channelSelectorValues); @@ -571,13 +554,13 @@ } if (!constStr.equals(valStr)) { // The value of the path parameter does not satisfy the constraint defined for the parameter. - return false; // Not to fire this event. + return false; // Not to fire this event. } } } return true; } - + private static class ResourceStateValueProvider implements IResourceStateValueProvider { SystemState curSystemState; SystemState nextSystemState; @@ -592,11 +575,13 @@ 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 3fb236f..1a8324d 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/SystemState.java @@ -1,33 +1,15 @@ package simulator; - -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import models.algebra.Constant; -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; -import models.dataConstraintModel.MapTerm; -import models.dataConstraintModel.ResourceHierarchy; + +import models.algebra.*; +import models.dataConstraintModel.*; import models.dataFlowModel.DataTransferChannel; -import simulator.states.CompositeResourceState; -import simulator.states.JsonResourceState; -import simulator.states.ListResourceState; -import simulator.states.MapResourceState; -import simulator.states.PrimitiveResourceState; -import simulator.states.ResourceState; - +import simulator.states.*; + +import java.util.*; + /** * The whole state of a running model + * * @author Nitta * */ @@ -40,10 +22,10 @@ } public SystemState(SystemState prevState) { - for (Resource resource: prevState.getRootResources()) { + for (Resource resource : prevState.getRootResources()) { rootResources.add(new Resource(resource)); } - for (Map.Entry channelEnt: prevState.getChannelStates().entrySet()) { + for (Map.Entry channelEnt : prevState.getChannelStates().entrySet()) { if (channelEnt.getValue() != null) { channelStates.put(channelEnt.getKey(), (ChannelState) channelEnt.getValue().clone()); } else { @@ -61,7 +43,7 @@ } public Resource getResource(ResourceIdentifier resourceIdentifier) { - for (Resource root: rootResources) { + for (Resource root : rootResources) { Resource descendant = root.getDescendant(resourceIdentifier); if (descendant != null) return descendant; } @@ -69,20 +51,20 @@ } public Resource getResource(String resourceIdentifier) { - for (Resource root: rootResources) { + for (Resource root : rootResources) { Resource descendant = root.getDescendant(resourceIdentifier); if (descendant != null) return descendant; } return null; } - + /** * update the state of a specified resource - * + * * @param resourceIdentifier a resource identifier to identify the resource - * @param curResVar a variable to represent the current state of the resource (may be replaced with resCurStateVal) - * @param resCurStateVal the value of the current state of the resource - * @param resNextStateVal the value of the new state of the resource (may contain curResVar) + * @param curResVar a variable to represent the current state of the resource (may be replaced with resCurStateVal) + * @param resCurStateVal the value of the current state of the resource + * @param resNextStateVal the value of the new state of the resource (may contain curResVar) * @return the identifier of the deepest resource created by this update. */ public List updateResourceState(ResourceIdentifier resourceIdentifier, Variable curResVar, Expression resCurStateVal, Expression resNextStateVal) { @@ -158,7 +140,7 @@ Expression childList = ((Term) listValue.getChild(0)).reduce(); if (childList instanceof ListTerm) { // If the child list is a list literal. - List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. + List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. if (childInfo != null) createdResources.addAll(childInfo); } else if (childList instanceof Term) { // There may or may not be the current state of the resource (curResVar) under the child. @@ -222,7 +204,7 @@ Expression childList = ((Term) listValue.getChild(0)).reduce(); if (childList instanceof ListTerm) { // If the child list is a list literal. - List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. + List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. if (childInfo != null) createdResources.addAll(childInfo); } else if (childList instanceof Term) { // There may or may not be the current state of the resource (curResVar) under the child. @@ -273,7 +255,7 @@ Expression childList = ((Term) listValue.getChild(0)).reduce(); if (childList instanceof ListTerm) { // If the child list is a list literal. - List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. + List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. if (childInfo != null) createdResources.addAll(childInfo); } else if (childList instanceof Term) { // There may or may not be the current state of the resource (curResVar) under the child. @@ -297,7 +279,7 @@ if (state instanceof MapResourceState) { List createdResources = new ArrayList<>(); ((MapResourceState) state).clearChildStates(); - for (String key: mapValue.keySet()) { + for (String key : mapValue.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); ResourceHierarchy childResourceHierarchy = null; if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { @@ -326,7 +308,7 @@ if (state instanceof MapResourceState) { ((MapResourceState) state).clearChildStates(); List createdResources = new ArrayList<>(); - for (String key: mapValue.keySet()) { + for (String key : mapValue.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); ResourceHierarchy childResourceHierarchy = null; if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { @@ -374,7 +356,7 @@ Expression childMap = ((Term) mapValue.getChild(0)).reduce(); if (childMap instanceof MapTerm) { // If the child map is a map literal. - List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childMap); // one more recursion + List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childMap); // one more recursion if (childInfo != null) createdResources.addAll(childInfo); } else if (childMap instanceof Term) { // There may or may not be the current state of the resource (curResVar) under the child. @@ -436,7 +418,7 @@ Expression childMap = ((Term) mapValue.getChild(0)).reduce(); if (childMap instanceof MapTerm) { // If the child map is a map literal. - List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childMap); // one more recursion + List childInfo = updateResourceState(resourceIdentifier, curResVar, resCurStateVal, childMap); // one more recursion if (childInfo != null) createdResources.addAll(childInfo); } else if (childMap instanceof Term) { // There may or may not be the current state of the resource (curResVar) under the child. @@ -460,9 +442,9 @@ ResourceState state = res.getState(); if (state instanceof JsonResourceState) { List createdResources = new ArrayList<>(); - for (String key: jsonValue.keySet()) { + for (String key : jsonValue.keySet()) { ResourceHierarchy childResourceHierarchy = null; - for (ResourceHierarchy childRes: resourceIdentifier.getResourceHierarchy().getChildren()) { + for (ResourceHierarchy childRes : resourceIdentifier.getResourceHierarchy().getChildren()) { if (childRes.getResourceName().equals(key)) { childResourceHierarchy = childRes; break; @@ -499,7 +481,7 @@ if (childKeyExp instanceof Constant) { String memberName = (String) ((Constant) childKeyExp).getValue(); ResourceHierarchy childResourceHierarchy = null; - for (ResourceHierarchy childRes: resourceIdentifier.getResourceHierarchy().getChildren()) { + for (ResourceHierarchy childRes : resourceIdentifier.getResourceHierarchy().getChildren()) { if (childRes.getResourceName().equals(memberName)) { childResourceHierarchy = childRes; break; @@ -556,7 +538,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) { @@ -605,7 +587,7 @@ childList = ((Term) childList).reduce(); if (childList instanceof ListTerm) { // If the child list is a list literal. - Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. + Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. state = (ListResourceState) childInfo.getKey(); if (childInfo != null) createdResources.addAll(childInfo.getValue()); } else if (childList instanceof Term) { @@ -652,7 +634,7 @@ childList = ((Term) childList).reduce(); if (childList instanceof ListTerm) { // If the child list is a list literal. - Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. + Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. state = (ListResourceState) childInfo.getKey(); if (childInfo != null) createdResources.addAll(childInfo.getValue()); } else if (childList instanceof Term) { @@ -699,7 +681,7 @@ childList = ((Term) childList).reduce(); if (childList instanceof ListTerm) { // If the child list is a list literal. - Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. + Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childList); // one more recursion. state = (ListResourceState) childInfo.getKey(); if (childInfo != null) createdResources.addAll(childInfo.getValue()); } else if (childList instanceof Term) { @@ -750,7 +732,7 @@ JsonTerm mapValue = (JsonTerm) resStateValue; MapResourceState state = new MapResourceState(); Map.Entry> createInfo = new AbstractMap.SimpleEntry<>(state, new ArrayList<>()); - for (String key: mapValue.keySet()) { + for (String key : mapValue.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); ResourceHierarchy childResourceHierarchy = null; if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { @@ -775,7 +757,7 @@ MapTerm mapValue = (MapTerm) resStateValue; MapResourceState state = new MapResourceState(); Map.Entry> createInfo = new AbstractMap.SimpleEntry<>(state, new ArrayList<>()); - for (String key: mapValue.keySet()) { + for (String key : mapValue.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); ResourceHierarchy childResourceHierarchy = null; if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { @@ -816,7 +798,7 @@ childMap = ((Term) childMap).reduce(); if (childMap instanceof MapTerm) { // If the child map is a map literal. - Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childMap); // one more recursion. + Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childMap); // one more recursion. state = (MapResourceState) childInfo.getKey(); if (childInfo != null) createdResources.addAll(childInfo.getValue()); } else if (childMap instanceof Term) { @@ -864,7 +846,7 @@ childMap = ((Term) childMap).reduce(); if (childMap instanceof MapTerm) { // If the child map is a map literal. - Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childMap); // one more recursion. + Map.Entry> childInfo = createResourceState(resourceIdentifier, curResVar, resCurStateVal, childMap); // one more recursion. state = (MapResourceState) childInfo.getKey(); if (childInfo != null) createdResources.addAll(childInfo.getValue()); } else if (childMap instanceof Term) { @@ -886,7 +868,7 @@ MapTerm mapVal = (MapTerm) mapExp; MapResourceState state = new MapResourceState(); Map.Entry> createInfo = new AbstractMap.SimpleEntry<>(null, new ArrayList<>()); - for (String key: mapVal.keySet()) { + for (String key : mapVal.keySet()) { Expression childExp = new Constant(key, DataConstraintModel.typeString); ResourceHierarchy childResourceHierarchy = null; if (resourceIdentifier.getResourceHierarchy().getChildren() != null && resourceIdentifier.getResourceHierarchy().getChildren().size() > 0) { @@ -916,9 +898,9 @@ JsonTerm jsonValue = (JsonTerm) resStateValue; JsonResourceState state = new JsonResourceState(); Map.Entry> createInfo = new AbstractMap.SimpleEntry<>(null, new ArrayList<>()); - for (String key: jsonValue.keySet()) { + for (String key : jsonValue.keySet()) { ResourceHierarchy childResourceHierarchy = null; - for (ResourceHierarchy childRes: resourceIdentifier.getResourceHierarchy().getChildren()) { + for (ResourceHierarchy childRes : resourceIdentifier.getResourceHierarchy().getChildren()) { if (childRes.getResourceName().equals(key)) { childResourceHierarchy = childRes; break; @@ -955,7 +937,7 @@ if (childExp instanceof Constant) { String memberName = (String) ((Constant) childExp).getValue(); ResourceHierarchy childResourceHierarchy = null; - for (ResourceHierarchy childRes: resourceIdentifier.getResourceHierarchy().getChildren()) { + for (ResourceHierarchy childRes : resourceIdentifier.getResourceHierarchy().getChildren()) { if (childRes.getResourceName().equals(memberName)) { childResourceHierarchy = childRes; break; @@ -984,9 +966,9 @@ Expression jsonExp = jsonValue.reduce(); if (jsonExp instanceof JsonTerm) { JsonTerm jsonVal = (JsonTerm) jsonExp; - for (String key: jsonVal.keySet()) { + for (String key : jsonVal.keySet()) { ResourceHierarchy childResourceHierarchy = null; - for (ResourceHierarchy childRes: resourceIdentifier.getResourceHierarchy().getChildren()) { + for (ResourceHierarchy childRes : resourceIdentifier.getResourceHierarchy().getChildren()) { if (childRes.getResourceName().equals(key)) { childResourceHierarchy = childRes; break; @@ -1012,7 +994,7 @@ createInfo.getValue().addAll(childInfo.getValue()); createInfo = new AbstractMap.SimpleEntry<>(state, createInfo.getValue()); } - } + } } return createInfo; } @@ -1055,7 +1037,7 @@ public void updateChannelState(DataTransferChannel channel, ChannelState channelState) { channelStates.put(channel, channelState); } - + public List getEvents() { return events; } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/NativeSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/NativeSender.java index a286401..f2ab162 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/NativeSender.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/NativeSender.java @@ -1,14 +1,6 @@ package simulator.interfaces; -import java.util.HashSet; -import java.util.Set; - -import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.dataConstraintModel.Channel; +import models.algebra.*; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; @@ -33,7 +25,8 @@ try { Event event = new Event(channel, message, resourcePath, resource); simulator.transition(event); - } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | UnificationFailed | ValueUndefined e) { + } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | + UnificationFailed | ValueUndefined e) { e.printStackTrace(); } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentHeightReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentHeightReceiver.java index 9d6aad1..a13f5cc 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentHeightReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentHeightReceiver.java @@ -1,11 +1,5 @@ package simulator.interfaces.swing; -import java.awt.Component; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.text.JTextComponent; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -13,13 +7,15 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; +import java.awt.*; + public class ComponentHeightReceiver implements INativeReceiver { protected Component component; public ComponentHeightReceiver(Component component) { this.component = component; } - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -31,5 +27,5 @@ } } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentMouseSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentMouseSender.java index f90d46b..bc484b1 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentMouseSender.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentMouseSender.java @@ -1,9 +1,5 @@ package simulator.interfaces.swing; -import java.awt.Component; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -14,15 +10,18 @@ import simulator.Simulator; import simulator.interfaces.NativeSender; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + public class ComponentMouseSender extends NativeSender implements MouseListener { public ComponentMouseSender(Simulator simulator, DataTransferChannel channel, ResourcePath resourcePath, Resource resource) { super(simulator, channel, resourcePath, resource); } - + public void mouseClicked(MouseEvent e) { } - + public void mousePressed(MouseEvent e) { Constant one = new Constant("1", DataConstraintModel.typeInt); Expression message = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); @@ -30,7 +29,7 @@ ((Term) message).setChild(0, one); sendToModel(message); } - + public void mouseReleased(MouseEvent e) { Constant zero = new Constant("0", DataConstraintModel.typeInt); Expression message = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); @@ -38,10 +37,10 @@ ((Term) message).setChild(0, zero); sendToModel(message); } - + public void mouseEntered(MouseEvent e) { } - + public void mouseExited(MouseEvent e) { } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentTextReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentTextReceiver.java index 5ab8b63..3fd084a 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentTextReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentTextReceiver.java @@ -1,11 +1,5 @@ package simulator.interfaces.swing; -import java.awt.Component; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.text.JTextComponent; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -13,13 +7,17 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; +import javax.swing.*; +import javax.swing.text.JTextComponent; +import java.awt.*; + public class ComponentTextReceiver implements INativeReceiver { protected Component component; public ComponentTextReceiver(Component component) { this.component = component; } - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -36,5 +34,5 @@ } } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentTextSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentTextSender.java index c6580fd..b27d21f 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentTextSender.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentTextSender.java @@ -1,10 +1,5 @@ package simulator.interfaces.swing; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -15,12 +10,17 @@ import simulator.Simulator; import simulator.interfaces.NativeSender; -public class ComponentTextSender extends NativeSender implements DocumentListener { +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +public class ComponentTextSender extends NativeSender implements DocumentListener { + public ComponentTextSender(Simulator simulator, DataTransferChannel channel, ResourcePath resourcePath, Resource resource) { super(simulator, channel, resourcePath, resource); } - + @Override public void insertUpdate(DocumentEvent e) { Document d = e.getDocument(); @@ -34,7 +34,7 @@ e1.printStackTrace(); } } - + @Override public void removeUpdate(DocumentEvent e) { Document d = e.getDocument(); @@ -48,7 +48,7 @@ e1.printStackTrace(); } } - + @Override public void changedUpdate(DocumentEvent e) { Document d = e.getDocument(); @@ -62,5 +62,5 @@ e1.printStackTrace(); } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentVisibilityReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentVisibilityReceiver.java index 447dae1..e07e5ba 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentVisibilityReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentVisibilityReceiver.java @@ -1,7 +1,5 @@ package simulator.interfaces.swing; -import java.awt.Component; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -10,13 +8,15 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; +import java.awt.*; + public class ComponentVisibilityReceiver implements INativeReceiver { protected Component component; public ComponentVisibilityReceiver(Component component) { this.component = component; } - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -31,5 +31,5 @@ } } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentWidthReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentWidthReceiver.java index 76c0dda..465c4f5 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentWidthReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentWidthReceiver.java @@ -1,11 +1,5 @@ package simulator.interfaces.swing; -import java.awt.Component; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.text.JTextComponent; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -13,13 +7,15 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; +import java.awt.*; + public class ComponentWidthReceiver implements INativeReceiver { protected Component component; public ComponentWidthReceiver(Component component) { this.component = component; } - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -31,5 +27,5 @@ } } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentXReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentXReceiver.java index 2867e97..21e5a11 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentXReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentXReceiver.java @@ -1,11 +1,5 @@ package simulator.interfaces.swing; -import java.awt.Component; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.text.JTextComponent; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -13,13 +7,15 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; +import java.awt.*; + public class ComponentXReceiver implements INativeReceiver { protected Component component; public ComponentXReceiver(Component component) { this.component = component; } - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -31,5 +27,5 @@ } } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentYReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentYReceiver.java index a964f6b..542fd24 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentYReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/ComponentYReceiver.java @@ -1,11 +1,5 @@ package simulator.interfaces.swing; -import java.awt.Component; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.text.JTextComponent; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -13,13 +7,15 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; +import java.awt.*; + public class ComponentYReceiver implements INativeReceiver { protected Component component; public ComponentYReceiver(Component component) { this.component = component; } - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -31,5 +27,5 @@ } } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java index bdd76dd..1650854 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java @@ -1,21 +1,5 @@ package simulator.interfaces.swing; -import java.awt.Component; -import java.awt.FlowLayout; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.JTextField; -import javax.swing.table.DefaultTableModel; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -30,6 +14,14 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import java.awt.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + public class SwingPresenter implements INativeReceiver { // Native channel names. public final String screenUpdateChannelName = "ScreenUpdate"; @@ -77,11 +69,11 @@ setHeightChannel = (DataTransferChannel) simulator.getModel().getChannel(setHeightChannelName); mouseEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(mouseEventChannelName); textEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(textEventChannelName); - onTableChangedChannel = (DataTransferChannel)simulator.getModel().getChannel(OnTableChangedChannelName); + onTableChangedChannel = (DataTransferChannel) simulator.getModel().getChannel(OnTableChangedChannelName); simulator.addNativeReceiver(this, screenUpdateChannel); simulator.addNativeReceiver(new SwingLayout(), setLayoutChannel); } - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -110,13 +102,13 @@ // If the set of screen components is changed. // Remove old components and their native receivers. - for (String oldWid: oldWidSet) { + for (String oldWid : oldWidSet) { mainPanel.remove(components.get(oldWid)); } - for (DataTransferChannel channel: channelAndResourcesForReceiving.keySet()) { + for (DataTransferChannel channel : channelAndResourcesForReceiving.keySet()) { Map widToResource = channelAndResourcesForReceiving.get(channel); - for (String oldWid: oldWidSet) { + for (String oldWid : oldWidSet) { Resource resource = widToResource.remove(oldWid); if (resource != null) { simulator.removeNativeReceiver(channel, resource); @@ -127,20 +119,20 @@ // Add new swing components. Resource screenResource = nextSystemState.getResource(event.getInputResource().getResourceIdentifier()); Resource widgetsResource = screenResource.getChildrenMap().get("widgets"); - for (String newWid: newWidSet) { + for (String newWid : newWidSet) { Expression value = ((MapTerm) newWidgets).get(newWid); if (value instanceof JsonTerm) { JsonTerm widget = (JsonTerm) value; Resource widgetResource = widgetsResource.getChildrenMap().get(newWid); Expression type = widget.get("type"); - if (type instanceof Constant && ((String)((Constant) type).getValue()).equals("button")) { + if (type instanceof Constant && ((String) ((Constant) type).getValue()).equals("button")) { // Add a button component. Expression text = widget.get("text"); Expression x = widget.get("x"); Expression y = widget.get("y"); Expression width = widget.get("width"); Expression height = widget.get("height"); - JButton button = new JButton(((String)((Constant) text).getValue())); + JButton button = new JButton(((String) ((Constant) text).getValue())); if (x != null && y != null) { button.setLocation(Integer.parseInt(x.toString()), Integer.parseInt(y.toString())); } @@ -151,9 +143,9 @@ components.put(newWid, button); // Connect swing component and model. ResourcePath resPath = mouseEventChannel.getOutputResources().iterator().next(); - button.addMouseListener(new ComponentMouseSender(simulator, mouseEventChannel, resPath, widgetResource)); // button => widgetResource + button.addMouseListener(new ComponentMouseSender(simulator, mouseEventChannel, resPath, widgetResource)); // button => widgetResource - ComponentVisibilityReceiver nativeVisibilityReceiver = new ComponentVisibilityReceiver(button); // widgetResource => button + ComponentVisibilityReceiver nativeVisibilityReceiver = new ComponentVisibilityReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeVisibilityReceiver, setVisibleChannel, widgetResource.getChildrenMap().get("visible")); Map resources = channelAndResourcesForReceiving.get(setVisibleChannel); if (resources == null) { @@ -162,7 +154,7 @@ } resources.put(newWid, widgetResource); - ComponentTextReceiver nativeTextReceiver = new ComponentTextReceiver(button); // widgetResource => button + ComponentTextReceiver nativeTextReceiver = new ComponentTextReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeTextReceiver, setTextChannel, widgetResource.getChildrenMap().get("text")); resources = channelAndResourcesForReceiving.get(setTextChannel); if (resources == null) { @@ -173,7 +165,7 @@ Resource widgetXResource = widgetResource.getChildrenMap().get("x"); if (widgetXResource != null) { - ComponentXReceiver nativeXReceiver = new ComponentXReceiver(button); // widgetResource => button + ComponentXReceiver nativeXReceiver = new ComponentXReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeXReceiver, setXChannel, widgetXResource); resources = channelAndResourcesForReceiving.get(setXChannel); if (resources == null) { @@ -185,7 +177,7 @@ Resource widgetYResource = widgetResource.getChildrenMap().get("y"); if (widgetYResource != null) { - ComponentYReceiver nativeYReceiver = new ComponentYReceiver(button); // widgetResource => button + ComponentYReceiver nativeYReceiver = new ComponentYReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeYReceiver, setYChannel, widgetYResource); resources = channelAndResourcesForReceiving.get(setYChannel); if (resources == null) { @@ -197,7 +189,7 @@ Resource widgetWidthResource = widgetResource.getChildrenMap().get("width"); if (widgetWidthResource != null) { - ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(button); // widgetResource => button + ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeWidthReceiver, setWidthChannel, widgetWidthResource); resources = channelAndResourcesForReceiving.get(setWidthChannel); if (resources == null) { @@ -209,7 +201,7 @@ Resource widgetHeightResource = widgetResource.getChildrenMap().get("height"); if (widgetHeightResource != null) { - ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(button); // widgetResource => button + ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeHeightReceiver, setHeightChannel, widgetHeightResource); resources = channelAndResourcesForReceiving.get(setHeightChannel); if (resources == null) { @@ -218,7 +210,7 @@ } resources.put(newWid, widgetHeightResource); } - } else if (type instanceof Constant && ((String)((Constant) type).getValue()).equals("label")) { + } else if (type instanceof Constant && ((String) ((Constant) type).getValue()).equals("label")) { // Add a label component. Expression text = widget.get("text"); Expression x = widget.get("x"); @@ -236,7 +228,7 @@ components.put(newWid, label); // Connect swing component and model. - ComponentVisibilityReceiver nativeVisibilityReceiver = new ComponentVisibilityReceiver(label); // widgetResource => label + ComponentVisibilityReceiver nativeVisibilityReceiver = new ComponentVisibilityReceiver(label); // widgetResource => label simulator.addNativeReceiver(nativeVisibilityReceiver, setVisibleChannel, widgetResource.getChildrenMap().get("visible")); Map resources = channelAndResourcesForReceiving.get(setVisibleChannel); if (resources == null) { @@ -245,7 +237,7 @@ } resources.put(newWid, widgetResource); - ComponentTextReceiver nativeTextReceiver = new ComponentTextReceiver(label); // widgetResource => label + ComponentTextReceiver nativeTextReceiver = new ComponentTextReceiver(label); // widgetResource => label simulator.addNativeReceiver(nativeTextReceiver, setTextChannel, widgetResource.getChildrenMap().get("text")); resources = channelAndResourcesForReceiving.get(setTextChannel); if (resources == null) { @@ -256,7 +248,7 @@ Resource widgetXResource = widgetResource.getChildrenMap().get("x"); if (widgetXResource != null) { - ComponentXReceiver nativeXReceiver = new ComponentXReceiver(label); // widgetResource => label + ComponentXReceiver nativeXReceiver = new ComponentXReceiver(label); // widgetResource => label simulator.addNativeReceiver(nativeXReceiver, setXChannel, widgetXResource); resources = channelAndResourcesForReceiving.get(setXChannel); if (resources == null) { @@ -268,7 +260,7 @@ Resource widgetYResource = widgetResource.getChildrenMap().get("y"); if (widgetYResource != null) { - ComponentYReceiver nativeYReceiver = new ComponentYReceiver(label); // widgetResource => label + ComponentYReceiver nativeYReceiver = new ComponentYReceiver(label); // widgetResource => label simulator.addNativeReceiver(nativeYReceiver, setYChannel, widgetYResource); resources = channelAndResourcesForReceiving.get(setYChannel); if (resources == null) { @@ -280,7 +272,7 @@ Resource widgetWidthResource = widgetResource.getChildrenMap().get("width"); if (widgetWidthResource != null) { - ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(label); // widgetResource => label + ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(label); // widgetResource => label simulator.addNativeReceiver(nativeWidthReceiver, setWidthChannel, widgetWidthResource); resources = channelAndResourcesForReceiving.get(setWidthChannel); if (resources == null) { @@ -292,7 +284,7 @@ Resource widgetHeightResource = widgetResource.getChildrenMap().get("height"); if (widgetHeightResource != null) { - ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(label); // widgetResource => label + ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(label); // widgetResource => label simulator.addNativeReceiver(nativeHeightReceiver, setHeightChannel, widgetHeightResource); resources = channelAndResourcesForReceiving.get(setHeightChannel); if (resources == null) { @@ -301,54 +293,54 @@ } resources.put(newWid, widgetHeightResource); } - } else if (type instanceof Constant && ((String)((Constant) type).getValue()).equals("table")) { + } else if (type instanceof Constant && ((String) ((Constant) type).getValue()).equals("table")) { // Add a label component. Expression text = widget.get("text"); Expression x = widget.get("x"); Expression y = widget.get("y"); Expression width = widget.get("width"); Expression height = widget.get("height"); - MapTerm data = (MapTerm)widget.get("data"); - ListTerm columnsList = (ListTerm)widget.get("columns"); - Constant rowNumExp = (Constant)widget.get("rowNum"); - Constant rowHeightExp = (Constant)widget.get("rowHeight"); + MapTerm data = (MapTerm) widget.get("data"); + ListTerm columnsList = (ListTerm) widget.get("columns"); + Constant rowNumExp = (Constant) widget.get("rowNum"); + Constant rowHeightExp = (Constant) widget.get("rowHeight"); Constant primaryKeyNameExp = (Constant) widget.get("primaryKeyName"); boolean primaryKeyVisible = !primaryKeyNameExp.getValue().equals(""); - + // JLabel label = new JLabel(((String) ((Constant) text).getValue())); int colNum = columnsList.size() + (primaryKeyVisible ? 1 : 0); String[] columns = new String[colNum]; String[][] tableDatas = new String[data.keySet().size()][colNum]; - if(primaryKeyVisible) { - columns[0] = (String)primaryKeyNameExp.getValue(); - for(int i = 1; i < colNum; i++) { - columns[i] = (String)((Constant)columnsList.get(i - 1)).getValue(); + if (primaryKeyVisible) { + columns[0] = (String) primaryKeyNameExp.getValue(); + for (int i = 1; i < colNum; i++) { + columns[i] = (String) ((Constant) columnsList.get(i - 1)).getValue(); } } else { - for(int i = 0; i < colNum; i++) { - columns[i] = (String)((Constant)columnsList.get(i)).getValue(); + for (int i = 0; i < colNum; i++) { + columns[i] = (String) ((Constant) columnsList.get(i)).getValue(); } } int dataCount = 0; - for(String dataKey : data.keySet()) { + for (String dataKey : data.keySet()) { JsonTerm rowData = (JsonTerm) data.get(dataKey); - if(primaryKeyVisible) { + if (primaryKeyVisible) { tableDatas[dataCount][0] = dataKey; - for(int j = 1; j < columns.length; j++) { + for (int j = 1; j < columns.length; j++) { Constant cellValue = (Constant) rowData.get(columns[j]); - if(cellValue == null) { + if (cellValue == null) { tableDatas[dataCount][j] = "error"; } else { - tableDatas[dataCount][j] = (String)((Constant) rowData.get(columns[j])).getValue(); + tableDatas[dataCount][j] = (String) ((Constant) rowData.get(columns[j])).getValue(); } } } else { - for(int j = 0; j < columns.length; j++) { + for (int j = 0; j < columns.length; j++) { Constant cellValue = (Constant) rowData.get(columns[j]); - if(cellValue == null) { + if (cellValue == null) { tableDatas[dataCount][j] = "error"; } else { - tableDatas[dataCount][j] = (String)((Constant) rowData.get(columns[j])).getValue(); + tableDatas[dataCount][j] = (String) ((Constant) rowData.get(columns[j])).getValue(); } } } @@ -373,7 +365,7 @@ components.put(newWid, scroll); // Connect swing component and model. - ComponentVisibilityReceiver nativeVisibilityReceiver = new ComponentVisibilityReceiver(scroll); // widgetResource => label + ComponentVisibilityReceiver nativeVisibilityReceiver = new ComponentVisibilityReceiver(scroll); // widgetResource => label simulator.addNativeReceiver(nativeVisibilityReceiver, setVisibleChannel, widgetResource.getChildrenMap().get("visible")); Map resources = channelAndResourcesForReceiving.get(setVisibleChannel); if (resources == null) { @@ -384,7 +376,7 @@ Resource widgetXResource = widgetResource.getChildrenMap().get("x"); if (widgetXResource != null) { - ComponentXReceiver nativeXReceiver = new ComponentXReceiver(scroll); // widgetResource => label + ComponentXReceiver nativeXReceiver = new ComponentXReceiver(scroll); // widgetResource => label simulator.addNativeReceiver(nativeXReceiver, setXChannel, widgetXResource); resources = channelAndResourcesForReceiving.get(setXChannel); if (resources == null) { @@ -396,7 +388,7 @@ Resource widgetYResource = widgetResource.getChildrenMap().get("y"); if (widgetYResource != null) { - ComponentYReceiver nativeYReceiver = new ComponentYReceiver(scroll); // widgetResource => label + ComponentYReceiver nativeYReceiver = new ComponentYReceiver(scroll); // widgetResource => label simulator.addNativeReceiver(nativeYReceiver, setYChannel, widgetYResource); resources = channelAndResourcesForReceiving.get(setYChannel); if (resources == null) { @@ -408,7 +400,7 @@ Resource widgetWidthResource = widgetResource.getChildrenMap().get("width"); if (widgetWidthResource != null) { - ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(scroll); // widgetResource => label + ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(scroll); // widgetResource => label simulator.addNativeReceiver(nativeWidthReceiver, setWidthChannel, widgetWidthResource); resources = channelAndResourcesForReceiving.get(setWidthChannel); if (resources == null) { @@ -420,7 +412,7 @@ Resource widgetHeightResource = widgetResource.getChildrenMap().get("height"); if (widgetHeightResource != null) { - ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(scroll); // widgetResource => label + ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(scroll); // widgetResource => label simulator.addNativeReceiver(nativeHeightReceiver, setHeightChannel, widgetHeightResource); resources = channelAndResourcesForReceiving.get(setHeightChannel); if (resources == null) { @@ -431,18 +423,18 @@ } Resource widgetDataResource = widgetResource.getChildrenMap().get("data"); - if(widgetDataResource != null ) { - TableDataReceiver tableDataReceiver = new TableDataReceiver(tableModel, columns, (String)((Constant) primaryKeyNameExp).getValue()); + if (widgetDataResource != null) { + TableDataReceiver tableDataReceiver = new TableDataReceiver(tableModel, columns, (String) ((Constant) primaryKeyNameExp).getValue()); simulator.addNativeReceiver(tableDataReceiver, onTableChangedChannel, widgetDataResource); resources = channelAndResourcesForReceiving.get(onTableChangedChannel); - if(resources == null) { + if (resources == null) { resources = new HashMap<>(); channelAndResourcesForReceiving.put(onTableChangedChannel, resources); } resources.put(newWid, widgetDataResource); } - } else if (type instanceof Constant && ((String)((Constant) type).getValue()).equals("textInput")) { + } else if (type instanceof Constant && ((String) ((Constant) type).getValue()).equals("textInput")) { // Add a text input component. Expression x = widget.get("x"); Expression y = widget.get("y"); @@ -459,9 +451,9 @@ components.put(newWid, textField); // Connect swing component and model. ResourcePath resPath = textEventChannel.getOutputResources().iterator().next(); - textField.getDocument().addDocumentListener(new ComponentTextSender(simulator, textEventChannel, resPath, widgetResource)); // textField => widgetResource + textField.getDocument().addDocumentListener(new ComponentTextSender(simulator, textEventChannel, resPath, widgetResource)); // textField => widgetResource - ComponentVisibilityReceiver nativeReceiver = new ComponentVisibilityReceiver(textField); // widgetResource => textField + ComponentVisibilityReceiver nativeReceiver = new ComponentVisibilityReceiver(textField); // widgetResource => textField simulator.addNativeReceiver(nativeReceiver, setVisibleChannel, widgetResource.getChildrenMap().get("visible")); Map resources = channelAndResourcesForReceiving.get(setVisibleChannel); if (resources == null) { @@ -472,7 +464,7 @@ Resource widgetXResource = widgetResource.getChildrenMap().get("x"); if (widgetXResource != null) { - ComponentXReceiver nativeXReceiver = new ComponentXReceiver(textField); // widgetResource => textField + ComponentXReceiver nativeXReceiver = new ComponentXReceiver(textField); // widgetResource => textField simulator.addNativeReceiver(nativeXReceiver, setXChannel, widgetXResource); resources = channelAndResourcesForReceiving.get(setXChannel); if (resources == null) { @@ -484,7 +476,7 @@ Resource widgetYResource = widgetResource.getChildrenMap().get("y"); if (widgetYResource != null) { - ComponentYReceiver nativeYReceiver = new ComponentYReceiver(textField); // widgetResource => textField + ComponentYReceiver nativeYReceiver = new ComponentYReceiver(textField); // widgetResource => textField simulator.addNativeReceiver(nativeYReceiver, setYChannel, widgetYResource); resources = channelAndResourcesForReceiving.get(setYChannel); if (resources == null) { @@ -496,7 +488,7 @@ Resource widgetWidthResource = widgetResource.getChildrenMap().get("width"); if (widgetWidthResource != null) { - ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(textField); // widgetResource => textField + ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(textField); // widgetResource => textField simulator.addNativeReceiver(nativeWidthReceiver, setWidthChannel, widgetWidthResource); resources = channelAndResourcesForReceiving.get(setWidthChannel); if (resources == null) { @@ -508,7 +500,7 @@ Resource widgetHeightResource = widgetResource.getChildrenMap().get("height"); if (widgetHeightResource != null) { - ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(textField); // widgetResource => textField + ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(textField); // widgetResource => textField simulator.addNativeReceiver(nativeHeightReceiver, setHeightChannel, widgetHeightResource); resources = channelAndResourcesForReceiving.get(setHeightChannel); if (resources == null) { @@ -530,7 +522,7 @@ } public class SwingLayout implements INativeReceiver { - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -547,5 +539,5 @@ } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/TableDataReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/TableDataReceiver.java index f2ad1c0..697276a 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/TableDataReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/TableDataReceiver.java @@ -1,5 +1,4 @@ package simulator.interfaces.swing; -import javax.swing.table.DefaultTableModel; import models.algebra.Constant; import models.algebra.Expression; @@ -10,8 +9,10 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; -public class TableDataReceiver implements INativeReceiver{ +import javax.swing.table.DefaultTableModel; +public class TableDataReceiver implements INativeReceiver { + protected DefaultTableModel tableModel; protected String[] columns; protected String primaryKeyName; @@ -28,21 +29,21 @@ public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); System.out.println(message); - if(message instanceof Term) { - MapTerm data = (MapTerm)((Term) message).getChild(0); + if (message instanceof Term) { + MapTerm data = (MapTerm) ((Term) message).getChild(0); int colNum = columns.length + (primaryKeyVisible ? 1 : 0); String[][] tableDatas = new String[data.keySet().size()][colNum]; int dataCount = 0; - for(String dataKey : data.keySet()) { + for (String dataKey : data.keySet()) { JsonTerm rowData = (JsonTerm) data.get(dataKey); - if(primaryKeyVisible) { + if (primaryKeyVisible) { tableDatas[dataCount][0] = dataKey; - for(int j = 1; j < columns.length; j++) { - tableDatas[dataCount][j] = (String)((Constant) rowData.get(columns[j])).getValue(); + for (int j = 1; j < columns.length; j++) { + tableDatas[dataCount][j] = (String) ((Constant) rowData.get(columns[j])).getValue(); } } else { - for(int j = 0; j < columns.length; j++) { - tableDatas[dataCount][j] = (String)((Constant) rowData.get(columns[j])).getValue(); + for (int j = 0; j < columns.length; j++) { + tableDatas[dataCount][j] = (String) ((Constant) rowData.get(columns[j])).getValue(); } } dataCount++; @@ -50,5 +51,5 @@ tableModel.setDataVector(tableDatas, columns); } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerEventSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerEventSender.java index 1dce61c..f3c625c 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerEventSender.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerEventSender.java @@ -1,7 +1,6 @@ package simulator.interfaces.timers; import models.algebra.Expression; -import models.algebra.Term; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferChannel; import simulator.Resource; @@ -9,16 +8,16 @@ import simulator.interfaces.NativeSender; public class TimerEventSender extends NativeSender implements Runnable { - + public TimerEventSender(Simulator simulator, DataTransferChannel channel, ResourcePath resourcePath, Resource resource) { super(simulator, channel, resourcePath, resource); } - + @Override public void run() { Expression message = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); message = (Expression) message.clone(); sendToModel(message); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerService.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerService.java index 1ef8061..8337058 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerService.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerService.java @@ -1,12 +1,5 @@ package simulator.interfaces.timers; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.ScheduledThreadPoolExecutor; - import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; @@ -20,12 +13,19 @@ import simulator.SystemState; import simulator.interfaces.INativeReceiver; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + public class TimerService implements INativeReceiver { public final String timersUpdatedChannelName = "TimersUpdated"; public final String timerEventChannelName = "TimerEvent"; - + protected final Simulator simulator; - protected final Map timers; + protected final Map timers; protected DataTransferChannel timersUpdatedChannel; protected DataTransferChannel timerEventChannel; @@ -54,15 +54,15 @@ // If the set of timers is changed. // Remove old timers and their native receivers. - for (String tid: oldTidSet) { + for (String tid : oldTidSet) { ScheduledThreadPoolExecutor timer = timers.get(tid); timer.shutdown(); timers.remove(tid); } - + // Add new timers. Resource timersResource = nextSystemState.getResource(event.getInputResource().getResourceIdentifier()); - for (String tid: newTidSet) { + for (String tid : newTidSet) { Expression value = nextTimers.get(tid); if (value instanceof JsonTerm) { JsonTerm timerValue = (JsonTerm) value; @@ -75,7 +75,7 @@ // Connect Java timer and model. ResourcePath resPath = timerEventChannel.getOutputResources().iterator().next(); - TimerEventSender sender = new TimerEventSender(simulator, timerEventChannel, resPath, timerResource); // timer => timerResource + TimerEventSender sender = new TimerEventSender(simulator, timerEventChannel, resPath, timerResource); // timer => timerResource timer.scheduleAtFixedRate(sender, 0, interval, TimeUnit.MILLISECONDS); } } @@ -94,7 +94,7 @@ timerEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(timerEventChannelName); simulator.addNativeReceiver(this, timerStartChannel); } - + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); @@ -111,7 +111,7 @@ } } } - + public class TimerClear implements INativeReceiver { public final String timerClearChannelName = "TimerClear"; protected DataTransferChannel timerClearChannel; diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/CompositeResourceState.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/CompositeResourceState.java index b445d14..7809cf0 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/CompositeResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/CompositeResourceState.java @@ -9,6 +9,8 @@ } public abstract Map getChildStates(); + public abstract void clearChildStates(); + 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 6ba7256..7b46931 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/JsonResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/JsonResourceState.java @@ -1,22 +1,20 @@ package simulator.states; -import java.util.HashMap; -import java.util.Map; - -import models.algebra.Constant; import models.algebra.Expression; -import models.algebra.Term; import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.JsonTerm; +import java.util.HashMap; +import java.util.Map; + public class JsonResourceState extends CompositeResourceState { private Map children = new HashMap<>(); - + @Override public Expression getValue() { JsonTerm value = new JsonTerm(); value.setType(DataConstraintModel.typeJson); - for (Map.Entry childEnt: children.entrySet()) { + for (Map.Entry childEnt : children.entrySet()) { value.addMember(childEnt.getKey(), childEnt.getValue().getValue()); } return value; @@ -26,7 +24,7 @@ public Map getChildStates() { return children; } - + public void addChildState(String param, ResourceState childState) { children.put(param, childState); } @@ -34,14 +32,14 @@ public void removeChildState(String param) { children.remove(param); } - + public void clearChildStates() { children.clear(); } - + @Override public void replaceChildState(ResourceState state, ResourceState newState) { - for (Map.Entry childEnt: children.entrySet()) { + for (Map.Entry childEnt : children.entrySet()) { if (childEnt.getValue().equals(state)) { children.put(childEnt.getKey(), newState); } @@ -50,7 +48,7 @@ public Object clone() { JsonResourceState newJsonResourceState = new JsonResourceState(); - for (String key: children.keySet()) { + for (String key : children.keySet()) { newJsonResourceState.children.put(key, (ResourceState) children.get(key).clone()); } return newJsonResourceState; diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/ListResourceState.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/ListResourceState.java index d45f9d2..ad10cec 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/ListResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/ListResourceState.java @@ -1,23 +1,20 @@ package simulator.states; +import models.algebra.Expression; +import models.dataConstraintModel.ListTerm; + import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Term; -import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.ListTerm; - public class ListResourceState extends CompositeResourceState { private List children = new ArrayList<>(); @Override public Expression getValue() { ListTerm value = new ListTerm(); - for (ResourceState child: children) { + for (ResourceState child : children) { value.append(child.getValue()); } return value; @@ -31,7 +28,7 @@ } return childParams; } - + public void addChildState(ResourceState childState) { children.add(childState); } @@ -39,11 +36,11 @@ public void removeChildState(int idx) { children.remove(idx); } - + public void clearChildStates() { children.clear(); } - + @Override public void replaceChildState(ResourceState state, ResourceState newState) { for (int i = 0; i < children.size(); i++) { @@ -59,7 +56,7 @@ public Object clone() { ListResourceState newListResourceState = new ListResourceState(); - for (ResourceState state: children) { + for (ResourceState state : children) { newListResourceState.children.add((ResourceState) state.clone()); } return newListResourceState; diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/MapResourceState.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/MapResourceState.java index 6ceecf4..f341703 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/MapResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/MapResourceState.java @@ -1,14 +1,12 @@ package simulator.states; -import java.util.HashMap; -import java.util.Map; - -import models.algebra.Constant; import models.algebra.Expression; -import models.algebra.Term; import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.MapTerm; +import java.util.HashMap; +import java.util.Map; + public class MapResourceState extends CompositeResourceState { private Map children = new HashMap<>(); @@ -16,7 +14,7 @@ public Expression getValue() { MapTerm value = new MapTerm(); value.setType(DataConstraintModel.typeMap); - for (Map.Entry childEnt: children.entrySet()) { + for (Map.Entry childEnt : children.entrySet()) { value.insert(childEnt.getKey(), childEnt.getValue().getValue()); } return value; @@ -26,7 +24,7 @@ public Map getChildStates() { return children; } - + public void addChildState(String param, ResourceState childState) { children.put(param, childState); } @@ -34,14 +32,14 @@ public void removeChildState(String param) { children.remove(param); } - + public void clearChildStates() { children.clear(); } - + @Override public void replaceChildState(ResourceState state, ResourceState newState) { - for (Map.Entry childEnt: children.entrySet()) { + for (Map.Entry childEnt : children.entrySet()) { if (childEnt.getValue().equals(state)) { children.put(childEnt.getKey(), newState); } @@ -50,7 +48,7 @@ public Object clone() { MapResourceState newMapResourceState = new MapResourceState(); - for (String key: children.keySet()) { + for (String key : children.keySet()) { newMapResourceState.children.put(key, (ResourceState) children.get(key).clone()); } return newMapResourceState; diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/PrimitiveResourceState.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/PrimitiveResourceState.java index 19db331..eaa02da 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/PrimitiveResourceState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/PrimitiveResourceState.java @@ -19,7 +19,7 @@ public void setValue(Constant newValue) { value = newValue; } - + @Override boolean hasChildren() { return false; diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/states/State.java b/AlgebraicDataflowArchitectureModel/src/simulator/states/State.java index 00883d9..eaf83cc 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/states/State.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/states/State.java @@ -4,10 +4,12 @@ /** * A state of a resource + * * @author Nitta * */ abstract public class State implements Cloneable { abstract public Expression getValue(); + abstract public Object clone(); } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/DataConstraintModelTest.java b/AlgebraicDataflowArchitectureModel/src/tests/DataConstraintModelTest.java index b84e563..fee2aba 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/DataConstraintModelTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/DataConstraintModelTest.java @@ -1,41 +1,43 @@ package tests; -import static org.junit.Assert.*; - +import models.algebra.Variable; +import models.dataConstraintModel.Channel; +import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.DataConstraintModel; +import models.dataConstraintModel.ResourcePath; import org.junit.Test; -import models.algebra.Variable; -import models.dataConstraintModel.*; +import static org.junit.Assert.assertEquals; public class DataConstraintModelTest { - + @Test public void test() { // Construct a data constraint architecture model. DataConstraintModel model = new DataConstraintModel(); - ResourcePath customers = new ResourcePath("customers"); // "customers" - ResourcePath customer = new ResourcePath(customers, new Variable("uid")); // "customers.{uid}" - ResourcePath customer_off = new ResourcePath(customer, "off"); // "customers.{uid}.off" - ResourcePath customer_add = new ResourcePath(customer, "add"); // "customers.{uid}.add" - ResourcePath companies = new ResourcePath("companies"); // "companies" - ResourcePath company = new ResourcePath(companies, new Variable("cid")); // "companies.{cid}" - ResourcePath company_add = new ResourcePath(company, "add"); // "companies.{cid}.add" + ResourcePath customers = new ResourcePath("customers"); // "customers" + ResourcePath customer = new ResourcePath(customers, new Variable("uid")); // "customers.{uid}" + ResourcePath customer_off = new ResourcePath(customer, "off"); // "customers.{uid}.off" + ResourcePath customer_add = new ResourcePath(customer, "add"); // "customers.{uid}.add" + ResourcePath companies = new ResourcePath("companies"); // "companies" + ResourcePath company = new ResourcePath(companies, new Variable("cid")); // "companies.{cid}" + ResourcePath company_add = new ResourcePath(company, "add"); // "companies.{cid}.add" model.addResourcePath(customer_off); model.addResourcePath(customer_add); model.addResourcePath(company_add); - Channel cio_setCustomerOff = new Channel("CIO_SetCustomerOff", new Variable("uid")); // set customer's office + Channel cio_setCustomerOff = new Channel("CIO_SetCustomerOff", new Variable("uid")); // set customer's office ChannelMember customer_off_1 = new ChannelMember(customer_off); cio_setCustomerOff.addChannelMember(customer_off_1); assertEquals(customer_off.getPathParams().get(0), cio_setCustomerOff.getSelectors().iterator().next().getExpression()); - Channel cio_setCompanyAdd = new Channel("CIO_SetCompanyAdd", new Variable("cid")); // set companie's address + Channel cio_setCompanyAdd = new Channel("CIO_SetCompanyAdd", new Variable("cid")); // set companie's address ChannelMember company_add_1 = new ChannelMember(company_add); - cio_setCompanyAdd.addChannelMember(company_add_1); + cio_setCompanyAdd.addChannelMember(company_add_1); assertEquals(company_add.getPathParams().get(0), cio_setCompanyAdd.getSelectors().iterator().next().getExpression()); - Channel c = new Channel("c", new Variable("uid")); // update customer's address + Channel c = new Channel("c", new Variable("uid")); // update customer's address ChannelMember customer_off_2 = new ChannelMember(customer_off); ChannelMember company_add_2 = new ChannelMember(company_add); ChannelMember customer_add_2 = new ChannelMember(customer_add); @@ -56,5 +58,5 @@ assertEquals(2, model.getInputChannels().size()); assertEquals(1, model.getChannels().size()); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java b/AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java index 9ba67ab..225639b 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java @@ -1,6 +1,15 @@ package tests; -import static org.junit.Assert.*; +import algorithms.DataTransferModelAnalyzer; +import generators.DataTransferMethodAnalyzer; +import models.Node; +import models.dataFlowModel.DataFlowGraph; +import models.dataFlowModel.DataTransferModel; +import models.dataFlowModel.ResourceNode; +import models.dataFlowModel.StoreAttribute; +import org.junit.Test; +import parser.Parser; +import parser.exceptions.*; import java.io.BufferedReader; import java.io.File; @@ -8,29 +17,8 @@ import java.io.FileReader; import java.util.HashMap; -import org.junit.Test; - -import algorithms.*; -import generators.DataTransferMethodAnalyzer; -import models.Node; -import models.dataFlowModel.*; -import parser.*; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; public class DataStorageDecisionTest { @@ -51,7 +39,7 @@ DataFlowGraph graph = DataTransferModelAnalyzer.createDataFlowGraphWithStateStoringAttribute(model); DataTransferModelAnalyzer.annotateWithSelectableDataTransferAttiribute(graph); DataTransferMethodAnalyzer.decideToStoreResourceStates(graph); - for(Node resNode: graph.getResourceNodes()) { + for (Node resNode : graph.getResourceNodes()) { String resName = ((ResourceNode) resNode).getResourceName(); boolean decision = ((StoreAttribute) ((ResourceNode) resNode).getAttribute()).isStored(); System.out.println(resName + ":" + decision); @@ -59,8 +47,9 @@ assertEquals(decision, exprectedDecision.get(resName)); } } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket | + WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } catch (FileNotFoundException e) { diff --git a/AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java b/AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java index 5d2c4d8..5bb65ef 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java @@ -1,7 +1,14 @@ package tests; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import algorithms.DataTransferModelAnalyzer; +import models.Node; +import models.dataFlowModel.DataFlowGraph; +import models.dataFlowModel.DataTransferModel; +import models.dataFlowModel.ResourceNode; +import models.dataFlowModel.StoreAttribute; +import org.junit.Test; +import parser.Parser; +import parser.exceptions.*; import java.io.BufferedReader; import java.io.File; @@ -9,28 +16,8 @@ import java.io.FileReader; import java.util.HashMap; -import org.junit.Test; - -import algorithms.DataTransferModelAnalyzer; -import models.Node; -import models.dataFlowModel.*; -import parser.Parser; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; public class DataStorageNecessityTest { @@ -49,21 +36,22 @@ model = parser.doParse(); System.out.println(model); DataFlowGraph graph = DataTransferModelAnalyzer.createDataFlowGraphWithStateStoringAttribute(model); - for (Node n: graph.getNodes()) { + for (Node n : graph.getNodes()) { if (n instanceof ResourceNode) { ResourceNode resource = (ResourceNode) n; - if((StoreAttribute) resource.getAttribute() != null) { + if ((StoreAttribute) resource.getAttribute() != null) { String resName = resource.getResourceName(); boolean necessity = ((StoreAttribute) resource.getAttribute()).isNeeded(); - System.out.println(resName + ":" + necessity); + System.out.println(resName + ":" + necessity); assertNotNull(exprectedNecessity.get(resName)); assertEquals(necessity, exprectedNecessity.get(resName)); } } } } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket | + WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } catch (FileNotFoundException e) { diff --git a/AlgebraicDataflowArchitectureModel/src/tests/DataTransferModelTest.java b/AlgebraicDataflowArchitectureModel/src/tests/DataTransferModelTest.java index 0f4575b..5c9bc49 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/DataTransferModelTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/DataTransferModelTest.java @@ -1,37 +1,39 @@ package tests; -import static org.junit.Assert.*; - +import models.Edge; +import models.algebra.Variable; +import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.ResourcePath; +import models.dataFlowModel.DataFlowGraph; +import models.dataFlowModel.DataTransferChannel; +import models.dataFlowModel.DataTransferModel; import org.junit.Test; -import models.*; -import models.algebra.Variable; -import models.dataConstraintModel.*; -import models.dataFlowModel.*; +import static org.junit.Assert.assertEquals; public class DataTransferModelTest { - + @Test public void test() { // Construct a data-flow architecture model. DataTransferModel model = new DataTransferModel(); - ResourcePath customers = new ResourcePath("customers"); // "customers" - ResourcePath customer = new ResourcePath(customers, new Variable("uid")); // "customers.{uid}" - ResourcePath customer_off = new ResourcePath(customer, "off"); // "customers.{uid}.off" - ResourcePath customer_add = new ResourcePath(customer, "add"); // "customers.{uid}.add" - ResourcePath companies = new ResourcePath("companies"); // "companies" - ResourcePath company = new ResourcePath(companies, new Variable("cid")); // "companies.{cid}" - ResourcePath company_add = new ResourcePath(company, "add"); // "companies.{cid}.add" + ResourcePath customers = new ResourcePath("customers"); // "customers" + ResourcePath customer = new ResourcePath(customers, new Variable("uid")); // "customers.{uid}" + ResourcePath customer_off = new ResourcePath(customer, "off"); // "customers.{uid}.off" + ResourcePath customer_add = new ResourcePath(customer, "add"); // "customers.{uid}.add" + ResourcePath companies = new ResourcePath("companies"); // "companies" + ResourcePath company = new ResourcePath(companies, new Variable("cid")); // "companies.{cid}" + ResourcePath company_add = new ResourcePath(company, "add"); // "companies.{cid}.add" model.addResourcePath(customer_off); model.addResourcePath(customer_add); model.addResourcePath(company_add); - + // === cio_setCustomerOff(uid) === // // out customers.{uid}.off(c, set(x)) = x // - DataTransferChannel cio_setCustomerOff = new DataTransferChannel("CIO_SetCustomerOff", new Variable("uid")); // set customer's office (an input channel) + DataTransferChannel cio_setCustomerOff = new DataTransferChannel("CIO_SetCustomerOff", new Variable("uid")); // set customer's office (an input channel) ChannelMember customer_off_1 = new ChannelMember(customer_off); cio_setCustomerOff.addChannelMemberAsOutput(customer_off_1); assertEquals(customer_off.getPathParams().get(0), cio_setCustomerOff.getSelectors().iterator().next().getExpression()); @@ -40,9 +42,9 @@ // // out companies.{cid}.add(a, set(y)) = y // - DataTransferChannel cio_setCompanyAdd = new DataTransferChannel("CIO_SetCompanyAdd", new Variable("cid")); // set companie's address (an input channel) + DataTransferChannel cio_setCompanyAdd = new DataTransferChannel("CIO_SetCompanyAdd", new Variable("cid")); // set companie's address (an input channel) ChannelMember company_add_1 = new ChannelMember(company_add); - cio_setCompanyAdd.addChannelMemberAsOutput(company_add_1); + cio_setCompanyAdd.addChannelMemberAsOutput(company_add_1); assertEquals(company_add.getPathParams().get(0), cio_setCompanyAdd.getSelectors().iterator().next().getExpression()); // === c === @@ -51,7 +53,7 @@ // in companies.{cid}.add( a, update(cid, a2)) = a2 // out customers.{uid}.add(b, update(cid, a2)) = a2 // - DataTransferChannel c = new DataTransferChannel("c", new Variable("uid")); // update customer's address + DataTransferChannel c = new DataTransferChannel("c", new Variable("uid")); // update customer's address ChannelMember customer_off_2 = new ChannelMember(customer_off); ChannelMember company_add_2 = new ChannelMember(company_add); ChannelMember customer_add_2 = new ChannelMember(customer_add); @@ -80,9 +82,9 @@ assertEquals(7, resourceDependencyGraph.getResourceNodes().size()); assertEquals(3, resourceDependencyGraph.getChannelNodes().size()); assertEquals(5, resourceDependencyGraph.getEdges().size()); - for (Edge e: resourceDependencyGraph.getEdges()) { + for (Edge e : resourceDependencyGraph.getEdges()) { System.out.println(e.getSource() + "-(" + e + ")->" + e.getDestination()); } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/DirectedGraphTest.java b/AlgebraicDataflowArchitectureModel/src/tests/DirectedGraphTest.java index 4f6db8e..5eb5032 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/DirectedGraphTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/DirectedGraphTest.java @@ -1,13 +1,14 @@ package tests; -import static org.junit.Assert.*; - +import models.DirectedGraph; +import models.Edge; +import models.Node; import org.junit.Test; -import models.*; +import static org.junit.Assert.assertEquals; public class DirectedGraphTest { - + @Test public void test() { // Build a directed graph. @@ -41,7 +42,7 @@ assertEquals(1, n4.getOutdegree()); // Remove an edge. - g.removeEdge(e5); + g.removeEdge(e5); // Re-check the number of nodes. assertEquals(4, g.getNodes().size()); // Re-check the number of edges. @@ -56,5 +57,5 @@ assertEquals(1, n4.getIndegree()); assertEquals(1, n4.getOutdegree()); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java b/AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java index b88f7c3..e6b6683 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java @@ -1,31 +1,19 @@ package tests; +import algorithms.DataTransferModelAnalyzer; +import models.Edge; +import models.dataFlowModel.DataFlowEdge; +import models.dataFlowModel.DataFlowGraph; +import models.dataFlowModel.DataTransferModel; +import models.dataFlowModel.PushPullAttribute; +import parser.Parser; +import parser.exceptions.*; + import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; -import algorithms.*; -import models.Edge; -import models.dataFlowModel.*; -import parser.*; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; - public class EdgeTransitionSelectableTest { public static void main(String[] args) { File file = new File("models/POS2.model"); @@ -37,13 +25,14 @@ System.out.println(model); DataFlowGraph graph = DataTransferModelAnalyzer.createDataFlowGraphWithStateStoringAttribute(model); DataTransferModelAnalyzer.annotateWithSelectableDataTransferAttiribute(graph); - for(Edge e:graph.getEdges()) { + for (Edge e : graph.getEdges()) { DataFlowEdge re = (DataFlowEdge) e; - System.out.println(re.getSource() + "-" + re.getDestination() + ":" + ((PushPullAttribute)(re.getAttribute())).getOptions()); + System.out.println(re.getSource() + "-" + re.getDestination() + ":" + ((PushPullAttribute) (re.getAttribute())).getOptions()); } } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket | + WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } catch (FileNotFoundException e) { diff --git a/AlgebraicDataflowArchitectureModel/src/tests/FormulaChannelTest.java b/AlgebraicDataflowArchitectureModel/src/tests/FormulaChannelTest.java index 6bf26f4..e7a9c87 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/FormulaChannelTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/FormulaChannelTest.java @@ -1,16 +1,13 @@ package tests; -import org.junit.Test; - -import models.algebra.Symbol; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.DataConstraintModel; -import models.dataConstraintModel.ResourceHierarchy; import models.dataConstraintModel.ResourcePath; import models.visualModel.FormulaChannel; +import org.junit.Test; public class FormulaChannelTest { - + @Test public void test() { ResourcePath res1 = new ResourcePath("r1"); @@ -52,5 +49,5 @@ System.out.println(ch2.getSourceText()); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/GraphicalViewer.java b/AlgebraicDataflowArchitectureModel/src/tests/GraphicalViewer.java index 95c7e05..cece7ad 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/GraphicalViewer.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/GraphicalViewer.java @@ -1,61 +1,40 @@ package tests; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.EventObject; -import java.util.Map; - -import javax.swing.BorderFactory; -import javax.swing.CellRendererPane; -import javax.swing.JComboBox; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JScrollPane; -import javax.swing.border.BevelBorder; - -import com.mxgraph.canvas.mxICanvas; -import com.mxgraph.canvas.mxImageCanvas; import com.mxgraph.model.mxCell; import com.mxgraph.model.mxGeometry; import com.mxgraph.model.mxIGraphModel; -import com.mxgraph.shape.mxITextShape; import com.mxgraph.swing.mxGraphComponent; -import com.mxgraph.swing.handler.mxRubberband; -import com.mxgraph.swing.view.mxCellEditor; import com.mxgraph.swing.view.mxICellEditor; -import com.mxgraph.swing.view.mxInteractiveCanvas; import com.mxgraph.util.mxConstants; import com.mxgraph.util.mxPoint; import com.mxgraph.util.mxUtils; import com.mxgraph.view.mxCellState; import com.mxgraph.view.mxGraph; -public class GraphicalViewer extends JFrame -{ +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.EventObject; +public class GraphicalViewer extends JFrame { + /** - * + * */ private static final long serialVersionUID = -844106998814982739L; final int PORT_DIAMETER = 8; final int PORT_RADIUS = PORT_DIAMETER / 2; - - public GraphicalViewer() - { + + public GraphicalViewer() { super("Graphical Viewer"); - + // Demonstrates the use of a Swing component for rendering vertices. // Note: Use the heavyweight feature to allow for event handling in // the Swing component that is used for rendering the vertex. - + mxGraph graph = new mxGraph() { public boolean isPort(Object cell) { mxGeometry geo = getCellGeometry(cell); @@ -67,9 +46,9 @@ return false; } }; - + Object parent = graph.getDefaultParent(); - + graph.getModel().beginUpdate(); try { mxGeometry geo1 = new mxGeometry(0, 0.5, PORT_DIAMETER, PORT_DIAMETER); @@ -82,7 +61,7 @@ Object c1 = graph.insertVertex(parent, null, "c1", 150, 20, 30, 30); mxCell c1_in = new mxCell(null, geo1, "shape=ellipse;perimter=ellipsePerimeter"); - c1_in.setVertex(true); + c1_in.setVertex(true); graph.addCell(c1_in, c1); mxCell c1_out = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); c1_out.setVertex(true); @@ -90,7 +69,7 @@ Object c2 = graph.insertVertex(parent, null, "c2", 150, 100, 30, 30); mxCell c2_in = new mxCell(null, geo1, "shape=ellipse;perimter=ellipsePerimeter"); - c2_in.setVertex(true); + c2_in.setVertex(true); graph.addCell(c2_in, c2); mxCell c2_out = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); c2_out.setVertex(true); @@ -108,13 +87,13 @@ } finally { graph.getModel().endUpdate(); } - - mxGraphComponent graphComponent = new mxGraphComponent(graph) { + + mxGraphComponent graphComponent = new mxGraphComponent(graph) { protected mxICellEditor createCellEditor() { final mxGraphComponent graphComponent = this; return new mxICellEditor() { /** - * + * */ public int DEFAULT_MIN_WIDTH = 70; public int DEFAULT_MIN_HEIGHT = 30; @@ -132,13 +111,13 @@ public Object getEditingCell() { return editingCell; } - + @Override public void startEditing(Object cell, EventObject evt) { if (editingCell != null) { stopEditing(true); } - + mxCellState state = graphComponent.getGraph().getView().getState(cell); if (state != null && state.getLabel() != null && !state.getLabel().equals("")) { editingCell = cell; @@ -156,7 +135,7 @@ comboBox.updateUI(); } } - + @Override public void stopEditing(boolean cancel) { if (editingCell != null) { @@ -171,12 +150,12 @@ mxCellState state = graphComponent.getGraph().getView().getState(cell); graphComponent.redraw(state); } - + if (comboBox.getParent() != null) { comboBox.setVisible(false); comboBox.getParent().remove(comboBox); } - + graphComponent.requestFocusInWindow(); } } @@ -184,44 +163,44 @@ public String getCurrentValue() { return (String) comboBox.getSelectedItem(); } - + /** * Returns the bounds to be used for the editor. */ public Rectangle getEditorBounds(mxCellState state, double scale) { mxIGraphModel model = state.getView().getGraph().getModel(); Rectangle bounds = null; - + bounds = state.getLabelBounds().getRectangle(); bounds.height += 10; - + // Applies the horizontal and vertical label positions if (model.isVertex(state.getCell())) { String horizontal = mxUtils.getString(state.getStyle(), mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER); - + if (horizontal.equals(mxConstants.ALIGN_LEFT)) { bounds.x -= state.getWidth(); } else if (horizontal.equals(mxConstants.ALIGN_RIGHT)) { bounds.x += state.getWidth(); } - + String vertical = mxUtils.getString(state.getStyle(), mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE); - + if (vertical.equals(mxConstants.ALIGN_TOP)) { bounds.y -= state.getHeight(); } else if (vertical.equals(mxConstants.ALIGN_BOTTOM)) { bounds.y += state.getHeight(); } } - + bounds.setSize( (int) Math.max(bounds.getWidth(), Math.round(minimumWidth * scale)), (int) Math.max(bounds.getHeight(), Math.round(minimumHeight * scale))); - + return bounds; } }; @@ -238,23 +217,23 @@ }; graphComponent.getGraphControl().addMouseListener(new MouseAdapter() { - + public void mouseReleased(MouseEvent e) { Object cell = graphComponent.getCellAt(e.getX(), e.getY()); if (cell != null) { - System.out.println("cell="+graph.getLabel(cell)); + System.out.println("cell=" + graph.getLabel(cell)); } } }); getContentPane().add(graphComponent); } - + public static void main(String[] args) { GraphicalViewer frame = new GraphicalViewer(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 320); frame.setVisible(true); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/InverseTest.java b/AlgebraicDataflowArchitectureModel/src/tests/InverseTest.java index 0d0efe1..f1eafff 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/InverseTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/InverseTest.java @@ -1,17 +1,5 @@ package tests; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.HashMap; - -import org.junit.Test; - import models.algebra.Expression; import models.algebra.Position; import models.algebra.Term; @@ -19,6 +7,7 @@ import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.JsonType; import models.dataFlowModel.DataTransferModel; +import org.junit.Test; import parser.Parser; import parser.Parser.TokenStream; import parser.exceptions.ExpectedColon; @@ -26,6 +15,10 @@ import parser.exceptions.ExpectedRightBracket; import parser.exceptions.WrongJsonExpression; +import java.util.HashMap; + +import static org.junit.Assert.*; + public class InverseTest { @Test public void test() { @@ -36,19 +29,19 @@ TokenStream stream = new Parser.TokenStream(); Parser parser = new Parser(stream); - stream.addLine(rhs); - + stream.addLine(rhs); + Expression rhsExp = parser.parseTerm(stream, model); System.out.println("=== solve{" + lhs + " = " + rhsExp + "} for a, b, d, x ==="); - + HashMap rhsVars = rhsExp.getVariables(); assertEquals(4, rhsVars.size()); - + // Solve {y = (a * x + b) + c} for a, b, c, x Variable y = new Variable(lhs); - for (Position vPos: rhsVars.keySet()) { + for (Position vPos : rhsVars.keySet()) { Variable v = rhsVars.get(vPos); - Expression inv = rhsExp.getInverseMap(y, vPos); // inverse map to get v back from the output value y + Expression inv = rhsExp.getInverseMap(y, vPos); // inverse map to get v back from the output value y assertTrue(inv.contains(y)); assertFalse(inv.contains(v)); System.out.println(rhsVars.get(vPos) + " = " + inv); @@ -78,16 +71,16 @@ Variable z = new Variable("z"); System.out.println("=== solve{" + z + " = " + rhsExp3 + "} for x ==="); HashMap rhsVars3 = rhsExp3.getVariables(); - for (Position vPos: rhsVars3.keySet()) { + for (Position vPos : rhsVars3.keySet()) { Variable v = rhsVars3.get(vPos); - Expression inv = rhsExp3.getInverseMap(z, vPos); // inverse map to get v back from the output value z + Expression inv = rhsExp3.getInverseMap(z, vPos); // inverse map to get v back from the output value z if (inv instanceof Term) { inv = ((Term) inv).reduce(); } assertTrue(inv.contains(z)); assertFalse(inv.contains(v)); System.out.println(rhsVars3.get(vPos) + " = " + inv); - } + } // Solve {z = x.id} for x TokenStream stream4 = new Parser.TokenStream(); @@ -96,7 +89,7 @@ Expression rhsExp4 = parser4.parseTerm(stream4, model); System.out.println("=== solve{" + z + " = " + rhsExp4 + "} for x ==="); HashMap rhsVars4 = rhsExp4.getVariables(); - for (Position vPos: rhsVars4.keySet()) { + for (Position vPos : rhsVars4.keySet()) { Variable v = rhsVars4.get(vPos); if (x.getName().equals("x")) { JsonType jsonType = new JsonType("Json", "HashMap<>", DataConstraintModel.typeJson); @@ -104,14 +97,14 @@ jsonType.addMemberType("name", DataConstraintModel.typeString); v.setType(jsonType); } - Expression inv = rhsExp4.getInverseMap(z, vPos); // inverse map to get v back from the output value z + Expression inv = rhsExp4.getInverseMap(z, vPos); // inverse map to get v back from the output value z if (inv instanceof Term) { inv = ((Term) inv).reduce(); } System.out.println(rhsVars4.get(vPos) + " = " + inv); assertTrue(inv.contains(z)); assertFalse(inv.contains(v)); - } + } } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/JAXRSCodeGeneratorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/JAXRSCodeGeneratorTest.java index 9df8290..9d10492 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/JAXRSCodeGeneratorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/JAXRSCodeGeneratorTest.java @@ -1,55 +1,25 @@ package tests; -import static org.junit.Assert.*; +import algorithms.DataTransferModelAnalyzer; +import algorithms.TypeInference; +import code.ast.*; +import generators.DataTransferMethodAnalyzer; +import generators.JerseyCodeGenerator; +import generators.JerseyMethodBodyGenerator; +import models.Edge; +import models.dataFlowModel.*; +import org.junit.Test; +import parser.Parser; +import parser.exceptions.*; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; -import org.junit.Test; - -import algorithms.*; -import code.ast.Annotation; -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; -import generators.CodeGeneratorFromDataFlowGraph; -import generators.DataTransferMethodAnalyzer; -import generators.JavaCodeGenerator; -import generators.JavaMethodBodyGenerator; -import generators.JavaSpecific; -import generators.JerseyCodeGenerator; -import generators.JerseyMethodBodyGenerator; -import generators.JerseySpecific; -import models.Edge; -import models.dataFlowModel.*; -import parser.*; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; +import static org.junit.Assert.*; public class JAXRSCodeGeneratorTest { @@ -71,67 +41,67 @@ private void testAccounts() { try { ArrayList generatedCode = generateCode("models/Accounts.model", null); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "List")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("List", - Map.entry(List.of(), - 1)))), - Map.entry("getAccount", Map.entry(Set.of(), - Map.entry("Account", - Map.entry(List.of("int"), - 1)))), - Map.entry("getNameValue", Map.entry(Set.of("@Path(\"/{uid}/name\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("int"), - 1)))), - Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{uid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("int"), - 1)))), - Map.entry("changeName", Map.entry(Set.of("@Path(\"/{uid}/name\")","@PUT"), - Map.entry("void", - Map.entry(List.of("int","String"), - 1)))), - Map.entry("signup", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "List")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("List", + Map.entry(List.of(), + 1)))), + Map.entry("getAccount", Map.entry(Set.of(), + Map.entry("Account", + Map.entry(List.of("int"), + 1)))), + Map.entry("getNameValue", Map.entry(Set.of("@Path(\"/{uid}/name\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("int"), + 1)))), + Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{uid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("int"), + 1)))), + Map.entry("changeName", Map.entry(Set.of("@Path(\"/{uid}/name\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("int", "String"), + 1)))), + Map.entry("signup", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); exprectedStructure.put("Account", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("name", "String")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getName", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("changeName", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("int","String"), - 1)))), - Map.entry("Account", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("name", "String")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getName", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("changeName", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("int", "String"), + 1)))), + Map.entry("Account", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -140,48 +110,48 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/Clock.model", PushPullValue.PULL); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Hour", Map.entry(Set.of("@Path(\"/hour\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "int")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromMin", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("int"), - 1)))))))); - exprectedStructure.put("Min", Map.entry(Set.of("@Path(\"/min\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("tick", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of(), - 3)))))))); - exprectedStructure.put("Min_ang", Map.entry(Set.of("@Path(\"/min_ang\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 2)))))))); - exprectedStructure.put("Hour_ang", Map.entry(Set.of("@Path(\"/hour_ang\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 2)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Hour", Map.entry(Set.of("@Path(\"/hour\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "int")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromMin", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("int"), + 1)))))))); + exprectedStructure.put("Min", Map.entry(Set.of("@Path(\"/min\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("tick", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of(), + 3)))))))); + exprectedStructure.put("Min_ang", Map.entry(Set.of("@Path(\"/min_ang\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 2)))))))); + exprectedStructure.put("Hour_ang", Map.entry(Set.of("@Path(\"/hour_ang\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 2)))))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); @@ -189,56 +159,56 @@ // check PUSH-first generatedCode = generateCode("models/Clock.model", PushPullValue.PUSH); exprectedStructure.clear(); - exprectedStructure.put("Hour_ang", Map.entry(Set.of("@Path(\"/hour_ang\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "double")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromHour", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("int"), - 1)))))))); - exprectedStructure.put("Hour", Map.entry(Set.of("@Path(\"/hour\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromMin", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("int"), - 3)))))))); - exprectedStructure.put("Min", Map.entry(Set.of("@Path(\"/min\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("tick", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of(), - 5)))))))); - exprectedStructure.put("Min_ang", Map.entry(Set.of("@Path(\"/min_ang\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "double")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromMin", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("int"), - 1)))))))); + exprectedStructure.put("Hour_ang", Map.entry(Set.of("@Path(\"/hour_ang\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "double")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromHour", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("int"), + 1)))))))); + exprectedStructure.put("Hour", Map.entry(Set.of("@Path(\"/hour\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromMin", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("int"), + 3)))))))); + exprectedStructure.put("Min", Map.entry(Set.of("@Path(\"/min\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("tick", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of(), + 5)))))))); + exprectedStructure.put("Min_ang", Map.entry(Set.of("@Path(\"/min_ang\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "double")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromMin", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("int"), + 1)))))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -246,120 +216,120 @@ private void testCustomerManagement() { try { ArrayList generatedCode = generateCode("models/CustomerManagement.model", null); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Companies", Map.entry(Set.of("@Path(\"/companies\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getCompany", Map.entry(Set.of(), - Map.entry("Company", - Map.entry(List.of("String"), - 1)))), - Map.entry("getAddressValue", Map.entry(Set.of("@Path(\"/{cid}/address\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("getCompanyValue", Map.entry(Set.of("@Path(\"/{cid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("setAddress", Map.entry(Set.of("@Path(\"/{cid}/address\")","@PUT"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("addCampany", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))))); - exprectedStructure.put("Customers", Map.entry(Set.of("@Path(\"/customers\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getCustomer", Map.entry(Set.of(), - Map.entry("Customer", - Map.entry(List.of("String"), - 1)))), - Map.entry("getAddressValue", Map.entry(Set.of("@Path(\"/{uid}/address\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("getCustomerValue", Map.entry(Set.of("@Path(\"/{uid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("getOrganizationValue", Map.entry(Set.of("@Path(\"/{uid}/organization\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("addCustomer", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("setOrganization", Map.entry(Set.of("@Path(\"/{uid}/organization\")","@PUT"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Companies", Map.entry(Set.of("@Path(\"/companies\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getCompany", Map.entry(Set.of(), + Map.entry("Company", + Map.entry(List.of("String"), + 1)))), + Map.entry("getAddressValue", Map.entry(Set.of("@Path(\"/{cid}/address\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("getCompanyValue", Map.entry(Set.of("@Path(\"/{cid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("setAddress", Map.entry(Set.of("@Path(\"/{cid}/address\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("addCampany", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))))); + exprectedStructure.put("Customers", Map.entry(Set.of("@Path(\"/customers\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getCustomer", Map.entry(Set.of(), + Map.entry("Customer", + Map.entry(List.of("String"), + 1)))), + Map.entry("getAddressValue", Map.entry(Set.of("@Path(\"/{uid}/address\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("getCustomerValue", Map.entry(Set.of("@Path(\"/{uid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("getOrganizationValue", Map.entry(Set.of("@Path(\"/{uid}/organization\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("addCustomer", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("setOrganization", Map.entry(Set.of("@Path(\"/{uid}/organization\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))))); exprectedStructure.put("Customer", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("organization", "String"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getOrganization", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("getAddress", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 2)))), - Map.entry("setOrganization", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Customer", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("organization", "String"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getOrganization", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("getAddress", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 2)))), + Map.entry("setOrganization", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Customer", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); exprectedStructure.put("Company", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("address", "String")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getAddress", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("setAddress", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Company", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("address", "String")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getAddress", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("setAddress", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Company", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -367,137 +337,137 @@ private void testGroupChat() { try { ArrayList generatedCode = generateCode("models/GroupChat.model", null); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Groups", Map.entry(Set.of("@Path(\"/groups\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getGroup", Map.entry(Set.of(), - Map.entry("Group", - Map.entry(List.of("String"), - 1)))), - Map.entry("getMembersValue", Map.entry(Set.of("@Path(\"/{gid}/members\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("List", - Map.entry(List.of("String"), - 1)))), - Map.entry("getMessagesValue", Map.entry(Set.of("@Path(\"/{gid}/messages\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("List", - Map.entry(List.of("String"), - 1)))), - Map.entry("getGroupValue", Map.entry(Set.of("@Path(\"/{gid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("addGroupMember", Map.entry(Set.of("@Path(\"/{gid}/members\")","@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("postMessage", Map.entry(Set.of("@Path(\"/{gid}/messages\")","@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("createGroup", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Groups", Map.entry(Set.of("@Path(\"/groups\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getGroup", Map.entry(Set.of(), + Map.entry("Group", + Map.entry(List.of("String"), + 1)))), + Map.entry("getMembersValue", Map.entry(Set.of("@Path(\"/{gid}/members\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("List", + Map.entry(List.of("String"), + 1)))), + Map.entry("getMessagesValue", Map.entry(Set.of("@Path(\"/{gid}/messages\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("List", + Map.entry(List.of("String"), + 1)))), + Map.entry("getGroupValue", Map.entry(Set.of("@Path(\"/{gid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("addGroupMember", Map.entry(Set.of("@Path(\"/{gid}/members\")", "@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("postMessage", Map.entry(Set.of("@Path(\"/{gid}/messages\")", "@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("createGroup", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); exprectedStructure.put("Account", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("notifications", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getNotifications", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("updateNotificationsFromMessages", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String","int","List","String"), - 1)))), - Map.entry("hasRead", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Account", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("Map"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("notifications", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getNotifications", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("updateNotificationsFromMessages", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String", "int", "List", "String"), + 1)))), + Map.entry("hasRead", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Account", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("Map"), + 1)))))))); exprectedStructure.put("Group", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("messages", "List"), - Map.entry("client", "Client"), - Map.entry("members", "List")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getMessages", Map.entry(Set.of(), - Map.entry("List", - Map.entry(List.of(), - 1)))), - Map.entry("getMembers", Map.entry(Set.of(), - Map.entry("List", - Map.entry(List.of(), - 1)))), - Map.entry("postMessage", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 6)))), - Map.entry("addGroupMember", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Group", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("List","List"), - 2)))))))); - exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getAccount", Map.entry(Set.of(), - Map.entry("Account", - Map.entry(List.of("String"), - 1)))), - Map.entry("updateNotificationsFromMessages", Map.entry(Set.of("@Path(\"accounts/{v1}/notifications\")","@POST"), - Map.entry("void", - Map.entry(List.of("String","String","int","List","String"), - 1)))), - Map.entry("getNotificationsValue", Map.entry(Set.of("@Path(\"/{v1}/notifications\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{v1}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("hasRead", Map.entry(Set.of("@Path(\"/{aid}/notifications\")","@DELETE"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("signUp", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("messages", "List"), + Map.entry("client", "Client"), + Map.entry("members", "List")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getMessages", Map.entry(Set.of(), + Map.entry("List", + Map.entry(List.of(), + 1)))), + Map.entry("getMembers", Map.entry(Set.of(), + Map.entry("List", + Map.entry(List.of(), + 1)))), + Map.entry("postMessage", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 6)))), + Map.entry("addGroupMember", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Group", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("List", "List"), + 2)))))))); + exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getAccount", Map.entry(Set.of(), + Map.entry("Account", + Map.entry(List.of("String"), + 1)))), + Map.entry("updateNotificationsFromMessages", Map.entry(Set.of("@Path(\"accounts/{v1}/notifications\")", "@POST"), + Map.entry("void", + Map.entry(List.of("String", "String", "int", "List", "String"), + 1)))), + Map.entry("getNotificationsValue", Map.entry(Set.of("@Path(\"/{v1}/notifications\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{v1}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("hasRead", Map.entry(Set.of("@Path(\"/{aid}/notifications\")", "@DELETE"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("signUp", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -505,67 +475,67 @@ private void testInventoryManagement() { try { ArrayList generatedCode = generateCode("models/InventoryManagement.model", null); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("InventoryElement", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("count", "int")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getCount", Map.entry(Set.of(), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("receiveOrShip", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","int"), - 1)))), - Map.entry("InventoryElement", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("int"), - 1)))))))); - exprectedStructure.put("Inventory", Map.entry(Set.of("@Path(\"/inventory\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getInventoryElement", Map.entry(Set.of(), - Map.entry("InventoryElement", - Map.entry(List.of("String"), - 1)))), - Map.entry("getInventoryElementValue", Map.entry(Set.of("@Path(\"/{itemId}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("getCountValue", Map.entry(Set.of("@Path(\"/{itemId}/count\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of("String"), - 1)))), - Map.entry("registerItem", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String","int","String"), - 1)))), - Map.entry("receiveOrShip", Map.entry(Set.of("@Path(\"/{itemId}/count\")","@POST"), - Map.entry("void", - Map.entry(List.of("String","int"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("count", "int")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getCount", Map.entry(Set.of(), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("receiveOrShip", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "int"), + 1)))), + Map.entry("InventoryElement", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("int"), + 1)))))))); + exprectedStructure.put("Inventory", Map.entry(Set.of("@Path(\"/inventory\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getInventoryElement", Map.entry(Set.of(), + Map.entry("InventoryElement", + Map.entry(List.of("String"), + 1)))), + Map.entry("getInventoryElementValue", Map.entry(Set.of("@Path(\"/{itemId}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("getCountValue", Map.entry(Set.of("@Path(\"/{itemId}/count\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of("String"), + 1)))), + Map.entry("registerItem", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String", "int", "String"), + 1)))), + Map.entry("receiveOrShip", Map.entry(Set.of("@Path(\"/{itemId}/count\")", "@POST"), + Map.entry("void", + Map.entry(List.of("String", "int"), + 1)))))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -574,145 +544,145 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/OnlineBattleGame.model", null); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Rooms", Map.entry(Set.of("@Path(\"/rooms\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getRoom", Map.entry(Set.of(), - Map.entry("Room", - Map.entry(List.of("String"), - 1)))), - Map.entry("getBlue_idValue", Map.entry(Set.of("@Path(\"/{rid}/blue_id\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("getRed_nameValue", Map.entry(Set.of("@Path(\"/{rid}/red_name\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("getBlue_nameValue", Map.entry(Set.of("@Path(\"/{rid}/blue_name\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("getRed_idValue", Map.entry(Set.of("@Path(\"/{rid}/red_id\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("getRoomValue", Map.entry(Set.of("@Path(\"/{rid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("changeBlueId", Map.entry(Set.of("@Path(\"/{rid}/blue_id\")","@PUT"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("createRoom", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String","String","String"), - 1)))), - Map.entry("changeRedId", Map.entry(Set.of("@Path(\"/{rid}/red_id\")","@PUT"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Rooms", Map.entry(Set.of("@Path(\"/rooms\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getRoom", Map.entry(Set.of(), + Map.entry("Room", + Map.entry(List.of("String"), + 1)))), + Map.entry("getBlue_idValue", Map.entry(Set.of("@Path(\"/{rid}/blue_id\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("getRed_nameValue", Map.entry(Set.of("@Path(\"/{rid}/red_name\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("getBlue_nameValue", Map.entry(Set.of("@Path(\"/{rid}/blue_name\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("getRed_idValue", Map.entry(Set.of("@Path(\"/{rid}/red_id\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("getRoomValue", Map.entry(Set.of("@Path(\"/{rid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("changeBlueId", Map.entry(Set.of("@Path(\"/{rid}/blue_id\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("createRoom", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String", "String", "String"), + 1)))), + Map.entry("changeRedId", Map.entry(Set.of("@Path(\"/{rid}/red_id\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))))); exprectedStructure.put("Room", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("blue_id", "String"), - Map.entry("red_id", "String"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getBlue_id", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("getRed_id", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("getRed_name", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 2)))), - Map.entry("getBlue_name", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 2)))), - Map.entry("changeRedId", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("changeBlueId", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Room", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 2)))))))); + Map.entry(Map.ofEntries(Map.entry("blue_id", "String"), + Map.entry("red_id", "String"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getBlue_id", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("getRed_id", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("getRed_name", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 2)))), + Map.entry("getBlue_name", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 2)))), + Map.entry("changeRedId", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("changeBlueId", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Room", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 2)))))))); exprectedStructure.put("Account", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("name", "String")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getName", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("changeName", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Account", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); - exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getAccount", Map.entry(Set.of(), - Map.entry("Account", - Map.entry(List.of("String"), - 1)))), - Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{aid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("getNameValue", Map.entry(Set.of("@Path(\"/{aid}/name\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("signUp", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("changeName", Map.entry(Set.of("@Path(\"/{aid}/name\")","@PUT"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("name", "String")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getName", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("changeName", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Account", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); + exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getAccount", Map.entry(Set.of(), + Map.entry("Account", + Map.entry(List.of("String"), + 1)))), + Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{aid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("getNameValue", Map.entry(Set.of("@Path(\"/{aid}/name\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("signUp", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("changeName", Map.entry(Set.of("@Path(\"/{aid}/name\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -722,187 +692,187 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/OnlineBattleGame2.model", null); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Rooms", Map.entry(Set.of("@Path(\"/rooms\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getRoom", Map.entry(Set.of(), - Map.entry("Room", - Map.entry(List.of("String"), - 1)))), - Map.entry("getIdValue", Map.entry(Set.of("@Path(\"/{rid}/members/{mno}/id\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String","int"), - 1)))), - Map.entry("getBattleValue", Map.entry(Set.of("@Path(\"/{rid}/battle\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("boolean", - Map.entry(List.of("String"), - 1)))), - Map.entry("getRoomValue", Map.entry(Set.of("@Path(\"/{rid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("getMemberValue", Map.entry(Set.of("@Path(\"/{rid}/members/{mno}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String","int"), - 1)))), - Map.entry("getMembersValue", Map.entry(Set.of("@Path(\"/{rid}/members\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("List", - Map.entry(List.of("String"), - 1)))), - Map.entry("getNameValue", Map.entry(Set.of("@Path(\"/{rid}/members/{mno}/name\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String","int"), - 1)))), - Map.entry("battle", Map.entry(Set.of("@Path(\"/{rid}/battle\")","@PUT"), - Map.entry("void", - Map.entry(List.of("String","boolean"), - 1)))), - Map.entry("addRoomMember", Map.entry(Set.of("@Path(\"/{rid}/members\")","@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("createRoom", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Rooms", Map.entry(Set.of("@Path(\"/rooms\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getRoom", Map.entry(Set.of(), + Map.entry("Room", + Map.entry(List.of("String"), + 1)))), + Map.entry("getIdValue", Map.entry(Set.of("@Path(\"/{rid}/members/{mno}/id\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String", "int"), + 1)))), + Map.entry("getBattleValue", Map.entry(Set.of("@Path(\"/{rid}/battle\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("boolean", + Map.entry(List.of("String"), + 1)))), + Map.entry("getRoomValue", Map.entry(Set.of("@Path(\"/{rid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("getMemberValue", Map.entry(Set.of("@Path(\"/{rid}/members/{mno}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String", "int"), + 1)))), + Map.entry("getMembersValue", Map.entry(Set.of("@Path(\"/{rid}/members\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("List", + Map.entry(List.of("String"), + 1)))), + Map.entry("getNameValue", Map.entry(Set.of("@Path(\"/{rid}/members/{mno}/name\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String", "int"), + 1)))), + Map.entry("battle", Map.entry(Set.of("@Path(\"/{rid}/battle\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("String", "boolean"), + 1)))), + Map.entry("addRoomMember", Map.entry(Set.of("@Path(\"/{rid}/members\")", "@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("createRoom", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); exprectedStructure.put("Member", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("id", "String"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getId", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("getName", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 2)))), - Map.entry("Member", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("id", "String"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getId", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("getName", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 2)))), + Map.entry("Member", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); exprectedStructure.put("Account", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("name", "String"), - Map.entry("point", "int")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getName", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("getPoint", Map.entry(Set.of(), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("updatePointFromBattle", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String","int","boolean","String"), - 1)))), - Map.entry("changeName", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Account", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","int"), - 2)))))))); + Map.entry(Map.ofEntries(Map.entry("name", "String"), + Map.entry("point", "int")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getName", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("getPoint", Map.entry(Set.of(), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("updatePointFromBattle", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String", "int", "boolean", "String"), + 1)))), + Map.entry("changeName", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Account", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "int"), + 2)))))))); exprectedStructure.put("Room", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("members", "Members"), - Map.entry("battle", "boolean"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getMembers", Map.entry(Set.of(), - Map.entry("Members", - Map.entry(List.of(), - 1)))), - Map.entry("getBattle", Map.entry(Set.of(), - Map.entry("boolean", - Map.entry(List.of(), - 1)))), - Map.entry("battle", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","boolean"), - 6)))), - Map.entry("Room", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("boolean"), - 1)))))))); - exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getAccount", Map.entry(Set.of(), - Map.entry("Account", - Map.entry(List.of("String"), - 1)))), - Map.entry("updatePointFromBattle", Map.entry(Set.of("@Path(\"accounts/{mid}/point\")","@POST"), - Map.entry("void", - Map.entry(List.of("String","String","int","boolean","String"), - 1)))), - Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{mid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("getNameValue", Map.entry(Set.of("@Path(\"/{mid}/name\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("getPointValue", Map.entry(Set.of("@Path(\"/{mid}/point\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of("String"), - 1)))), - Map.entry("signUp", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("changeName", Map.entry(Set.of("@Path(\"/{aid}/name\")","@PUT"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("members", "Members"), + Map.entry("battle", "boolean"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getMembers", Map.entry(Set.of(), + Map.entry("Members", + Map.entry(List.of(), + 1)))), + Map.entry("getBattle", Map.entry(Set.of(), + Map.entry("boolean", + Map.entry(List.of(), + 1)))), + Map.entry("battle", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "boolean"), + 6)))), + Map.entry("Room", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("boolean"), + 1)))))))); + exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getAccount", Map.entry(Set.of(), + Map.entry("Account", + Map.entry(List.of("String"), + 1)))), + Map.entry("updatePointFromBattle", Map.entry(Set.of("@Path(\"accounts/{mid}/point\")", "@POST"), + Map.entry("void", + Map.entry(List.of("String", "String", "int", "boolean", "String"), + 1)))), + Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{mid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("getNameValue", Map.entry(Set.of("@Path(\"/{mid}/name\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("getPointValue", Map.entry(Set.of("@Path(\"/{mid}/point\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of("String"), + 1)))), + Map.entry("signUp", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("changeName", Map.entry(Set.of("@Path(\"/{aid}/name\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))))); exprectedStructure.put("Members", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("value", "List")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("List", - Map.entry(List.of(), - 1)))), - Map.entry("getMember", Map.entry(Set.of(), - Map.entry("Member", - Map.entry(List.of("int"), - 1)))), - Map.entry("addRoomMember", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))))); + Map.entry(Map.ofEntries(Map.entry("value", "List")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("List", + Map.entry(List.of(), + 1)))), + Map.entry("getMember", Map.entry(Set.of(), + Map.entry("Member", + Map.entry(List.of("int"), + 1)))), + Map.entry("addRoomMember", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -911,48 +881,48 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/POS.model", PushPullValue.PULL); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Points", Map.entry(Set.of("@Path(\"/points\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 2)))))))); - exprectedStructure.put("Total", Map.entry(Set.of("@Path(\"/total\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 2)))))))); - exprectedStructure.put("Payment", Map.entry(Set.of("@Path(\"/payment\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("purchase", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("int"), - 3)))))))); - exprectedStructure.put("History", Map.entry(Set.of("@Path(\"/history\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "List")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("List", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromPayment", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("int"), - 1)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Points", Map.entry(Set.of("@Path(\"/points\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 2)))))))); + exprectedStructure.put("Total", Map.entry(Set.of("@Path(\"/total\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 2)))))))); + exprectedStructure.put("Payment", Map.entry(Set.of("@Path(\"/payment\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("purchase", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("int"), + 3)))))))); + exprectedStructure.put("History", Map.entry(Set.of("@Path(\"/history\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "List")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("List", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromPayment", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("int"), + 1)))))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); @@ -960,56 +930,56 @@ // check PUSH-first generatedCode = generateCode("models/POS.model", PushPullValue.PUSH); exprectedStructure.clear(); - exprectedStructure.put("Payment", Map.entry(Set.of("@Path(\"/payment\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("purchase", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("int"), - 5)))))))); - exprectedStructure.put("Total", Map.entry(Set.of("@Path(\"/total\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "int")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromHistory", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("List"), - 1)))))))); - exprectedStructure.put("History", Map.entry(Set.of("@Path(\"/history\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "List"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("List", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromPayment", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("int"), - 3)))))))); - exprectedStructure.put("Points", Map.entry(Set.of("@Path(\"/points\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "int")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("int", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromPayment", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("int"), - 1)))))))); + exprectedStructure.put("Payment", Map.entry(Set.of("@Path(\"/payment\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("purchase", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("int"), + 5)))))))); + exprectedStructure.put("Total", Map.entry(Set.of("@Path(\"/total\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "int")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromHistory", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("List"), + 1)))))))); + exprectedStructure.put("History", Map.entry(Set.of("@Path(\"/history\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "List"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("List", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromPayment", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("int"), + 3)))))))); + exprectedStructure.put("Points", Map.entry(Set.of("@Path(\"/points\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "int")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("int", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromPayment", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("int"), + 1)))))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -1017,142 +987,142 @@ private void testSimpleTwitter() { try { ArrayList generatedCode = generateCode("models/SimpleTwitter.model", null); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getAccount", Map.entry(Set.of(), - Map.entry("Account", - Map.entry(List.of("String"), - 1)))), - Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{accountId}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("getTweetsValue", Map.entry(Set.of("@Path(\"/{accountId}/tweets\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("List", - Map.entry(List.of("String"), - 1)))), - Map.entry("tweet", Map.entry(Set.of("@Path(\"/{accountId}/tweets\")","@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("signUp", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getAccount", Map.entry(Set.of(), + Map.entry("Account", + Map.entry(List.of("String"), + 1)))), + Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{accountId}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("getTweetsValue", Map.entry(Set.of("@Path(\"/{accountId}/tweets\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("List", + Map.entry(List.of("String"), + 1)))), + Map.entry("tweet", Map.entry(Set.of("@Path(\"/{accountId}/tweets\")", "@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("signUp", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))))); exprectedStructure.put("Account", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("tweets", "List")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getTweets", Map.entry(Set.of(), - Map.entry("List", - Map.entry(List.of(), - 1)))), - Map.entry("tweet", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Account", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("List"), - 1)))))))); - + Map.entry(Map.ofEntries(Map.entry("tweets", "List")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getTweets", Map.entry(Set.of(), + Map.entry("List", + Map.entry(List.of(), + 1)))), + Map.entry("tweet", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Account", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("List"), + 1)))))))); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } - + private void testVotingSystem() { try { ArrayList generatedCode = generateCode("models/VotingSystem.model", null); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Counts", Map.entry(Set.of("@Path(\"/counts\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 8)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Counts", Map.entry(Set.of("@Path(\"/counts\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 8)))))))); exprectedStructure.put("Account", Map.entry(Set.of(), - Map.entry(Map.ofEntries(Map.entry("vote", "String")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getVote", Map.entry(Set.of(), - Map.entry("String", - Map.entry(List.of(), - 1)))), - Map.entry("cast", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("Account", Map.entry(Set.of(), - Map.entry("void", - Map.entry(List.of("String"), - 1)))))))); - exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "Map")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of(), - 1)))), - Map.entry("getAccount", Map.entry(Set.of(), - Map.entry("Account", - Map.entry(List.of("String"), - 1)))), - Map.entry("getVoteValue", Map.entry(Set.of("@Path(\"/{aid}/vote\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("String", - Map.entry(List.of("String"), - 1)))), - Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{aid}\")","@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("Map", - Map.entry(List.of("String"), - 1)))), - Map.entry("cast", Map.entry(Set.of("@Path(\"/{aid}/vote\")","@PUT"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))), - Map.entry("signUp", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))))); - + Map.entry(Map.ofEntries(Map.entry("vote", "String")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of(), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getVote", Map.entry(Set.of(), + Map.entry("String", + Map.entry(List.of(), + 1)))), + Map.entry("cast", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("Account", Map.entry(Set.of(), + Map.entry("void", + Map.entry(List.of("String"), + 1)))))))); + exprectedStructure.put("Accounts", Map.entry(Set.of("@Path(\"/accounts\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "Map")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of(), + 1)))), + Map.entry("getAccount", Map.entry(Set.of(), + Map.entry("Account", + Map.entry(List.of("String"), + 1)))), + Map.entry("getVoteValue", Map.entry(Set.of("@Path(\"/{aid}/vote\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("String", + Map.entry(List.of("String"), + 1)))), + Map.entry("getAccountValue", Map.entry(Set.of("@Path(\"/{aid}\")", "@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("Map", + Map.entry(List.of("String"), + 1)))), + Map.entry("cast", Map.entry(Set.of("@Path(\"/{aid}/vote\")", "@PUT"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))), + Map.entry("signUp", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))))); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -1161,46 +1131,46 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/WeatherObservationSystem.model", PushPullValue.PULL); - Map, // class annotations - Entry, // field name to type - Map, // class annotations - Entry, // arg types - Integer>>>>>>> // lines of code - exprectedStructure = new HashMap<>(); - exprectedStructure.put("Temp_c", Map.entry(Set.of("@Path(\"/temp_c\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 2)))))))); - exprectedStructure.put("Highest", Map.entry(Set.of("@Path(\"/highest\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "double")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromTemp_f", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("double"), - 1)))), - Map.entry("reset", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("double"), - 1)))))))); - exprectedStructure.put("Temp_f", Map.entry(Set.of("@Path(\"/temp_f\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "double"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 1)))), - Map.entry("observe", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("double"), - 3)))))))); + Map, // class annotations + Entry, // field name to type + Map, // class annotations + Entry, // arg types + Integer>>>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Temp_c", Map.entry(Set.of("@Path(\"/temp_c\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 2)))))))); + exprectedStructure.put("Highest", Map.entry(Set.of("@Path(\"/highest\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "double")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromTemp_f", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("double"), + 1)))), + Map.entry("reset", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("double"), + 1)))))))); + exprectedStructure.put("Temp_f", Map.entry(Set.of("@Path(\"/temp_f\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "double"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 1)))), + Map.entry("observe", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("double"), + 3)))))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); @@ -1208,57 +1178,57 @@ // check PUSH-first generatedCode = generateCode("models/WeatherObservationSystem.model", PushPullValue.PUSH); exprectedStructure.clear(); - exprectedStructure.put("Highest", Map.entry(Set.of("@Path(\"/highest\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "double")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromTemp_f", Map.entry(Set.of("@POST"), - Map.entry("void", - Map.entry(List.of("double"), - 1)))), - Map.entry("reset", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("double"), - 1)))))))); - exprectedStructure.put("Temp_f", Map.entry(Set.of("@Path(\"/temp_f\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "double"), - Map.entry("client", "Client")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 1)))), - Map.entry("observe", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("double"), - 5)))))))); - exprectedStructure.put("Temp_c", Map.entry(Set.of("@Path(\"/temp_c\")","@Component"), - Map.entry(Map.ofEntries(Map.entry("value", "double")), - Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)","@GET"), - Map.entry("double", - Map.entry(List.of(), - 1)))), - Map.entry("updateFromTemp_f", Map.entry(Set.of("@PUT"), - Map.entry("void", - Map.entry(List.of("double"), - 1)))))))); + exprectedStructure.put("Highest", Map.entry(Set.of("@Path(\"/highest\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "double")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromTemp_f", Map.entry(Set.of("@POST"), + Map.entry("void", + Map.entry(List.of("double"), + 1)))), + Map.entry("reset", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("double"), + 1)))))))); + exprectedStructure.put("Temp_f", Map.entry(Set.of("@Path(\"/temp_f\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "double"), + Map.entry("client", "Client")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 1)))), + Map.entry("observe", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("double"), + 5)))))))); + exprectedStructure.put("Temp_c", Map.entry(Set.of("@Path(\"/temp_c\")", "@Component"), + Map.entry(Map.ofEntries(Map.entry("value", "double")), + Map.ofEntries(Map.entry("getValue", Map.entry(Set.of("@Produces(MediaType.APPLICATION_JSON)", "@GET"), + Map.entry("double", + Map.entry(List.of(), + 1)))), + Map.entry("updateFromTemp_f", Map.entry(Set.of("@PUT"), + Map.entry("void", + Map.entry(List.of("double"), + 1)))))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } - - private ArrayList generateCode(String fileName, PushPullValue pushPullValue) throws FileNotFoundException, - ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, - ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, - WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + + private ArrayList generateCode(String fileName, PushPullValue pushPullValue) throws FileNotFoundException, + ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, + ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, + WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { File file = new File(fileName); Parser parser = new Parser(new BufferedReader(new FileReader(file))); DataTransferModel model; @@ -1280,15 +1250,15 @@ // ArrayList codetree = new CodeGeneratorFromDataFlowGraph().generateCode(model, graph, new JerseySpecific(), new JavaSpecific()); return codetree; } - + private void checkStructure(ArrayList generatedCode, - Map, Entry, Map, Entry, Integer>>>>>>> exprectedStructure) { - for (var classEnt: exprectedStructure.entrySet()) { + Map, Entry, Map, Entry, Integer>>>>>>> exprectedStructure) { + for (var classEnt : exprectedStructure.entrySet()) { String expectedClassName = classEnt.getKey(); Entry, Entry, Map, Entry, Integer>>>>>> expectedClassInfo = classEnt.getValue(); - TypeDeclaration generatedClass = null; - for (CompilationUnit cu: generatedCode) { - for (TypeDeclaration type: cu.types()) { + TypeDeclaration generatedClass = null; + for (CompilationUnit cu : generatedCode) { + for (TypeDeclaration type : cu.types()) { if (type.getTypeName().equals(expectedClassName)) { generatedClass = type; break; @@ -1298,9 +1268,9 @@ assertNotNull(generatedClass); Set expectedClassAnnotations = expectedClassInfo.getKey(); - for (String expectedAnnotation: expectedClassAnnotations) { + for (String expectedAnnotation : expectedClassAnnotations) { boolean existsAnnotation = false; - for (Annotation generatedAnnotation: generatedClass.getAnnotations()) { + for (Annotation generatedAnnotation : generatedClass.getAnnotations()) { if (expectedAnnotation.equals(generatedAnnotation.toString())) { existsAnnotation = true; } @@ -1311,9 +1281,9 @@ Map exprectedFields = expectedClassStructure.getKey(); Map, Entry, Integer>>>> exprectedMethods = expectedClassStructure.getValue(); - for (String expectedFieldName: exprectedFields.keySet()) { + for (String expectedFieldName : exprectedFields.keySet()) { FieldDeclaration generatedField = null; - for (FieldDeclaration field: generatedClass.getFields()) { + for (FieldDeclaration field : generatedClass.getFields()) { if (field.getName().equals(expectedFieldName)) { generatedField = field; break; @@ -1329,9 +1299,9 @@ } } - for (String expectedMethodName: exprectedMethods.keySet()) { - MethodDeclaration generatedMethod= null; - for (MethodDeclaration method: generatedClass.getMethods()) { + for (String expectedMethodName : exprectedMethods.keySet()) { + MethodDeclaration generatedMethod = null; + for (MethodDeclaration method : generatedClass.getMethods()) { if (method.getName().equals(expectedMethodName)) { generatedMethod = method; break; @@ -1341,9 +1311,9 @@ Entry, Entry, Integer>>> expectedMethodInfo = exprectedMethods.get(expectedMethodName); Set expectedMethodAnnotations = expectedMethodInfo.getKey(); - for (String expectedAnnotation: expectedMethodAnnotations) { + for (String expectedAnnotation : expectedMethodAnnotations) { boolean existsAnnotation = false; - for (Annotation generatedAnnotation: generatedMethod.getAnnotations()) { + for (Annotation generatedAnnotation : generatedMethod.getAnnotations()) { if (expectedAnnotation.replaceAll("\\{.*\\}", "\\{\\}").equals(generatedAnnotation.toString().replaceAll("\\{.*\\}", "\\{\\}"))) { existsAnnotation = true; } @@ -1363,9 +1333,9 @@ } Entry, Integer> expectedMethodInfo2 = expectedMethodSignature.getValue(); List expectedArgTypes = expectedMethodInfo2.getKey(); - for (String expectedArgType: expectedArgTypes) { + for (String expectedArgType : expectedArgTypes) { boolean existsArg = false; - for (VariableDeclaration var: generatedMethod.getParameters()) { + for (VariableDeclaration var : generatedMethod.getParameters()) { if (expectedArgType.equals(var.getType().getInterfaceTypeName())) { existsArg = true; } @@ -1377,7 +1347,7 @@ } } } - + private void generateCheckCode(ArrayList generatedCode) { // exprectedStructure.put("Main", Map.entry(Set.of(), // Map.entry(Map.ofEntries(Map.entry("history", "History"), @@ -1408,8 +1378,8 @@ // Map.entry("int", // Map.entry(List.of(), // 1)))))))); - for (CompilationUnit cu: generatedCode) { - for (TypeDeclaration type: cu.types()) { + for (CompilationUnit cu : generatedCode) { + for (TypeDeclaration type : cu.types()) { Collection annotations = type.getAnnotations(); List fields = type.getFields(); List methods = type.getMethods(); @@ -1419,7 +1389,7 @@ } else { System.out.print("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Set.of("); String delim = ""; - for (Annotation annotation: annotations) { + for (Annotation annotation : annotations) { System.out.print(delim + "\"" + annotation.toString().replace("\"", "\\\"") + "\""); delim = ","; } @@ -1440,7 +1410,7 @@ System.out.println("Map.entry(Map.ofEntries(Map.entry(\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\")),"); } else { int i = 0; - for (FieldDeclaration field: fields) { + for (FieldDeclaration field : fields) { if (i == 0) { System.out.println("Map.entry(Map.ofEntries(Map.entry(\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\"),"); } else { @@ -1472,7 +1442,7 @@ System.out.println("Map.ofEntries())));"); } else { int i = 0; - for (MethodDeclaration method: methods) { + for (MethodDeclaration method : methods) { // method name and method annotations if (i == 0) { System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); @@ -1488,7 +1458,7 @@ } else { System.out.print("Map.ofEntries(Map.entry(\"" + method.getName() + "\", Map.entry(Set.of("); String delim = ""; - for (Annotation annotation: methodAnnotations) { + for (Annotation annotation : methodAnnotations) { System.out.print(delim + "\"" + annotation.toString().replace("\"", "\\\"") + "\""); delim = ","; } @@ -1508,7 +1478,7 @@ } else { System.out.print("Map.entry(\"" + method.getName() + "\", Map.entry(Set.of("); String delim = ""; - for (Annotation annotation: methodAnnotations) { + for (Annotation annotation : methodAnnotations) { System.out.print(delim + "\"" + annotation.toString().replace("\"", "\\\"") + "\""); delim = ","; } @@ -1541,7 +1511,7 @@ } else { System.out.print("Map.entry(List.of("); String delim = ""; - for (VariableDeclaration arg: method.getParameters()) { + for (VariableDeclaration arg : method.getParameters()) { System.out.print(delim + "\"" + arg.getType().getInterfaceTypeName() + "\""); delim = ","; } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java index b9a5dc0..3d3804d 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java @@ -1,6 +1,16 @@ package tests; -import static org.junit.Assert.*; +import algorithms.DataTransferModelAnalyzer; +import algorithms.TypeInference; +import code.ast.*; +import generators.DataTransferMethodAnalyzer; +import generators.JavaCodeGenerator; +import generators.JavaMethodBodyGenerator; +import models.Edge; +import models.dataFlowModel.*; +import org.junit.Test; +import parser.Parser; +import parser.exceptions.*; import java.io.BufferedReader; import java.io.File; @@ -12,39 +22,7 @@ import java.util.Map; import java.util.Map.Entry; -import org.junit.Test; - -import algorithms.*; -import code.ast.CompilationUnit; -import code.ast.FieldDeclaration; -import code.ast.MethodDeclaration; -import code.ast.TypeDeclaration; -import code.ast.VariableDeclaration; -import generators.CodeGeneratorFromDataFlowGraph; -import generators.DataTransferMethodAnalyzer; -import generators.JavaCodeGenerator; -import generators.JavaMethodBodyGenerator; -import generators.JavaSpecific; -import generators.StandaloneSpecific; -import models.Edge; -import models.dataFlowModel.*; -import parser.*; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; +import static org.junit.Assert.*; public class JavaCodeGeneratorTest { @@ -52,11 +30,11 @@ public void test() { testAccounts(); testClock(); - testCustomerManagement(); // Two methods with the same signature are generated. + testCustomerManagement(); // Two methods with the same signature are generated. testGroupChat(); testInventoryManagement(); // testOnlineBattleGame(); // A feature has not been implemented for Java prototype generation. - testOnlineBattleGame2(); // Two methods with the same signature are generated. PUSH-first implementation still does not work. + testOnlineBattleGame2(); // Two methods with the same signature are generated. PUSH-first implementation still does not work. testPOS(); testSimpleTwitter(); testVotingSystem(); @@ -66,63 +44,63 @@ private void testAccounts() { try { ArrayList generatedCode = generateCode("models/Accounts.model", null); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Map", - Map.entry(List.of("int"), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of("int"), - 1))), - Map.entry("changeName", Map.entry("void", - Map.entry(List.of("int","String"), - 1))), - Map.entry("getAccounts", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("signup", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("int"), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of("int"), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("int", "String"), + 1))), + Map.entry("getAccounts", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("signup", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Account", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("changeName", Map.entry("void", - Map.entry(List.of("int","String"), - 1))), - Map.entry("Account", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("int", "String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Account", - Map.entry(List.of("int"), - 1))), - Map.entry("signup", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("int"), + 1))), + Map.entry("signup", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -131,67 +109,67 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/Clock.model", PushPullValue.PULL); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("hour", "Hour"), - Map.entry("hour_ang", "Hour_ang"), - Map.entry("min", "Min"), - Map.entry("min_ang", "Min_ang")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 4))), - Map.entry("getHour", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("getHour_ang", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("getMin", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("tick", Map.entry("void", - Map.entry(List.of(), - 1))), - Map.entry("getMin_ang", Map.entry("double", - Map.entry(List.of(), - 1)))))); + Map.entry("hour_ang", "Hour_ang"), + Map.entry("min", "Min"), + Map.entry("min_ang", "Min_ang")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 4))), + Map.entry("getHour", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getHour_ang", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("getMin", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("tick", Map.entry("void", + Map.entry(List.of(), + 1))), + Map.entry("getMin_ang", Map.entry("double", + Map.entry(List.of(), + 1)))))); exprectedStructure.put("Hour", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("updateFromMin", Map.entry("void", - Map.entry(List.of("int"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updateFromMin", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); exprectedStructure.put("Hour_ang", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("Hour_ang", Map.entry("void", - Map.entry(List.of("Hour"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("Hour_ang", Map.entry("void", + Map.entry(List.of("Hour"), + 1)))))); exprectedStructure.put("Min", Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("hour", "Hour")), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("tick", Map.entry("void", - Map.entry(List.of(), - 2))), - Map.entry("Min", Map.entry("void", - Map.entry(List.of("Hour"), - 1)))))); + Map.entry("hour", "Hour")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("tick", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("Min", Map.entry("void", + Map.entry(List.of("Hour"), + 1)))))); exprectedStructure.put("Min_ang", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("Min_ang", Map.entry("void", - Map.entry(List.of("Min"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("Min_ang", Map.entry("void", + Map.entry(List.of("Min"), + 1)))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); @@ -200,72 +178,72 @@ generatedCode = generateCode("models/Clock.model", PushPullValue.PUSH); exprectedStructure.clear(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("hour_ang", "Hour_ang"), - Map.entry("min_ang", "Min_ang"), - Map.entry("hour", "Hour"), - Map.entry("min", "Min")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 4))), - Map.entry("getHour_ang", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("getMin_ang", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("getHour", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("getMin", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("tick", Map.entry("void", - Map.entry(List.of(), - 1)))))); + Map.entry("min_ang", "Min_ang"), + Map.entry("hour", "Hour"), + Map.entry("min", "Min")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 4))), + Map.entry("getHour_ang", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("getMin_ang", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("getHour", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getMin", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("tick", Map.entry("void", + Map.entry(List.of(), + 1)))))); exprectedStructure.put("Hour_ang", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("updateFromHour", Map.entry("void", - Map.entry(List.of("int"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromHour", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); exprectedStructure.put("Min_ang", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("updateFromMin", Map.entry("void", - Map.entry(List.of("int"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromMin", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); exprectedStructure.put("Hour", Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("hour_ang", "Hour_ang")), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("updateFromMin", Map.entry("void", - Map.entry(List.of("int"), - 2))), - Map.entry("Hour", Map.entry("void", - Map.entry(List.of("Hour_ang"), - 1)))))); + Map.entry("hour_ang", "Hour_ang")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updateFromMin", Map.entry("void", + Map.entry(List.of("int"), + 2))), + Map.entry("Hour", Map.entry("void", + Map.entry(List.of("Hour_ang"), + 1)))))); exprectedStructure.put("Min", Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("min_ang", "Min_ang"), - Map.entry("hour", "Hour")), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("tick", Map.entry("void", - Map.entry(List.of(), - 3))), - Map.entry("Min", Map.entry("void", - Map.entry(List.of("Min_ang","Hour"), - 2)))))); + Map.entry("min_ang", "Min_ang"), + Map.entry("hour", "Hour")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("tick", Map.entry("void", + Map.entry(List.of(), + 3))), + Map.entry("Min", Map.entry("void", + Map.entry(List.of("Min_ang", "Hour"), + 2)))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -273,114 +251,114 @@ private void testCustomerManagement() { try { ArrayList generatedCode = generateCode("models/CustomerManagement.model", null); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("companies", "Companies"), - Map.entry("customers", "Customers")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 2))), - Map.entry("getAddress", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("setAddress", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getCustomer", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getCompanies", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("addCampany", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getOrganization", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("setOrganization", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), + Map.entry("customers", "Customers")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("setAddress", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getCustomer", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getCompanies", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("addCampany", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getOrganization", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("setOrganization", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), // Map.entry("getAddress", Map.entry("String", // Map.entry(List.of("String"), // 1))), - Map.entry("getCompany", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getCustomers", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("addCustomer", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); + Map.entry("getCompany", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getCustomers", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("addCustomer", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); exprectedStructure.put("Customer", Map.entry(Map.ofEntries(Map.entry("organization", "String"), - Map.entry("company", "Company"), - Map.entry("companies", "Companies")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getOrganization", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getAddress", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("setOrganization", Map.entry("void", - Map.entry(List.of("String","String"), - 2))), - Map.entry("Customer", Map.entry("void", - Map.entry(List.of("String","Companies"), - 3)))))); + Map.entry("company", "Company"), + Map.entry("companies", "Companies")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getOrganization", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("setOrganization", Map.entry("void", + Map.entry(List.of("String", "String"), + 2))), + Map.entry("Customer", Map.entry("void", + Map.entry(List.of("String", "Companies"), + 3)))))); exprectedStructure.put("Companies", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getCompany", Map.entry("Company", - Map.entry(List.of("String"), - 1))), - Map.entry("addCampany", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getCompany", Map.entry("Company", + Map.entry(List.of("String"), + 1))), + Map.entry("addCampany", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); exprectedStructure.put("Company", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getAddress", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("setAddress", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Company", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("setAddress", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Company", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Customers", Map.entry(Map.ofEntries(Map.entry("value", "Map"), - Map.entry("companies", "Companies")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getCustomer", Map.entry("Customer", - Map.entry(List.of("String"), - 1))), - Map.entry("addCustomer", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Customers", Map.entry("void", - Map.entry(List.of("Companies"), - 1)))))); + Map.entry("companies", "Companies")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getCustomer", Map.entry("Customer", + Map.entry(List.of("String"), + 1))), + Map.entry("addCustomer", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Customers", Map.entry("void", + Map.entry(List.of("Companies"), + 1)))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -388,130 +366,130 @@ private void testGroupChat() { try { ArrayList generatedCode = generateCode("models/GroupChat.model", null); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("accounts", "Accounts"), - Map.entry("groups", "Groups")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 2))), - Map.entry("getAccounts", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String"), - 1))), - Map.entry("getGroup", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getMessages", Map.entry("List", - Map.entry(List.of("String"), - 1))), - Map.entry("postMessage", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getAccount", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getMember", Map.entry("String", - Map.entry(List.of("String","int"), - 1))), - Map.entry("getNotifications", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("hasRead", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getMembers", Map.entry("List", - Map.entry(List.of("String"), - 1))), - Map.entry("addGroupMember", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getGroups", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("createGroup", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.entry("groups", "Groups")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String"), + 1))), + Map.entry("getGroup", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getMessages", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("postMessage", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getMember", Map.entry("String", + Map.entry(List.of("String", "int"), + 1))), + Map.entry("getNotifications", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("hasRead", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getMembers", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("addGroupMember", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getGroups", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("createGroup", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Account", - Map.entry(List.of("String"), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Group", Map.entry(Map.ofEntries(Map.entry("messages", "List"), - Map.entry("account", "Account"), - Map.entry("accounts", "Accounts"), - Map.entry("members", "List")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getMessages", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("getMember", Map.entry("String", - Map.entry(List.of("int"), - 1))), - Map.entry("getMembers", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("postMessage", Map.entry("void", - Map.entry(List.of("String","String"), - 6))), - Map.entry("addGroupMember", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Group", Map.entry("void", - Map.entry(List.of("List","Accounts","List"), - 3)))))); + Map.entry("account", "Account"), + Map.entry("accounts", "Accounts"), + Map.entry("members", "List")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getMessages", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("getMember", Map.entry("String", + Map.entry(List.of("int"), + 1))), + Map.entry("getMembers", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("postMessage", Map.entry("void", + Map.entry(List.of("String", "String"), + 6))), + Map.entry("addGroupMember", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Group", Map.entry("void", + Map.entry(List.of("List", "Accounts", "List"), + 3)))))); exprectedStructure.put("Account", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getNotifications", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("updateNotificationsFromMessages", Map.entry("void", - Map.entry(List.of("String","String","int","List","String"), - 1))), - Map.entry("hasRead", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Account", Map.entry("void", - Map.entry(List.of("Map"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getNotifications", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("updateNotificationsFromMessages", Map.entry("void", + Map.entry(List.of("String", "String", "int", "List", "String"), + 1))), + Map.entry("hasRead", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("Map"), + 1)))))); exprectedStructure.put("Groups", Map.entry(Map.ofEntries(Map.entry("value", "Map"), - Map.entry("accounts", "Accounts")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getGroup", Map.entry("Group", - Map.entry(List.of("String"), - 1))), - Map.entry("createGroup", Map.entry("void", - Map.entry(List.of("String"), - 1))), - Map.entry("Groups", Map.entry("void", - Map.entry(List.of("Accounts"), - 1)))))); - - checkStructure(generatedCode, exprectedStructure); + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getGroup", Map.entry("Group", + Map.entry(List.of("String"), + 1))), + Map.entry("createGroup", Map.entry("void", + Map.entry(List.of("String"), + 1))), + Map.entry("Groups", Map.entry("void", + Map.entry(List.of("Accounts"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -519,63 +497,63 @@ private void testInventoryManagement() { try { ArrayList generatedCode = generateCode("models/InventoryManagement.model", null); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 1))), - Map.entry("getInventoryElement", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getInventory", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("registerItem", Map.entry("void", - Map.entry(List.of("String","int","String"), - 1))), - Map.entry("getCount", Map.entry("int", - Map.entry(List.of("String"), - 1))), - Map.entry("receiveOrShip", Map.entry("void", - Map.entry(List.of("String","int"), - 1)))))); + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 1))), + Map.entry("getInventoryElement", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getInventory", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("registerItem", Map.entry("void", + Map.entry(List.of("String", "int", "String"), + 1))), + Map.entry("getCount", Map.entry("int", + Map.entry(List.of("String"), + 1))), + Map.entry("receiveOrShip", Map.entry("void", + Map.entry(List.of("String", "int"), + 1)))))); exprectedStructure.put("InventoryElement", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getCount", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("receiveOrShip", Map.entry("void", - Map.entry(List.of("String","int"), - 1))), - Map.entry("InventoryElement", Map.entry("void", - Map.entry(List.of("int"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getCount", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("receiveOrShip", Map.entry("void", + Map.entry(List.of("String", "int"), + 1))), + Map.entry("InventoryElement", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); exprectedStructure.put("Inventory", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getInventoryElement", Map.entry("InventoryElement", - Map.entry(List.of("String"), - 1))), - Map.entry("registerItem", Map.entry("void", - Map.entry(List.of("String","int","String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getInventoryElement", Map.entry("InventoryElement", + Map.entry(List.of("String"), + 1))), + Map.entry("registerItem", Map.entry("void", + Map.entry(List.of("String", "int", "String"), + 1)))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -584,125 +562,125 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/OnlineBattleGame.model", PushPullValue.PULL); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("accounts", "Accounts"), - Map.entry("rooms", "Rooms")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 2))), - Map.entry("getRoom", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("changeName", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getAccount", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getBlue_id", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("changeBlueId", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getRed_id", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("changeRedId", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getAccounts", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getRooms", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("createRoom", Map.entry("void", - Map.entry(List.of("String","String","String"), - 1))), - Map.entry("getRed_name", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("getBlue_name", Map.entry("String", - Map.entry(List.of("String"), - 1)))))); + Map.entry("rooms", "Rooms")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getRoom", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getBlue_id", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeBlueId", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getRed_id", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeRedId", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getRooms", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String", "String", "String"), + 1))), + Map.entry("getRed_name", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("getBlue_name", Map.entry("String", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Room", Map.entry(Map.ofEntries(Map.entry("blue_id", "String"), - Map.entry("red_id", "String"), - Map.entry("account", "Account"), - Map.entry("accounts", "Accounts")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getBlue_id", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getRed_id", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getRed_name", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getBlue_name", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("changeRedId", Map.entry("void", - Map.entry(List.of("String","String"), - 2))), - Map.entry("changeBlueId", Map.entry("void", - Map.entry(List.of("String","String"), - 2))), - Map.entry("Room", Map.entry("void", - Map.entry(List.of("String","String","Accounts"), - 5)))))); + Map.entry("red_id", "String"), + Map.entry("account", "Account"), + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getBlue_id", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getRed_id", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getRed_name", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getBlue_name", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("changeRedId", Map.entry("void", + Map.entry(List.of("String", "String"), + 2))), + Map.entry("changeBlueId", Map.entry("void", + Map.entry(List.of("String", "String"), + 2))), + Map.entry("Room", Map.entry("void", + Map.entry(List.of("String", "String", "Accounts"), + 5)))))); exprectedStructure.put("Account", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("changeName", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Account", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Account", - Map.entry(List.of("String"), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); exprectedStructure.put("Rooms", Map.entry(Map.ofEntries(Map.entry("value", "Map"), - Map.entry("accounts", "Accounts")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getRoom", Map.entry("Room", - Map.entry(List.of("String"), - 1))), - Map.entry("createRoom", Map.entry("void", - Map.entry(List.of("String","String","String"), - 1))), - Map.entry("Rooms", Map.entry("void", - Map.entry(List.of("Accounts"), - 1)))))); + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getRoom", Map.entry("Room", + Map.entry(List.of("String"), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String", "String", "String"), + 1))), + Map.entry("Rooms", Map.entry("void", + Map.entry(List.of("Accounts"), + 1)))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); @@ -711,131 +689,131 @@ generatedCode = generateCode("models/OnlineBattleGame.model", PushPullValue.PUSH); exprectedStructure.clear(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("accounts", "Accounts"), - Map.entry("rooms", "Rooms")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 2))), - Map.entry("getAccount", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getBlue_name", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("getBlue_id", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("changeBlueId", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getRed_name", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("getRed_id", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("changeRedId", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("changeName", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getAccounts", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getRooms", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("createRoom", Map.entry("void", - Map.entry(List.of("String","String","String"), - 1))), - Map.entry("getRoom", Map.entry("Map", - Map.entry(List.of("String"), - 1)))))); + Map.entry("rooms", "Rooms")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getBlue_name", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("getBlue_id", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeBlueId", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getRed_name", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("getRed_id", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeRedId", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getRooms", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String", "String", "String"), + 1))), + Map.entry("getRoom", Map.entry("Map", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Account", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("changeName", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Account", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Account", - Map.entry(List.of("String"), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); exprectedStructure.put("Rooms", Map.entry(Map.ofEntries(Map.entry("value", "Map"), - Map.entry("accounts", "Accounts")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getRoom", Map.entry("Room", - Map.entry(List.of("String"), - 1))), - Map.entry("createRoom", Map.entry("void", - Map.entry(List.of("String","String","String"), - 1))), - Map.entry("Rooms", Map.entry("void", - Map.entry(List.of("Accounts"), - 1)))))); + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getRoom", Map.entry("Room", + Map.entry(List.of("String"), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String", "String", "String"), + 1))), + Map.entry("Rooms", Map.entry("void", + Map.entry(List.of("Accounts"), + 1)))))); exprectedStructure.put("Room", Map.entry(Map.ofEntries(Map.entry("account", "Account"), - Map.entry("accounts", "Accounts"), - Map.entry("blue_id", "String"), - Map.entry("red_id", "String")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getBlue_name", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getBlue_id", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getRed_name", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getRed_id", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("updateBlue_nameFromBlue_id", Map.entry("void", - Map.entry(List.of("String","String","String"), - 2))), - Map.entry("updateRed_nameFromRed_id", Map.entry("void", - Map.entry(List.of("String","String","String"), - 2))), - Map.entry("changeRedId", Map.entry("void", - Map.entry(List.of("String","String"), - 3))), - Map.entry("changeBlueId", Map.entry("void", - Map.entry(List.of("String","String"), - 3))), - Map.entry("Room", Map.entry("void", - Map.entry(List.of("Accounts","String","String"), - 5)))))); + Map.entry("accounts", "Accounts"), + Map.entry("blue_id", "String"), + Map.entry("red_id", "String")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getBlue_name", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getBlue_id", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getRed_name", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getRed_id", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("updateBlue_nameFromBlue_id", Map.entry("void", + Map.entry(List.of("String", "String", "String"), + 2))), + Map.entry("updateRed_nameFromRed_id", Map.entry("void", + Map.entry(List.of("String", "String", "String"), + 2))), + Map.entry("changeRedId", Map.entry("void", + Map.entry(List.of("String", "String"), + 3))), + Map.entry("changeBlueId", Map.entry("void", + Map.entry(List.of("String", "String"), + 3))), + Map.entry("Room", Map.entry("void", + Map.entry(List.of("Accounts", "String", "String"), + 5)))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -844,162 +822,162 @@ private void testOnlineBattleGame2() { try { ArrayList generatedCode = generateCode("models/OnlineBattleGame2.model", null); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("accounts", "Accounts"), - Map.entry("rooms", "Rooms")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 2))), - Map.entry("getAccount", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getMember", Map.entry("Map", - Map.entry(List.of("String","int"), - 1))), - Map.entry("getMembers", Map.entry("List", - Map.entry(List.of("String"), - 1))), - Map.entry("addRoomMember", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getAccounts", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getRoom", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getId", Map.entry("String", - Map.entry(List.of("String","int"), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("changeName", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getRooms", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("createRoom", Map.entry("void", - Map.entry(List.of("String"), - 1))), + Map.entry("rooms", "Rooms")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getMember", Map.entry("Map", + Map.entry(List.of("String", "int"), + 1))), + Map.entry("getMembers", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("addRoomMember", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getRoom", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getId", Map.entry("String", + Map.entry(List.of("String", "int"), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getRooms", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String"), + 1))), // Map.entry("getName", Map.entry("String", // Map.entry(List.of("String","int"), // 1))), - Map.entry("getBattle", Map.entry("boolean", - Map.entry(List.of("String"), - 1))), - Map.entry("battle", Map.entry("void", - Map.entry(List.of("String","boolean"), - 1))), - Map.entry("getPoint", Map.entry("int", - Map.entry(List.of("String"), - 1)))))); + Map.entry("getBattle", Map.entry("boolean", + Map.entry(List.of("String"), + 1))), + Map.entry("battle", Map.entry("void", + Map.entry(List.of("String", "boolean"), + 1))), + Map.entry("getPoint", Map.entry("int", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Account", Map.entry(Map.ofEntries(Map.entry("name", "String"), - Map.entry("point", "int")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getPoint", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("updatePointFromBattle", Map.entry("void", - Map.entry(List.of("String","String","int","boolean","String"), - 1))), - Map.entry("changeName", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Account", Map.entry("void", - Map.entry(List.of("String","int"), - 2)))))); + Map.entry("point", "int")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getPoint", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updatePointFromBattle", Map.entry("void", + Map.entry(List.of("String", "String", "int", "boolean", "String"), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("String", "int"), + 2)))))); exprectedStructure.put("Member", Map.entry(Map.ofEntries(Map.entry("id", "String"), - Map.entry("account", "Account"), - Map.entry("accounts", "Accounts")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getId", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("getName", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("Member", Map.entry("void", - Map.entry(List.of("String","Accounts"), - 2)))))); + Map.entry("account", "Account"), + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getId", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("Member", Map.entry("void", + Map.entry(List.of("String", "Accounts"), + 2)))))); exprectedStructure.put("Members", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("getMember", Map.entry("Member", - Map.entry(List.of("int"), - 1))), - Map.entry("addRoomMember", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("getMember", Map.entry("Member", + Map.entry(List.of("int"), + 1))), + Map.entry("addRoomMember", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Account", - Map.entry(List.of("String"), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); exprectedStructure.put("Room", Map.entry(Map.ofEntries(Map.entry("members", "Members"), - Map.entry("battle", "boolean"), - Map.entry("account", "Account"), - Map.entry("accounts", "Accounts")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getMembers", Map.entry("Members", - Map.entry(List.of(), - 1))), - Map.entry("getBattle", Map.entry("boolean", - Map.entry(List.of(), - 1))), - Map.entry("battle", Map.entry("void", - Map.entry(List.of("String","boolean"), - 6))), - Map.entry("Room", Map.entry("void", - Map.entry(List.of("boolean","Accounts"), - 2)))))); + Map.entry("battle", "boolean"), + Map.entry("account", "Account"), + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getMembers", Map.entry("Members", + Map.entry(List.of(), + 1))), + Map.entry("getBattle", Map.entry("boolean", + Map.entry(List.of(), + 1))), + Map.entry("battle", Map.entry("void", + Map.entry(List.of("String", "boolean"), + 6))), + Map.entry("Room", Map.entry("void", + Map.entry(List.of("boolean", "Accounts"), + 2)))))); exprectedStructure.put("Rooms", Map.entry(Map.ofEntries(Map.entry("value", "Map"), - Map.entry("accounts", "Accounts")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getRoom", Map.entry("Room", - Map.entry(List.of("String"), - 1))), - Map.entry("createRoom", Map.entry("void", - Map.entry(List.of("String"), - 1))), - Map.entry("Rooms", Map.entry("void", - Map.entry(List.of("Accounts"), - 1)))))); + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getRoom", Map.entry("Room", + Map.entry(List.of("String"), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String"), + 1))), + Map.entry("Rooms", Map.entry("void", + Map.entry(List.of("Accounts"), + 1)))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -1008,67 +986,67 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/POS.model", PushPullValue.PULL); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("history", "History"), - Map.entry("total", "Total"), - Map.entry("payment", "Payment"), - Map.entry("points", "Points")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 4))), - Map.entry("getHistory", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("getTotal", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("getPayment", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("purchase", Map.entry("void", - Map.entry(List.of("int"), - 1))), - Map.entry("getPoints", Map.entry("int", - Map.entry(List.of(), - 1)))))); + Map.entry("total", "Total"), + Map.entry("payment", "Payment"), + Map.entry("points", "Points")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 4))), + Map.entry("getHistory", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("getTotal", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getPayment", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("purchase", Map.entry("void", + Map.entry(List.of("int"), + 1))), + Map.entry("getPoints", Map.entry("int", + Map.entry(List.of(), + 1)))))); exprectedStructure.put("History", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("updateFromPayment", Map.entry("void", - Map.entry(List.of("int"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("updateFromPayment", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); exprectedStructure.put("Total", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("Total", Map.entry("void", - Map.entry(List.of("History"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("Total", Map.entry("void", + Map.entry(List.of("History"), + 1)))))); exprectedStructure.put("Payment", Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("history", "History")), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("purchase", Map.entry("void", - Map.entry(List.of("int"), - 2))), - Map.entry("Payment", Map.entry("void", - Map.entry(List.of("History"), - 1)))))); + Map.entry("history", "History")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("purchase", Map.entry("void", + Map.entry(List.of("int"), + 2))), + Map.entry("Payment", Map.entry("void", + Map.entry(List.of("History"), + 1)))))); exprectedStructure.put("Points", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("Points", Map.entry("void", - Map.entry(List.of("Payment"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("Points", Map.entry("void", + Map.entry(List.of("Payment"), + 1)))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); @@ -1077,72 +1055,72 @@ generatedCode = generateCode("models/POS.model", PushPullValue.PUSH); exprectedStructure.clear(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("points", "Points"), - Map.entry("total", "Total"), - Map.entry("history", "History"), - Map.entry("payment", "Payment")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 4))), - Map.entry("getPoints", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("getTotal", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("getHistory", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("getPayment", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("purchase", Map.entry("void", - Map.entry(List.of("int"), - 1)))))); + Map.entry("total", "Total"), + Map.entry("history", "History"), + Map.entry("payment", "Payment")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 4))), + Map.entry("getPoints", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getTotal", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getHistory", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("getPayment", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("purchase", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); exprectedStructure.put("Points", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("updateFromPayment", Map.entry("void", - Map.entry(List.of("int"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updateFromPayment", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); exprectedStructure.put("Total", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("updateFromHistory", Map.entry("void", - Map.entry(List.of("List"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updateFromHistory", Map.entry("void", + Map.entry(List.of("List"), + 1)))))); exprectedStructure.put("History", Map.entry(Map.ofEntries(Map.entry("value", "List"), - Map.entry("total", "Total")), - Map.ofEntries(Map.entry("getValue", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("updateFromPayment", Map.entry("void", - Map.entry(List.of("int"), - 2))), - Map.entry("History", Map.entry("void", - Map.entry(List.of("Total"), - 1)))))); + Map.entry("total", "Total")), + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("updateFromPayment", Map.entry("void", + Map.entry(List.of("int"), + 2))), + Map.entry("History", Map.entry("void", + Map.entry(List.of("Total"), + 1)))))); exprectedStructure.put("Payment", Map.entry(Map.ofEntries(Map.entry("value", "int"), - Map.entry("points", "Points"), - Map.entry("history", "History")), - Map.ofEntries(Map.entry("getValue", Map.entry("int", - Map.entry(List.of(), - 1))), - Map.entry("purchase", Map.entry("void", - Map.entry(List.of("int"), - 3))), - Map.entry("Payment", Map.entry("void", - Map.entry(List.of("Points","History"), - 2)))))); + Map.entry("points", "Points"), + Map.entry("history", "History")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("purchase", Map.entry("void", + Map.entry(List.of("int"), + 3))), + Map.entry("Payment", Map.entry("void", + Map.entry(List.of("Points", "History"), + 2)))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -1150,63 +1128,63 @@ private void testSimpleTwitter() { try { ArrayList generatedCode = generateCode("models/SimpleTwitter.model", null); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getAccounts", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getTweets", Map.entry("List", - Map.entry(List.of("String"), - 1))), - Map.entry("tweet", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getTweets", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("tweet", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); exprectedStructure.put("Account", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getTweets", Map.entry("List", - Map.entry(List.of(), - 1))), - Map.entry("tweet", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Account", Map.entry("void", - Map.entry(List.of("List"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getTweets", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("tweet", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("List"), + 1)))))); exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Account", - Map.entry(List.of("String"), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); - + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -1214,76 +1192,76 @@ private void testVotingSystem() { try { ArrayList generatedCode = generateCode("models/VotingSystem.model", null); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("accounts", "Accounts"), - Map.entry("counts", "Counts")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 2))), - Map.entry("getAccounts", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getVote", Map.entry("String", - Map.entry(List.of("String"), - 1))), - Map.entry("cast", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("getAccount", Map.entry("Map", - Map.entry(List.of("String"), - 1))), - Map.entry("getCounts", Map.entry("Map", - Map.entry(List.of(), - 1)))))); + Map.entry("counts", "Counts")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getVote", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("cast", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getCounts", Map.entry("Map", + Map.entry(List.of(), + 1)))))); exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getAccount", Map.entry("Account", - Map.entry(List.of("String"), - 1))), - Map.entry("signUp", Map.entry("void", - Map.entry(List.of("String","String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String", "String"), + 1)))))); exprectedStructure.put("Account", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 1))), - Map.entry("getVote", Map.entry("String", - Map.entry(List.of(), - 1))), - Map.entry("cast", Map.entry("void", - Map.entry(List.of("String","String"), - 1))), - Map.entry("Account", Map.entry("void", - Map.entry(List.of("String"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getVote", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("cast", Map.entry("void", + Map.entry(List.of("String", "String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); exprectedStructure.put("Counts", Map.entry(Map.ofEntries(Map.entry("value", "Map"), - Map.entry("account", "Account"), - Map.entry("accounts", "Accounts")), - Map.ofEntries(Map.entry("getValue", Map.entry("Map", - Map.entry(List.of(), - 6))), - Map.entry("Counts", Map.entry("void", - Map.entry(List.of("Accounts"), - 1)))))); - + Map.entry("account", "Account"), + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 6))), + Map.entry("Counts", Map.entry("void", + Map.entry(List.of("Accounts"), + 1)))))); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } @@ -1292,62 +1270,62 @@ try { // check PULL-first ArrayList generatedCode = generateCode("models/WeatherObservationSystem.model", PushPullValue.PULL); - Map, // field name to type - Map, // arg types - Integer>>>>> // lines of code - exprectedStructure = new HashMap<>(); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("highest", "Highest"), - Map.entry("temp_f", "Temp_f"), - Map.entry("temp_c", "Temp_c")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 3))), - Map.entry("getHighest", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("reset", Map.entry("void", - Map.entry(List.of("double"), - 1))), - Map.entry("getTemp_f", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("observe", Map.entry("void", - Map.entry(List.of("double"), - 1))), - Map.entry("getTemp_c", Map.entry("double", - Map.entry(List.of(), - 1)))))); + Map.entry("temp_f", "Temp_f"), + Map.entry("temp_c", "Temp_c")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 3))), + Map.entry("getHighest", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("reset", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("getTemp_f", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("observe", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("getTemp_c", Map.entry("double", + Map.entry(List.of(), + 1)))))); exprectedStructure.put("Highest", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("updateFromTemp_f", Map.entry("void", - Map.entry(List.of("double"), - 1))), - Map.entry("reset", Map.entry("void", - Map.entry(List.of("double"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromTemp_f", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("reset", Map.entry("void", + Map.entry(List.of("double"), + 1)))))); exprectedStructure.put("Temp_f", Map.entry(Map.ofEntries(Map.entry("value", "double"), - Map.entry("highest", "Highest")), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("observe", Map.entry("void", - Map.entry(List.of("double"), - 2))), - Map.entry("Temp_f", Map.entry("void", - Map.entry(List.of("Highest"), - 1)))))); + Map.entry("highest", "Highest")), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("observe", Map.entry("void", + Map.entry(List.of("double"), + 2))), + Map.entry("Temp_f", Map.entry("void", + Map.entry(List.of("Highest"), + 1)))))); exprectedStructure.put("Temp_c", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("Temp_c", Map.entry("void", - Map.entry(List.of("Temp_f"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("Temp_c", Map.entry("void", + Map.entry(List.of("Temp_f"), + 1)))))); checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); @@ -1356,71 +1334,71 @@ generatedCode = generateCode("models/WeatherObservationSystem.model", PushPullValue.PUSH); exprectedStructure.clear(); exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("temp_c", "Temp_c"), - Map.entry("highest", "Highest"), - Map.entry("temp_f", "Temp_f")), - Map.ofEntries(Map.entry("Main", Map.entry("void", - Map.entry(List.of(), - 3))), - Map.entry("getTemp_c", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("getHighest", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("reset", Map.entry("void", - Map.entry(List.of("double"), - 1))), - Map.entry("getTemp_f", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("observe", Map.entry("void", - Map.entry(List.of("double"), - 1)))))); + Map.entry("highest", "Highest"), + Map.entry("temp_f", "Temp_f")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 3))), + Map.entry("getTemp_c", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("getHighest", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("reset", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("getTemp_f", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("observe", Map.entry("void", + Map.entry(List.of("double"), + 1)))))); exprectedStructure.put("Temp_c", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("updateFromTemp_f", Map.entry("void", - Map.entry(List.of("double"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromTemp_f", Map.entry("void", + Map.entry(List.of("double"), + 1)))))); exprectedStructure.put("Highest", Map.entry(Map.ofEntries(), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("updateFromTemp_f", Map.entry("void", - Map.entry(List.of("double"), - 1))), - Map.entry("reset", Map.entry("void", - Map.entry(List.of("double"), - 1)))))); + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromTemp_f", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("reset", Map.entry("void", + Map.entry(List.of("double"), + 1)))))); exprectedStructure.put("Temp_f", Map.entry(Map.ofEntries(Map.entry("value", "double"), - Map.entry("highest", "Highest"), - Map.entry("temp_c", "Temp_c")), - Map.ofEntries(Map.entry("getValue", Map.entry("double", - Map.entry(List.of(), - 1))), - Map.entry("observe", Map.entry("void", - Map.entry(List.of("double"), - 3))), - Map.entry("Temp_f", Map.entry("void", - Map.entry(List.of("Highest","Temp_c"), - 2)))))); + Map.entry("highest", "Highest"), + Map.entry("temp_c", "Temp_c")), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("observe", Map.entry("void", + Map.entry(List.of("double"), + 3))), + Map.entry("Temp_f", Map.entry("void", + Map.entry(List.of("Highest", "Temp_c"), + 2)))))); - checkStructure(generatedCode, exprectedStructure); + checkStructure(generatedCode, exprectedStructure); // generateCheckCode(generatedCode); - } catch (FileNotFoundException - | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } - - private ArrayList generateCode(String fileName, PushPullValue pushPullValue) throws FileNotFoundException, - ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, - ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, - WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + + private ArrayList generateCode(String fileName, PushPullValue pushPullValue) throws FileNotFoundException, + ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, + ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, + WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { File file = new File(fileName); Parser parser = new Parser(new BufferedReader(new FileReader(file))); DataTransferModel model; @@ -1442,15 +1420,15 @@ // ArrayList codetree = new CodeGeneratorFromDataFlowGraph().generateCode(model, graph, new StandaloneSpecific(), new JavaSpecific()); return codetree; } - + private void checkStructure(ArrayList generatedCode, - Map, Map, Integer>>>>> exprectedStructure) { - for (var classEnt: exprectedStructure.entrySet()) { + Map, Map, Integer>>>>> exprectedStructure) { + for (var classEnt : exprectedStructure.entrySet()) { String expectedClassName = classEnt.getKey(); Entry, Map, Integer>>>> expectedClassStructure = classEnt.getValue(); - TypeDeclaration generatedClass = null; - for (CompilationUnit cu: generatedCode) { - for (TypeDeclaration type: cu.types()) { + TypeDeclaration generatedClass = null; + for (CompilationUnit cu : generatedCode) { + for (TypeDeclaration type : cu.types()) { if (type.getTypeName().equals(expectedClassName)) { generatedClass = type; break; @@ -1462,9 +1440,9 @@ Map exprectedFields = expectedClassStructure.getKey(); Map, Integer>>> exprectedMethods = expectedClassStructure.getValue(); - for (String expectedFieldName: exprectedFields.keySet()) { + for (String expectedFieldName : exprectedFields.keySet()) { FieldDeclaration generatedField = null; - for (FieldDeclaration field: generatedClass.getFields()) { + for (FieldDeclaration field : generatedClass.getFields()) { if (field.getName().equals(expectedFieldName)) { generatedField = field; break; @@ -1480,9 +1458,9 @@ } } - for (String expectedMethodName: exprectedMethods.keySet()) { - MethodDeclaration generatedMethod= null; - for (MethodDeclaration method: generatedClass.getMethods()) { + for (String expectedMethodName : exprectedMethods.keySet()) { + MethodDeclaration generatedMethod = null; + for (MethodDeclaration method : generatedClass.getMethods()) { if (method.getName().equals(expectedMethodName)) { generatedMethod = method; break; @@ -1503,9 +1481,9 @@ } Entry, Integer> expectedMethodInfo2 = expectedMethodInfo.getValue(); List expectedArgTypes = expectedMethodInfo2.getKey(); - for (String expectedArgType: expectedArgTypes) { + for (String expectedArgType : expectedArgTypes) { boolean existsArg = false; - for (VariableDeclaration var: generatedMethod.getParameters()) { + for (VariableDeclaration var : generatedMethod.getParameters()) { if (expectedArgType.equals(var.getType().getInterfaceTypeName())) { existsArg = true; } @@ -1517,7 +1495,7 @@ } } } - + private void generateCheckCode(ArrayList generatedCode) { // exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("history", "History"), // Map.entry("total", "Total"), @@ -1541,18 +1519,19 @@ // Map.entry("getPoints", Map.entry("int", // Map.entry(List.of(), // 1)))))); - for (CompilationUnit cu: generatedCode) { - for (TypeDeclaration type: cu.types()) { + for (CompilationUnit cu : generatedCode) { + for (TypeDeclaration type : cu.types()) { List fields = type.getFields(); List methods = type.getMethods(); // fields if (fields.size() == 0) { System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.ofEntries(),"); - } if (fields.size() == 1) { + } + if (fields.size() == 1) { System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.ofEntries(),"); } else { int i = 0; - for (FieldDeclaration field: fields) { + for (FieldDeclaration field : fields) { if (i == 0) { System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.ofEntries(Map.entry(\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\"),"); } else { @@ -1584,7 +1563,7 @@ System.out.println("Map.ofEntries())));"); } else { int i = 0; - for (MethodDeclaration method: methods) { + for (MethodDeclaration method : methods) { // method name and return type if (i == 0) { System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t"); @@ -1626,7 +1605,7 @@ } else { System.out.print("Map.entry(List.of("); String delim = ""; - for (VariableDeclaration arg: method.getParameters()) { + for (VariableDeclaration arg : method.getParameters()) { System.out.print(delim + "\"" + arg.getType().getInterfaceTypeName() + "\""); delim = ","; } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/NativeAccessTest.java b/AlgebraicDataflowArchitectureModel/src/tests/NativeAccessTest.java index a91d089..75c7e6a 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/NativeAccessTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/NativeAccessTest.java @@ -1,18 +1,12 @@ package tests; -import org.junit.Test; - import algorithms.TypeInference; import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; +import org.junit.Test; import parser.Parser; import parser.Parser.TokenStream; import parser.exceptions.ExpectedColon; @@ -78,11 +72,11 @@ Resource ioResource = initialState.getResource("sampleText"); // Connect the simulator and native code - NativeSender textSender = new NativeSender(simulator, nativeInputEventChannel, sampleText, ioResource) { // Native code => model + NativeSender textSender = new NativeSender(simulator, nativeInputEventChannel, sampleText, ioResource) { // Native code => model }; - INativeReceiver textReceiver = new INativeReceiver() { // Model to native code + INativeReceiver textReceiver = new INativeReceiver() { // Model to native code @Override - public void onReceiveFromModel(Event event, SystemState nextSystemState) { // Receive a message from the model + public void onReceiveFromModel(Event event, SystemState nextSystemState) { // Receive a message from the model Expression message = event.getMessage(); System.out.println(message); } @@ -91,12 +85,12 @@ stream.addLine("input(\"HelloWorld\")"); Expression sendMessage = parser.parseTerm(stream, model); - textSender.sendToModel(sendMessage); // Send a message to the model + textSender.sendToModel(sendMessage); // Send a message to the model } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } - + } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/SimplifiedDataFlowModelTest.java b/AlgebraicDataflowArchitectureModel/src/tests/SimplifiedDataFlowModelTest.java index 099c6a6..7a2d84b 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/SimplifiedDataFlowModelTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/SimplifiedDataFlowModelTest.java @@ -1,23 +1,25 @@ package tests; -import static org.junit.Assert.*; - +import models.Edge; +import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.ResourcePath; +import models.dataFlowModel.DataFlowGraph; +import models.dataFlowModel.DataTransferChannel; +import models.dataFlowModel.DataTransferModel; import org.junit.Test; -import models.*; -import models.dataConstraintModel.*; -import models.dataFlowModel.*; +import static org.junit.Assert.assertEquals; public class SimplifiedDataFlowModelTest { - + @Test public void test() { // Construct a data-flow architecture model. DataTransferModel model = new DataTransferModel(); - ResourcePath payment = new ResourcePath("payment"); // a resource to specify the payment resource - ResourcePath points = new ResourcePath("points"); // a resource to specify the points resource - ResourcePath history = new ResourcePath("history"); // a resource to specify the payment history resource - ResourcePath total = new ResourcePath("total"); // a resource to specify the total payment resource + ResourcePath payment = new ResourcePath("payment"); // a resource to specify the payment resource + ResourcePath points = new ResourcePath("points"); // a resource to specify the points resource + ResourcePath history = new ResourcePath("history"); // a resource to specify the payment history resource + ResourcePath total = new ResourcePath("total"); // a resource to specify the total payment resource model.addResourcePath(payment); model.addResourcePath(points); model.addResourcePath(history); @@ -92,9 +94,9 @@ assertEquals(4, resourceDependencyGraph.getResourceNodes().size()); assertEquals(4, resourceDependencyGraph.getChannelNodes().size()); assertEquals(6, resourceDependencyGraph.getEdges().size()); - for (Edge e: resourceDependencyGraph.getEdges()) { + for (Edge e : resourceDependencyGraph.getEdges()) { System.out.println(e.getSource() + "-(" + e + ")->" + e.getDestination()); } } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/SimulatorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/SimulatorTest.java index a6c2817..917f636 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/SimulatorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/SimulatorTest.java @@ -1,36 +1,25 @@ package tests; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.algebra.Variable; -import models.algebra.Constant; +import models.algebra.*; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; +import org.junit.Test; import parser.Parser; import parser.Parser.TokenStream; import parser.exceptions.ExpectedColon; import parser.exceptions.ExpectedDoubleQuotation; import parser.exceptions.ExpectedRightBracket; import parser.exceptions.WrongJsonExpression; -import simulator.Event; -import simulator.Resource; -import simulator.Simulator; -import simulator.SystemState; -import simulator.ResourceIdentifier; +import simulator.*; import simulator.states.MapResourceState; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + public class SimulatorTest { @Test public void test() { @@ -41,21 +30,21 @@ // Construct a data transfer architecture model. DataTransferModel model = new DataTransferModel(); - ResourcePath customers = new ResourcePath("customers"); // "customers" - ResourcePath customer = new ResourcePath(customers, - new Variable("uid", DataConstraintModel.typeString)); // "customers.{uid}" - ResourcePath customer_off = new ResourcePath(customer, "off"); // "customers.{uid}.off" - ResourcePath customer_add = new ResourcePath(customer, "add"); // "customers.{uid}.add" - ResourcePath companies = new ResourcePath("companies"); // "companies" - ResourcePath company = new ResourcePath(companies, - new Variable("cid", DataConstraintModel.typeString)); // "companies.{cid}" - ResourcePath company_add = new ResourcePath(company, "add"); // "companies.{cid}.add" - ResourcePath company2 = new ResourcePath(companies, - new Variable("cid2", DataConstraintModel.typeString)); // "companies.{cid2}" - ResourcePath company2_add = new ResourcePath(company2, "add"); // "companies.{cid2}.add" - ResourcePath companyA = new ResourcePath(companies, - new Constant("A", DataConstraintModel.typeString)); // "companies.A" - ResourcePath companyA_add = new ResourcePath(companyA, "add"); // "companies.{cid2}.add" + ResourcePath customers = new ResourcePath("customers"); // "customers" + ResourcePath customer = new ResourcePath(customers, + new Variable("uid", DataConstraintModel.typeString)); // "customers.{uid}" + ResourcePath customer_off = new ResourcePath(customer, "off"); // "customers.{uid}.off" + ResourcePath customer_add = new ResourcePath(customer, "add"); // "customers.{uid}.add" + ResourcePath companies = new ResourcePath("companies"); // "companies" + ResourcePath company = new ResourcePath(companies, + new Variable("cid", DataConstraintModel.typeString)); // "companies.{cid}" + ResourcePath company_add = new ResourcePath(company, "add"); // "companies.{cid}.add" + ResourcePath company2 = new ResourcePath(companies, + new Variable("cid2", DataConstraintModel.typeString)); // "companies.{cid2}" + ResourcePath company2_add = new ResourcePath(company2, "add"); // "companies.{cid2}.add" + ResourcePath companyA = new ResourcePath(companies, + new Constant("A", DataConstraintModel.typeString)); // "companies.A" + ResourcePath companyA_add = new ResourcePath(companyA, "add"); // "companies.{cid2}.add" model.addResourcePath(customer_off); model.addResourcePath(customer_add); model.addResourcePath(company_add); @@ -64,7 +53,7 @@ model.addResourcePath(companies); // For channel CIO_AddCustomer - DataTransferChannel cio_addCustomer = new DataTransferChannel("CIO_AddCustomer"); // add a customer + DataTransferChannel cio_addCustomer = new DataTransferChannel("CIO_AddCustomer"); // add a customer ChannelMember customers1 = new ChannelMember(customers); stream.addLine("db:Map"); Expression curStateExp0 = parser.parseTerm(stream, model); @@ -78,7 +67,7 @@ cio_addCustomer.addChannelMemberAsOutput(customers1); // For channel CIO_AddCompany - DataTransferChannel cio_addCompany = new DataTransferChannel("CIO_AddCompany"); // add a company + DataTransferChannel cio_addCompany = new DataTransferChannel("CIO_AddCompany"); // add a company ChannelMember companies1 = new ChannelMember(companies); stream.addLine("db:Map"); Expression curStateExp1 = parser.parseTerm(stream, model); @@ -89,10 +78,10 @@ stream.addLine("insert(db, cid, {\"add\": add})"); Expression nextStateExp1 = parser.parseTerm(stream, model); companies1.getStateTransition().setNextStateExpression(nextStateExp1); - cio_addCompany.addChannelMemberAsOutput(companies1); + cio_addCompany.addChannelMemberAsOutput(companies1); // For channel CIO_SetCustomerOff - DataTransferChannel cio_setCustomerOff = new DataTransferChannel("CIO_SetCustomerOff", new Variable("uid")); // set customer's office + DataTransferChannel cio_setCustomerOff = new DataTransferChannel("CIO_SetCustomerOff", new Variable("uid")); // set customer's office ChannelMember customer_off_1 = new ChannelMember(customer_off); stream.addLine("cid:Str"); Expression curStateExp2 = parser.parseTerm(stream, model); @@ -106,7 +95,7 @@ cio_setCustomerOff.addChannelMemberAsOutput(customer_off_1); // For channel CIO_SetCompanyAdd - DataTransferChannel cio_setCompanyAdd = new DataTransferChannel("CIO_SetCompanyAdd", new Variable("cid")); // set companie's address + DataTransferChannel cio_setCompanyAdd = new DataTransferChannel("CIO_SetCompanyAdd", new Variable("cid")); // set companie's address ChannelMember company_add_1 = new ChannelMember(company_add); stream.addLine("a1:Str"); Expression curStateExp3 = parser.parseTerm(stream, model); @@ -117,10 +106,10 @@ stream.addLine("a2"); Expression nextStateExp3 = parser.parseTerm(stream, model); company_add_1.getStateTransition().setNextStateExpression(nextStateExp3); - cio_setCompanyAdd.addChannelMemberAsOutput(company_add_1); + cio_setCompanyAdd.addChannelMemberAsOutput(company_add_1); // For channel C - DataTransferChannel c = new DataTransferChannel("C", new Variable("uid")); // update customer's address + DataTransferChannel c = new DataTransferChannel("C", new Variable("uid")); // update customer's address ChannelMember customer_off_2 = new ChannelMember(customer_off); stream.addLine("cid:Str"); Expression curStateExp4 = parser.parseTerm(stream, model); @@ -144,7 +133,7 @@ Expression nextStateExp5 = parser.parseTerm(stream, model); company_add_2.getStateTransition().setNextStateExpression(nextStateExp5); c.addChannelMemberAsInput(company_add_2); - + ChannelMember customer_add_2 = new ChannelMember(customer_add); stream.addLine("a3:Str"); Expression curStateExp6 = parser.parseTerm(stream, model); @@ -169,7 +158,7 @@ SystemState initialState = simulator.init(); assertEquals(2, initialState.getRootResources().size()); - for (Resource rootRes: initialState.getRootResources()) { + for (Resource rootRes : initialState.getRootResources()) { assertTrue(rootRes.getState() instanceof MapResourceState); assertEquals(0, rootRes.getChildren().size()); assertEquals(0, ((MapResourceState) rootRes.getState()).getChildStates().size()); @@ -195,7 +184,7 @@ // After the next state (customers.addCustomer("1", "A")) stream.addLine("addCustomer(\"1\", \"A\")"); Expression messageAddCust = parser.parseTerm(stream, model); - Event addCustomer = new Event(cio_addCustomer, messageAddCust, customers, nextState.getResource(ResourceIdentifier.createFrom(customers))); + Event addCustomer = new Event(cio_addCustomer, messageAddCust, customers, nextState.getResource(ResourceIdentifier.createFrom(customers))); simulator.transition(addCustomer); SystemState nextNextState = simulator.getCurState(); @@ -210,7 +199,7 @@ // After the next next state (companies.A.setAdd("Tokyo")) stream.addLine("setAdd(\"Tokyo\")"); Expression messageSetAdd = parser.parseTerm(stream, model); - Event setAdd = new Event(cio_setCompanyAdd, messageSetAdd, company_add, nextNextState.getResource(ResourceIdentifier.createFrom(companyA_add))); + Event setAdd = new Event(cio_setCompanyAdd, messageSetAdd, company_add, nextNextState.getResource(ResourceIdentifier.createFrom(companyA_add))); simulator.transition(setAdd); SystemState nextNextNextState = simulator.getCurState(); Resource customersRes2 = nextNextNextState.getResource(ResourceIdentifier.createFrom(customers)); @@ -220,7 +209,9 @@ System.out.println("companies:" + nextNextNextState.getResource(ResourceIdentifier.createFrom(companies)).getState().getValue()); System.out.println("customers:" + nextNextNextState.getResource(ResourceIdentifier.createFrom(customers)).getState().getValue()); - } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | UnificationFailed | ValueUndefined | ExpectedDoubleQuotation e) { + } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ParameterizedIdentifierIsFutureWork | + ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | UnificationFailed | ValueUndefined | + ExpectedDoubleQuotation e) { e.printStackTrace(); } } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/TermTest.java b/AlgebraicDataflowArchitectureModel/src/tests/TermTest.java index 9ae2ec0..8acffe8 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/TermTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/TermTest.java @@ -1,16 +1,16 @@ package tests; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; -import org.junit.Test; - import models.algebra.Constant; import models.algebra.Symbol; import models.algebra.Term; import models.algebra.Variable; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; public class TermTest { - + @Test public void test() { Symbol add = new Symbol("add", 2); @@ -20,13 +20,13 @@ Variable x = new Variable("x"); Variable y = new Variable("y"); Variable z = new Variable("z"); - Term t1 = new Term(add); // add(1, x) + Term t1 = new Term(add); // add(1, x) t1.addChild(one); t1.addChild(x); - Term t2 = new Term(mul); // mul(add(1, x), y) + Term t2 = new Term(mul); // mul(add(1, x), y) t2.addChild(t1); t2.addChild(y); - Term t3 = new Term(add); // add(1, x) + Term t3 = new Term(add); // add(1, x) t3.addChild(one); t3.addChild(x); @@ -48,5 +48,5 @@ System.out.println(t1); System.out.println(t2); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/UpdateCodeGenerationTest.java b/AlgebraicDataflowArchitectureModel/src/tests/UpdateCodeGenerationTest.java index bc1db89..eaced86 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/UpdateCodeGenerationTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/UpdateCodeGenerationTest.java @@ -1,20 +1,13 @@ package tests; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Field; -import models.algebra.InvalidMessage; -import models.algebra.Parameter; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; -import models.algebra.Variable; -import models.dataConstraintModel.*; -import models.dataFlowModel.DataTransferModel; +import models.algebra.*; +import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.DataConstraintModel; +import models.dataConstraintModel.ResourcePath; +import models.dataConstraintModel.StateTransition; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferChannel.IResourceStateAccessor; +import models.dataFlowModel.DataTransferModel; import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; public class UpdateCodeGenerationTest { @@ -25,10 +18,10 @@ Symbol sum = new Symbol("sum", 1, Symbol.Type.PREFIX, "stream().mapToInt(x->x).sum", Symbol.Type.METHOD); // resources - ResourcePath payment = new ResourcePath("payment"); // a resource to specify the payment resource - ResourcePath points = new ResourcePath("points"); // a resource to specify the loyalty resource - ResourcePath history = new ResourcePath("history"); // a resource to specify the payment history resource - ResourcePath total = new ResourcePath("total"); // a resource to specify the total payment resource + ResourcePath payment = new ResourcePath("payment"); // a resource to specify the payment resource + ResourcePath points = new ResourcePath("points"); // a resource to specify the loyalty resource + ResourcePath history = new ResourcePath("history"); // a resource to specify the payment history resource + ResourcePath total = new ResourcePath("total"); // a resource to specify the total payment resource payment.setResourceStateType(DataConstraintModel.typeInt); points.setResourceStateType(DataConstraintModel.typeInt); history.setResourceStateType(DataConstraintModel.typeInt); @@ -57,6 +50,7 @@ } return null; } + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -66,10 +60,11 @@ if (targetRes.equals(total)) return pTotal; return null; } + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { return null; - } + } }; // methods in the Java program @@ -90,6 +85,7 @@ } return null; } + @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { ResourcePath targetRes = target.getResource(); @@ -115,10 +111,11 @@ } return null; } + @Override public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) { return null; - } + } }; // === c1 === @@ -137,12 +134,12 @@ Variable l = new Variable("l"); Constant c_0_05 = new Constant("0.05"); Symbol update1 = new Symbol("update1", 1); - Term c1_message = new Term(update1); // update1(y) + Term c1_message = new Term(update1); // update1(y) c1_message.addChild(y); - Term rawPoints = new Term(DataConstraintModel.mul); // y*0.05 + Term rawPoints = new Term(DataConstraintModel.mul); // y*0.05 rawPoints.addChild(y); rawPoints.addChild(c_0_05); - Term nextPoints = new Term(floor); // floor(y*0.05) + Term nextPoints = new Term(floor); // floor(y*0.05) nextPoints.addChild(rawPoints); StateTransition c1_payment_transition = new StateTransition(); @@ -160,14 +157,14 @@ System.out.println(c1); try { - String[] sideEffects = new String[] {""}; - System.out.println("-----"); + String[] sideEffects = new String[]{""}; + System.out.println("-----"); System.out.println(c1.deriveUpdateExpressionOf(c1_loyalty).toImplementation(sideEffects)); System.out.println("-- PUSH --"); Expression loyaltyPushUpdate = c1.deriveUpdateExpressionOf(c1_loyalty, pushAccessor).getKey(); Parameter param = null; - for (Parameter p: loyaltyPushUpdate.getSubTerms(Parameter.class).values()) { + for (Parameter p : loyaltyPushUpdate.getSubTerms(Parameter.class).values()) { if (p.equals(pPayment) || p.equals(pPoints) || p.equals(pHistory) || p.equals(pTotal)) { param = p; break; @@ -182,7 +179,7 @@ System.out.println("\t return " + c1.deriveUpdateExpressionOf(c1_loyalty, pullAccessor).getKey().toImplementation(sideEffects) + ";"); System.out.println("}"); } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage - | UnificationFailed | ValueUndefined e) { + | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } @@ -202,9 +199,9 @@ Variable z = new Variable("z"); Variable h = new Variable("h"); Symbol update2 = new Symbol("update2", 1); - Term c2_message = new Term(update2); // update2(z) + Term c2_message = new Term(update2); // update2(z) c2_message.addChild(z); - Term nextHistory = new Term(DataTransferModel.cons); // cons(z, h) + Term nextHistory = new Term(DataTransferModel.cons); // cons(z, h) nextHistory.addChild(z); nextHistory.addChild(h); @@ -220,17 +217,17 @@ c2_history_transition.setNextStateExpression(nextHistory); c2_history.setStateTransition(c2_history_transition); - System.out.println(c2); + System.out.println(c2); try { - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; System.out.println("-----"); System.out.println(c2.deriveUpdateExpressionOf(c2_history).toImplementation(sideEffects)); System.out.println("-- PUSH --"); Expression historyPushUpdate = c2.deriveUpdateExpressionOf(c2_history, pushAccessor).getKey(); Parameter param = null; - for (Parameter p: historyPushUpdate.getSubTerms(Parameter.class).values()) { + for (Parameter p : historyPushUpdate.getSubTerms(Parameter.class).values()) { if (p.equals(pPayment) || p.equals(pPoints) || p.equals(pHistory) || p.equals(pTotal)) { param = p; break; @@ -245,7 +242,7 @@ System.out.println("\t return " + c2.deriveUpdateExpressionOf(c2_history, pullAccessor).getKey().toImplementation(sideEffects) + ";"); System.out.println("}"); } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage - | UnificationFailed | ValueUndefined e) { + | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } @@ -265,7 +262,7 @@ Variable u = new Variable("u"); Variable t = new Variable("t"); Symbol update3 = new Symbol("update3", 1); - Term c3_message = new Term(update3); // update3(u) + Term c3_message = new Term(update3); // update3(u) c3_message.addChild(u); Expression nextHistory2 = u; Term nextTotal = new Term(sum); @@ -276,7 +273,7 @@ c3_history_transition.setMessageExpression(c3_message); c3_history_transition.setNextStateExpression(nextHistory2); c3_history.setStateTransition(c3_history_transition); - + StateTransition c3_total_transition = new StateTransition(); c3_total_transition.setCurStateExpression(t); c3_total_transition.setMessageExpression(c3_message); @@ -284,16 +281,16 @@ c3_total.setStateTransition(c3_total_transition); System.out.println(c3); - + try { - String[] sideEffects = new String[] {""}; + String[] sideEffects = new String[]{""}; System.out.println("-----"); System.out.println(c3.deriveUpdateExpressionOf(c3_total).toImplementation(sideEffects)); System.out.println("-- PUSH --"); Expression totalPushUpdate = c3.deriveUpdateExpressionOf(c3_total, pushAccessor).getKey(); Parameter param = null; - for (Parameter p: totalPushUpdate.getSubTerms(Parameter.class).values()) { + for (Parameter p : totalPushUpdate.getSubTerms(Parameter.class).values()) { if (p.equals(pPayment) || p.equals(pPoints) || p.equals(pHistory) || p.equals(pTotal)) { param = p; break; @@ -308,11 +305,11 @@ System.out.println("\t return " + c3.deriveUpdateExpressionOf(c3_total, pullAccessor).getKey().toImplementation(sideEffects) + ";"); System.out.println("}"); } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage - | UnificationFailed | ValueUndefined e) { + | UnificationFailed | ValueUndefined e) { e.printStackTrace(); } System.out.println("=========="); } - + } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/UpdateConflictCheckTest.java b/AlgebraicDataflowArchitectureModel/src/tests/UpdateConflictCheckTest.java index a7d7d6a..3f860c1 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/UpdateConflictCheckTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/UpdateConflictCheckTest.java @@ -1,33 +1,17 @@ package tests; -import static org.junit.Assert.*; +import algorithms.Validation; +import models.dataFlowModel.DataTransferModel; +import org.junit.Test; +import parser.Parser; +import parser.exceptions.*; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; -import org.junit.Test; - -import algorithms.*; -import models.dataFlowModel.DataTransferModel; -import parser.Parser; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; +import static org.junit.Assert.assertTrue; public class UpdateConflictCheckTest { @@ -41,9 +25,10 @@ model = parser.doParse(); assertTrue(Validation.checkUpdateConflict(model)); } catch (ExpectedRightBracket | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket - | ExpectedRightCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals - | ExpectedRHSExpression | WrongLHSExpression | WrongRHSExpression | ExpectedAssignment - | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + | ExpectedRightCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | + ExpectedEquals + | ExpectedRHSExpression | WrongLHSExpression | WrongRHSExpression | ExpectedAssignment + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } catch (FileNotFoundException e) { diff --git a/AlgebraicDataflowArchitectureModel/src/tests/parser/ParseTest.java b/AlgebraicDataflowArchitectureModel/src/tests/parser/ParseTest.java index 8c5eae4..2de472e 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/parser/ParseTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/parser/ParseTest.java @@ -1,10 +1,5 @@ package tests.parser; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; - import models.Edge; import models.algebra.InvalidMessage; import models.algebra.ParameterizedIdentifierIsFutureWork; @@ -12,27 +7,20 @@ import models.algebra.ValueUndefined; import models.dataConstraintModel.Channel; import models.dataConstraintModel.ChannelMember; -import models.dataFlowModel.*; +import models.dataFlowModel.DataFlowGraph; +import models.dataFlowModel.DataTransferChannel; +import models.dataFlowModel.DataTransferModel; +import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; import parser.Parser; -import parser.exceptions.ExpectedAssignment; -import parser.exceptions.ExpectedChannel; -import parser.exceptions.ExpectedChannelName; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedEquals; -import parser.exceptions.ExpectedInOrOutOrRefOrSubKeyword; -import parser.exceptions.ExpectedLeftCurlyBracket; -import parser.exceptions.ExpectedRHSExpression; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.ExpectedRightCurlyBracket; -import parser.exceptions.ExpectedStateTransition; -import parser.exceptions.WrongJsonExpression; -import parser.exceptions.WrongLHSExpression; -import parser.exceptions.WrongPathExpression; -import parser.exceptions.WrongRHSExpression; +import parser.exceptions.*; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; public class ParseTest { - + public static void main(String[] args) { File file = new File("models/POS.model"); try { @@ -41,30 +29,31 @@ try { model = parser.doParse(); System.out.println(model); - - for (Channel c: model.getChannels()) { - for (ChannelMember out: ((DataTransferChannel) c).getOutputChannelMembers()) { - String[] sideEffects = new String[] {""}; + + for (Channel c : model.getChannels()) { + for (ChannelMember out : ((DataTransferChannel) c).getOutputChannelMembers()) { + String[] sideEffects = new String[]{""}; System.out.println("next" + out.getResource().getLeafResourceName() + " = " + ((DataTransferChannel) c).deriveUpdateExpressionOf(out).toImplementation(sideEffects)); } } - + System.out.println(); - + DataFlowGraph resourceDependencyGraph = model.getDataFlowGraph(); - for (Edge e: resourceDependencyGraph.getEdges()) { + for (Edge e : resourceDependencyGraph.getEdges()) { System.out.println(e.getSource() + "-(" + e + ")->" + e.getDestination()); } } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword - | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression - | WrongRHSExpression | ExpectedRightBracket | ParameterizedIdentifierIsFutureWork - | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage - | UnificationFailed | ValueUndefined | ExpectedAssignment | ExpectedRightCurlyBracket | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ParameterizedIdentifierIsFutureWork + | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage + | UnificationFailed | ValueUndefined | ExpectedAssignment | ExpectedRightCurlyBracket | + WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } } - + }