package org.ntlab.traceanalyzer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import org.ntlab.trace.ClassInfo;
import org.ntlab.trace.MethodExecution;
import org.ntlab.trace.ThreadInstance;
import org.ntlab.trace.Trace;
import org.ntlab.trace.TraceJSON;
public class MarkedTrace {
private Trace trace;
private long markStart = -1L;
private long markEnd = -1L;
private ArrayList<MarkedThread> markedThreads = null;
private boolean bHighlightUniqueMethods = false;
/**
* マーク外で実行された全メソッド実行
*/
private HashSet<String> unmarkedMethodSignatures = null;
public MarkedTrace(String traceFilePath) {
this.trace = new TraceJSON(traceFilePath);
markFull();
}
public void setTrace(Trace trace) {
this.trace = trace;
markFull();
}
public ClassInfo getClassInfo(String className) {
if (trace instanceof TraceJSON) {
return ((TraceJSON)trace).getClassInfo(className);
}
return null;
}
public void markFull() {
Collection<ThreadInstance> threads = trace.getAllThreads().values();
long start = -1L;
long end = -1L;
for (ThreadInstance thread: threads) {
ArrayList<MethodExecution> roots = thread.getRoot();
for (MethodExecution m: roots) {
if (start == -1L || m.getEntryTime() < start) {
start = m.getEntryTime();
}
if (end == -1L || m.getExitTime() > end) {
end = m.getExitTime(); // JSONトレースのみ対応
}
}
}
if (end < start) {
end = start + 1;
}
mark(start, end);
}
public void mark(long start, long end) {
this.markStart = start;
this.markEnd = end;
updateMarkedThreads();
}
public long getMarkStart() {
return markStart;
}
public long getMarkEnd() {
return markEnd;
}
public ArrayList<MarkedThread> getMarkedThreads() {
if (markedThreads == null) {
updateMarkedThreads();
}
return markedThreads;
}
private void updateMarkedThreads() {
MarkedMethodExecutionVisitor visitor = new MarkedMethodExecutionVisitor();
trace.traverseMarkedMethodExecutions(visitor, markStart, markEnd);
markedThreads = visitor.getMarkedThreads();
}
/**
* マーク固有のメソッドを強調する
* @param bHighlightUniqueMethods マーク固有のメソッドを強調するか?
*/
public void setHighlightUniqueMethods(boolean bHighlightUniqueMethods) {
this.bHighlightUniqueMethods = bHighlightUniqueMethods;
if (bHighlightUniqueMethods) {
if (unmarkedMethodSignatures == null) unmarkedMethodSignatures = trace.getUnmarkedMethodSignatures(markStart, markEnd);
for (int i = 0; i < markedThreads.size(); i++) {
markedThreads.get(i).searchUniqueMethodInvocation(unmarkedMethodSignatures);
}
}
}
/**
* マーク固有のメソッドを強調しているか?
* @return
*/
public boolean isbHighlightUniqueMethods() {
return bHighlightUniqueMethods;
}
/**
* マーク固有のメソッド実行をすべて取得する
* @return マーク固有の全メソッド実行
*/
public ArrayList<MarkedMethodExecution> getUniqueMethodExecutions() {
ArrayList<MarkedMethodExecution> uniqueMethodExecutions = new ArrayList<MarkedMethodExecution>();
if (markedThreads == null) {
updateMarkedThreads();
}
if (unmarkedMethodSignatures == null) unmarkedMethodSignatures = trace.getUnmarkedMethodSignatures(markStart, markEnd);
for (int i = 0; i < markedThreads.size(); i++) {
uniqueMethodExecutions.addAll(markedThreads.get(i).getUniqueMethodExecutions(unmarkedMethodSignatures));
}
return uniqueMethodExecutions;
}
}