package edu.sc.seis.sod.process.waveform; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import edu.iris.Fissures.IfNetwork.Channel; import edu.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.SodUtil; import edu.sc.seis.sod.Start; import edu.sc.seis.sod.status.ChannelFormatter; import edu.sc.seis.sod.status.EventFormatter; import edu.sc.seis.sod.status.FileWritingTemplate; import edu.sc.seis.sod.status.FissuresFormatter; import edu.sc.seis.sod.status.StationFormatter; import edu.sc.seis.sod.status.TemplateFileLoader; import edu.sc.seis.sod.velocity.event.VelocityEvent; /** * @author groves Created on Jan 10, 2005 */ public class SeismogramImageOutputLocator { private SeismogramImageOutputLocator() {} public SeismogramImageOutputLocator(Element el) throws Exception { this(el, true); } public SeismogramImageOutputLocator(Element el, boolean useBase) throws Exception { NodeList nl = el.getChildNodes(); for(int i = 0; i < nl.getLength(); i++) { Node n = nl.item(i); if(n.getNodeName().equals("fileDir")) { NodeList fileNodes = ((Element)n).getChildNodes(); for(int j = 0; j < fileNodes.getLength(); j++) { if(fileNodes.item(j).getNodeName().equals("statusBase")) { if(useBase) { fileDir += Start.getRunProps().getStatusBaseDir() + "/"; } } else { fileDir += fileNodes.item(j).getNodeValue(); } } } else if(n.getNodeName().equals("seismogramConfig")) { if(fileDir.equals("")) { fileDir = FileWritingTemplate.getBaseDirectoryName(); } Element config = TemplateFileLoader.getTemplate((Element)n); parseOutputLocationCreators(SodUtil.getElement(config, "outputLocation")); } else if(n.getNodeName().equals("outputLocationCreators")) { parseOutputLocationCreators((Element)n); } else if(n.getNodeName().equals("prefix")) { prefix = SodUtil.getNestedText((Element)n); } else if(n.getNodeName().equals("fileType")) { configuredFileType = SodUtil.getNestedText((Element)n); } } if(fileDir.equals("")) { fileDir = FileWritingTemplate.getBaseDirectoryName(); } } public static SeismogramImageOutputLocator createForLocalSeismogramTemplate(Element el) throws ConfigurationException { SeismogramImageOutputLocator out = new SeismogramImageOutputLocator(); out.parseOutputLocationCreators(el); out.prefix = "original_"; out.fileDir = FileWritingTemplate.getBaseDirectoryName(); return out; } public String getFileType() { return configuredFileType; } public String getPrefix() { return prefix; } private void parseOutputLocationCreators(Element parent) throws ConfigurationException { Element eventDir = SodUtil.getElement(parent, "eventDir"); eventFormatter = new EventFormatter(eventDir); Element stationDir = SodUtil.getElement(parent, "stationDir"); stationFormatter = new StationFormatter(stationDir); Element picName = SodUtil.getElement(parent, "picName"); chanFormatter = new ChannelFormatter(picName, true); } public String getLocation(VelocityEvent event, Channel channel) { return getLocation(event.getCacheEvent(), channel); } public String getLocation(CacheEvent event, Channel channel) { return getLocation(event, channel, configuredFileType); } public String getLocation(VelocityEvent event, Channel channel, String fileType) { return getLocation(event.getCacheEvent(), channel, fileType); } public String getLocation(CacheEvent event, Channel channel, String fileType) { return FissuresFormatter.filize(getDirectory(event, channel, true) + prefix + chanFormatter.getResult(channel) + "." + fileType); } private String fileDir = "", prefix = "", configuredFileType = SeismogramImageProcess.PNG; private EventFormatter eventFormatter = EventFormatter.makeTime(); private StationFormatter stationFormatter = StationFormatter.makeNetAndCode(); private ChannelFormatter chanFormatter = ChannelFormatter.makeSiteAndCode(); public String getDirectory(CacheEvent event, Channel chan, boolean useStatusDir) { String dir = useStatusDir ? fileDir : ""; dir += '/' + eventFormatter.getResult(event) + '/' + stationFormatter.getResult(chan.getSite().getStation()) + '/'; return dir; } }