package org.gridkit.jvmtool.stacktrace.analytics;
import java.io.IOException;
import java.lang.Thread.State;
import org.gridkit.jvmtool.stacktrace.CounterCollection;
import org.gridkit.jvmtool.stacktrace.ReaderProxy;
import org.gridkit.jvmtool.stacktrace.StackFrameList;
import org.gridkit.jvmtool.stacktrace.StackTraceReader;
public class FilteredStackTraceReader extends ReaderProxy implements StackTraceReader {
private final ThreadSnapshotFilter filter;
private final StackTraceReader reader;
public FilteredStackTraceReader(ThreadSnapshotFilter filter, StackTraceReader reader) throws IOException {
super(null);
this.filter = filter;
this.reader = reader;
if (reader.isLoaded()) {
reader.loadNext();
}
seek();
}
@Override
protected StackTraceReader getReader() {
return this;
}
@Override
public boolean isLoaded() {
return reader.isLoaded();
}
@Override
public long getThreadId() {
return reader.getThreadId();
}
@Override
public long getTimestamp() {
return reader.getTimestamp();
}
@Override
public String getThreadName() {
return reader.getThreadName();
}
@Override
public State getThreadState() {
return reader.getThreadState();
}
@Override
public CounterCollection getCounters() {
return reader.getCounters();
}
@Override
public StackTraceElement[] getTrace() {
return reader.getTrace();
}
@Override
public StackFrameList getStackTrace() {
return reader.getStackTrace();
}
private void seek() throws IOException {
while(reader.isLoaded()) {
if (filter.evaluate(this)) {
return;
}
reader.loadNext();
}
}
@Override
public boolean loadNext() throws IOException {
reader.loadNext();
seek();
return reader.isLoaded();
}
}