package org.ntlab.traceDebugger.analyzerProvider; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; import org.ntlab.traceAnalysisPlatform.tracer.trace.Reference; import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; import org.ntlab.traceAnalysisPlatform.tracer.trace.Trace; import org.ntlab.traceAnalysisPlatform.tracer.trace.TraceJSON; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; import org.ntlab.traceDebugger.JavaEditorOperator; import org.ntlab.traceDebugger.Variable; public class DeltaExtractionAnalyzer extends AbstractAnalyzer { private static DeltaExtractionAnalyzer theInstance = null; private DeltaExtractorJSON deltaExtractor; private ExtractedStructure extractedStructure; private TracePoint bottomPoint; public DeltaExtractionAnalyzer(Trace trace) { super(trace); deltaExtractor = new DeltaExtractorJSON((TraceJSON)trace); DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); mgr.deleteMarkers(DeltaMarkerManager.DELTA_MARKER_ID); mgr.deleteMarkers(DeltaMarkerManager.DELTA_MARKER_ID_2); } private static DeltaExtractionAnalyzer getInstance() { if (theInstance == null) { theInstance = new DeltaExtractionAnalyzer(TraceJSON.getInstance()); } return theInstance; } public TracePoint getBottomPoint() { return bottomPoint; } public ExtractedStructure geExtractedStructure() { return extractedStructure; } public void extractDelta(Variable variable) { String srcId = variable.getContainerId(); String srcClassName = variable.getContainerClassName(); String dstId = variable.getId(); String dstClassName = variable.getClassName(); TracePoint before = variable.getTracePoint(); Reference reference = new Reference(srcId, dstId, srcClassName, dstClassName); // デルタ抽出 reset(); DeltaRelatedAliasCollector aliasCollector = new DeltaRelatedAliasCollector(srcId, dstId); extractedStructure = deltaExtractor.extract(reference, before.duplicate(), aliasCollector); MethodExecution creationCallTree = extractedStructure.getCreationCallTree(); List<Alias> srcSideRelatedAliases = aliasCollector.getSrcSideRelatedAliases(); List<Alias> dstSideRelatedAliases = aliasCollector.getDstSideRelatedAliases(); MethodExecution coordinator = extractedStructure.getCoordinator(); bottomPoint = findTracePoint(reference, creationCallTree, before.getStatement().getTimeStamp()); // デルタ抽出の結果を元にソースコードを反転表示する mark(bottomPoint, srcSideRelatedAliases, dstSideRelatedAliases, coordinator); } private void mark(TracePoint bottomPoint, List<Alias> srcSideRelatedAliases, List<Alias> dstSideRelatedAliases, MethodExecution coordinator) { String message = String.format("Bottom %s", ""); markAndOpenJavaFile(bottomPoint.getMethodExecution(), bottomPoint.getStatement().getLineNo(), message, DeltaMarkerManager.DELTA_MARKER_ID); int cnt = 1; for (Alias alias: srcSideRelatedAliases) { message = String.format("SrcSide%03d %s (id = %s)", cnt, alias.getAliasType().toString(), alias.getObjectId()); markAndOpenJavaFile(alias, message, DeltaMarkerManager.DELTA_MARKER_ID); cnt++; } cnt = 1; for (Alias alias : dstSideRelatedAliases) { message = String.format("DstSide%03d %s (id = %s)", cnt, alias.getAliasType().toString(), alias.getObjectId()); markAndOpenJavaFile(alias, message, DeltaMarkerManager.DELTA_MARKER_ID_2); cnt++; } markAndOpenJavaFile(coordinator, -1 , "Coordinator", DeltaMarkerManager.DELTA_MARKER_ID); } private TracePoint findTracePoint(Reference reference, MethodExecution methodExecution, long beforeTime) { List<Statement> statements = methodExecution.getStatements(); for (int i = statements.size() - 1; i >= 0; i--) { Statement statement = statements.get(i); if (!(statement instanceof FieldUpdate)) continue; if (statement.getTimeStamp() > beforeTime) continue; FieldUpdate fu = (FieldUpdate)statement; if (fu.getContainerObjId().equals(reference.getSrcObjectId()) && fu.getValueObjId().equals(reference.getDstObjectId())) { return new TracePoint(methodExecution, i); } } return null; } private void reset() { bottomPoint = null; DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); mgr.deleteMarkers(DeltaMarkerManager.DELTA_MARKER_ID); mgr.deleteMarkers(DeltaMarkerManager.DELTA_MARKER_ID_2); } private void markAndOpenJavaFile(Alias alias, String message, String markerId) { IFile file = JavaEditorOperator.findIFile(alias.getMethodExecution()); DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); IMarker marker = mgr.addMarker(alias, file, message, markerId); JavaEditorOperator.markAndOpenJavaFile(marker); } private void markAndOpenJavaFile(MethodExecution methodExecution, int lineNo, String message, String markerId) { IFile file = JavaEditorOperator.findIFile(methodExecution); DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); IMarker marker = mgr.addMarker(methodExecution, lineNo, file, message, markerId); JavaEditorOperator.markAndOpenJavaFile(marker); } }