package org.jactr.eclipse.runtime.trace;
/*
* default logging
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.Executor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.jactr.eclipse.runtime.RuntimePlugin;
import org.jactr.eclipse.runtime.session.ISession;
import org.jactr.eclipse.runtime.trace.impl.GeneralEventManager;
import org.jactr.tools.tracer.transformer.ITransformedEvent;
public class RuntimeTraceManager
{
static private final transient Log LOGGER = LogFactory
.getLog(RuntimeTraceManager.class);
private GeneralEventManager<IRuntimeTraceListener, Event> _eventManager;
public RuntimeTraceManager()
{
_eventManager = new GeneralEventManager<IRuntimeTraceListener, Event>(
new GeneralEventManager.INotifier<IRuntimeTraceListener, Event>() {
public void notify(IRuntimeTraceListener listener, Event event)
{
try
{
if (listener.isInterestedIn(event.event, event.session))
listener.eventFired(event.event, event.session);
}
catch (Exception e)
{
LOGGER.error(String.format(
"Failed to propogate event [%s] to listener [%s] ",
event.event.getClass().getName(), listener.getClass()
.getName()), e);
}
}
});
}
public void clear()
{
_eventManager.clear();
}
public Collection<IRuntimeTraceListener> getListeners(
Collection<IRuntimeTraceListener> container)
{
if (container == null) container = new ArrayList<IRuntimeTraceListener>();
_eventManager.getListeners(container);
return container;
}
public void addListener(IRuntimeTraceListener listener)
{
addListener(listener, null);
}
public void addListener(IRuntimeTraceListener listener, Executor executor)
{
_eventManager.addListener(listener, executor);
}
public void removeListener(final IRuntimeTraceListener listener)
{
_eventManager.removeListener(listener);
}
public void fireEvent(ITransformedEvent event, ISession session)
{
_eventManager.notify(new Event(event, session));
}
public void fireEvents(Collection<ITransformedEvent> events, ISession session)
{
for (ITransformedEvent event : events)
_eventManager.notify(new Event(event, session));
// RuntimePlugin.info(String.format("(bulk) fired %s %.4f", event.getClass()
// .getSimpleName(), event.getSimulationTime()));
}
public void fireEvents(IProgressMonitor monitor,
Collection<ITransformedEvent> events, ISession session)
{
for (ITransformedEvent event : events)
{
if (monitor.isCanceled()) return;
try
{
_eventManager.notify(new Event(event, session));
// RuntimePlugin.info(String.format("(monitored) fired %s %.4f", event
// .getClass().getSimpleName(), event.getSimulationTime()));
}
catch (Exception e)
{
RuntimePlugin.error(String.format(
"Failed to notify event %s, skipping", event.getClass()
.getSimpleName()), e);
}
finally
{
monitor.worked(1);
}
}
}
private class Event
{
final public ITransformedEvent event;
final public ISession session;
public Event(ITransformedEvent event, ISession session)
{
this.event = event;
this.session = session;
}
}
}