diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/ControlFlowDelegationCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/ControlFlowDelegationCellEditor.java index a18d773..0285782 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/ControlFlowDelegationCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/ControlFlowDelegationCellEditor.java @@ -7,6 +7,7 @@ import application.editor.FlowCellEditor; import models.controlFlowModel.CallEdge; import models.controlFlowModel.CallEdgeAttribute; +import models.controlFlowModel.ControlFlowDelegator; public class ControlFlowDelegationCellEditor extends FlowCellEditor { @@ -30,10 +31,11 @@ if( editingCell != null) stopEditing(true); if( graphComponent.getGraph().getModel().isEdge(cellObj) ) { - CallEdgeAttribute callEdgeAttrl = (CallEdgeAttribute)graphComponent.getGraph().getModel().getValue(cellObj); + CallEdgeAttribute callEdgeAttr = (CallEdgeAttribute)graphComponent.getGraph().getModel().getValue(cellObj); - if(callEdgeAttrl == null) return; - System.out.println("Edge: " + callEdgeAttrl.getSelectedOption().name()); + if(callEdgeAttr == null) return; + System.out.println("Edge: " + callEdgeAttr.getSelectedOption().name()); + ((ControlFlowDelegationStage)stage).getDelegatableNodes(callEdgeAttr.getCallEdge()); } } diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/ControlFlowDelegationStage.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/ControlFlowDelegationStage.java index 8f03d6b..98e4725 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/ControlFlowDelegationStage.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/ControlFlowDelegationStage.java @@ -1,6 +1,7 @@ package application.editor.stages; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.mxgraph.model.mxCell; @@ -8,14 +9,14 @@ import com.mxgraph.view.mxGraph; import application.editor.FlowCellEditor; -import application.editor.InEdgeAttribute; -import application.editor.OutEdgeAttribute; import application.editor.Stage; import models.Edge; import models.controlFlowModel.CallEdge; import models.controlFlowModel.CallEdgeAttribute; import models.controlFlowModel.CallGraph; +import models.controlFlowModel.ControlFlowDelegator; import models.controlFlowModel.ControlFlowGraph; +import models.controlFlowModel.ObjectNode; import models.controlFlowModel.StatefulObjectNode; import models.dataConstraintModel.IdentifierTemplate; import models.dataFlowModel.DataFlowGraph; @@ -79,6 +80,15 @@ } /************************************************************* + * + */ + public List getDelegatableNodes(final CallEdge callEdge){ + ControlFlowDelegator delegator = new ControlFlowDelegator(controlFlowGraph); + return delegator.searchDelegatableNodes(callEdge); + } + + + /************************************************************* * [ *private ] /************************************************************* * [ views ] @@ -189,7 +199,10 @@ Object srcNodeCell =resNodeCells.get(srcResNode); Object dstNodeCell = resNodeCells.get(dstResNode); - graph.insertEdge(layerCell, null, new CallEdgeAttribute(callEdge), srcNodeCell, dstNodeCell, "movable=false;"); + CallEdgeAttribute callEdgeAttr = new CallEdgeAttribute(callEdge); + callEdge.setAttribute(callEdgeAttr); + + graph.insertEdge(layerCell, null, callEdgeAttr, srcNodeCell, dstNodeCell, "movable=false;"); } return graph; } diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdge.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdge.java index 484d861..e19986e 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdge.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdge.java @@ -14,5 +14,4 @@ public PushPullValue getSelectedOption() { return this.selectedOption; } - } diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdgeAttribute.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdgeAttribute.java index e436c19..e16d9fe 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdgeAttribute.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/CallEdgeAttribute.java @@ -4,9 +4,7 @@ import models.dataFlowModel.PushPullValue; public class CallEdgeAttribute extends EdgeAttribute { - private PushPullValue selectedOption; - private ObjectNode srcObjNode; - private ObjectNode dstObjNode; + private CallEdge callEdge = null; /************************************************************* * [ *constructor ] @@ -14,13 +12,7 @@ * */ public CallEdgeAttribute(CallEdge callEdge) { - this.selectedOption = callEdge.getSelectedOption(); - - if(!(callEdge.getSource() instanceof ObjectNode)) throw new ClassCastException(callEdge.getSource() + "is not type of ObjectNode"); - this.srcObjNode = (ObjectNode)callEdge.getSource(); - - if(!(callEdge.getDestination() instanceof ObjectNode)) throw new ClassCastException(callEdge.getDestination() + "is not type of ObjectNode"); - this.dstObjNode = (ObjectNode)callEdge.getDestination(); + this.callEdge = callEdge; } /************************************************************* @@ -28,23 +20,29 @@ /************************************************************* * [ getter ] /*************************************************************/ + public CallEdge getCallEdge() { + return callEdge; + } + public PushPullValue getSelectedOption() { - return selectedOption; + return callEdge.getSelectedOption(); } public ObjectNode getSourceObjectNode() { - return srcObjNode; + if(callEdge.getSource() instanceof ObjectNode) throw new ClassCastException("sourceNode isn't type of "); + return (ObjectNode)callEdge.getSource(); } public ObjectNode getDestinationObjectNode() { - return dstObjNode; + if(callEdge.getDestination() instanceof ObjectNode) throw new ClassCastException("destinationNode isn't type of "); + return (ObjectNode)callEdge.getDestination(); } /************************************************************* * */ public String toString() { - return this.selectedOption.name(); + return callEdge.getSelectedOption().name(); } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowDelegator.java b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowDelegator.java index 5aca969..917dae9 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowDelegator.java +++ b/AlgebraicDataflowArchitectureModel/src/models/controlFlowModel/ControlFlowDelegator.java @@ -1,15 +1,23 @@ package models.controlFlowModel; import java.util.ArrayList; +import java.util.List; +import javax.swing.event.ListDataEvent; + +import models.Edge; import models.Node; +import models.dataFlowModel.DataFlowGraph; import models.dataFlowModel.PushPullAttribute; +import models.dataFlowModel.PushPullValue; /**-------------------------------------------------------------------------------- * it has Delegation of Control-Flow algorithm. */ public class ControlFlowDelegator { + private ControlFlowGraph controlFlowGraph = null; + /**-------------------------------------------------------------------------------- * [ *public ] /**-------------------------------------------------------------------------------- @@ -19,23 +27,86 @@ * 2. mxGraphを再構築? * 3. mxGraphModelから委譲可能なmxCellのリストと */ - public void changeControlFlowGraph() {} + public ControlFlowDelegator(final ControlFlowGraph controlFlowGraph) { + this.controlFlowGraph = controlFlowGraph; + } - /**-------------------------------------------------------------------------------- + /************************************************************* + * [ *public ] + /************************************************************* * *@param callEdge */ - public ArrayList searchDelegatableNodes(final CallEdge callEdge){ - ArrayList nodes = new ArrayList<>(); + public List searchDelegatableNodes(final CallEdge callEdge){ + List nodes = new ArrayList<>(); + + CallGraph callGraph = null; + if(callEdge.getSelectedOption().equals(PushPullValue.PUSH)) { + callGraph = controlFlowGraph.getPushCallGraph(); + } + else { + callGraph = controlFlowGraph.getPullCallGraph(); + } - Node parentNode = callEdge.getSource(); - if(parentNode == null) return null; + // 1. adding parentNode + ObjectNode delegatingNode = callEdge.getSelectedOption().equals(PushPullValue.PUSH) + ? (ObjectNode) callEdge.getSource() + : (ObjectNode) callEdge.getDestination(); - PushPullAttribute pushPullAttribute = (PushPullAttribute)callEdge.getAttribute(); - if( pushPullAttribute == null) return null; - if( !(pushPullAttribute instanceof PushPullAttribute) ) return null; + ObjectNode parentNode = callEdge.getSelectedOption().equals(PushPullValue.PUSH) + ? (ObjectNode) callEdge.getDestination() + : (ObjectNode) callEdge.getSource(); + + if(parentNode == null || delegatingNode == null) + throw new NullPointerException("parentNode is null."); + if( !(parentNode instanceof ObjectNode && delegatingNode instanceof ObjectNode)) + throw new ClassCastException("callEdge.getSource() is not ObjectNode"); + + nodes.add(parentNode); + + + // 2. searchinge and adding children node of parentNode + searchOutOfNodes(nodes, parentNode, delegatingNode, callEdge.getSelectedOption()); + + // add to nodes in PUSH + // if() return nodes; // switch objects by transfer type - return null; + return nodes; + } + + /************************************************************* + * + */ + private void searchOutOfNodes(List nodes, ObjectNode currentNode, final ObjectNode delegatingNode, final PushPullValue selectedOption){ + + switch(selectedOption) { + case PUSH: + if(currentNode.getInEdges().size() == 0) return; + // get child of base-node + for(Edge e : currentNode.getInEdges()) { + ObjectNode foundNode = (ObjectNode)e.getSource(); + + if(foundNode.equals(delegatingNode)) continue; + + nodes.add(foundNode); + searchOutOfNodes(nodes, foundNode, delegatingNode, selectedOption); + } + break; + + case PULL: + case PUSHorPULL: + if(currentNode.getOutEdges().size() == 0) return; + // get child of base-node + for(Edge e : currentNode.getOutEdges()) { + ObjectNode foundNode = (ObjectNode)e.getDestination(); + + if(foundNode.equals(delegatingNode)) continue; + + nodes.add(foundNode); + searchOutOfNodes(nodes, foundNode, delegatingNode, selectedOption); + } + break; + } } }