diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java index afb3904..c12ff85 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java @@ -38,6 +38,7 @@ private HashMap resNodeToCell; private HashMap eventChannelToCell; + private HashMap eventChannelObjNodeToCell; private HashMap cellToInterfaceNode = new HashMap<>(); private String dependencyEdgeStyle = "strokeWidth=1;strokeColor=green;movable=false"; @@ -78,6 +79,7 @@ resNodeToCell = ((PushPullSelectionStage) prevStage).getResNodeToCell(); eventChannelToCell = ((PushPullSelectionStage) prevStage).getEventChannelToCell(); + buildEventChannelObjNodeMap(prevStage); mxCell parent = (mxCell) graph.getDefaultParent(); mxCell layer = (mxCell) parent.getChildAt(DEPENDENCY_LAYER); @@ -114,6 +116,18 @@ // private //-------------------------------------------------- + private void buildEventChannelObjNodeMap(Stage prevStage) { + eventChannelObjNodeToCell = new HashMap<>(); + + for (Map.Entry entry : ((PushPullSelectionStage) prevStage).getEventChannelToCell().entrySet()) { + DataTransferChannel channel = entry.getKey(); + mxCell cell = entry.getValue(); + + EventChannelObjectNode objNode = new EventChannelObjectNode(channel); + eventChannelObjNodeToCell.put(objNode, cell); + } + } + private void clearDependencyGraphCells(mxGraph graph) { mxCell root = (mxCell) graph.getDefaultParent(); mxCell dependencyLayer = (mxCell) root.getChildAt(DEPENDENCY_LAYER); @@ -157,7 +171,8 @@ mxCell dependencyLayer = (mxCell) root.getChildAt(DEPENDENCY_LAYER); // Find top-level resource nodes and recursively copy them - for (ResourceNode resourceNode : dependencyGraph.getDataFlowGraph().getRootResourceNodes()) { + for (StatefulObjectNode statefulObjectNode : dependencyGraph.getRootStatefulObjectNodes()) { + ResourceNode resourceNode = statefulObjectNode.getResource(); mxCell oldCell = resNodeToCell.get(resourceNode); if (oldCell != null) { mxCell newCell = cloneResourceCellHierarchy(oldCell, dependencyLayer, resNodeCells); @@ -232,8 +247,8 @@ mxCell dependencyLayer = (mxCell) root.getChildAt(DEPENDENCY_LAYER); // Recursively copy the EventChannel hierarchy - for (ChannelNode channelNode : dependencyGraph.getDataFlowGraph().getRootChannelNodes()) { - DataTransferChannel channel = channelNode.getChannel(); + for (EventChannelObjectNode eventChannelNode : dependencyGraph.getEventChannelObjectNodes()) { + DataTransferChannel channel = eventChannelNode.getIOChannel(); if (channel.getInputResources().isEmpty()) { mxCell oldCell = eventChannelToCell.get(channel); if (oldCell != null && !eventChannelCells.containsKey(channel)) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java index e8d2306..c5c13f2 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java @@ -9,14 +9,17 @@ import models.dataFlowModel.DataTransferModel; import models.dataFlowModel.IFlowGraph; import models.dataFlowModel.ResourceNode; +import simulator.states.State; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; public class DependencyGraph extends DirectedGraph implements IFlowGraph { private final ControlFlowGraph controlFlowGraph; protected Map objectNodeMap = null; + protected Set rootStatefulObjectNodes = null; public DependencyGraph(ControlFlowGraph controlFlowGraph, DataTransferModel model) { this.controlFlowGraph = controlFlowGraph; @@ -28,6 +31,18 @@ for (Edge e : controlFlowGraph.getPullCallGraph().getEdges()) { addEdge(e.getSource(), e.getDestination()); } + + initRootStatefulObjectNodes(getDataFlowGraph()); + } + + //このコードはControlFlowModelingで実装するのが適している + private void initRootStatefulObjectNodes(DataFlowGraph dfGraph) { + rootStatefulObjectNodes = new HashSet<>(); + + for (ResourceNode res : dfGraph.getRootResourceNodes()) { + StatefulObjectNode stateful = new StatefulObjectNode(res); + rootStatefulObjectNodes.add(stateful); + } } public void addNode(ObjectNode node) { @@ -69,6 +84,20 @@ return controlFlowGraph; } + public Set getEventChannelObjectNodes(){ + Set result = new HashSet<>(); + for (Node node : getNodes()) { + if (node instanceof EventChannelObjectNode) { + result.add((EventChannelObjectNode) node); + } + } + return result; + } + + public Set getRootStatefulObjectNodes(){ + return rootStatefulObjectNodes; + } + @Override public Map> getAllComponentNodes() { return null;