diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java index 32b4e79..492d109 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyCellEditor.java @@ -5,10 +5,14 @@ import com.mxgraph.model.mxGeometry; import com.mxgraph.swing.mxGraphComponent; import com.mxgraph.view.mxCellState; +import models.Edge; +import models.controlFlowModel.ObjectNode; +import models.dependencyModel.DependencyEdge; import models.dependencyModel.DependencyGraph; import models.dependencyModel.InterfaceNode; import javax.swing.*; +import javax.xml.transform.Source; import java.awt.*; import java.awt.event.MouseEvent; import java.util.EventObject; @@ -45,6 +49,7 @@ if (isInterfaceNode(cell) && mouseEvent.getClickCount() == 2) { showInterfaceEditDialog(cell, eventObj); } + } /** @@ -167,6 +172,42 @@ graphComponent.getGraph().getModel().beginUpdate(); try { + + DependencyGraph depGraph = ddmStage.getDependencyGraph(); + + InterfaceNode interfaceNode = ddmStage.getInterfaceNode(interfaceCell); + if (interfaceNode == null) { + return; + } + + ObjectNode srcNode = interfaceNode.getDependencySideNode(); + ObjectNode dstNode = interfaceNode.getImplementSideNode(); + + DependencyEdge depEdge = null; + DependencyEdge implEdge = null; + + for (Edge e : depGraph.getEdges()) { + DependencyEdge de = (DependencyEdge) e; + if (de.getDestination() == interfaceNode) { + if (de.getEdgeType() == DependencyEdge.DependencyEdgeType.DEPENDENCY) { + depEdge = de; + } else if (de.getEdgeType() == DependencyEdge.DependencyEdgeType.IMPLEMENT) { + implEdge = de; + } + } + } + + if (depEdge != null && implEdge != null) { + depGraph.removeEdge(depEdge); + depGraph.removeEdge(implEdge); + ddmStage.getDependencyGraph().removeNode(interfaceNode); + ddmStage.removeInterfaceNode(interfaceCell); + + DependencyEdge restored = + new DependencyEdge(srcNode, dstNode, DependencyEdge.DependencyEdgeType.DEPENDENCY); + depGraph.addEdge(restored); + } + // Remove the interface node and its edges graphComponent.getGraph().getModel().remove(edge1); graphComponent.getGraph().getModel().remove(edge2); @@ -203,15 +244,15 @@ DependencyModelingStage ddmStage = (DependencyModelingStage) stage; mxCell source = (mxCell) edgeCell.getSource(); - mxCell target = (mxCell) edgeCell.getTarget(); + mxCell destination = (mxCell) edgeCell.getTarget(); - if (source == null || target == null) return; + if (source == null || destination == null) return; mxCell root = (mxCell) graphComponent.getGraph().getDefaultParent(); mxCell layerCell = (mxCell) root.getChildAt(ddmStage.DEPENDENCY_LAYER); mxCellState s = graphComponent.getGraph().getView().getState(source); - mxCellState t = graphComponent.getGraph().getView().getState(target); + mxCellState t = graphComponent.getGraph().getView().getState(destination); double midX, midY; @@ -225,7 +266,7 @@ graphComponent.getGraph().getModel().remove(edgeCell); // Insert the interface node (Interface) into the DEPENDENCY_LAYER - mxCell interfaceNode = (mxCell) graphComponent.getGraph().insertVertex( + mxCell interfaceCell = (mxCell) graphComponent.getGraph().insertVertex( layerCell, null, "Interface", @@ -245,21 +286,48 @@ ); if (newName != null && !newName.trim().isEmpty()) { - interfaceNode.setValue(newName.trim()); + interfaceCell.setValue(newName.trim()); } - // Setting Interface Name - InterfaceNode modelNode = new InterfaceNode(interfaceNode.getValue().toString()); - ddmStage.setInterfaceNode(interfaceNode, modelNode); - // Get the original edge's style and value String edgeStyle = edgeCell.getStyle(); Object edgeValue = edgeCell.getValue(); - // Create edge from source -> interface (keep original style) - graphComponent.getGraph().insertEdge(layerCell, null, edgeValue, source, interfaceNode, edgeStyle); + //create InterfaceNode and InterfaceEdge + ObjectNode srcNode = ddmStage.getEventChannelObjectNode(source); + if (srcNode == null) { + srcNode = ddmStage.getStatefulObjectNode(source); + } + ObjectNode dstNode = ddmStage.getStatefulObjectNode(destination); + InterfaceNode InterfaceNode = new InterfaceNode(srcNode, dstNode, interfaceCell.getValue().toString()); + ddmStage.setInterfaceNode(interfaceCell, InterfaceNode); - // Create edge from target -> interface (reverse direction, dashed) + DependencyGraph depGraph = ddmStage.getDependencyGraph(); + DependencyEdge targetEdge = null; + + for (Edge e : depGraph.getEdges()) { + if (e.getSource() == srcNode) { + targetEdge = (DependencyEdge) e; + break; + } + } + + 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); + } + + // Create edge from source -> interface (keep original style) + graphComponent.getGraph().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")) { @@ -268,7 +336,7 @@ reversedStyle = "dashed=true"; } - graphComponent.getGraph().insertEdge(layerCell, null, edgeValue, target, interfaceNode, reversedStyle); + graphComponent.getGraph().insertEdge(layerCell, null, edgeValue, destination, interfaceCell, reversedStyle); } finally { graphComponent.getGraph().getModel().endUpdate(); @@ -284,11 +352,7 @@ // Get or create InterfaceNode InterfaceNode interfaceNode = ddmStage.getInterfaceNode(cell); - if (interfaceNode == null) { - String currentName = (cell.getValue() != null) ? cell.getValue().toString() : "Interface"; - interfaceNode = new InterfaceNode(currentName); - ddmStage.setInterfaceNode(cell, interfaceNode); - } + if (interfaceNode == null) return ; // Create dialog JDialog dialog = new JDialog((Frame) null, "Interface Settings", true); @@ -301,15 +365,6 @@ JTextField nameField = new JTextField(interfaceNode.getName(), 20); namePanel.add(nameField, BorderLayout.CENTER); - // Method code area - JPanel codePanel = new JPanel(new BorderLayout(5, 5)); - codePanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 10, 10)); - codePanel.add(new JLabel("Method Code:"), BorderLayout.NORTH); - JTextArea codeArea = new JTextArea(interfaceNode.getMethodCode(), 20, 40); - codeArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); - JScrollPane scrollPane = new JScrollPane(codeArea); - codePanel.add(scrollPane, BorderLayout.CENTER); - // Buttons JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton okButton = new JButton("OK"); @@ -320,7 +375,6 @@ String newName = nameField.getText().trim(); if (!newName.isEmpty()) { finalInterfaceNode.setName(newName); - finalInterfaceNode.setMethodCode(codeArea.getText()); graphComponent.getGraph().getModel().beginUpdate(); try { @@ -340,7 +394,6 @@ // Add components to dialog dialog.add(namePanel, BorderLayout.NORTH); - dialog.add(codePanel, BorderLayout.CENTER); dialog.add(buttonPanel, BorderLayout.SOUTH); dialog.pack(); diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java index 94a1e8a..850b41c 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DependencyModelingStage.java @@ -34,6 +34,9 @@ private HashMap statefulObjectNodeToCell; private HashMap eventChannelObjNodeToCell; + + private HashMap cellToStatefulObjectNode = new HashMap<>(); + private HashMap cellToEventChannelObjectNode= new HashMap<>(); private HashMap cellToInterfaceNode = new HashMap<>(); private String dependencyEdgeStyle = "strokeWidth=1;strokeColor=green;movable=false"; @@ -52,9 +55,22 @@ //-------------------------------------------------- public InterfaceNode getInterfaceNode(mxCell cell) { + System.out.println("edge: "+ dependencyGraph.getEdges().size() +" node: " + dependencyGraph.getNodes().size() + "\n" + dependencyGraph.getNodes()); return cellToInterfaceNode.get(cell); } + public void removeInterfaceNode(mxCell cell) { + cellToInterfaceNode.remove(cell); + } + + public StatefulObjectNode getStatefulObjectNode(mxCell cell) { + return cellToStatefulObjectNode.get(cell); + } + + public EventChannelObjectNode getEventChannelObjectNode(mxCell cell) { + return cellToEventChannelObjectNode.get(cell); + } + public void setInterfaceNode(mxCell cell, InterfaceNode interfaceNode) { cellToInterfaceNode.put(cell, interfaceNode); } @@ -67,20 +83,26 @@ public void init(Stage prevStage) { if (prevStage instanceof PushPullSelectionStage) { model = prevStage.getModel(); - - DataFlowGraph dataFlowGraph = ((PushPullSelectionStage) prevStage).getDataFlowGraph(); - ControlFlowGraph controlFlowGraph = new ControlFlowGraph(dataFlowGraph, model); - dependencyGraph = new DependencyGraph(controlFlowGraph, model); - - statefulObjectNodeToCell = buildStatefulObjectNodeMap(prevStage); - eventChannelObjNodeToCell = buildEventChannelObjNodeMap(prevStage); - mxCell parent = (mxCell) graph.getDefaultParent(); mxCell layer = (mxCell) parent.getChildAt(DEPENDENCY_LAYER); + // レイヤーが空の場合のみ、グラフ構造の構築と描画を行う if (layer.getChildCount() == 0) { + // 1. 論理モデルの構築 + DataFlowGraph dataFlowGraph = ((PushPullSelectionStage) prevStage).getDataFlowGraph(); + ControlFlowGraph controlFlowGraph = new ControlFlowGraph(dataFlowGraph, model); + this.dependencyGraph = new DependencyGraph(controlFlowGraph, model); + + // 2. 前のステージからのマッピング準備 + statefulObjectNodeToCell = buildStatefulObjectNodeMap(prevStage); + eventChannelObjNodeToCell = buildEventChannelObjNodeMap(prevStage); + + // 3. 既存のゴミをクリア(マップ含む) clearDependencyGraphCells(graph); + + // 4. 描画 graph = constructGraph(graph, dependencyGraph); + } } @@ -137,7 +159,7 @@ result.put(statefulNode, cell); }else { result.put(new StatefulObjectNode(node), cell); - System.out.println("DependencyGraph に StatefulObjectNode が存在しません:" + node.getResourceName()); + // System.out.println("DependencyGraph に StatefulObjectNode が存在しません:" + node.getResourceName()); } } @@ -182,8 +204,17 @@ try { Map dependencyResNodeCells = createCellsOfResourceMap(); + + for (Map.Entry e : dependencyResNodeCells.entrySet()) { + cellToStatefulObjectNode.put(e.getValue(), e.getKey()); + } + Map dependencyEventNodeCells = createEventChannelCells(); + for (Map.Entry e : dependencyEventNodeCells.entrySet()) { + cellToEventChannelObjectNode.put(e.getValue(), e.getKey()); + } + graph = insertDependencyEdges(dependencyResNodeCells, dependencyEventNodeCells); } finally { graph.getModel().endUpdate(); @@ -222,7 +253,6 @@ mxCell newCell = (mxCell) graph.insertVertex(newParent,null, label, geo.getX(), geo.getY(), geo.getWidth(), geo.getHeight(), newStyle); - StatefulObjectNode parentNode = findStatefulObjectNodeByCell(oldCell); if( parentNode != null){ resNodeCells.put(parentNode, newCell); @@ -256,7 +286,7 @@ } private void addDependencyGraph(StatefulObjectNode parentNode, StatefulObjectNode childNode){ - dependencyGraph.addEdge(new DependencyEdge(parentNode, childNode)); + dependencyGraph.addEdge(new DependencyEdge(parentNode, childNode, DependencyEdge.DependencyEdgeType.DEPENDENCY)); } private Map createEventChannelCells() { diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java index 3ef765c..c9b4b63 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyEdge.java @@ -7,7 +7,18 @@ import models.controlFlowModel.StatefulObjectNode; public class DependencyEdge extends Edge { - public DependencyEdge(ObjectNode src, ObjectNode dst){ + public enum DependencyEdgeType{ DEPENDENCY, IMPLEMENT } + private DependencyEdgeType dependencyEdgeType = DependencyEdgeType.DEPENDENCY; + + public DependencyEdge(ObjectNode src, ObjectNode dst, DependencyEdgeType type){ super(src,dst); + dependencyEdgeType = type; } + + public DependencyEdge(ObjectNode src, InterfaceNode dst, DependencyEdgeType type){ + super(src,dst); + dependencyEdgeType = type; + } + + public DependencyEdgeType getEdgeType() { return dependencyEdgeType; } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java index 00641c0..c7cf70b 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/DependencyGraph.java @@ -48,8 +48,6 @@ StatefulObjectNode sNode = (StatefulObjectNode) node; if (sNode.getResource() == res) { rootStatefulObjectNodes.add(sNode); - System.out.println(("ro " + sNode.getName())); - System.out.println(res.getChildren()); break; } } @@ -69,8 +67,6 @@ if (sNode.getResource() == resNode) { found = sNode; statefulObjectNodes.add(sNode); - - System.out.println(("no " + sNode.getName())); break; } } @@ -88,6 +84,7 @@ EventChannelObjectNode ecoNode = (EventChannelObjectNode) node; if (!objectNodeMap.containsKey(ecoNode)) { ecoNode = new EventChannelObjectNode(((EventChannelObjectNode) node).getIOChannel()); + System.out.println(node +" " + ecoNode); objectNodeMap.put(node, ecoNode); super.addNode(ecoNode); return ecoNode; @@ -110,7 +107,7 @@ addNode((ObjectNode) srcNode); addNode((ObjectNode) dstNode); addEdge(new DependencyEdge(getOrCreateObjectNode((ObjectNode) - srcNode), getOrCreateObjectNode((ObjectNode) dstNode))); + srcNode), getOrCreateObjectNode((ObjectNode) dstNode), DependencyEdge.DependencyEdgeType.DEPENDENCY)); } private ObjectNode getOrCreateObjectNode(ObjectNode node) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/InterfaceNode.java b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/InterfaceNode.java index d349856..1b482fb 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/InterfaceNode.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dependencyModel/InterfaceNode.java @@ -1,14 +1,17 @@ package models.dependencyModel; import models.Node; +import models.controlFlowModel.ObjectNode; public class InterfaceNode extends Node { private String name; - private String methodCode; + private ObjectNode dependencySideNode = null; + private ObjectNode implementSideNode = null; - public InterfaceNode(String name) { + public InterfaceNode(ObjectNode dpnNode, ObjectNode impNode,String name) { + dependencySideNode = dpnNode; + implementSideNode = impNode; this.name = name; - this.methodCode = ""; } public String getName() { @@ -19,11 +22,6 @@ this.name = name; } - public String getMethodCode() { - return methodCode; - } - - public void setMethodCode(String methodCode) { - this.methodCode = methodCode; - } + public ObjectNode getDependencySideNode() { return dependencySideNode; } + public ObjectNode getImplementSideNode() { return implementSideNode; } } \ No newline at end of file