org.gridkit.jvmtool.stacktrace.LegacyThreadEventReader Maven / Gradle / Ivy
package org.gridkit.jvmtool.stacktrace;
import java.io.IOException;
import java.lang.Thread.State;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.gridkit.jvmtool.codec.stacktrace.ThreadSnapshotEvent;
import org.gridkit.jvmtool.event.ErrorEvent;
import org.gridkit.jvmtool.event.Event;
import org.gridkit.jvmtool.event.EventMorpher;
import org.gridkit.jvmtool.event.EventReader;
import org.gridkit.jvmtool.event.MorphingEventReader;
import org.gridkit.jvmtool.event.SimpleCounterCollection;
import org.gridkit.jvmtool.event.SimpleErrorEvent;
import org.gridkit.jvmtool.event.SimpleTagCollection;
import org.gridkit.jvmtool.event.TagCollection;
import org.gridkit.jvmtool.jvmevents.JvmEvents;
public class LegacyThreadEventReader implements EventReader {
private final StackTraceReader reader;
private final Proxy proxy = new Proxy();
private ErrorEvent error;
private boolean goNext;
public LegacyThreadEventReader(StackTraceReader reader) {
this.reader = reader;
if (reader.isLoaded()) {
proxy.init();
}
}
@Override
public EventReader morph(EventMorpher morpher) {
return MorphingEventReader.morph(this, morpher);
}
@Override
public boolean hasNext() {
if (error != null) {
return !goNext;
}
try {
if (goNext || !reader.isLoaded()) {
goNext = false;
if (reader.loadNext()) {
proxy.init();
}
}
return reader.isLoaded();
} catch (IOException e) {
error = new SimpleErrorEvent(e);
return true;
}
}
@Override
public Event next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
goNext = true;
return error == null ? proxy : error;
}
@Override
public Event peekNext() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return error == null ? proxy : error;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public Iterator iterator() {
return this;
}
@Override
public void dispose() {
// do nothing
}
private class Proxy implements ThreadSnapshotEvent {
private SimpleCounterCollection counters = new SimpleCounterCollection();
private SimpleTagCollection tags = new SimpleTagCollection();
public void init() {
counters.clear();
counters.setAll(reader.getCounters());
if (reader.getThreadId() >= 0) {
counters.set(JvmEvents.THREAD_ID, reader.getThreadId());
}
tags.clear();
if (reader.getThreadName() != null) {
tags.put(JvmEvents.THREAD_NAME, reader.getThreadName());
}
if (reader.getThreadState() != null) {
tags.put(JvmEvents.THREAD_STATE, reader.getThreadState().toString());
}
}
@Override
public long threadId() {
return reader.getThreadId();
}
@Override
public String threadName() {
return reader.getThreadName();
}
@Override
public State threadState() {
return reader.getThreadState();
}
@Override
public StackFrameList stackTrace() {
return reader.getStackTrace();
}
@Override
public long timestamp() {
return reader.getTimestamp();
}
@Override
public CounterCollection counters() {
return counters;
}
@Override
public TagCollection tags() {
return tags;
}
}
}