/** * ForkProcessor.java * * @author Philip Crotwell */ package edu.sc.seis.sod.process.waveform; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import edu.iris.Fissures.IfSeismogramDC.RequestFilter; import edu.iris.Fissures.network.ChannelImpl; import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl; import edu.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.CookieJar; import edu.sc.seis.sod.LocalSeismogramArm; import edu.sc.seis.sod.SodUtil; import edu.sc.seis.sod.Threadable; import edu.sc.seis.sod.status.StringTree; import edu.sc.seis.sod.status.StringTreeBranch; import edu.sc.seis.sod.status.StringTreeLeaf; import edu.sc.seis.sod.subsetter.Subsetter; import edu.sc.seis.sod.subsetter.availableData.AvailableDataLogicalSubsetter; import edu.sc.seis.sod.subsetter.availableData.AvailableDataSubsetter; public class ForkProcess implements WaveformProcess, Threadable { public ForkProcess(Element config) throws ConfigurationException { NodeList children = config.getChildNodes(); Node node; String [] packageArray = packages.toArray(new String[0]); for(int i = 0; i < children.getLength(); i++) { node = children.item(i); if(node instanceof Element) { Object sodElement = SodUtil.load((Element)node, packageArray); if (sodElement instanceof Subsetter) { localSeisProcessList.add(createSubsetter((Subsetter)sodElement)); } } // end of if (node instanceof Element) } // end of for (int i=0; i<children.getSize(); i++) } public boolean isThreadSafe() { return true; } public static final List<String> packages; static { packages = new LinkedList<String>(); packages.add("waveform"); packages.addAll(AvailableDataLogicalSubsetter.packages); } public static WaveformProcess createSubsetter(final Subsetter s) throws ConfigurationException { if (s instanceof WaveformProcess) { return (WaveformProcess)s; } else { final AvailableDataSubsetter subsetter = (AvailableDataSubsetter)AvailableDataLogicalSubsetter.createSubsetter(s); return new WaveformProcess() { public WaveformResult accept(CacheEvent event, ChannelImpl channel, RequestFilter[] request, RequestFilter[] available, LocalSeismogramImpl[] seismograms, CookieJar cookieJar) throws Exception { return new WaveformResult(seismograms, subsetter.accept(event, channel, request, available, cookieJar)); } }; } } /** * Forks the processing off the LocalSeismograms. The processes that are * contained in this tag are processed, but the return value off the process * method is the original seismograms. This allows, for example to process * both a original and a filtered version of the seismograms independently. */ public WaveformResult accept(CacheEvent event, ChannelImpl channel, RequestFilter[] request, RequestFilter[] available, LocalSeismogramImpl[] seismograms, CookieJar cookieJar) throws Exception { return new WaveformResult(copySeismograms(seismograms), doAND(event, channel, request, available, seismograms, cookieJar).getReason()); } protected WaveformResult doAND(CacheEvent event, ChannelImpl channel, RequestFilter[] request, RequestFilter[] available, LocalSeismogramImpl[] seismograms, CookieJar cookieJar) throws Exception { // pass originals to the contained processors List<StringTree> reasons = new ArrayList<StringTree>(localSeisProcessList.size()); Iterator it = localSeisProcessList.iterator(); WaveformResult result = new WaveformResult(seismograms, new StringTreeLeaf(this, true)); while(it.hasNext() && result.isSuccess()) { WaveformProcess processor = (WaveformProcess)it.next(); result = LocalSeismogramArm.runProcessorThreadCheck(processor, event, channel, request, available, result.getSeismograms(), cookieJar); reasons.add(result.getReason()); } // end of while (it.hasNext()) return new WaveformResult(result.getSeismograms(), new StringTreeBranch(this, result.isSuccess(), (StringTree[])reasons.toArray(new StringTree[0]))); } public static LocalSeismogramImpl[] copySeismograms(LocalSeismogramImpl[] seismograms) { LocalSeismogramImpl[] out = new LocalSeismogramImpl[seismograms.length]; for(int i = 0; i < out.length; i++) { out[i] = new LocalSeismogramImpl(seismograms[i], seismograms[i].data); } return out; } public String toString() { String s = SodUtil.getSimpleName(getClass()) + "("; Iterator it = localSeisProcessList.iterator(); while(it.hasNext()) { s += it.next().toString() + ","; } s = s.substring(0, s.length() - 1); s += ")"; return s; } protected List localSeisProcessList = new ArrayList(); public WaveformProcess[] getWrappedProcessors() { return (WaveformProcess[])localSeisProcessList.toArray(new WaveformProcess[0]); } }