diff --git a/AlgebraicDataflowArchitectureModel/src/application/ApplicationWindow.java b/AlgebraicDataflowArchitectureModel/src/application/ApplicationWindow.java index c692fa3..3b5141a 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/ApplicationWindow.java +++ b/AlgebraicDataflowArchitectureModel/src/application/ApplicationWindow.java @@ -62,7 +62,7 @@ navigationWindow.setVisible(true); showFlowLayerWindow = new FlowLayerWindow(this); - showFlowLayerWindow.setVisible(false); + showFlowLayerWindow.setVisible(true); editor.addStageChangeListener(navigationWindow); editor.addStageChangeListener(showFlowLayerWindow); diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java index dd200c7..32b4e79 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java @@ -4,6 +4,8 @@ import com.mxgraph.model.mxCell; import com.mxgraph.model.mxGeometry; import com.mxgraph.swing.mxGraphComponent; +import com.mxgraph.view.mxCellState; +import models.dependencyModel.DependencyGraph; import models.dependencyModel.InterfaceNode; import javax.swing.*; @@ -208,12 +210,14 @@ mxCell root = (mxCell) graphComponent.getGraph().getDefaultParent(); mxCell layerCell = (mxCell) root.getChildAt(ddmStage.DEPENDENCY_LAYER); - // Calculate the midpoint of the edge - mxGeometry sourceGeo = source.getGeometry(); - mxGeometry targetGeo = target.getGeometry(); + mxCellState s = graphComponent.getGraph().getView().getState(source); + mxCellState t = graphComponent.getGraph().getView().getState(target); - double midX = (sourceGeo.getCenterX() + targetGeo.getCenterX()) / 2; - double midY = (sourceGeo.getCenterY() + targetGeo.getCenterY()) / 2; + double midX, midY; + + midX = (s.getCenterX() + t.getCenterX()) / 2; + midY = (s.getCenterY() + t.getCenterY()) / 2; + graphComponent.getGraph().getModel().beginUpdate(); try { diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java index 662e6be..5e1d44d 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java @@ -13,6 +13,7 @@ import com.mxgraph.view.mxGraph; import com.mxgraph.view.mxPerimeter; import com.mxgraph.view.mxStyleRegistry; +import models.Edge; import models.Node; import models.algebra.*; import models.controlFlowModel.*; @@ -33,7 +34,7 @@ mxGraphics2DCanvas.putShape("interface", new mxInterfaceShape()); mxStyleRegistry.putValue("interfacePerimeter", new mxInterfacePerimeter()); } - public final int DEPENDENCY_NODE_SIZE = 50; + public final int DEPENDENCY_NODE_SIZE = 40; private DependencyGraph dependencyGraph = null; @@ -41,7 +42,7 @@ private HashMap eventChannelToCell; private HashMap cellToInterfaceNode = new HashMap<>(); - private String dependencyEdgeStyle = "strokeWidth=2;strokeColor=green;movable=false"; + private String dependencyEdgeStyle = "strokeWidth=1;strokeColor=green;movable=false"; //-------------------------------------------------- // constructor @@ -64,6 +65,10 @@ cellToInterfaceNode.put(cell, interfaceNode); } + public DependencyGraph getDependencyGraph(){ + return dependencyGraph; + } + @Override public void init(Stage prevStage) { if (prevStage instanceof PushPullSelectionStage) { @@ -174,7 +179,7 @@ double h = geo.getHeight(); String label = (String) oldCell.getValue(); - String newStyle = "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top"; + String newStyle = "shape=ellipse;perimeter=ellipsePerimeter;verticalAlign=top;opacity=" + 0; mxCell newCell = (mxCell) graph.insertVertex(newParent,null, label, x, y, w, h, newStyle); @@ -319,7 +324,7 @@ mxCell root = (mxCell) graph.getDefaultParent(); mxCell layerCell = (mxCell) root.getChildAt(DEPENDENCY_LAYER); - for (CallEdge callEdge : dependencyGraph.getDependencyEdges()) { + for (Edge callEdge : dependencyGraph.getEdges()) { Node srcNode = callEdge.getSource(); Node dstNode = callEdge.getDestination(); diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java new file mode 100644 index 0000000..3ef765c --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java @@ -0,0 +1,13 @@ +package models.dependencyModel; + +import models.Edge; +import models.Node; +import models.controlFlowModel.EventChannelObjectNode; +import models.controlFlowModel.ObjectNode; +import models.controlFlowModel.StatefulObjectNode; + +public class DependencyEdge extends Edge { + public DependencyEdge(ObjectNode src, ObjectNode dst){ + super(src,dst); + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java index 161890a..77d76a2 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java @@ -3,37 +3,66 @@ import models.DirectedGraph; import models.Edge; import models.Node; -import models.controlFlowModel.CallEdge; -import models.controlFlowModel.EventChannelObjectNode; -import models.controlFlowModel.StatefulObjectNode; -import models.controlFlowModel.ControlFlowGraph; +import models.controlFlowModel.*; import models.dataFlowModel.DataFlowGraph; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; import models.dataFlowModel.IFlowGraph; import models.dataFlowModel.ResourceNode; +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; - - private DirectedGraph dependencyGraph; + protected Map statefulObjectNodeMap = null; public DependencyGraph(ControlFlowGraph controlFlowGraph, DataTransferModel model) { - - //ControlFlowGraphのPush, PullCallGraphをDependencyGraphに追加する this.controlFlowGraph = controlFlowGraph; - for(Edge e: controlFlowGraph.getPushCallGraph().getEdges()){ - this.addEdge(e); + this.statefulObjectNodeMap = new HashMap<>(); + + for (Edge e : controlFlowGraph.getPushCallGraph().getEdges()) { + addEdge(e.getSource(), e.getDestination()); } - for(Edge e: controlFlowGraph.getPullCallGraph().getEdges()){ - this.addEdge(e); + for (Edge e : controlFlowGraph.getPullCallGraph().getEdges()) { + addEdge(e.getSource(), e.getDestination()); + } + //statefulObjectNodeMap.forEach((k, v) -> System.out.println(k + " -> " + v)); + this.getEdges().forEach(e -> + System.out.println(e.getSource() + " -> " + e.getDestination())); + } + + public void addNode(ObjectNode node) { + if (node instanceof EventChannelObjectNode) { + EventChannelObjectNode ecoNode = (EventChannelObjectNode) node; + if (!statefulObjectNodeMap.containsKey(node)) { + statefulObjectNodeMap.put(node, ecoNode); + super.addNode(ecoNode); + } + } else if (node instanceof StatefulObjectNode) { + StatefulObjectNode sNode = (StatefulObjectNode) node; + if (!statefulObjectNodeMap.containsKey(node)) { + statefulObjectNodeMap.put(node, sNode); + super.addNode(sNode); + } + } else { + super.addNode(node); } } + public void addEdge(Node srcNode, Node dstNode){ + addNode((ObjectNode) srcNode); + addNode((ObjectNode) dstNode); + addEdge(new DependencyEdge(getOrCreateObjectNode(( + EventChannelObjectNode) srcNode), getOrCreateObjectNode((StatefulObjectNode)dstNode))); + } + + private ObjectNode getOrCreateObjectNode(ObjectNode node) { + ObjectNode obj = statefulObjectNodeMap.get(node); + return obj; + } public DataFlowGraph getDataFlowGraph(){ return controlFlowGraph.getDataFlowGraph(); } @@ -43,42 +72,6 @@ } /** - * Get all dependency edges (CallEdges from push/pull call graphs) - * @return Set of CallEdges representing dependencies between resources - */ - public Set getDependencyEdges() { - Set dependencyEdges = new HashSet<>(); - for (Edge edge : getEdges()) { - if (edge instanceof CallEdge) { - dependencyEdges.add((CallEdge) edge); - } - } - return dependencyEdges; - } - - /** - * Get push dependency edges only - * @return Set of push CallEdges - */ - public Set getPushDependencyEdges() { - return controlFlowGraph.getPushCallGraph().getEdges().stream() - .filter(e -> e instanceof CallEdge) - .map(e -> (CallEdge) e) - .collect(java.util.stream.Collectors.toSet()); - } - - /** - * Get pull dependency edges only - * @return Set of pull CallEdges - */ - public Set getPullDependencyEdges() { - return controlFlowGraph.getPullCallGraph().getEdges().stream() - .filter(e -> e instanceof CallEdge) - .map(e -> (CallEdge) e) - .collect(java.util.stream.Collectors.toSet()); - } - - /** * Get resource node from StatefulObjectNode * @param objectNode StatefulObjectNode * @return Corresponding ResourceNode or null diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/InterfaceNode.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/InterfaceNode.java index 645ff11..d349856 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/InterfaceNode.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/InterfaceNode.java @@ -1,6 +1,8 @@ package models.dependencyModel; -public class InterfaceNode { +import models.Node; + +public class InterfaceNode extends Node { private String name; private String methodCode;