diff --git a/src/org/ntlab/deltaViewer/MagnetRONFrame.java b/src/org/ntlab/deltaViewer/MagnetRONFrame.java index 2085f29..db60dfa 100644 --- a/src/org/ntlab/deltaViewer/MagnetRONFrame.java +++ b/src/org/ntlab/deltaViewer/MagnetRONFrame.java @@ -28,32 +28,81 @@ protected static final String CONTAINER_COMPONENT = "Container-Component"; protected static final String CONTAINER_COMPONENT_COLLECTION = "Container-Component(Collection)"; protected static final String THIS_ANOTHER = "This-Another"; - - private DeltaViewer viewer = null; - + private static Dimension DEFAULT_SIZE = new Dimension(1300, 700); private static String WINDOW_TITLE = "Delta Viewer"; + private TraceJSON trace = null; + private DeltaExtractorJSON s = null; + + private CollaborationViewer viewer = null; + + private Map argsMap = new HashMap<>(); + public MagnetRONFrame() throws HeadlessException { super(WINDOW_TITLE); setSize(DEFAULT_SIZE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); - this.viewer = new DeltaViewer(); + this.viewer = new CollaborationViewer(); getContentPane().add(viewer, BorderLayout.CENTER); pack(); } public void startAnimation() { - Map.Entry extracted = extract(); + // Change Here! + setArgmentsForDeltaExtract(argsMap); + //���o�������f���^�̈������i�[����Map��key +// String argsKey = "ArgoUMLSelect"; +// String argsKey = "ArgoUMLDelete1"; +// String argsKey = "JHotDrawTransform"; +// String argsKey = "JHotDrawSelect3"; +// String argsKey = "sampleArray"; +// String argsKey = "sampleCollection"; +// String argsKey = "sampleCreate"; +// String argsKey = "sampleStatic"; +// String argsKey = "delta_eg1"; +// String argsKey = "pre_Exp1"; + String argsKey1 = "getterOverlap1"; + String argsKey2 = "getterOverlap2"; +// String argsKey = "setterOverlap1"; +// String argsKey = "worstCase"; +// String argsKey = "sample1"; +// String argsKey = "objTrace5"; + List keys = new ArrayList(); + keys.add(argsKey2); + keys.add(argsKey1); + Map.Entry extracted = extractMulti(keys); new Thread() { public void run() { startDeltaViewer(extracted.getKey(), extracted.getValue()); } }.start(); } + + public Map.Entry extractMulti(List keys) { + CollaborationObjectCallGraph cocg = null; + CollaborationAliasCollector cac = null; + trace = new TraceJSON(argsMap.get(keys.get(0))[4]); + s = new DeltaExtractorJSON(trace); - public Map.Entry extract() { + for(String key: keys) { + Map.Entry extracted = extract(key); + if (cocg == null) { + cocg = new CollaborationObjectCallGraph(extracted.getKey()); + } else { + cocg.merge(extracted.getKey()); + } + if (cac == null) { + cac = new CollaborationAliasCollector(extracted.getValue()); + } else { + cac.merge(extracted.getValue()); + } + } + return new AbstractMap.SimpleEntry(cocg, cac); + } + + public Map.Entry extract(String argsKey) { // DeltaExtractorJSON dex = new DeltaExtractorJSON(trace); // HashMap threads = trace.getAllThreads(); // ThreadInstance thread = threads.values().iterator().next(); // �Ō�̃X���b�h�����Ă��邾���c @@ -133,29 +182,7 @@ // } // } - // Change Here! - Map argsMap = new HashMap<>(); - setArgmentsForDeltaExtract(argsMap); - //���o�������f���^�̈������i�[����Map��key -// String argsKey = "ArgoUMLSelect"; -// String argsKey = "ArgoUMLDelete1"; -// String argsKey = "JHotDrawTransform"; -// String argsKey = "JHotDrawSelect3"; -// String argsKey = "sampleArray"; -// String argsKey = "sampleCollection"; -// String argsKey = "sampleCreate"; -// String argsKey = "sampleStatic"; -// String argsKey = "delta_eg1"; - String argsKey = "pre_Exp1"; -// String argsKey = "getterOverlap1"; -// String argsKey = "setterOverlap1"; -// String argsKey = "worstCase"; -// String argsKey = "sample1"; -// String argsKey = "objTrace5"; - long time = System.nanoTime(); - TraceJSON trace = new TraceJSON(argsMap.get(argsKey)[4]); - DeltaExtractorJSON s = new DeltaExtractorJSON(trace); if (argsMap.get(argsKey)[5] == CONTAINER_COMPONENT || argsMap.get(argsKey)[5] == CONTAINER_COMPONENT_COLLECTION) { HashMap threads = trace.getAllThreads(); @@ -204,18 +231,18 @@ } } - public void startDeltaViewer(ExtractedStructure e, IAliasCollector dac) { + public void startDeltaViewer(IObjectCallGraph ocg, IAliasCollector ac) { // Build a frame, create a graph, and add the graph to the frame so you can actually see the graph. - if(e != null) { - List srcSide = e.getDelta().getSrcSide(); - List dstSide = e.getDelta().getDstSide(); - if (srcSide.size() >= 1 && dstSide.size() >= 1) { - WINDOW_TITLE = "extract delta of:" + e.getDelta().getSrcSide().get(0).getDstClassName() + "(" + e.getDelta().getSrcSide().get(0).getDstObjectId() + ")" + " -> " + e.getDelta().getDstSide().get(0).getDstClassName() + "(" + e.getDelta().getDstSide().get(0).getDstObjectId() + ")"; - setTitle(WINDOW_TITLE); - } + if (ocg != null) { + List relatedPoints = ocg.getRelatedPoints(); + TracePoint lastRP = relatedPoints.get(relatedPoints.size() - 1); + Map.Entry rpInf = MagnetRONViewer.getRelatedInformation(lastRP); + WINDOW_TITLE = "extract delta of:" + rpInf.getKey().getSrcClassName() + "(" + rpInf.getKey().getSrcObjectId() + ")" + " -> " + rpInf.getKey().getDstClassName()+ "(" + rpInf.getKey().getDstObjectId()+ ")"; + setTitle(WINDOW_TITLE); } - viewer.init(e, dac); - List aliasList = new ArrayList<>(dac.getAliasList()); + + viewer.init(ocg, ac, new CollaborationLayout()); + List aliasList = new ArrayList<>(ac.getAliasList()); // dv.setCoordinatorPoint(1200, 100); viewer.initAnimation(); @@ -254,7 +281,7 @@ String[] pre_Exp6 = {null, null, "E","C", "traces/pre_Exp6.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("pre_Exp6", pre_Exp6); String[] pre_Exp7 = {null, null, "E","C", "traces/pre_Exp7.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("pre_Exp7", pre_Exp7); - // Samples of Plural Delta + // Samples of Multiple Deltas String[] getterOverlap1 = {null, null, "getterOverlap.F","getterOverlap.D", "traces/getterOverlap.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("getterOverlap1", getterOverlap1); String[] getterOverlap2 = {null, null, "getterOverlap.G","getterOverlap.D", "traces/getterOverlap.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("getterOverlap2", getterOverlap2); String[] setterOverlap1 = {null, null, "setterOverlap.F","setterOverlap.C", "traces/setterOverlap.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("setterOverlap1", setterOverlap1); diff --git a/src/org/ntlab/deltaViewer/MagnetRONViewer.java b/src/org/ntlab/deltaViewer/MagnetRONViewer.java index 608a7ef..7af37f3 100644 --- a/src/org/ntlab/deltaViewer/MagnetRONViewer.java +++ b/src/org/ntlab/deltaViewer/MagnetRONViewer.java @@ -5,6 +5,7 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.geom.Path2D; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -21,9 +22,13 @@ import org.ntlab.deltaExtractor.IAliasCollector; import org.ntlab.deltaExtractor.Alias.AliasType; import org.ntlab.deltaViewer.Edge.TypeName; +import org.ntlab.trace.ArrayUpdate; import org.ntlab.trace.FieldUpdate; import org.ntlab.trace.MethodExecution; import org.ntlab.trace.MethodInvocation; +import org.ntlab.trace.Reference; +import org.ntlab.trace.Statement; +import org.ntlab.trace.TracePoint; import com.mxgraph.canvas.mxGraphics2DCanvas; import com.mxgraph.model.mxCell; @@ -1103,7 +1108,7 @@ return time; } - protected String[] formatFieldName(String fieldName) { + protected static String[] formatFieldName(String fieldName) { String fieldNames[] = fieldName.split("\\."); String names[] = new String[] {fieldNames[0], fieldNames[fieldNames.length - 1]}; for(int i = 1; i < fieldNames.length - 1; i++) { @@ -1214,6 +1219,62 @@ protected void reflectCoordinates(DeltaGraphAdapter mxgraph) { // TODO Auto-generated method stub } + + public static Map.Entry getRelatedInformation(TracePoint rp) { + Statement rpStatement = rp.getStatement(); + String rpSrcObjId = null; + String rpDstObjId = null; + String rpSrcClassName = null; + String rpDstClassName = null; + String rpFieldName = null; + + // Search for relatedPoint objectReference srcClassName, fieldName. + if(rpStatement instanceof FieldUpdate) { + // Format fieldName. + FieldUpdate rpFieldUpdateStatement = (FieldUpdate) rpStatement; + rpSrcObjId = rpFieldUpdateStatement.getContainerObjId(); + rpDstObjId = rpFieldUpdateStatement.getValueObjId(); + String rpFieldNames[] = formatFieldName(rpFieldUpdateStatement.getFieldName()); + rpSrcClassName = rpFieldNames[0]; + rpDstClassName = rpFieldUpdateStatement.getValueClassName(); + rpFieldName = rpFieldNames[rpFieldNames.length-1]; + } else if (rpStatement instanceof ArrayUpdate) { + // container to component + ArrayUpdate rpArrayUpdateStatement = (ArrayUpdate) rpStatement; + rpSrcObjId = rpArrayUpdateStatement.getArrayObjectId(); + rpDstObjId = rpArrayUpdateStatement.getValueObjectId(); + rpSrcClassName = rpArrayUpdateStatement.getArrayClassName(); + rpDstClassName = rpArrayUpdateStatement.getValueClassName(); + rpFieldName = "[" + rpArrayUpdateStatement.getIndex() + "]"; + } else if(rpStatement instanceof MethodInvocation) { + MethodInvocation rpMethodInvStatement = (MethodInvocation) rpStatement; + MethodExecution rpCalledMethodExec = rpMethodInvStatement.getCalledMethodExecution(); + String rpMethodSig = rpCalledMethodExec.getSignature(); + + //Array��List�̂Ƃ��������x����t����i�m���ɕ������Ă�����̂Ƃ�)getSignature->contains("List.get(") || "Map.get(") <�z���C�g���X�g> +// if (rpMethodExec.getSignature().contains("List.add(") || +// rpMethodExec.getSignature().contains("Map.put(")) { + if (rpCalledMethodExec.isCollectionType() + && (rpMethodSig.contains("add(") + || rpMethodSig.contains("set(") + || rpMethodSig.contains("put(") + || rpMethodSig.contains("push(") + || rpMethodSig.contains("addElement("))) { + + rpSrcClassName = rpCalledMethodExec.getThisClassName(); + rpDstClassName = rpCalledMethodExec.getArguments().get(0).getActualType(); + rpSrcObjId = rpCalledMethodExec.getThisObjId(); + rpDstObjId = rpCalledMethodExec.getArguments().get(0).getId(); + } else { + // this to another + rpSrcClassName = rpMethodInvStatement.getThisClassName(); + rpDstClassName = rpCalledMethodExec.getReturnValue().getActualType(); + rpSrcObjId = rpMethodInvStatement.getThisObjId(); + rpDstObjId = rpCalledMethodExec.getReturnValue().getId(); + } + } + return new AbstractMap.SimpleEntry<>(new Reference(rpSrcObjId, rpDstObjId, rpSrcClassName, rpDstClassName), rpFieldName); + } protected class CurvedCanvas extends mxInteractiveCanvas { mxIShape shape = new CurvedConnector(); @@ -1310,6 +1371,6 @@ pt.setY(pt.getY() + offset.getY()); points.set(index, pt); } - } + } } } diff --git a/src/tests/CollaborationAliasCollectorTest.java b/src/tests/CollaborationAliasCollectorTest.java index 88f4307..d81051c 100644 --- a/src/tests/CollaborationAliasCollectorTest.java +++ b/src/tests/CollaborationAliasCollectorTest.java @@ -20,9 +20,9 @@ // String key = "getterOverlap"; String key = "setterOverlap"; MagnetRONFrameTest magnetRONFrame = new MagnetRONFrameTest(); - Map extractedPluralDelta = magnetRONFrame.extractPluralDelta(key); - List eList = new ArrayList<>(extractedPluralDelta.keySet()); - List dacList = new ArrayList<>(extractedPluralDelta.values()); + Map extractedMultipleDeltas = magnetRONFrame.extractMultipleDeltas(key); + List eList = new ArrayList<>(extractedMultipleDeltas.keySet()); + List dacList = new ArrayList<>(extractedMultipleDeltas.values()); CollaborationAliasCollector cac = null; for (IAliasCollector dac: dacList) { if (cac == null) { diff --git a/src/tests/CollaborationObjectCallGraphTest.java b/src/tests/CollaborationObjectCallGraphTest.java index 88e3c4b..7883a36 100644 --- a/src/tests/CollaborationObjectCallGraphTest.java +++ b/src/tests/CollaborationObjectCallGraphTest.java @@ -25,9 +25,9 @@ // String key = "getterOverlap"; String key = "setterOverlap"; MagnetRONFrameTest magnetRONFrame = new MagnetRONFrameTest(); - Map extractedPluralDelta = magnetRONFrame.extractPluralDelta(key); - List eList = new ArrayList<>(extractedPluralDelta.keySet()); - List dacList = new ArrayList<>(extractedPluralDelta.values()); + Map extractedMultipleDeltas = magnetRONFrame.extractMultipleDeltas(key); + List eList = new ArrayList<>(extractedMultipleDeltas.keySet()); + List dacList = new ArrayList<>(extractedMultipleDeltas.values()); CollaborationObjectCallGraph cocg = null; for (ExtractedStructure e: eList) { diff --git a/src/tests/MagnetRONFrameTest.java b/src/tests/MagnetRONFrameTest.java index 0492327..e66559c 100644 --- a/src/tests/MagnetRONFrameTest.java +++ b/src/tests/MagnetRONFrameTest.java @@ -61,9 +61,9 @@ // Change Here! // String key = "getterOverlap"; String key = "setterOverlap"; - Map extractedPluralDelta = extractPluralDelta(key); - List eList = new ArrayList<>(extractedPluralDelta.keySet()); - List dacList = new ArrayList<>(extractedPluralDelta.values()); + Map extractedMultipleDeltas = extractMultipleDeltas(key); + List eList = new ArrayList<>(extractedMultipleDeltas.keySet()); + List dacList = new ArrayList<>(extractedMultipleDeltas.values()); CollaborationObjectCallGraph cocg = null; CollaborationAliasCollector cac = null; for (ExtractedStructure e: eList) { @@ -80,7 +80,6 @@ cac.merge(dac); } } - // new Thread() { // public void run() { startCollectionViewer(cocg, cac); @@ -89,12 +88,12 @@ } } - public Map extractPluralDelta(String key) { - Map extractedPluralDelta = new HashMap<>(); + public Map extractMultipleDeltas(String key) { + Map extractedMultipleDeltas = new HashMap<>(); Map argsMap = new HashMap<>(); setArgmentsForDeltaExtract(argsMap); Map> argsKeysMap = new HashMap<>(); - setArgsKeysForPluralDeltaExtract(argsKeysMap, argsMap); + setArgsKeysForMultipleDeltasExtract(argsKeysMap, argsMap); List argsKeys = argsKeysMap.get(key); TraceJSON trace = new TraceJSON(argsMap.get(argsKeys.get(0))[4]); DeltaExtractorJSON s = new DeltaExtractorJSON(trace); @@ -143,9 +142,9 @@ eList.add(e); dacList.add(dac); } - extractedPluralDelta.put(eList.get(0), dacList.get(0)); + extractedMultipleDeltas.put(eList.get(0), dacList.get(0)); } - return extractedPluralDelta; + return extractedMultipleDeltas; } public void startCollectionViewer(CollaborationObjectCallGraph cocg, IAliasCollector cac) { @@ -166,16 +165,16 @@ } private void setArgmentsForDeltaExtract(Map map){ - // Samples of Plural Delta + // Samples of Multiple Deltas String[] getterOverlap1 = {null, null, "getterOverlap.F","getterOverlap.D", "traces/getterOverlap.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("getterOverlap1", getterOverlap1); String[] getterOverlap2 = {null, null, "getterOverlap.G","getterOverlap.D", "traces/getterOverlap.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("getterOverlap2", getterOverlap2); String[] setterOverlap1 = {null, null, "setterOverlap.F","setterOverlap.C", "traces/setterOverlap.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("setterOverlap1", setterOverlap1); String[] setterOverlap2 = {null, null, "setterOverlap.G","setterOverlap.C", "traces/setterOverlap.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("setterOverlap2", setterOverlap2); } - private void setArgsKeysForPluralDeltaExtract(Map> argsKeysMap, Map argsMap){ - // Samples of Plural Delta - argsKeysMap.put("getterOverlap", new ArrayList(Arrays.asList("getterOverlap1", "getterOverlap2"))); + private void setArgsKeysForMultipleDeltasExtract(Map> argsKeysMap, Map argsMap){ + // Samples of Multiple Deltas + argsKeysMap.put("getterOverlap", new ArrayList(Arrays.asList("getterOverlap2", "getterOverlap1"))); argsKeysMap.put("setterOverlap", new ArrayList(Arrays.asList("setterOverlap1", "setterOverlap2"))); } }