package dk.statsbiblioteket.medieplatform.autonomous.iterator.eventhandlers; import dk.statsbiblioteket.medieplatform.autonomous.ResultCollector; import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.AttributeParsingEvent; import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.NodeBeginsParsingEvent; import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.NodeEndParsingEvent; import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.ParsingEvent; import dk.statsbiblioteket.medieplatform.autonomous.iterator.common.TreeIterator; import org.slf4j.Logger; import java.util.List; public class EventRunner implements Runnable { private static Logger log = org.slf4j.LoggerFactory.getLogger(EventRunner.class); public static final String EXCEPTION = "exception"; public static final String UNEXPECTED_ERROR = "Unexpected error: "; protected TreeIterator iterator; protected final List<TreeEventHandler> eventHandlers; protected final ResultCollector resultCollector; private boolean spawn = false; /** * Initialise the EventRunner with a tree iterator. * * @param iterator The tree iterator to run events on. * @param eventHandlers eventhandler to hande the events encountered * @param resultCollector the result collector */ public EventRunner(TreeIterator iterator, List<TreeEventHandler> eventHandlers, ResultCollector resultCollector) { this.iterator = iterator; this.eventHandlers = eventHandlers; this.resultCollector = resultCollector; } /** * Initialise the EventRunner. This constructor should only be used by the * MultithreadEventRunner * * @param iterator The tree iterator to run events on. * @param eventHandlers eventhandler to hande the events encountered * @param resultCollector the result collector * @param spawn if true, do not run handleFinish * * @see dk.statsbiblioteket.medieplatform.autonomous.iterator.eventhandlers.MultiThreadedEventRunner */ protected EventRunner(TreeIterator iterator, List<TreeEventHandler> eventHandlers, ResultCollector resultCollector, boolean spawn) { this(iterator,eventHandlers,resultCollector); this.spawn = spawn; } /** * Trigger all the given event handlers on all events of the iterator. * * @throws java.io.IOException */ public void run() { ParsingEvent current = null; while (iterator.hasNext()) { current = popInjectedEvent(); if (current == null) { current = iterator.next(); } switch (current.getType()) { case NodeBegin: { if (current instanceof NodeBeginsParsingEvent) { NodeBeginsParsingEvent event = (NodeBeginsParsingEvent) current; handleNodeBegins(event); } break; } case NodeEnd: { if (current instanceof NodeEndParsingEvent) { NodeEndParsingEvent event = (NodeEndParsingEvent) current; handleNodeEnd(event); } break; } case Attribute: { if (current instanceof AttributeParsingEvent) { AttributeParsingEvent event = (AttributeParsingEvent) current; handleAttribute(event); } break; } } } if (!spawn) { handleFinish(); } } /** * pop an injected event from the first injecting event handler that has * an injected event * @return an injected event or null */ public AttributeParsingEvent popInjectedEvent() { for (TreeEventHandler eventHandler : eventHandlers) { if (eventHandler instanceof InjectingTreeEventHandler) { InjectingTreeEventHandler handler = (InjectingTreeEventHandler) eventHandler; AttributeParsingEvent event = handler.popEvent(); if (event != null){ return event; } } } return null; } public void handleFinish() { for (TreeEventHandler handler : eventHandlers) { try { handler.handleFinish(); } catch (Exception e) { log.error("Caught Exception",e); resultCollector.addFailure("General Batch failure", EXCEPTION, handler.getClass().getSimpleName(), UNEXPECTED_ERROR + e.toString()); } } } public void handleAttribute(AttributeParsingEvent current) { for (TreeEventHandler handler : eventHandlers) { try { handler.handleAttribute(current); } catch (Exception e) { log.error("Caught Exception", e); resultCollector.addFailure(current.getName(), EXCEPTION, handler.getClass().getSimpleName(), UNEXPECTED_ERROR + e.toString()); } } } public void handleNodeEnd(NodeEndParsingEvent current) { for (TreeEventHandler handler : eventHandlers) { try { handler.handleNodeEnd(current); } catch (Exception e) { log.error("Caught Exception", e); resultCollector.addFailure(current.getName(), EXCEPTION, handler.getClass().getSimpleName(), UNEXPECTED_ERROR + e.toString()); } } } public void handleNodeBegins(NodeBeginsParsingEvent current) { for (TreeEventHandler handler : eventHandlers) { try { handler.handleNodeBegin(current); } catch (Exception e) { log.error("Caught Exception", e); resultCollector.addFailure(current.getName(), EXCEPTION, handler.getClass().getSimpleName(), UNEXPECTED_ERROR + e.toString()); } } } }