package edu.sc.seis.sod.subsetter.request; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.TimeZone; import org.apache.velocity.VelocityContext; import org.w3c.dom.Element; import edu.iris.Fissures.IfEvent.EventAccessOperations; import edu.iris.Fissures.IfEvent.Origin; import edu.iris.Fissures.IfNetwork.Channel; import edu.iris.Fissures.IfSeismogramDC.RequestFilter; import edu.iris.Fissures.model.ISOTime; import edu.iris.Fissures.model.MicroSecondDate; import edu.iris.Fissures.model.QuantityImpl; import edu.iris.Fissures.model.UnitImpl; import edu.iris.Fissures.network.ChannelImpl; import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl; import edu.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.fissuresUtil.cache.EventUtil; import edu.sc.seis.fissuresUtil.chooser.ThreadSafeSimpleDateFormat; import edu.sc.seis.fissuresUtil.display.ParseRegions; 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.SodUtil; import edu.sc.seis.sod.status.FissuresFormatter; import edu.sc.seis.sod.status.StringTree; import edu.sc.seis.sod.status.StringTreeLeaf; import edu.sc.seis.sod.subsetter.VelocityFileElementParser; import edu.sc.seis.sod.velocity.SimpleVelocitizer; import edu.sc.seis.sod.velocity.WaveformProcessContext; /** * BreqFastRequestSubsetter.java Created: Wed Mar 19 14:07:16 2003 * * @author <a href="mailto:crotwell@owl.seis.sc.edu">Philip Crotwell </a> * @version 1.0 */ public class BreqFastRequest implements RequestSubsetter { public BreqFastRequest(Element config) throws ConfigurationException { this.config = config; VelocityFileElementParser parser = new VelocityFileElementParser(config, getDefaultWorkingDir(), getDefaultFileTemplate()); labelTemplate = DOMHelper.extractText(config, "label", "${event.getTime('yyyy.DDD.HH.mm.ss.SSSS')}"); fullTemplate = parser.getTemplate(); regions = ParseRegions.getInstance(); } public StringTree accept(CacheEvent event, ChannelImpl channel, RequestFilter[] request, CookieJar cookieJar) { return new StringTreeLeaf(this, writeToBFEmail(event, channel, request)); } protected String getConfig(String name) { return SodUtil.getText(SodUtil.getElement(config, name)); } protected synchronized boolean writeToBFEmail(EventAccessOperations event, ChannelImpl channel, RequestFilter[] request) { VelocityContext ctx = new WaveformProcessContext(event, channel, request, new RequestFilter[0], new LocalSeismogramImpl[0], null); String bfastLoc = FissuresFormatter.filize(velocitizer.evaluate(fullTemplate, ctx)); File bfFile = new File(bfastLoc); File parent = bfFile.getParentFile(); if(!parent.exists() && !parent.mkdirs()) { throw new RuntimeException("Unable to create directory." + parent); } // need to check before the writer is created as it creates the file boolean fileExists = bfFile.exists(); Writer out = null; try { out = new BufferedWriter(new FileWriter(bfFile.getAbsolutePath(), true)); if(!fileExists) {// first time to this event, insert headers insertEventHeader(event, out, velocitizer.evaluate(labelTemplate, ctx)); } // end of if ( ! fileExists) for(int i = 0; i < request.length; i++) { insertRequest(channel, request, out, i); } // end of for (int i=0; i<request.length; i++) } catch(IOException e) { throw new RuntimeException("Trouble writing breqfast request!", e); } finally { if(out != null) { try { out.close(); } catch(IOException e) { throw new RuntimeException("Unable to close breqfast file!", e); } } } return true; } protected void optInsert(Writer out, String configName) throws IOException { optInsert(out, configName, configName.toUpperCase()); } protected void optInsert(Writer out, String configName, String fieldName) throws IOException { if(SodUtil.getElement(config, configName) != null) { insert(out, configName, fieldName); } } protected void insert(Writer out, String configName) throws IOException { insert(out, configName, configName.toUpperCase()); } protected void insert(Writer out, String configName, String fieldName) throws IOException { out.write("." + fieldName + " " + getConfig(configName) + nl); } protected void insertRequest(Channel channel, RequestFilter[] request, Writer out, int i) throws IOException { MicroSecondDate start = new MicroSecondDate(request[i].start_time); MicroSecondDate end = new MicroSecondDate(request[i].end_time); out.write(channel.getSite().getStation().get_code() + " " + channel.getSite().getStation().getNetworkAttr().get_code() + " " + format.format(start) + tenths.format(start).substring(0, 1) + " " + format.format(end) + tenths.format(end).substring(0, 1) + " 1 " + channel.get_code() + " " + channel.getSite().get_code() + nl); } protected void insertEventHeader(EventAccessOperations event, Writer out, String label) throws IOException { insert(out, "name"); insert(out, "inst"); insert(out, "mail"); insert(out, "email"); insert(out, "phone"); insert(out, "fax"); insert(out, "media"); insert(out, "altmedia1", "ALTERNATIVE MEDIA"); insert(out, "altmedia2", "ALTERNATIVE MEDIA"); Origin o = EventUtil.extractOrigin(event); out.write(".SOURCE " + "~" + o.getCatalog() + " " + o.getContributor() + "~unknown~unknown~" + nl); MicroSecondDate oTime = new MicroSecondDate(o.getOriginTime()); out.write(".HYPO " + "~" + format.format(oTime) + tenths.format(oTime) + "~" + o.getLocation().latitude + "~" + o.getLocation().longitude + "~" + ((QuantityImpl)o.getLocation().depth).convertTo(UnitImpl.KILOMETER) .getValue() + "~" + "0" + "~" + event.get_attributes().region.number + "~" + regions.getRegionName(event.get_attributes().region) + "~" + nl); for(int j = 0; j < o.getMagnitudes().length; j++) { out.write(".MAGNITUDE ~" + o.getMagnitudes()[j].value + "~" + o.getMagnitudes()[j].type + "~" + nl); } // end of for (int j=0; j<o.magnitude.length; j++) insert(out, "quality"); out.write(".LABEL " + label + nl); out.write(".END" + nl); out.write(nl); } protected String getDefaultWorkingDir() { return "breqfast"; } protected String getDefaultFileTemplate() { return "${event.getTime('yyyy.DDD.HH.mm.ss.SSSS')}.breq"; } static final String nl = "\n"; ThreadSafeSimpleDateFormat format = new ThreadSafeSimpleDateFormat("yyyy MM dd HH mm ss.", ISOTime.UTC); ThreadSafeSimpleDateFormat tenths = new ThreadSafeSimpleDateFormat("SSS", ISOTime.UTC); ParseRegions regions; Element config; private String fullTemplate, labelTemplate; private SimpleVelocitizer velocitizer = new SimpleVelocitizer(); } // BreqFastRequestGenerator