org.snapscript.core.trace.TraceInterceptor Maven / Gradle / Ivy
package org.snapscript.core.trace;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import org.snapscript.core.scope.Scope;
import org.snapscript.core.stack.ThreadStack;
public class TraceInterceptor implements TraceListener {
private final Set listeners;
private final TraceErrorCollector collector;
private final ThreadStack stack;
public TraceInterceptor(TraceErrorCollector collector, ThreadStack stack) {
this.listeners = new CopyOnWriteArraySet();
this.collector = collector;
this.stack = stack;
}
@Override
public void traceBefore(Scope scope, Trace trace) {
stack.before(trace);
if(!listeners.isEmpty()) {
for(TraceListener listener : listeners) {
listener.traceBefore(scope, trace);
}
}
}
@Override
public void traceAfter(Scope scope, Trace trace) {
stack.after(trace);
if(!listeners.isEmpty()) {
for(TraceListener listener : listeners) {
listener.traceAfter(scope, trace);
}
}
}
@Override
public void traceCompileError(Scope scope, Trace trace, Exception cause) {
collector.compileError(cause, trace);
if(!listeners.isEmpty()) {
for(TraceListener listener : listeners) {
listener.traceCompileError(scope, trace, cause);
}
}
}
@Override
public void traceRuntimeError(Scope scope, Trace trace, Exception cause) {
collector.runtimeError(cause, trace);
if(!listeners.isEmpty()) {
for(TraceListener listener : listeners) {
listener.traceRuntimeError(scope, trace, cause);
}
}
}
public void register(TraceListener listener) {
listeners.add(listener);
}
public void remove(TraceListener listener) {
listeners.remove(listener);
}
public void clear() {
listeners.clear();
}
}