/** * LocalSeismogramTemplate.java * * @author Created by Philip Oliver-Paull */ package edu.sc.seis.sod.status.waveformArm; import java.io.StringWriter; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.velocity.VelocityContext; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.w3c.dom.Element; import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.CookieJar; import edu.sc.seis.sod.process.waveform.LocalSeismogramTemplateGenerator; import edu.sc.seis.sod.status.FileWritingTemplate; import edu.sc.seis.sod.status.GenericTemplate; import edu.sc.seis.sod.status.MenuTemplate; import edu.sc.seis.sod.status.OutputScheduler; import edu.sc.seis.sod.status.Template; import edu.sc.seis.sod.status.TemplateFileLoader; public class LocalSeismogramTemplate extends Template{ public LocalSeismogramTemplate(Element el, String baseDir) throws ConfigurationException{ this.baseDir = baseDir; parse(el); } public void update(String outputLocation, CookieJar cj){ String loc = baseDir + outputLocation; synchronized(toBeRendered){ if (!toBeRendered.containsKey(loc)){ toBeRendered.put(loc, cj); OutputScheduler.getDefault().schedule(writer); } } } protected Object textTemplate(final String text) { return new GenericTemplate() { public String getResult() { return text; } }; } public class Writer implements Runnable{ public void run() { CookieJar[] jars = new CookieJar[0]; String[] fileLocs = new String[0]; synchronized(toBeRendered){ int numCookiesWaiting = toBeRendered.size(); if(toBeRendered.size() > 0){ jars = new CookieJar[toBeRendered.size()]; fileLocs = new String[toBeRendered.size()]; Iterator it = toBeRendered.keySet().iterator(); while(it.hasNext()){ String loc= (String)it.next(); fileLocs[--numCookiesWaiting] = loc; jars[numCookiesWaiting] = (CookieJar)toBeRendered.get(loc); } toBeRendered.clear(); } } for (int i = 0; i < jars.length; i++) { FileWritingTemplate.write(fileLocs[i], getResult(jars[i])); } } } public String getResult(CookieJar cj) { StringBuffer buf = new StringBuffer(); Iterator e = templates.iterator(); while(e.hasNext()) { buf.append(((GenericTemplate)e.next()).getResult()); } return getVelocityResult(buf.toString(), cj); } public static String getVelocityResult(String template, CookieJar cookieJar) { try { StringWriter out = new StringWriter(); synchronized (LocalSeismogramTemplateGenerator.getVelocity()) { // the new VeocityContext "wrapper" is to help with a possible memory leak // due to velocity gathering introspection information, // see http://jakarta.apache.org/velocity/developer-guide.html#Other%20Context%20Issues boolean status = LocalSeismogramTemplateGenerator.getVelocity().evaluate(new VelocityContext(cookieJar.getContext()), out, "localSeismogramTemplate", template); } template = out.toString(); } catch (ParseErrorException e) { GlobalExceptionHandler.handle("Problem using Velocity", e); } catch (MethodInvocationException e) { GlobalExceptionHandler.handle("Problem using Velocity", e); } catch (ResourceNotFoundException e) { GlobalExceptionHandler.handle("Problem using Velocity", e); } return template; } /**if this class has an template for this tag, it creates it using the * passed in element and returns it. Otherwise it returns null. */ protected Object getTemplate(String tag, Element el)throws ConfigurationException { if(tag.equals("menu")){ try { return new MenuTemplate(TemplateFileLoader.getTemplate(el), baseDir + "/1/2/3/test.html", baseDir); } catch (Exception e) { GlobalExceptionHandler.handle("Problem getting template for Menu", e); } } return super.getTemplate(tag,el); } private Writer writer = new Writer(); private Map toBeRendered = Collections.synchronizedMap(new HashMap()); private String baseDir; }