package edu.sc.seis.sod.subsetter.requestGenerator; import java.util.LinkedList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.fissuresUtil.display.configuration.DOMHelper; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.CookieJar; import edu.sc.seis.sod.SodElement; import edu.sc.seis.sod.SodUtil; import edu.sc.seis.sod.status.StringTree; import edu.sc.seis.sod.subsetter.Subsetter; import edu.sc.seis.sod.subsetter.channel.ChannelLogicalSubsetter; import edu.sc.seis.sod.subsetter.eventChannel.EventChannelLogicalSubsetter; import edu.sc.seis.sod.subsetter.eventChannel.EventChannelSubsetter; import edu.sc.seis.sod.subsetter.origin.EventLogicalSubsetter; public class ChoiceRequest implements RequestGenerator { public ChoiceRequest(Element config) throws ConfigurationException { NodeList choiceNodes = DOMHelper.extractNodes(config, "choice"); for(int i = 0; i < choiceNodes.getLength(); i++) { choices.add(new Choice((Element)choiceNodes.item(i))); } if(DOMHelper.hasElement(config, "otherwise")) { Element otherwiseEl = DOMHelper.extractElement(config, "otherwise/*"); otherwise = (RequestGenerator)SodUtil.load(otherwiseEl, "requestGenerator"); } } public RequestFilter[] generateRequest(CacheEvent event, ChannelImpl channel, CookieJar cookieJar) throws Exception { for(int i = 0; i < choices.size(); i++) { Choice c = (Choice)choices.get(i); if(c.accept(event, channel, cookieJar).isSuccess()) { return c.generateRequest(event, channel, cookieJar); } } // end of while (it.hasNext()) if(otherwise != null) { return otherwise.generateRequest(event, channel, cookieJar); } else { logger.debug("No choice matched, generating no request"); return new RequestFilter[0]; } // end of else } protected List choices = new LinkedList(); protected RequestGenerator otherwise = null; class Choice implements RequestGenerator, EventChannelSubsetter { Choice(Element config) throws ConfigurationException { NodeList childNodes = config.getChildNodes(); Node node; for(int counter = 0; counter < childNodes.getLength(); counter++) { node = childNodes.item(counter); if(node instanceof Element) { SodElement sodElement = (SodElement)SodUtil.load((Element)node, packages.toArray(new String[0])); if(sodElement instanceof RequestGenerator) { requestGenerator = (RequestGenerator)sodElement; } else if(sodElement instanceof Subsetter) { eventChannelSubsetter = EventChannelLogicalSubsetter.createSubsetter((Subsetter)sodElement); } } // end of else } } public RequestFilter[] generateRequest(CacheEvent event, ChannelImpl channel, CookieJar cookieJar) throws Exception { return requestGenerator.generateRequest(event, channel, cookieJar); } public StringTree accept(CacheEvent event, ChannelImpl channel, CookieJar cookieJar) throws Exception { return eventChannelSubsetter.accept(event, channel, cookieJar); } RequestGenerator requestGenerator; EventChannelSubsetter eventChannelSubsetter; } private static Logger logger = LoggerFactory.getLogger(ChoiceRequest.class); public static final List<String> packages; static { packages = new LinkedList<String>(); packages.add("requestGenerator"); packages.add("eventChannel"); packages.add("eventStation"); packages.addAll(ChannelLogicalSubsetter.packages); packages.addAll(EventLogicalSubsetter.packages); } }// PhaseRequest