package edu.sc.seis.sod.velocity;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.Writer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Properties;
import java.util.TimeZone;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.runtime.RuntimeConstants;
import org.slf4j.Logger;
import edu.iris.Fissures.IfEvent.EventAccessOperations;
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.network.ChannelImpl;
import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl;
import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler;
import edu.sc.seis.sod.CookieJar;
/**
* @author groves
*
* Created on May 25, 2005
*/
public class SimpleVelocitizer {
public static String format(MicroSecondDate date, String format) {
DateFormat dateFormat = new SimpleDateFormat(format);
dateFormat.setTimeZone(ISOTime.UTC);
return dateFormat.format(date);
}
public String evaluate(String template, Channel chan) {
return evaluate(template, ContextWrangler.createContext(chan));
}
public String evaluate(String template, EventAccessOperations event) {
return evaluate(template, ContextWrangler.createContext(event));
}
public String evaluate(String template,
EventAccessOperations event,
ChannelImpl channel,
RequestFilter[] original,
RequestFilter[] available,
LocalSeismogramImpl[] seismograms,
CookieJar cookieJar) {
return evaluate(template, ContextWrangler.createContext(event,
channel,
original,
available,
seismograms,
cookieJar));
}
public String evaluate(String template, VelocityContext ctx) {
StringWriter writer = new StringWriter();
try {
try {
Velocity.evaluate(ctx, writer, "SimpleVelocitizer", template);
} catch(ParseErrorException parseError) {
return ERR_PREFIX + "Invalid Velocity";
}
return writer.toString();
} catch(Exception e) {
GlobalExceptionHandler.handle(e);
return "Unable to evaluate " + template;
}
}
public String evaluate(InputStream template, VelocityContext ctx) {
StringWriter writer = new StringWriter();
try {
try {
evaluate(template, ctx, writer);
} catch(ParseErrorException parseError) {
return ERR_PREFIX + "Invalid Velocity";
}
} catch(Exception e) {
GlobalExceptionHandler.handle(e);
return "Unable to evaluate " + template;
}
return writer.toString();
}
public void evaluate(InputStream template,
VelocityContext ctx,
Writer writer) throws ParseErrorException, Exception {
Velocity.evaluate(ctx,
writer,
"SimpleVelocitizer",
new InputStreamReader(template));
}
public static String cleanUpErrorStringForDisplay(String string) {
if(string.startsWith(ERR_PREFIX)) {
return string.substring(ERR_PREFIX.length());
}
return string;
}
public static final String VELOCITY_LOGGER_NAME = "runtime.log.logsystem.log4j.logger";
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SimpleVelocitizer.class);
public static void setupVelocityLogger(Properties velocityProps, Logger velocityLogger) {
velocityProps.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
"org.apache.velocity.runtime.log.Log4JLogChute");
velocityProps.setProperty(VELOCITY_LOGGER_NAME,
logger.getName());
}
static {
try {
Properties props = new Properties();
setupVelocityLogger(props, logger);
props.setProperty("velocimacro.library", "");
Velocity.init(props);
} catch(Exception e) {
GlobalExceptionHandler.handle("Trouble initializing velocity", e);
}
}
public static final String ERR_PREFIX = "#ERROR#";
}