package org.ntlab.deltaViewer; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import org.ntlab.deltaExtractor.Alias; import org.ntlab.deltaExtractor.DeltaExtractorJSON; import org.ntlab.deltaExtractor.ExtractedStructure; import org.ntlab.trace.FieldAccess; import org.ntlab.trace.FieldUpdate; import org.ntlab.trace.IStatementVisitor; import org.ntlab.trace.MethodExecution; import org.ntlab.trace.MethodInvocation; import org.ntlab.trace.ObjectReference; import org.ntlab.trace.Reference; import org.ntlab.trace.Statement; import org.ntlab.trace.ThreadInstance; import org.ntlab.trace.Trace; import org.ntlab.trace.TraceJSON; import org.ntlab.trace.TracePoint; /** * Delta viewer sample for MagnetRON. * * @author Nitta Lab. */ public class DeltaViewerSample { // 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"; /** * @param args */ public static void main(String[] args) { // DeltaExtractorJSON dex = new DeltaExtractorJSON(trace); // HashMap<String, ThreadInstance> threads = trace.getAllThreads(); // ThreadInstance thread = threads.values().iterator().next(); // 最後のスレッドを見ているだけ… // TracePoint tp = thread.getRoot().get(thread.getRoot().size() - 1).getExitPoint(); // System.out.println("===== All Statements Backward ====="); // TracePoint tp = null; // ExtractedStructure e = null; // DeltaAliasCollector dac = new DeltaAliasCollector(); // 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; // e = dex.extract(new Reference(jHotDrawSelect3_1[0], jHotDrawSelect3_1[1], jHotDrawSelect3_1[2], jHotDrawSelect3_1[3]), tp, dac); // dex.extract(tp); // Statement statement = tp.getStatement(); // if(statement instanceof MethodInvocation) { // restart = ((MethodInvocation)tp.getStatement()).getCalledMethodExecution().getExitTime(); // } else { // restart = tp.getStatement().getTimeStamp(); // } // } // trace.traverseStatementsInTraceBackward(new IStatementVisitor() { // @Override // public boolean preVisitStatement(Statement statement) { // System.out.println("post:" + statement.getClass().getName() + ":" + statement.getTimeStamp()); // return false; // } // @Override // public boolean postVisitStatement(Statement statement) { // System.out.println("pre:" + statement.getClass().getName() + ":" + statement.getTimeStamp()); // return false; // } // }); // } // HashSet<String> marked = trace.getMarkedMethodSignatures(1255991806833871L, 1255991808597322L); // HashSet<String> marked = trace.getMarkedMethodSignatures(1699553004208835L, 1699553004739523L); // System.out.println("===== Marked Methods ====="); // for (String method: marked) { // System.out.println(method); // } // HashSet<String> unmarked = trace.getUnmarkedMethodSignatures(1255991806833871L, 1255991808597322L); // HashSet<String> unmarked = trace.getUnmarkedMethodSignatures(1699553004208835L, 1699553004739523L); // System.out.println("===== Unmarked Methods ====="); // for (String method: unmarked) { // System.out.println(method); // } // Change! // setArray, setCollection(2回目以降は必要なし) , foreach(thread) // ArrayListにaddされてない // フィールドに代入されていない // HashMap<String, ThreadInstance> threads = trace.getAllThreads(); // for(ThreadInstance ti: threads.values()) { // ArrayList<MethodExecution> roots = ti.getRoot(); // for(MethodExecution root: roots) { // traverseMethodExecution(root); // } // } Map<String, String[]> argsMap = new HashMap<>(); setArgmentsForDeltaExtract(argsMap); //抽出したいデルタの引数を格納した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 = "worstCase"; // String argsKey = "sample1"; 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<String, ThreadInstance> threads = trace.getAllThreads(); List<ExtractedStructure> eList = new ArrayList<>(); List<DeltaAliasCollector> dacList = new ArrayList<>(); if (threads.values().size() == 1) { ThreadInstance thread = threads.values().iterator().next(); // 最後のスレッドを見ているだけ… TracePoint tp = thread.getRoot().get(thread.getRoot().size() - 1).getExitPoint(); Reference reference = new Reference(argsMap.get(argsKey)[0], argsMap.get(argsKey)[1], argsMap.get(argsKey)[2], argsMap.get(argsKey)[3]); DeltaAliasCollector dac = new DeltaAliasCollector(); ExtractedStructure e = s.extract(reference, tp, dac); eList.add(e); dacList.add(dac); } else { for (ThreadInstance thread: threads.values()) { TracePoint tp = thread.getRoot().get(thread.getRoot().size() - 1).getExitPoint(); Reference reference = new Reference(argsMap.get(argsKey)[0], argsMap.get(argsKey)[1], argsMap.get(argsKey)[2], argsMap.get(argsKey)[3]); if (argsMap.get(argsKey)[5] == CONTAINER_COMPONENT_COLLECTION) { reference.setCollection(true); } // reference.setArray(true); // reference.setFinalLocal(true); // reference.setCreation(true); DeltaAliasCollector 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("---------------------------"); } } startDeltaViewer(eList.get(0), dacList.get(0)); } else { DeltaAliasCollector dac = new DeltaAliasCollector(); MethodExecution me = trace.getLastMethodExecution(argsMap.get(argsKey)[2]); Map<ObjectReference, TracePoint> refs = me.getObjectReferences(argsMap.get(argsKey)[3]); ObjectReference ref = refs.keySet().iterator().next(); ExtractedStructure e = s.extract(refs.get(ref), ref, dac); startDeltaViewer(e, dac); } } private static void startDeltaViewer(ExtractedStructure e, DeltaAliasCollector dac) { DeltaViewer dv = new DeltaViewer(e, dac); List<Alias> aliasList = new ArrayList<>(dac.getAliasList()); // dv.setCoordinatorPoint(1200, 100); dv.init(); // for(int i = 0; i < aliasList.size(); i++) { // System.out.println(aliasList.get(i).getObjectId() + ", " + aliasList.get(i).getMethodSignature() + " l." + aliasList.get(i).getLineNo() + " : " + aliasList.get(i).getAliasType().toString()); // } for (int i = 0; i <= aliasList.size(); i++) { dv.stepToAnimation(i); } } private static void setArgmentsForDeltaExtract(Map map){ // one delta extract String[] traceSample1 = {null, null, "","", "traces/traceSample1.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("traceSample1", traceSample1); String[] traceSample2 = {null, null, "","", "traces/traceSample2.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("traceSample2", traceSample2); String[] presenSample = {null, null, "","", "traces/presenSample.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("presenSample", presenSample); String[] worstCase = {null, null, "worstCase.P", "worstCase.M", "traces/_worstCase.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("worstCase", worstCase); String[] sample1 = {null, null, "sample1.D", "sample1.C", "traces\\sample1.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("sample1", sample1); String[] sampleArray = {null, null, "sampleArray.D", "sampleArray.C", "traces\\sampleArray.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("sampleArray", sampleArray); String[] sampleCollection = {null, null, "sampleCollection.D", "sampleCollection.C", "traces\\sampleCollection.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("sampleCollection", sampleCollection); String[] sampleCreate = {null, null, "sampleCreate.D", "sampleCreate.C", "traces\\sampleCreate.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("sampleCreate", sampleCreate); String[] sampleStatic = {null, null, "sampleStatic.D", "sampleStatic.C", "traces\\sampleStatic.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("sampleStatic", sampleStatic); String[] delta_eg1 = {null, null, "E","C", "traces/testTrace.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("delta_eg1", delta_eg1); String[] delta_eg5 = {null, null, "E","C", "traces/testTrace5.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("delta_eg5", delta_eg5); String[] testTrace2 = {null, null, "","", "traces/testTrace2.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("testTrace2", testTrace2); String[] testTrace3 = {null, null, "","", "traces/testTrace3.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("testTrace3", testTrace3); // 予備実験のときに用いたToy program String[] pre_Exp1 = {null, null, "E","C", "traces/pre_Exp1.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("pre_Exp1", pre_Exp1); String[] pre_Exp2 = {null, null, "E","C", "traces/pre_Exp2.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("pre_Exp2", pre_Exp2); String[] pre_Exp3 = {null, null, "E","C", "traces/pre_Exp3.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("pre_Exp3", pre_Exp3); String[] pre_Exp4 = {null, null, "E","C", "traces/pre_Exp4.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("pre_Exp4", pre_Exp4); String[] pre_Exp5 = {null, null, "E","C", "traces/pre_Exp5.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("pre_Exp5", pre_Exp5); 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); String[] test = {null, null, "org.argouml.uml.diagram.static_structure.ui.FigClass","org.tigris.gef.base.LayerPerspectiveMutable", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("test", test); String[] testVectorAddElement = {null, null, "java.util.Vector", "org.tigris.gef.base.LayerPerspective", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("testVectorAddElement", testVectorAddElement);//trace.javaに"addElement("に対応するように追加 String[] ArgoUMLBenchmark = {"", "", "", "", "traces/ArgoUMLBenchmark.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLBenchmark", ArgoUMLBenchmark); String[] ArgoUMLBenchmarkWithMoreStandardClasses = {"", "", "", "", "traces/ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLBenchmarkWithMoreStandardClasses", ArgoUMLBenchmarkWithMoreStandardClasses); // String[] ArgoUMLSelect0_1 = {"1994249754", "1141430801", "java.util.ArrayList", "org.argouml.uml.diagram.static_structure.ui.SelectionClass","traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLSelect0_1", ArgoUMLSelect0_1); String[] ArgoUMLSelect0_1 = {"1994249754", "1141430801", null, null,"traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLSelect0_1", ArgoUMLSelect0_1); /*Vector.addElemnt()に対応済み*/String[] ArgoUMLDelete0_2 = {"1784213708", "1337038091", "java.util.Vector", "org.argouml.uml.diagram.static_structure.ui.FigClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLDelete0_2", ArgoUMLDelete0_2); /*更に過去mouse.Pressed(), mouseReleased()*/String[] ArgoUMLPlace1_1 = {null, null, "java.util.ArrayList", "org.argouml.uml.diagram.static_structure.ui.FigClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLPlace1_1", ArgoUMLPlace1_1); // String[] ArgoUMLSelect1_2 = {"1994249754", "1141430801", "java.util.ArrayList", "org.argouml.uml.diagram.static_structure.ui.SelectionClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLSelect1_2", ArgoUMLSelect1_2); // String[] ArgoUMLSelect1_2 = {"125345735", "1672744985", "java.util.ArrayList", "org.argouml.uml.diagram.static_structure.ui.SelectionClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("ArgoUMLSelect1_2", ArgoUMLSelect1_2); String[] jEditBenchmark = {"", "", "", "", "traces/jEditBenchmark.trace", CONTAINER_COMPONENT}; map.put("jEditBenchmark", jEditBenchmark); String[] jEditSelect2_1 = {"932187140", "1572482885", "java.util.ArrayList", "org.gjt.sp.jedit.textarea.Selection$Range", "traces\\jEditBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jEditSelect2_1", jEditSelect2_1); String[] jHotDrawBenchmark = {"", "", "", "", "traces/jHotDrawBenchmark.trace", CONTAINER_COMPONENT}; map.put("jHotDrawBenchmark", jHotDrawBenchmark); String[] jHotDrawBenchmarkWithMoreStandardClasses = {"", "", "", "", "traces/jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jHotDrawBenchmarkWithMoreStandardClasses", jHotDrawBenchmarkWithMoreStandardClasses); /*List.toArray()に対応させる必要がある?*/String[] jEditDelete2_2 = {null, null, "org.gjt.sp.jedit.buffer.ContentManager", "java.util.ArrayList", "traces\\jEditBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jEditDelete2_2", jEditDelete2_2); String[] jHotDrawSelect3_1 = {"361298449", "212532447", "java.util.LinkedHashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jHotDrawSelect3_1", jHotDrawSelect3_1); String[] jHotDrawMove3_2 = {"778703711", "212532447", "org.jhotdraw.draw.tool.DefaultDragTracker", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jHotDrawMove3_2", jHotDrawMove3_2); /*不明*/String[] jHotDrawMove3_2_1 = {null, null, "java.util.ArrayList", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jHotDrawMove3_2_1", jHotDrawMove3_2_1); String[] jHotDrawPlace4_1 = {"1284329882", "212532447", "java.util.HashMap", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jHotDrawPlace4_1", jHotDrawPlace4_1); // String[] jHotDrawSelect4_2 = {"361298449", "212532447", "java.util.LinkedHashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jHotDrawSelect4_2", jHotDrawSelect4_2); String[] jHotDrawSelect4_2 = {null, null, "java.util.LinkedHashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("jHotDrawSelect4_2", jHotDrawSelect4_2); // MagnetRON Experiment String[] ArgoUMLSelect = {"125345735", "1672744985", "java.util.ArrayList", "org.argouml.uml.diagram.static_structure.ui.SelectionClass", "traces\\ArgoUMLBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("ArgoUMLSelect", ArgoUMLSelect); // ArgoUML 選択機能 (collection) 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) String[] JHotDrawTransform = {"176893671", "1952912699", "java.util.HashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("JHotDrawTransform", JHotDrawTransform); // JHotDraw 移動機能 (collection) String[] JHotDrawSelect1 = {"758826749", "1952912699", "org.jhotdraw.draw.tool.DefaultDragTracker", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT}; map.put("JHotDrawSelect1", JHotDrawSelect1); // JHotDraw 選択機能1 String[] JHotDrawSelect2 = {"1378082106", "1952912699", "java.util.HashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("JHotDrawSelect2", JHotDrawSelect2); // JHotDraw 選択機能2 (collection) String[] JHotDrawSelect3 = {"1787265837", "1952912699", "java.util.LinkedHashSet", "org.jhotdraw.draw.RectangleFigure", "traces\\jHotDrawBenchmarkWithMoreStandardClasses.trace", CONTAINER_COMPONENT_COLLECTION}; map.put("JHotDrawSelect3", JHotDrawSelect3); // JHotDraw 選択機能3 (collection) } private static void traverseMethodExecution(MethodExecution m) { System.out.println(m.getSignature()); for(Statement ms :m.getStatements()) { if(ms instanceof FieldAccess) { System.out.println(((FieldAccess)ms).getFieldName()); } } for(MethodExecution m2: m.getChildren()) { traverseMethodExecution(m2); } } }