diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java index 2516a92..1a92e8b 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java @@ -181,7 +181,7 @@ // Set layout setDAGLayout(); - changeStage(STAGE_DEPENDENCY_MODELING); + //changeStage(STAGE_DEPENDENCY_MODELING); changeStage(STAGE_PUSH_PULL_SELECTION); // Update current file info diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java index 492d109..3932005 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java @@ -2,9 +2,9 @@ import application.editor.FlowCellEditor; import com.mxgraph.model.mxCell; -import com.mxgraph.model.mxGeometry; import com.mxgraph.swing.mxGraphComponent; import com.mxgraph.view.mxCellState; +import com.mxgraph.view.mxGraph; import models.Edge; import models.controlFlowModel.ObjectNode; import models.dependencyModel.DependencyEdge; @@ -12,7 +12,6 @@ import models.dependencyModel.InterfaceNode; import javax.swing.*; -import javax.xml.transform.Source; import java.awt.*; import java.awt.event.MouseEvent; import java.util.EventObject; @@ -35,7 +34,6 @@ if (!(eventObj instanceof MouseEvent)) return; MouseEvent mouseEvent = (MouseEvent) eventObj; - // Right-click if (SwingUtilities.isRightMouseButton(mouseEvent)) { if (cell.isEdge()) { showEdgeContextMenu(cell, mouseEvent); @@ -43,10 +41,7 @@ showInterfaceContextMenu(cell, mouseEvent); } return; - } - - // Left-click - if (isInterfaceNode(cell) && mouseEvent.getClickCount() == 2) { + } else if (SwingUtilities.isLeftMouseButton(mouseEvent) && isInterfaceNode(cell)) { showInterfaceEditDialog(cell, eventObj); } @@ -118,9 +113,9 @@ private void removeInterface(mxCell interfaceCell) { DependencyModelingStage ddmStage = (DependencyModelingStage) stage; - // Get the DEPENDENCY_LAYER - mxCell root = (mxCell) graphComponent.getGraph().getDefaultParent(); - mxCell layerCell = (mxCell) root.getChildAt(ddmStage.DEPENDENCY_LAYER); + mxGraph graph = graphComponent.getGraph(); + mxCell layerCell = (mxCell) ((mxCell) graph.getDefaultParent()) + .getChildAt(ddmStage.DEPENDENCY_LAYER); // Get edges connected to the interface node int edgeCount = interfaceCell.getEdgeCount(); @@ -170,7 +165,7 @@ return; } - graphComponent.getGraph().getModel().beginUpdate(); + graph.getModel().beginUpdate(); try { DependencyGraph depGraph = ddmStage.getDependencyGraph(); @@ -189,9 +184,9 @@ for (Edge e : depGraph.getEdges()) { DependencyEdge de = (DependencyEdge) e; if (de.getDestination() == interfaceNode) { - if (de.getEdgeType() == DependencyEdge.DependencyEdgeType.DEPENDENCY) { + if (de.getEdgeType() == DependencyEdge.EdgeType.DEPENDENCY) { depEdge = de; - } else if (de.getEdgeType() == DependencyEdge.DependencyEdgeType.IMPLEMENT) { + } else if (de.getEdgeType() == DependencyEdge.EdgeType.IMPLEMENT) { implEdge = de; } } @@ -203,15 +198,13 @@ ddmStage.getDependencyGraph().removeNode(interfaceNode); ddmStage.removeInterfaceNode(interfaceCell); - DependencyEdge restored = - new DependencyEdge(srcNode, dstNode, DependencyEdge.DependencyEdgeType.DEPENDENCY); - depGraph.addEdge(restored); + depGraph.addEdge(new DependencyEdge(srcNode, dstNode, DependencyEdge.EdgeType.DEPENDENCY)); } // Remove the interface node and its edges - graphComponent.getGraph().getModel().remove(edge1); - graphComponent.getGraph().getModel().remove(edge2); - graphComponent.getGraph().getModel().remove(interfaceCell); + graph.getModel().remove(edge1); + graph.getModel().remove(edge2); + graph.getModel().remove(interfaceCell); // Restore the original edge (source -> target) // Remove the dashed style @@ -222,7 +215,7 @@ .replace("dashed=true", ""); } - graphComponent.getGraph().insertEdge( + graph.insertEdge( layerCell, null, edgeValue, @@ -232,7 +225,7 @@ ); } finally { - graphComponent.getGraph().getModel().endUpdate(); + graph.getModel().endUpdate(); graphComponent.refresh(); } } @@ -245,48 +238,38 @@ mxCell source = (mxCell) edgeCell.getSource(); mxCell destination = (mxCell) edgeCell.getTarget(); - if (source == null || destination == null) return; - mxCell root = (mxCell) graphComponent.getGraph().getDefaultParent(); - mxCell layerCell = (mxCell) root.getChildAt(ddmStage.DEPENDENCY_LAYER); + mxGraph graph = graphComponent.getGraph(); + mxCell layerCell = (mxCell) ((mxCell) graph.getDefaultParent()) + .getChildAt(ddmStage.DEPENDENCY_LAYER); - mxCellState s = graphComponent.getGraph().getView().getState(source); - mxCellState t = graphComponent.getGraph().getView().getState(destination); + mxCellState s = graph.getView().getState(source); + mxCellState t = graph.getView().getState(destination); double midX, midY; - midX = (s.getCenterX() + t.getCenterX()) / 2; midY = (s.getCenterY() + t.getCenterY()) / 2; - - graphComponent.getGraph().getModel().beginUpdate(); + graph.getModel().beginUpdate(); try { // Remove the original edge - graphComponent.getGraph().getModel().remove(edgeCell); + graph.getModel().remove(edgeCell); // Insert the interface node (Interface) into the DEPENDENCY_LAYER - mxCell interfaceCell = (mxCell) graphComponent.getGraph().insertVertex( - layerCell, - null, - "Interface", - midX - ddmStage.DEPENDENCY_NODE_SIZE / 2, - midY - ddmStage.DEPENDENCY_NODE_SIZE / 2, - ddmStage.DEPENDENCY_NODE_SIZE, - ddmStage.DEPENDENCY_NODE_SIZE, + mxCell interfaceCell = (mxCell) graph.insertVertex( + layerCell, null, "Interface", + midX - ddmStage.INTERFACE_NODE_SIZE / 2, + midY - ddmStage.INTERFACE_NODE_SIZE / 2, + ddmStage.INTERFACE_NODE_SIZE, + ddmStage.INTERFACE_NODE_SIZE, "shape=interface;strokeColor=green;fillColor=#BBFFBB;perimeter=interfacePerimeter;resizable=0;" ); // Input Interface Name - String defaultName = "Interface"; - String newName = JOptionPane.showInputDialog( - graphComponent, - "Interface name:", - defaultName - ); - - if (newName != null && !newName.trim().isEmpty()) { - interfaceCell.setValue(newName.trim()); + String name = JOptionPane.showInputDialog(graphComponent, "Interface name:", "Interface"); + if (name != null && !name.trim().isEmpty()) { + interfaceCell.setValue(name.trim()); } // Get the original edge's style and value @@ -299,8 +282,8 @@ srcNode = ddmStage.getStatefulObjectNode(source); } ObjectNode dstNode = ddmStage.getStatefulObjectNode(destination); - InterfaceNode InterfaceNode = new InterfaceNode(srcNode, dstNode, interfaceCell.getValue().toString()); - ddmStage.setInterfaceNode(interfaceCell, InterfaceNode); + InterfaceNode iNode = new InterfaceNode(srcNode, dstNode, interfaceCell.getValue().toString()); + ddmStage.setInterfaceNode(interfaceCell, iNode); DependencyGraph depGraph = ddmStage.getDependencyGraph(); DependencyEdge targetEdge = null; @@ -312,34 +295,24 @@ } } - if (targetEdge != null) { - depGraph.removeEdge(targetEdge); - - DependencyEdge depEdge = - new DependencyEdge(srcNode, InterfaceNode, DependencyEdge.DependencyEdgeType.DEPENDENCY); - DependencyEdge implEdge = - new DependencyEdge(dstNode, InterfaceNode, DependencyEdge.DependencyEdgeType.IMPLEMENT); - - depGraph.addEdge(depEdge); - depGraph.addEdge(implEdge); - } + if (targetEdge == null) return; + depGraph.removeEdge(targetEdge); + depGraph.addEdge(new DependencyEdge(srcNode, iNode, DependencyEdge.EdgeType.DEPENDENCY)); + depGraph.addEdge(new DependencyEdge(dstNode, iNode, DependencyEdge.EdgeType.IMPLEMENT)); // Create edge from source -> interface (keep original style) - graphComponent.getGraph().insertEdge(layerCell, null, edgeValue, source, interfaceCell, edgeStyle); + graph.insertEdge(layerCell, null, edgeValue, source, interfaceCell, edgeStyle); // Create edge from destination -> interface (reverse direction, dashed) // Add "dashed=true" to the style - String reversedStyle = edgeStyle; - if (reversedStyle != null && !reversedStyle.contains("dashed")) { - reversedStyle = reversedStyle + ";dashed=true"; - } else if (reversedStyle == null) { - reversedStyle = "dashed=true"; - } + String dashedStyle = (edgeStyle == null) + ? "dashed=true" + : (edgeStyle.contains("dashed") ? edgeStyle : edgeStyle + ";dashed=true"); - graphComponent.getGraph().insertEdge(layerCell, null, edgeValue, destination, interfaceCell, reversedStyle); + graph.insertEdge(layerCell, null, edgeValue, destination, interfaceCell, dashedStyle); } finally { - graphComponent.getGraph().getModel().endUpdate(); + graph.getModel().endUpdate(); graphComponent.refresh(); } } @@ -348,11 +321,8 @@ * Show dialog to edit interface name and method code */ private void showInterfaceEditDialog(mxCell cell, EventObject eventObj) { - DependencyModelingStage ddmStage = (DependencyModelingStage) stage; - - // Get or create InterfaceNode - InterfaceNode interfaceNode = ddmStage.getInterfaceNode(cell); - if (interfaceNode == null) return ; + InterfaceNode interfaceNode = ((DependencyModelingStage) stage).getInterfaceNode(cell); + if (interfaceNode == null) return; // Create dialog JDialog dialog = new JDialog((Frame) null, "Interface Settings", true); diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java index 343dd1e..64b3a64 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java @@ -17,7 +17,6 @@ import models.controlFlowModel.*; import models.dataFlowModel.*; import models.dependencyModel.*; -import simulator.Event; import java.awt.event.MouseListener; import java.util.*; @@ -28,7 +27,7 @@ mxGraphics2DCanvas.putShape("interface", new mxInterfaceShape()); mxStyleRegistry.putValue("interfacePerimeter", new mxInterfacePerimeter()); } - public final int DEPENDENCY_NODE_SIZE = 40; + public final double INTERFACE_NODE_SIZE = 40; private DependencyGraph dependencyGraph = null; @@ -171,8 +170,7 @@ nodes.add(node); resNodeToStatefulObjectNode.put(node.getResource(), nodes); - for (int i = 0; i < node.getChildrenNum(); i++) { - ObjectNode child = node.getChildren(i); + for (ObjectNode child: node.getChildren()) { if (child instanceof StatefulObjectNode) { putDescendantNodes((StatefulObjectNode) child, resNodeToStatefulObjectNode); } @@ -300,7 +298,7 @@ } private void addDependencyGraph(StatefulObjectNode parentNode, StatefulObjectNode childNode){ - dependencyGraph.addEdge(new DependencyEdge(parentNode, childNode, DependencyEdge.DependencyEdgeType.DEPENDENCY)); + dependencyGraph.addEdge(new DependencyEdge(parentNode, childNode, DependencyEdge.EdgeType.DEPENDENCY)); } private Map createEventChannelCells() { diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java index c9b4b63..3e0c958 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java @@ -1,24 +1,21 @@ 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 enum DependencyEdgeType{ DEPENDENCY, IMPLEMENT } - private DependencyEdgeType dependencyEdgeType = DependencyEdgeType.DEPENDENCY; + public enum EdgeType { DEPENDENCY, IMPLEMENT } + private EdgeType edgeType; - public DependencyEdge(ObjectNode src, ObjectNode dst, DependencyEdgeType type){ + public DependencyEdge(ObjectNode src, ObjectNode dst, EdgeType type){ super(src,dst); - dependencyEdgeType = type; + edgeType = type; } - public DependencyEdge(ObjectNode src, InterfaceNode dst, DependencyEdgeType type){ + public DependencyEdge(ObjectNode src, InterfaceNode dst, EdgeType type){ super(src,dst); - dependencyEdgeType = type; + edgeType = type; } - public DependencyEdgeType getEdgeType() { return dependencyEdgeType; } + public EdgeType getEdgeType() { return edgeType; } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java index 2f51055..0c544b4 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java @@ -5,13 +5,10 @@ import models.Node; import models.controlFlowModel.*; import models.dataFlowModel.DataFlowGraph; -import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; import models.dataFlowModel.IFlowGraph; import models.dataFlowModel.ResourceNode; -import javax.swing.plaf.nimbus.State; -import javax.xml.crypto.Data; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -35,7 +32,7 @@ } initRootStatefulObjectNodes(getDataFlowGraph()); - initStatefulObjectNodes(getDataFlowGraph()); +// initStatefulObjectNodes(getDataFlowGraph()); } public DependencyGraph(DataFlowGraph dataFlowGraph, DataTransferModel model){ @@ -50,50 +47,76 @@ } initRootStatefulObjectNodes(getDataFlowGraph()); - initStatefulObjectNodes(getDataFlowGraph()); +// initStatefulObjectNodes(getDataFlowGraph()); } private void initRootStatefulObjectNodes(DataFlowGraph dfGraph) { rootStatefulObjectNodes = new HashSet<>(); - - for (ResourceNode res : dfGraph.getRootResourceNodes()) { - - for (Node node : getNodes()) { - if (node instanceof StatefulObjectNode) { - StatefulObjectNode sNode = (StatefulObjectNode) node; - if (sNode.getResource() == res) { - rootStatefulObjectNodes.add(sNode); - break; - } - } - } - } - } - - private void initStatefulObjectNodes(DataFlowGraph dfGraph) { statefulObjectNodes = new HashSet<>(); - for (ResourceNode resNode : dfGraph.getResourceNodes()) { - StatefulObjectNode found = null; - StatefulObjectNode sNode = null; + for (ResourceNode resNode : dfGraph.getRootResourceNodes()) { + StatefulObjectNode statefulObjNode = null; for (Node node : getNodes()) { if (node instanceof StatefulObjectNode) { - sNode = (StatefulObjectNode) node; - if (sNode.getResource() == resNode) { - found = sNode; - statefulObjectNodes.add(sNode); + if (((StatefulObjectNode) node).getResource() == resNode) { + statefulObjNode = (StatefulObjectNode) node; break; } } } - - if (found == null) { - statefulObjectNodes.add((StatefulObjectNode) addNode(sNode)); + if (statefulObjNode == null) { + statefulObjNode = (StatefulObjectNode) addNode(new StatefulObjectNode(resNode)); } - + rootStatefulObjectNodes.add(statefulObjNode); + statefulObjectNodes.add(statefulObjNode); + initDescendantStatefulObjectNodes(resNode, statefulObjNode, dfGraph); } } + private void initDescendantStatefulObjectNodes(ResourceNode resNode, StatefulObjectNode statefulObjNode, DataFlowGraph dfGraph) { + for (ResourceNode childResNode : resNode.getChildren()) { + StatefulObjectNode childStatefulObjNode = null; + for (Node node : getNodes()) { + if (node instanceof StatefulObjectNode) { + if (((StatefulObjectNode) node).getResource() == childResNode) { + childStatefulObjNode = (StatefulObjectNode) node; + break; + } + } + } + if (childStatefulObjNode == null) { + childStatefulObjNode = (StatefulObjectNode) addNode(new StatefulObjectNode(childResNode)); + } + statefulObjNode.addChild(childStatefulObjNode); + statefulObjectNodes.add(childStatefulObjNode); + initDescendantStatefulObjectNodes(childResNode, childStatefulObjNode, dfGraph); + } + } + +// private void initStatefulObjectNodes(DataFlowGraph dfGraph) { +// statefulObjectNodes = new HashSet<>(); +// for (ResourceNode resNode : dfGraph.getResourceNodes()) { +// StatefulObjectNode found = null; +// StatefulObjectNode sNode = null; +// +// for (Node node : getNodes()) { +// if (node instanceof StatefulObjectNode) { +// sNode = (StatefulObjectNode) node; +// if (sNode.getResource() == resNode) { +// found = sNode; +// statefulObjectNodes.add(sNode); +// break; +// } +// } +// } +// +// if (found == null) { +// statefulObjectNodes.add((StatefulObjectNode) addNode(sNode)); +// } +// +// } +// } + public ObjectNode addNode(ObjectNode node) { if (node instanceof EventChannelObjectNode) { EventChannelObjectNode ecoNode = (EventChannelObjectNode) node; @@ -122,7 +145,7 @@ addNode((ObjectNode) srcNode); addNode((ObjectNode) dstNode); addEdge(new DependencyEdge(getOrCreateObjectNode((ObjectNode) - srcNode), getOrCreateObjectNode((ObjectNode) dstNode), DependencyEdge.DependencyEdgeType.DEPENDENCY)); + srcNode), getOrCreateObjectNode((ObjectNode) dstNode), DependencyEdge.EdgeType.DEPENDENCY)); } private ObjectNode getOrCreateObjectNode(ObjectNode node) {