package edu.sc.seis.sod; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler; import edu.sc.seis.sod.process.waveform.WaveformProcess; import edu.sc.seis.sod.source.seismogram.BatchDataRequest; import edu.sc.seis.sod.source.seismogram.FdsnDataSelect; import edu.sc.seis.sod.source.seismogram.SeismogramSourceLocator; import edu.sc.seis.sod.status.waveformArm.WaveformMonitor; import edu.sc.seis.sod.subsetter.availableData.AvailableDataSubsetter; import edu.sc.seis.sod.subsetter.availableData.SomeCoverage; import edu.sc.seis.sod.subsetter.eventStation.EventStationSubsetter; import edu.sc.seis.sod.subsetter.eventStation.PassEventStation; public abstract class AbstractWaveformRecipe { public AbstractWaveformRecipe() { try { dcLocator = new BatchDataRequest(new FdsnDataSelect()); } catch(ConfigurationException e) { logger.warn("Unable to instatiate BatchDataRequest, using thread per request", e); dcLocator = new FdsnDataSelect(); } } public void addStatusMonitor(WaveformMonitor monitor) { statusMonitors.add(monitor); } private Set<WaveformMonitor> statusMonitors = Collections.synchronizedSet(new HashSet<WaveformMonitor>()); protected abstract void handle(Element el) throws ConfigurationException; protected void processConfig(Element config) throws ConfigurationException { NodeList children = config.getChildNodes(); for(int i = 0; i < children.getLength(); i++) { if(children.item(i) instanceof Element) { Element el = (Element)children.item(i); handle(el); } // end of if (node instanceof Element) } // end of for (intadd i=0; i<children.getSize(); i++) } public static final String[] PACKAGES = new String[] {"waveformArm", "availableData", "availableData.vector", "eventChannel", "eventChannel.vector", "eventStation", "request", "request.vector", "requestGenerator", "requestGenerator.vector", "waveform", "waveform.vector", "seismogram"}; public synchronized void setStatus(CookieEventPair ecp) { synchronized(statusMonitors) { Iterator<WaveformMonitor> it = statusMonitors.iterator(); while(it.hasNext()) { try { WaveformMonitor monitor = it.next(); if(ecp instanceof EventChannelPair) { monitor.update((EventChannelPair)ecp); } else if(ecp instanceof EventVectorPair) { monitor.update((EventVectorPair)ecp); } else if(ecp instanceof EventStationPair) { monitor.update((EventStationPair)ecp); } } catch(Exception e) { // oh well, log it and go to next status processor GlobalExceptionHandler.handle("Problem in setStatus", e); } } } } public synchronized void setStatus(EventNetworkPair ecp) { synchronized(statusMonitors) { Iterator<WaveformMonitor> it = statusMonitors.iterator(); while(it.hasNext()) { try { it.next().update(ecp); } catch(Exception e) { // oh well, log it and go to next status processor GlobalExceptionHandler.handle("Problem in setStatus", e); } } } } public EventStationSubsetter getEventStationSubsetter() { return eventStation; } public abstract void add(WaveformProcess proc); protected EventStationSubsetter eventStation = new PassEventStation();; protected SeismogramSourceLocator dcLocator = new FdsnDataSelect(); protected static final AvailableDataSubsetter defaultAvailableDataSubsetter = new SomeCoverage(); private static final Logger logger = LoggerFactory.getLogger(AbstractWaveformRecipe.class); }