package edu.sc.seis.sod.velocity; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.exception.ParseErrorException; import edu.iris.Fissures.IfEvent.EventAccessOperations; import edu.iris.Fissures.IfNetwork.Channel; import edu.iris.Fissures.IfNetwork.NetworkAttr; import edu.iris.Fissures.IfSeismogramDC.RequestFilter; import edu.iris.Fissures.network.ChannelImpl; import edu.iris.Fissures.network.NetworkAttrImpl; import edu.iris.Fissures.network.StationImpl; import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl; import edu.sc.seis.fissuresUtil.mockFissures.IfEvent.MockEventAccessOperations; import edu.sc.seis.fissuresUtil.mockFissures.IfNetwork.MockChannel; import edu.sc.seis.fissuresUtil.mockFissures.IfNetwork.MockStation; import edu.sc.seis.fissuresUtil.mockFissures.IfSeismogramDC.MockSeismogram; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.CookieJar; import edu.sc.seis.sod.UserConfigurationException; import edu.sc.seis.sod.status.FissuresFormatter; import edu.sc.seis.sod.velocity.event.VelocityEvent; import edu.sc.seis.sod.velocity.network.VelocityChannel; import edu.sc.seis.sod.velocity.network.VelocityNetwork; import edu.sc.seis.sod.velocity.network.VelocityStation; import edu.sc.seis.sod.velocity.seismogram.VelocitySeismogram; /** * Handles getting stuff in the context and directing output to System.out or a * file for the printlineprocess classes * * @author groves * * Created on May 30, 2005 */ public class PrintlineVelocitizer { static VelocityContext mockContext = new VelocityContext(); static { VelocityEvent event = new VelocityEvent(MockEventAccessOperations.createEvent()); ChannelImpl chan = MockChannel.createChannel(); mockContext.put("event", event); mockContext.put("channel", new VelocityChannel(chan)); mockContext.put("station", new VelocityStation(MockStation.createStation())); mockContext.put("net", new VelocityNetwork((NetworkAttrImpl)MockChannel.createChannel().getNetworkAttr())); List<LocalSeismogramImpl> seisList = new ArrayList<LocalSeismogramImpl>(); seisList.add(new VelocitySeismogram(MockSeismogram.createSpike(chan.getId()), chan)); mockContext.put("seismograms", seisList); mockContext.put("index", new Integer(1)); } /** * Evaluates the templates such that errors might be discovered */ public PrintlineVelocitizer(String[] strings) throws ConfigurationException { if ( System.getProperty("printlinevelocitizer.check") == null || ! System.getProperty("printlinevelocitizer.check").equalsIgnoreCase("false")) { for(int i = 0; i < strings.length; i++) { try { StringWriter stringWriter = new StringWriter(); Velocity.evaluate(mockContext, stringWriter, "PrintlineTest", strings[i]); logger.debug("PrintlineVelocitizer: "+strings[i]+" Result: "+stringWriter.toString()); } catch(ParseErrorException e) { throw new UserConfigurationException("Malformed Velocity '" + strings[i] + "'. " + e.getMessage()); } catch(Exception e) { throw new ConfigurationException("Exception caused by testing Velocity", e); } } } } public String evaluate(String fileTemplate, String template, NetworkAttr attr) throws IOException { return evalulate(fileTemplate, template, ContextWrangler.createContext(attr)); } public String evaluate(String fileTemplate, String template, Channel chan) throws IOException { return evalulate(fileTemplate, template, ContextWrangler.createContext(chan)); } public String evaluate(String fileTemplate, String template, StationImpl sta) throws IOException { return evalulate(fileTemplate, template, ContextWrangler.createContext(sta)); } public String evaluate(String fileTemplate, String template, EventAccessOperations event, StationImpl sta, CookieJar cookieJar) throws IOException { VelocityContext cntxt = ContextWrangler.createContext(sta); ContextWrangler.insertIntoContext(event, cntxt); cntxt.put("cookieJar", cookieJar); return evalulate(fileTemplate, template, cntxt); } public String evaluate(String filename, String template, EventAccessOperations event, ChannelImpl channel, RequestFilter[] request, CookieJar cookieJar) throws IOException { return evaluate(filename, template, event, channel, request, new RequestFilter[0], cookieJar); } public String evaluate(String filename, String template, EventAccessOperations event, ChannelImpl channel, RequestFilter[] original, RequestFilter[] available, CookieJar cookieJar) throws IOException { return evaluate(filename, template, event, channel, original, available, new LocalSeismogramImpl[0], cookieJar); } public String evaluate(String fileTemplate, String template, EventAccessOperations event, ChannelImpl channel, RequestFilter[] original, RequestFilter[] available, LocalSeismogramImpl[] seismograms, CookieJar cookieJar) throws IOException { return evalulate(fileTemplate, template, ContextWrangler.createContext(event, channel, original, available, seismograms, cookieJar)); } public String evaluate(String fileTemplate, String template, EventAccessOperations event) throws IOException { return evalulate(fileTemplate, template, ContextWrangler.createContext(event)); } public String evalulate(String fileTemplate, String template, VelocityContext ctx) throws IOException { String result = simple.evaluate(template, ctx); if(fileTemplate.equals("")) { System.out.println(result); } else { appendToFile(fileTemplate, result, ctx); } return result; } private void appendToFile(String fileTemplate, String toAppend, VelocityContext ctx) throws IOException { String filename = FissuresFormatter.filize(simple.evaluate(fileTemplate, ctx)); File file = new File(filename); file.getAbsoluteFile().getParentFile().mkdirs(); FileWriter fwriter = new FileWriter(file, true); BufferedWriter bwriter = null; try { bwriter = new BufferedWriter(fwriter); bwriter.write(toAppend); bwriter.newLine(); } finally { if(bwriter != null) { bwriter.close(); } } } private SimpleVelocitizer simple = new SimpleVelocitizer(); private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(PrintlineVelocitizer.class); }