diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java index 4f891eb..346f738 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java @@ -307,13 +307,9 @@ fileString.append("geometry {\n"); - mxCell root = (mxCell) graph.getDefaultParent(); - mxCell nodeLayer = (mxCell) root.getChildAt(Stage.NODE_LAYER); - mxCell dataFlowLayer = (mxCell) root.getChildAt(Stage.DATA_FLOW_LAYER); - - // Node layer - for (int i = 0; i < graph.getModel().getChildCount(nodeLayer); i++) { - Object cell = graph.getModel().getChildAt(nodeLayer, i); + Object root = graph.getDefaultParent(); + for (int i = 0; i < graph.getModel().getChildCount(root); i++) { + Object cell = graph.getModel().getChildAt(root, i); if (graph.getModel().isVertex(cell)) { mxGraphView view = graph.getView(); mxCellState state = view.getState(cell); @@ -342,29 +338,6 @@ } } } - - // Data-Flow layer - // From controlFlowModeling branch - 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 (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(); } @@ -379,12 +352,11 @@ 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); + ctl.execute(root); } finally { graph.getModel().endUpdate(); } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/Stage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/Stage.java index 6c97317..33114bd 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/Stage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/Stage.java @@ -1,6 +1,5 @@ package application.editor; -import com.mxgraph.model.mxCell; import com.mxgraph.swing.mxGraphComponent; import com.mxgraph.swing.view.mxICellEditor; import com.mxgraph.util.mxEventSource.mxIEventListener; @@ -19,11 +18,6 @@ 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(); @@ -42,25 +36,4 @@ public DataTransferModel getModel() { return model; } - - /** - * Showing layers are specified number of layers. - * - * @param argsOfLayers you want to show numbers of layers. - */ - public void showOnlyLayer(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); - } - } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowModelingStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowModelingStage.java index c5c58c3..db39c41 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowModelingStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/DataFlowModelingStage.java @@ -11,33 +11,28 @@ import com.mxgraph.swing.mxGraphComponent; import com.mxgraph.util.mxEventSource.mxIEventListener; import com.mxgraph.util.mxPoint; -import com.mxgraph.view.mxGraph; -import generators.JavaCodeGenerator; -import models.Edge; -import models.algebra.*; +import models.algebra.Expression; import models.dataConstraintModel.Channel; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.ResourcePath; -import models.dataConstraintModel.Selector; -import models.dataFlowModel.*; +import models.dataFlowModel.DataTransferChannel; +import models.dataFlowModel.DataTransferModel; import models.visualModel.FormulaChannel; import parser.Parser; import parser.exceptions.*; import java.awt.event.MouseListener; -import java.util.*; +import java.util.ArrayList; +import java.util.List; public class DataFlowModelingStage extends Stage { - private boolean bReflectingArchitectureModel = false; - public DataFlowModelingStage(mxGraphComponent graphComponent) { super(graphComponent); } @Override public void init(Stage prevStage) { - showOnlyLayer(DATA_FLOW_LAYER); } @Override @@ -79,22 +74,8 @@ public void clear() { model = null; + ((mxGraphModel) graph.getModel()).clear(); - - // 空のレイヤーを新規作成 - mxCell root = (mxCell) graph.getDefaultParent(); - - graph.getModel().beginUpdate(); - try { - root.insert(new mxCell()); // NODE_LAYER, DATA_FLOW_LAYER - root.insert(new mxCell()); // PUSH_FLOW_LAYER - root.insert(new mxCell()); // PULL_FLOW_LAYER - - showOnlyLayer(NODE_LAYER, DATA_FLOW_LAYER); - } finally { - graph.getModel().endUpdate(); - } - graph.refresh(); } public DataTransferModel getModel() { @@ -109,184 +90,6 @@ clear(); this.model = model; - - // Update the mxGraph - constructGraph(graph, model); - } - - /** - * Construct a mxGraph from DataFlowModel - * - * @param graph mxGraph - * @param model DataTransferModel - */ - private void constructGraph(mxGraph graph, DataTransferModel model) { - bReflectingArchitectureModel = true; - ((mxGraphModel) graph.getModel()).clear(); - - mxCell parent = (mxCell) graph.getDefaultParent(); - mxCell nodeLayer = (mxCell) parent.getChildAt(Stage.NODE_LAYER); - mxCell dataFlowLayer = (mxCell) parent.getChildAt(Stage.DATA_FLOW_LAYER); - DataFlowGraph dataFlowGraph = model.getDataFlowGraph(); - - graph.getModel().beginUpdate(); - 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); - - Map channelsIn = new HashMap<>(); - Map channelsOut = new HashMap<>(); - Map resources = new HashMap<>(); - - // create resource vertices - for (ResourceNode resNode : dataFlowGraph.getRootResourceNodes()) { - int w = 80; - int h = 30; - ResourcePath res = resNode.getPrimaryResourcePath(); - Object resource = graph.insertVertex(dataFlowLayer, null, res.getLeafResourceName(), 20, 20, w, h, "shape=ellipse;perimeter=ellipsePerimeter"); // insert a resource as a vertex - resources.put(resNode, resource); - createChildResourceVertices(graph, resource, resNode, resources, w, h); - } - - // create channel vertices - for (ChannelNode c : dataFlowGraph.getRootChannelNodes()) { - DataTransferChannel channel = c.getChannel(); - if (!channel.getInputResources().isEmpty()) { - // Normal channel - if (channelsIn.get(channel) == null || channelsOut.get(channel) == null) { - if (channel.getSelectors().toString() == "[]") { - Object chCell = graph.insertVertex(dataFlowLayer, null, channel.getChannelName(), 150, 20, 30, 30); // 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 - channelsIn.put(channel, port_in); - channelsOut.put(channel, port_out); - } else { - for (Selector s : channel.getSelectors()) { - Expression exp = s.getExpression(); - String selName = exp.toString(); - String cName = channel.getChannelName(); - String channelName = cName + " (" + selName + ")"; - Object chCell = graph.insertVertex(dataFlowLayer, null, channelName, 150, 20, 60, 30); // 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 - channelsIn.put(channel, port_in); - channelsOut.put(channel, port_out); - } - } - } - } else { - // I/O channel - if (channelsOut.get(channel) == null) { - if (channel.getSelectors().toString() == "[]") { - Object chCell = graph.insertVertex(nodeLayer, null, channel.getChannelName(), 150, 20, 30, 30); // 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 - channelsIn.put(channel, port_in); - channelsOut.put(channel, port_out); - } else { - for (Selector s : channel.getSelectors()) { - Expression exp = s.getExpression(); - String selName = exp.toString(); - String cName = channel.getChannelName(); - String channelName = cName + " (" + selName + ")"; - Object chCell = graph.insertVertex(dataFlowLayer, null, channelName, 150, 20, 60, 30); // 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 - channelsIn.put(channel, port_in); - channelsOut.put(channel, port_out); - } - } - } - } - } - - // add input, output and reference edges - for (Edge edge : dataFlowGraph.getEdges()) { - DataFlowEdge dfEdge = (DataFlowEdge) edge; - if (dfEdge.isChannelToResource()) { - // output edge - DataTransferChannel channel = ((ChannelNode) dfEdge.getSource()).getChannel(); - ResourcePath dstRes = ((ResourceNode) dfEdge.getDestination()).getInSideResource(channel); - graph.insertEdge(dataFlowLayer, null, new Editor.SrcDstAttribute(channel, dstRes), channelsOut.get(channel), resources.get((ResourceNode) dfEdge.getDestination()), "movable=false"); - } else { - // input edge - DataTransferChannel channel = ((ChannelNode) dfEdge.getDestination()).getChannel(); - ResourcePath srcRes = ((ResourceNode) dfEdge.getSource()).getOutSideResource(channel); - Set> toRes = getResourceDependencyForChannel(channel, model, dataFlowGraph); - for (Map.Entry RtoR : toRes) { - graph.insertEdge(dataFlowLayer, null, null, resources.get(RtoR.getValue()), resources.get(RtoR.getKey()), "dashed=true;movable=false"); - } - graph.insertEdge(dataFlowLayer, null, new Editor.SrcDstAttribute(srcRes, channel), resources.get((ResourceNode) dfEdge.getSource()), channelsIn.get(channel), "movable=false"); - } - } - - for (Channel ch : model.getChannels()) { - // reference edges - DataTransferChannel channel = (DataTransferChannel) ch; - for (ResourcePath refRes : channel.getReferenceResources()) { - graph.insertEdge(dataFlowLayer, null, null, resources.get(dataFlowGraph.getResourceNode(refRes)), channelsIn.get(channel), "dashed=true;movable=false"); - } - } - } finally { - graph.getModel().endUpdate(); - } - - bReflectingArchitectureModel = false; - } - - private void createChildResourceVertices(mxGraph graph, Object resource, ResourceNode resNode, Map resources, int w, int h) { - for (ResourceNode childNode : resNode.getChildren()) { - ResourcePath childRes = childNode.getPrimaryResourcePath(); - Object childResource = graph.insertVertex(resource, null, childRes.getName(), 0, 0, w, h, "shape=ellipse;perimeter=ellipsePerimeter"); // insert a resource as a vertex - resources.put(childNode, childResource); - createChildResourceVertices(graph, childResource, childNode, resources, w, h); - } - } - - private Set> getResourceDependencyForChannel(DataTransferChannel ch, DataTransferModel model, 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 boolean isValid() { @@ -321,9 +124,8 @@ graph.getModel().beginUpdate(); mxCell root = (mxCell) graph.getDefaultParent(); - mxCell nodeLayer = (mxCell) root.getChildAt(NODE_LAYER); try { - graph.insertVertex(nodeLayer, null, resName, 20, 20, 80, 30, "shape=ellipse;perimeter=ellipsePerimeter"); // insert a resource as a vertex + graph.insertVertex(root, null, resName, 20, 20, 80, 30, "shape=ellipse;perimeter=ellipsePerimeter"); // insert a resource as a vertex } finally { graph.getModel().endUpdate(); } @@ -334,7 +136,6 @@ graph.getModel().beginUpdate(); mxCell root = (mxCell) graph.getDefaultParent(); - mxCell dataFlowLayer = (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)); @@ -344,7 +145,7 @@ geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); geo2.setRelative(true); - Object channel = graph.insertVertex(dataFlowLayer, null, channelGen.getChannelName(), 150, 20, 30, 30); // insert a channel as a vertex + Object channel = graph.insertVertex(root, null, channelGen.getChannelName(), 150, 20, 30, 30); // 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, channel); // insert the input port of a channel @@ -361,13 +162,12 @@ graph.getModel().beginUpdate(); mxCell root = (mxCell) graph.getDefaultParent(); - mxCell nodeLayer = (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); - Object channel = graph.insertVertex(nodeLayer, null, ioChannelGen.getChannelName(), 150, 20, 30, 30); // insert an I/O channel as a vertex + Object channel = graph.insertVertex(root, null, ioChannelGen.getChannelName(), 150, 20, 30, 30); // 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, channel); // insert the output port of a channel @@ -381,7 +181,6 @@ graph.getModel().beginUpdate(); mxCell root = (mxCell) graph.getDefaultParent(); - mxCell dataFlowLayer = (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)); @@ -391,7 +190,7 @@ geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); geo2.setRelative(true); - Object channel = graph.insertVertex(dataFlowLayer, null, formulaChannelGen.getChannelName(), 150, 20, 30, 30); // insert a channel as a vertex + Object channel = graph.insertVertex(root, null, formulaChannelGen.getChannelName(), 150, 20, 30, 30); // 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, channel); // insert the input port of a channel @@ -404,9 +203,6 @@ } public boolean connectEdge(mxCell edge, mxCell src, mxCell dst) { - if (bReflectingArchitectureModel) { - return false; - } DataTransferModel model = getModel(); Channel srcCh = model.getChannel((String) src.getValue()); if (srcCh == null) { diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java index 59d358d..70309d8 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionStage.java @@ -29,7 +29,6 @@ model = prevStage.getModel(); dataFlowGraph = analyzeDataTransferModel(model); } - showOnlyLayer(DATA_FLOW_LAYER); } @Override @@ -79,8 +78,7 @@ } private void updateEdgeAttributes(DataFlowGraph dataFlowGraph) { - mxCell parent = (mxCell) graph.getDefaultParent(); - mxCell dataFlowLayer = (mxCell) parent.getChildAt(DATA_FLOW_LAYER); + mxCell root = (mxCell) graph.getDefaultParent(); graph.getModel().beginUpdate(); try { @@ -92,7 +90,7 @@ ResourceNode srcRes = (ResourceNode) dataFlow.getSource(); DataTransferChannel channel = ((ChannelNode) dataFlow.getDestination()).getChannel(); // input edge - for (Object edge : graph.getChildEdges(dataFlowLayer)) { + for (Object edge : graph.getChildEdges(root)) { mxCell edgeCell = (mxCell) edge; if (edgeCell.getValue() instanceof Editor.SrcDstAttribute) { Editor.SrcDstAttribute edgeAttr = (Editor.SrcDstAttribute) edgeCell.getValue();