package org.ntlab.traceanalyzer; import java.util.ArrayList; import java.util.Stack; import org.ntlab.trace.IMethodExecutionVisitor; import org.ntlab.trace.MethodExecution; import org.ntlab.trace.ThreadInstance; public class MarkedMethodExecutionVisitor implements IMethodExecutionVisitor { private ArrayList<MarkedThread> markedThreads = new ArrayList<MarkedThread>(); private ArrayList<MarkedMethodExecution> topMethodExecutions = null; private Stack<MarkedMethodExecution> callStack = new Stack<MarkedMethodExecution>(); @Override public boolean preVisitThread(ThreadInstance thread) { topMethodExecutions = new ArrayList<MarkedMethodExecution>(); return false; } @Override public boolean postVisitThread(ThreadInstance thread) { if (topMethodExecutions.size() > 0) markedThreads.add(new MarkedThread(thread.getId(), topMethodExecutions)); return false; } @Override public boolean preVisitMethodExecution(MethodExecution methodExecution) { MarkedMethodExecution child = new MarkedMethodExecution(methodExecution); if (!callStack.isEmpty()) { MarkedMethodExecution parent = callStack.peek(); parent.addChild(child); } callStack.push(child); return false; } @Override public boolean postVisitMethodExecution(MethodExecution methodExecution, ArrayList<MethodExecution> children) { MarkedMethodExecution markedMethodExecution = callStack.pop(); if (callStack.isEmpty()) { topMethodExecutions.add(markedMethodExecution); } return false; } public ArrayList<MarkedThread> getMarkedThreads() { return markedThreads; } }