diff --git a/src/org/ntlab/deltaExtractor/Alias.java b/src/org/ntlab/deltaExtractor/Alias.java index 9cc13fd..39edc86 100644 --- a/src/org/ntlab/deltaExtractor/Alias.java +++ b/src/org/ntlab/deltaExtractor/Alias.java @@ -70,6 +70,9 @@ * @return */ public long getTimeStamp() { + if (!occurrencePoint.isValid()) { + return occurrencePoint.getMethodExecution().getEntryTime(); + } long stTimeStamp = occurrencePoint.getStatement().getTimeStamp(); Statement st = occurrencePoint.getStatement(); if (aliasType == AliasType.RETURN_VALUE) { diff --git a/src/org/ntlab/deltaViewer/CollaborationViewer.java b/src/org/ntlab/deltaViewer/CollaborationViewer.java index 743f923..830674d 100644 --- a/src/org/ntlab/deltaViewer/CollaborationViewer.java +++ b/src/org/ntlab/deltaViewer/CollaborationViewer.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import org.ntlab.deltaExtractor.Alias; import org.ntlab.deltaExtractor.IAliasCollector; @@ -103,7 +104,7 @@ if (numFrameAlias != null) { if (curFrameAlias != null) { for (TracePoint rp: relatedPoints) { - if (curFrameAlias.getTimeStamp() <= rp.getStatement().getTimeStamp() && rp.getStatement().getTimeStamp() <= numFrameAlias.getTimeStamp()) { + if (curFrameAlias.getTimeStamp() < rp.getStatement().getTimeStamp() && rp.getStatement().getTimeStamp() < numFrameAlias.getTimeStamp()) { System.out.println("\r\nLast Animation."); doLastAnimation(numFrame, rp); return; @@ -128,6 +129,7 @@ curFrame = numFrame; List aliasList = aliasCollector.getAliasList(); Alias prevAlias = aliasList.get(numFrame - 1); + Alias nextAlias = (numFrame < aliasList.size()) ? aliasList.get(numFrame) : null; // Make ObjectEdge and reset position of vertexObject, remove vertexMethodExecution. Statement statement = relatedPoint.getStatement(); @@ -154,9 +156,10 @@ System.out.println(methodExecToVertexMap.get(prevMethodExec).getLabel() + " :removeArgument: " + targetObjectVertex.getLabel()); } } - - removeCalledMethodExecutionVertex(objectToVertexMap.get(sourceObjectId), prevMethodExec.getCallerMethodExecution(), prevMethodExec); - updateObjectVertices(); + if (nextAlias == null || (nextAlias != null && !prevMethodExec.getSignature().equals(nextAlias.getMethodSignature()))) { + removeCalledMethodExecutionVertex(objectToVertexMap.get(sourceObjectId), prevMethodExec.getCallerMethodExecution(), prevMethodExec); + updateObjectVertices(); + } } if(statement instanceof MethodInvocation) { @@ -194,10 +197,12 @@ } List methodExecList = new ArrayList<>(methodExecToVertexMap.keySet()); System.out.println(methodExecList.size()); - if (methodExecList.size() > 1) { - removeCalledMethodExecutionVertex(null, prevMethodExec.getCallerMethodExecution(), prevMethodExec); - } else { - removeCalledMethodExecutionVertex(null, null, prevMethodExec); + if (nextAlias == null || (nextAlias != null && !prevMethodExec.getSignature().equals(nextAlias.getMethodSignature()))) { + if (methodExecList.size() > 1) { + removeCalledMethodExecutionVertex(null, prevMethodExec.getCallerMethodExecution(), prevMethodExec); + } else { + removeCalledMethodExecutionVertex(null, null, prevMethodExec); + } } updateObjectVertices(); } else { @@ -217,8 +222,10 @@ System.out.println(methodExecToVertexMap.get(prevMethodExec).getLabel() + " :removeArgument: " + tgtObjectVertex.getLabel()); } } - removeCalledMethodExecutionVertex(objectToVertexMap.get(srcObjId), prevMethodExec, calledMethodExec); - updateObjectVertices(); + if (nextAlias == null || (nextAlias != null && !calledMethodExec.getSignature().equals(nextAlias.getMethodSignature()))) { + removeCalledMethodExecutionVertex(objectToVertexMap.get(srcObjId), prevMethodExec, calledMethodExec); + updateObjectVertices(); + } } } @@ -248,7 +255,6 @@ // Add a vertex to the graph in a transactional fashion. The vertex is actually a 'cell' in jgraphx terminology. mxgraph.getModel().beginUpdate(); try { - Alias nextAlias = (numFrame < aliasList.size()) ? aliasList.get(numFrame) : null; List meList = new ArrayList<>(methodExecToVertexMap.keySet()); Collections.reverse(meList); System.out.println(meList.size()); @@ -338,6 +344,14 @@ double vertexObjWidth = VERTEX_OBJECT_SIZE.getWidth(); double vertexObjHeight = VERTEX_OBJECT_SIZE.getHeight(); + { + MethodExecution coordinator = objectCallGraph.getStartPoints().get(0); + String coordinatorObjId = coordinator.getThisObjId(); + String coordinatorClassName = coordinator.getThisClassName(); + Object vertex = mxgraph.insertDeltaVertex(mxDefaultParent, coordinatorObjId, coordinatorClassName, 0, 0, VERTEX_OBJECT_SIZE.getWidth(), VERTEX_OBJECT_SIZE.getHeight(), "fillColor=white"); //creates a white vertex. + objectToVertexMap.put(coordinatorObjId, new ObjectVertex(coordinatorClassName, vertex, 0, 0)); + } + for (int i = 0; i < ocgSize; i++) { Reference ref = refList.get(i); if (!ref.isCreation() && !ref.getSrcObjectId().equals(ref.getDstObjectId())) { @@ -457,49 +471,8 @@ // Judge AliasList contains relatedPoint. (If contains not to create edge.) if (rpIndex < relatedPoints.size() - 1) { TracePoint rp = relatedPoints.get(rpIndex); - Statement rpStatement = rp.getStatement(); - String rpSrcObjId = null; - String rpTgtObjId = null; - String rpSrcClassName = null; - String rpFieldName = null; - - // Search for relatedPoint objectReference srcClassName, fieldName. - if(rpStatement instanceof FieldUpdate) { - // Format fieldName. - FieldUpdate rpFieldUpdateStatement = (FieldUpdate) rpStatement; - rpSrcObjId = rpFieldUpdateStatement.getContainerObjId(); - rpTgtObjId = rpFieldUpdateStatement.getValueObjId(); - String rpFieldNames[] = formatFieldName(rpFieldUpdateStatement.getFieldName()); - rpSrcClassName = rpFieldNames[0]; - rpFieldName = rpFieldNames[rpFieldNames.length-1]; - } - - 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(); - rpSrcObjId = rpCalledMethodExec.getThisObjId(); - rpTgtObjId = rpCalledMethodExec.getArguments().get(0).getId(); - } else { - // this to another - rpSrcClassName = rpMethodInvStatement.getThisClassName(); - rpSrcObjId = rpMethodInvStatement.getThisObjId(); - rpTgtObjId = rpCalledMethodExec.getReturnValue().getId(); - } - } - if (srcClassName.equals(rpSrcClassName) && fieldName.equals(rpFieldName) && curAliasObjId.equals(rpSrcObjId) && nextAliasObjId.equals(rpTgtObjId)) { + Map.Entry rpInf = getRelatedInformation(rp); + if (srcClassName.equals(rpInf.getKey().getSrcClassName()) && fieldName.equals(rpInf.getValue()) && curAliasObjId.equals(rpInf.getKey().getSrcObjectId()) && nextAliasObjId.equals(rpInf.getKey().getDstObjectId())) { rpIndex++; continue; } diff --git a/src/org/ntlab/deltaViewer/MagnetRONFrame.java b/src/org/ntlab/deltaViewer/MagnetRONFrame.java index db60dfa..0d71f3a 100644 --- a/src/org/ntlab/deltaViewer/MagnetRONFrame.java +++ b/src/org/ntlab/deltaViewer/MagnetRONFrame.java @@ -53,25 +53,31 @@ // Change Here! setArgmentsForDeltaExtract(argsMap); //���o�������f���^�̈������i�[����Map��key -// String argsKey = "ArgoUMLSelect"; -// String argsKey = "ArgoUMLDelete1"; -// String argsKey = "JHotDrawTransform"; -// String argsKey = "JHotDrawSelect3"; +// String argsKey1 = "ArgoUMLSelect"; +// String argsKey1 = "ArgoUMLDelete1"; +// String argsKey2 = "ArgoUMLDelete2"; +// String argsKey1 = "JHotDrawTransform"; + String argsKey1 = "JHotDrawSelect1,1"; + String argsKey2 = "JHotDrawSelect2"; + String argsKey4 = "JHotDrawSelect3"; + String argsKey3 = "JHotDrawSelect4,1"; // 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 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); + keys.add(argsKey2); + keys.add(argsKey3); + keys.add(argsKey4); Map.Entry extracted = extractMulti(keys); new Thread() { public void run() { @@ -83,11 +89,26 @@ 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); + trace = null; + s = null; for(String key: keys) { - Map.Entry extracted = extract(key); + int index = 0; + if (key.contains(",")) { + String[] splitKeys = key.split(","); + key = splitKeys[0]; + index = Integer.parseInt(splitKeys[splitKeys.length-1]); + if (trace == null && s == null) { + trace = new TraceJSON(argsMap.get(key)[4]); + s = new DeltaExtractorJSON(trace); + } + } else { + if (trace == null && s == null) { + trace = new TraceJSON(argsMap.get(key)[4]); + s = new DeltaExtractorJSON(trace); + } + } + Map.Entry extracted = extract(key, index); if (cocg == null) { cocg = new CollaborationObjectCallGraph(extracted.getKey()); } else { @@ -102,7 +123,7 @@ return new AbstractMap.SimpleEntry(cocg, cac); } - public Map.Entry extract(String argsKey) { + public Map.Entry extract(String argsKey, int index) { // DeltaExtractorJSON dex = new DeltaExtractorJSON(trace); // HashMap threads = trace.getAllThreads(); // ThreadInstance thread = threads.values().iterator().next(); // �Ō�̃X���b�h�����Ă��邾���c @@ -206,18 +227,88 @@ // reference.setArray(true); // reference.setFinalLocal(true); // reference.setCreation(true); - IAliasTracker dac = new DeltaAliasCollector(); - ExtractedStructure e = s.extract(reference, tp, dac); - System.out.println(e); - if (e != null) { - eList.add(e); - dacList.add(dac); - System.out.println("add" + eList.size() + ", " + dacList.size()); - } + + ExtractedStructure e = null; + do { +// System.out.println(System.nanoTime() - time); + if (e == null) { + IAliasTracker dac = new DeltaAliasCollector(); + e = s.extract(reference, tp, dac); + System.out.println(e); + if (e != null) { + eList.add(e); + dacList.add(dac); + } +// e = s.extract(new Reference(null, null, "org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor$AdaptedSourceViewer", +// "org.eclipse.jface.text.contentassist.ContentAssistant")); + } else { + tp = e.getRelatedTracePoint().duplicate(); + tp.stepBackOver(); + IAliasTracker dac = new DeltaAliasCollector(); + e = s.extract(reference, tp, dac); +// e = s.extract(new Reference(null, null, "org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor$AdaptedSourceViewer", +// "org.eclipse.jface.text.contentassist.ContentAssistant"), e.getCreationCallTree().getEntryPoint()); + System.out.println(e); + if (e != null) { + eList.add(e); + dacList.add(dac); + System.out.println("add" + eList.size() + ", " + dacList.size()); + } + } + } while (e != null); +// } +// long restart = 0L; +// for(;;) { +// tp = trace.traverseStatementsInTraceBackward(new IStatementVisitor() { +// @Override +// public boolean preVisitStatement(Statement statement) { +// System.out.println("pre:" + statement.getThreadNo() + ":" + statement.getTimeStamp()); +// if(statement instanceof FieldUpdate) { +// FieldUpdate fu = (FieldUpdate) statement; +// if(!Trace.isNull(fu.getValueObjId()) && !Trace.isPrimitive(fu.getValueClassName())) { +// return true; +// } +// } +// return false; +// } +// +// @Override +// public boolean postVisitStatement(Statement statement) { +// System.out.println("post:" + statement.getThreadNo() + ":" + statement.getTimeStamp()); +// return false; +// } +// }, restart); +// if(tp == null || !tp.isValid()) break; +// IAliasTracker dac = new DeltaAliasCollector(); +// ExtractedStructure e = s.extract(reference, tp, dac); +// System.out.println(e); +// if (e != null) { +// eList.add(e); +// dacList.add(dac); +// System.out.println("add" + eList.size() + ", " + dacList.size()); +// } +// if(tp == null || !tp.isValid()) break; +// s.extract(tp); +// Statement statement = tp.getStatement(); +// if(statement instanceof MethodInvocation) { +// restart = ((MethodInvocation)tp.getStatement()).getCalledMethodExecution().getExitTime(); +// } else { +// restart = tp.getStatement().getTimeStamp(); +// } +// } + +// IAliasTracker dac = new DeltaAliasCollector(); +// ExtractedStructure e = s.extract(reference, tp, dac); +// System.out.println(e); +// if (e != null) { +// eList.add(e); +// dacList.add(dac); +// System.out.println("add" + eList.size() + ", " + dacList.size()); +// } System.out.println("---------------------------"); } } - return new AbstractMap.SimpleEntry(eList.get(0), dacList.get(0)); + return new AbstractMap.SimpleEntry(eList.get(index), dacList.get(index)); // startDeltaViewer(eList.get(0), dacList.get(0)); } else { IAliasTracker dac = new DeltaAliasCollector(); @@ -317,5 +408,6 @@ String[] JHotDrawSelect1 = {"758826749", "1952912699", "org.jhotdraw.draw.tool.DefaultDragTracker", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("JHotDrawSelect1", JHotDrawSelect1); // JHotDraw �I���@�\1 String[] JHotDrawSelect2 = {"1378082106", "1952912699", "java.util.HashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("JHotDrawSelect2", JHotDrawSelect2); // JHotDraw �I���@�\2 (collection) String[] JHotDrawSelect3 = {"1787265837", "1952912699", "java.util.LinkedHashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("JHotDrawSelect3", JHotDrawSelect3); // JHotDraw �I���@�\3 (collection) + String[] JHotDrawSelect4 = {"599587451", "758826749", "org.jhotdraw.draw.tool.DelegationSelectionTool", "org.jhotdraw.draw.tool.DefaultDragTracker", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("JHotDrawSelect4", JHotDrawSelect4); // JHotDraw �I���@�\3 (collection) } } diff --git a/src/tests/MagnetRONFrameTest.java b/src/tests/MagnetRONFrameTest.java index e66559c..7dca3cc 100644 --- a/src/tests/MagnetRONFrameTest.java +++ b/src/tests/MagnetRONFrameTest.java @@ -35,6 +35,7 @@ // Delta Extract Type 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 static Dimension DEFAULT_SIZE = new Dimension(1300, 700); private static String WINDOW_TITLE = "Delta Viewer"; @@ -59,8 +60,9 @@ public void startAnimation() { if (visible) { // Change Here! + String key = "ArgoUMLDelete"; // String key = "getterOverlap"; - String key = "setterOverlap"; +// String key = "setterOverlap"; Map extractedMultipleDeltas = extractMultipleDeltas(key); List eList = new ArrayList<>(extractedMultipleDeltas.keySet()); List dacList = new ArrayList<>(extractedMultipleDeltas.values()); @@ -170,11 +172,17 @@ 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); + + // MagnetRON Experiment + String[] ArgoUMLDelete1 = {null, null, "public void org.argouml.uml.diagram.ui.ActionRemoveFromDiagram.actionPerformed(", "org.argouml.uml.diagram.static_structure.ui.FigClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", THIS_ANOTHER}; map.put("ArgoUMLDelete1", ArgoUMLDelete1);// ArgoUML �폜�@�\1 (this to another) + String[] ArgoUMLDelete2 = {"450474599", "1675174935", "java.util.Vector", "org.argouml.uml.diagram.static_structure.ui.FigClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("ArgoUMLDelete2", ArgoUMLDelete2); // ArgoUML �폜�@�\2 (collection) + } 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"))); + argsKeysMap.put("ArgoUMLDelete", new ArrayList(Arrays.asList("ArgoUMLDelete1", "ArgoUMLDelete2"))); } }