package de.bodden.tamiflex.reporting.rt;
import static de.bodden.tamiflex.reporting.rt.Entry.Status.ATTEMPTED;
import static de.bodden.tamiflex.reporting.rt.Entry.Status.FAILED;
import static de.bodden.tamiflex.reporting.rt.Entry.Status.SUCCEEDED;
public class Entry {
public static enum Status { ATTEMPTED, SUCCEEDED, FAILED }
protected Status status;
protected final Thread thread;
protected final String payload;
private final int perThreadTimeStamp;
private final StackTraceElement[] stackTrace;
public Entry(int perThreadTimeStamp, StackTraceElement[] stackTrace, String payload) {
this.perThreadTimeStamp = perThreadTimeStamp;
this.stackTrace = stackTrace;
this.payload = payload;
this.thread = Thread.currentThread();
this.status = ATTEMPTED;
}
@Override
public String toString() {
return status + ";" + thread.getId()+"-"+thread.getName() + ";" + payload;
}
public boolean matchesEarlierEntry(Entry earlierEntry) {
if(earlierEntry.perThreadTimeStamp>=perThreadTimeStamp)
throw new IllegalArgumentException("not an earlier entry!");
if(earlierEntry.thread != thread) {
throw new IllegalArgumentException("not an earlier entry! (different threads)");
}
return earlierEntry.status == ATTEMPTED && stackTrace.length == earlierEntry.stackTrace.length && payload.equals(earlierEntry.payload);
}
public void markAsSucceeded() {
if(!successUnknown()) throw new IllegalStateException("status already set!");
status = SUCCEEDED;
}
public void markAsFailed() {
if(!successUnknown()) throw new IllegalStateException("status already set!");
status = FAILED;
}
public boolean successUnknown() {
return status == ATTEMPTED;
}
public int getStackDepth() {
return stackTrace.length;
}
public StackTraceElement[] getStackTrace() {
return stackTrace;
}
}