package edu.sc.seis.sod.subsetter.channel; import java.io.FileNotFoundException; import org.codehaus.stax2.validation.XMLValidationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Element; import edu.iris.Fissures.IfNetwork.ChannelNotFound; import edu.iris.Fissures.IfNetwork.Instrumentation; import edu.iris.Fissures.network.ChannelIdUtil; import edu.iris.Fissures.network.ChannelImpl; import edu.iris.Fissures.network.ResponsePrint; import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler; import edu.sc.seis.fissuresUtil.sac.InvalidResponse; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.source.SodSourceException; import edu.sc.seis.sod.source.network.NetworkSource; import edu.sc.seis.sod.status.Fail; import edu.sc.seis.sod.status.Pass; import edu.sc.seis.sod.status.StringTree; import edu.sc.seis.sod.subsetter.VelocityFileElementParser; import edu.sc.seis.sod.velocity.PrintlineVelocitizer; public class ResponseWriter implements ChannelSubsetter { public ResponseWriter(Element config) throws ConfigurationException { VelocityFileElementParser parser = new VelocityFileElementParser(config, DEFAULT_DIRECTORY, DEFAULT_TEMPLATE); template = parser.getTemplate(); velocitizer = new PrintlineVelocitizer(new String[] {template}); } public StringTree accept(ChannelImpl chan, NetworkSource network) throws Exception { try { Instrumentation inst = network.getInstrumentation(chan); String response = ResponsePrint.printResponse(chan.getId(), inst); velocitizer.evaluate(template, response, chan); } catch(ChannelNotFound e) { return new Fail(this, "No instrumentation"); } catch (InvalidResponse e) { return new Fail(this, "Invalid instrumentation: "+e.getMessage()); } catch(FileNotFoundException fe) { GlobalExceptionHandler.handle("Error while writing response file for " + ChannelIdUtil.toString(chan.get_id()), fe); return new Fail(this, "Error while writing response file", fe); } return new Pass(this); } public static final String DEFAULT_DIRECTORY = "responses/"; public static final String DEFAULT_TEMPLATE = "${channel.codes}.${channel.getStart('yyyy_DDD_HH_mm_ss')}.resp"; private String template; private PrintlineVelocitizer velocitizer; private static Logger logger = LoggerFactory.getLogger(ResponseWriter.class); }