Newer
Older
MagnetRON / src / org / ntlab / deltaViewer / MagnetRONFrame.java
package org.ntlab.deltaViewer;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;

import org.ntlab.deltaExtractor.Alias;
import org.ntlab.deltaExtractor.DeltaExtractorJSON;
import org.ntlab.deltaExtractor.ExtractedStructure;
import org.ntlab.trace.MethodExecution;
import org.ntlab.trace.ObjectReference;
import org.ntlab.trace.Reference;
import org.ntlab.trace.ThreadInstance;
import org.ntlab.trace.TraceJSON;
import org.ntlab.trace.TracePoint;

import javafx.beans.property.SimpleMapProperty;

public class MagnetRONFrame extends JFrame {
	// 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 DeltaViewer deltaViewer = null;

	private static Dimension DEFAULT_SIZE = new Dimension(1300, 700);
	private static String WINDOW_TITLE = "Delta Viewer";

	public MagnetRONFrame() throws HeadlessException {
		super(WINDOW_TITLE);
		setSize(DEFAULT_SIZE);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout());
		this.deltaViewer = new DeltaViewer();
		getContentPane().add(deltaViewer, BorderLayout.CENTER);
		pack();
	}

	public void startAnimation() {
		Map.Entry<ExtractedStructure, DeltaAliasCollector> extracted = extract();
		new Thread() {
			public void run() {
				startDeltaViewer(extracted.getKey(), extracted.getValue());						
			}
		}.start();
	}

	public Map.Entry<ExtractedStructure, DeltaAliasCollector> extract() {
		//		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";
		//		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<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("---------------------------");
				}
			}
			return new AbstractMap.SimpleEntry(eList.get(0), dacList.get(0));
//					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);
			return new AbstractMap.SimpleEntry(e, dac);
//					startDeltaViewer(e, dac);

		}
	}

	public void startDeltaViewer(ExtractedStructure e, DeltaAliasCollector dac) {
		// Build a frame, create a graph, and add the graph to the frame so you can actually see the graph.
		if(e != null) {
			List<Reference> srcSide = e.getDelta().getSrcSide();
			List<Reference> 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);			
			}
		}
		deltaViewer.init(e, dac);
		List<Alias> aliasList = new ArrayList<>(dac.getAliasList());

//		dv.setCoordinatorPoint(1200, 100);
		deltaViewer.initAnimation();
//		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++) {
			deltaViewer.stepToAnimation(i);
		}
	}

	private 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);
		String[] objTrace5 = {null, null, "A","B", "traces/objTraceSample5.txt", CONTAINER_COMPONENT_COLLECTION}; map.put("objTrace5", objTrace5);

		// 予備実験のときに用いた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)
	}
}