/**
* LocalSeismogramTemplateGenerator.java
*
* @author Created by Philip Oliver-Paull
*/
package edu.sc.seis.sod.process.waveform;
import java.io.File;
import java.util.Properties;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import edu.iris.Fissures.IfNetwork.Channel;
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.fissuresUtil.exceptionHandler.GlobalExceptionHandler;
import edu.sc.seis.sod.CookieJar;
import edu.sc.seis.sod.SodUtil;
import edu.sc.seis.sod.status.FileWritingTemplate;
import edu.sc.seis.sod.status.StringTreeLeaf;
import edu.sc.seis.sod.status.TemplateFileLoader;
import edu.sc.seis.sod.status.waveformArm.LocalSeismogramTemplate;
public class LocalSeismogramTemplateGenerator implements WaveformProcess {
private LocalSeismogramTemplate template;
private SeismogramImageProcess seismoImageProcess;
private SeismogramImageOutputLocator out;
private String fileName;
private static Logger logger = LoggerFactory.getLogger(LocalSeismogramTemplateGenerator.class);
public LocalSeismogramTemplateGenerator(Element el) throws Exception {
Element waveformSeismogramConfig = TemplateFileLoader.getTemplate(el);
Element outputLocEl = SodUtil.getElement(waveformSeismogramConfig,
"outputLocation");
out = SeismogramImageOutputLocator.createForLocalSeismogramTemplate(outputLocEl);
waveformSeismogramConfig.removeChild(outputLocEl);
seismoImageProcess = new SeismogramImageProcess(out);
Element fileEl = SodUtil.getElement(waveformSeismogramConfig,
"filename");
if(fileEl != null) {
fileName = fileEl.getFirstChild().getNodeValue();
waveformSeismogramConfig.removeChild(fileEl);
}
if(waveformSeismogramConfig == null) { throw new IllegalArgumentException("The configuration requires a template"); }
if(fileName != null) {
template = new LocalSeismogramTemplate(waveformSeismogramConfig,
FileWritingTemplate.getBaseDirectoryName()
+ "/");
}
}
public static VelocityEngine getVelocity() {
return velocity;
}
static VelocityEngine velocity = null;
static {
try {
velocity = new VelocityEngine();
String loggerName = "Velocity";
Properties props = new Properties();
props.put("resource.loader", "class");
props.put("class.resource.loader.description",
"Velocity Classpath Resource Loader");
props.put("class.resource.loader.class",
"org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
"org.apache.velocity.runtime.log.SimpleLog4JLogSystem");
props.put("runtime.log.logsystem.log4j.category", loggerName);
props.put("velocimacro.library", "");
velocity.init(props);
} catch(Throwable t) {
GlobalExceptionHandler.handle("Problem initializing Velocity", t);
}
}
public WaveformResult accept(CacheEvent event,
ChannelImpl channel,
RequestFilter[] original,
RequestFilter[] available,
LocalSeismogramImpl[] seismograms,
CookieJar cookieJar) throws Exception {
logger.debug("process() called");
if(seismoImageProcess != null) {
seismoImageProcess.accept(event,
channel,
original,
available,
seismograms,
cookieJar);
} else {
logger.debug("There was no picname in config. I am not generating pictures.");
}
if(fileName != null) {
template.update(getOutputLocation(event, channel, false), cookieJar);
} else {
logger.debug("There was no fileName in config. I am not generating html pages.");
}
return new WaveformResult(seismograms, new StringTreeLeaf(this, true));
}
public File getOutputFile(CacheEvent event, Channel chan) {
return new File(getOutputLocation(event, chan, true));
}
/** this is relative to the status directory */
private String getOutputLocation(CacheEvent event,
Channel chan,
boolean useStatusDir) {
return out.getDirectory(event, chan, useStatusDir) + fileName;
}
public SeismogramImageProcess getSeismogramImageProcess() {
return seismoImageProcess;
}
}