package edu.sc.seis.sod.status; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.w3c.dom.Element; import edu.iris.Fissures.network.NetworkAttrImpl; import edu.sc.seis.fissuresUtil.display.configuration.DOMHelper; import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler; import edu.sc.seis.fissuresUtil.exceptionHandler.HTMLReporter; import edu.sc.seis.sod.AbstractWaveformRecipe; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.EventArm; import edu.sc.seis.sod.EventChannelPair; import edu.sc.seis.sod.EventNetworkPair; import edu.sc.seis.sod.EventStationPair; import edu.sc.seis.sod.EventVectorPair; import edu.sc.seis.sod.NetworkArm; import edu.sc.seis.sod.SodUtil; import edu.sc.seis.sod.Stage; import edu.sc.seis.sod.Standing; import edu.sc.seis.sod.Start; import edu.sc.seis.sod.Status; import edu.sc.seis.sod.process.waveform.LocalSeismogramTemplateGenerator; import edu.sc.seis.sod.status.eventArm.EventStatusTemplate; import edu.sc.seis.sod.status.eventArm.MapEventStatus; import edu.sc.seis.sod.status.networkArm.NetworkInfoTemplateGenerator; import edu.sc.seis.sod.status.waveformArm.WaveformEventTemplateGenerator; import edu.sc.seis.sod.status.waveformArm.WaveformMonitor; import edu.sc.seis.sod.status.waveformArm.WaveformNetworkStatus; import edu.sc.seis.sod.status.waveformArm.WaveformStationStatus; public class IndexTemplate extends FileWritingTemplate implements WaveformMonitor { public IndexTemplate() throws IOException { this(FileWritingTemplate.getBaseDirectoryName()); } public IndexTemplate(String dirName) throws IOException { super(dirName, "index.html"); try { initExceptionHandler(); String configFileLoc = Start.getConfigFileName(); configFile = new File(configFileLoc).getName(); Element template = TemplateFileLoader.getTemplate(getClass().getClassLoader(), indexLoc); parse(template); write(); FileWritingTemplate help = new FileWritingTemplate(dirName, "/help/eventPageHelp.html"); help.parse(TemplateFileLoader.getTemplate(getClass().getClassLoader(), eventPageHelp)); help.write(); SodUtil.copyFile(cssLoc, dirName + "/main.css"); SodUtil.copyFile(sortLoc, dirName + "/sorttable.js"); SodUtil.copyFile(rulLoc, dirName + "/tableRuler.js"); SodUtil.copyFile(footPosLoc, dirName + "/footerPositioner.js"); SodUtil.copyFile(helpMark, dirName + "/images/helpmark.png"); SodUtil.copyFile(up, dirName + "/images/up.gif"); SodUtil.copyFile(down, dirName + "/images/down.gif"); SodUtil.copyFile(none, dirName + "/images/none.gif"); SodUtil.copyFile(key, dirName + "/images/mapkey.gif"); SodUtil.copyFile(individualKey, dirName + "/images/individualEventMapKey.gif"); SodUtil.copyFile(Start.getConfigFileName(), FileWritingTemplate.getBaseDirectoryName() + "/" + configFile); /* * To avoid problems during rendering of XML by some of the browsers * like Mac Safari */ convertToHTML(dirName); } catch(Exception e) { GlobalExceptionHandler.handle("unexpected problem creating index.html page", e); } } public static String getCopiedConfigFileLocation() { return configFile; } public static String getHtmlConfigFileName() { String configFileLoc = getCopiedConfigFileLocation(); String fileName = configFileLoc.substring(0, configFileLoc.indexOf(".xml")); return fileName += ".html"; } public void update(EventNetworkPair ecp) { write(); } public void update(EventStationPair ecp) { write(); } public void update(EventChannelPair ecp) { write(); } public void update(EventVectorPair ecp) { write(); } /** * Exists so IndexTemplate can be created before arms, in order for * exceptions in initialization to be in the status pages. */ public void performRegistration() throws Exception { if(Start.getEventArm() != null) { Start.getEventArm().add(mapEventStatus); } loadStatusTemplates(); if(Start.getWaveformRecipe() != null) { Start.getWaveformRecipe().addStatusMonitor(this); } } private void loadStatusTemplates() throws Exception { ClassLoader cl = this.getClass().getClassLoader(); Element statusConfig = TemplateFileLoader.getTemplate(cl, "jar:edu/sc/seis/sod/data/statusPageConfig.xml"); EventArm event = Start.getEventArm(); if(event != null) { Element eventStatusEl = DOMHelper.extractElement(statusConfig, "eventStatusTemplate"); event.add(new EventStatusTemplate(eventStatusEl)); } NetworkArm net = Start.getNetworkArm(); if(net != null) { Element netInfoEl = DOMHelper.extractElement(statusConfig, "networkInfoTemplateGenerator"); net.add(new NetworkInfoTemplateGenerator(netInfoEl)); } AbstractWaveformRecipe waveformArm = Start.getWaveformRecipe(); if(waveformArm != null) { Element seisTempEl = DOMHelper.extractElement(statusConfig, "localSeismogramTemplateGenerator"); waveformArm.add(new LocalSeismogramTemplateGenerator(seisTempEl)); Element waveformEventTempEl = DOMHelper.extractElement(statusConfig, "waveformEventTemplateGenerator"); waveformArm.addStatusMonitor(new WaveformEventTemplateGenerator(waveformEventTempEl)); Element waveformStationEl = DOMHelper.extractElement(statusConfig, "waveformStationStatus"); waveformArm.addStatusMonitor(new WaveformStationStatus(waveformStationEl)); Element waveformNetworkEl = DOMHelper.extractElement(statusConfig, "waveformNetworkStatus"); WaveformNetworkStatus wns = new WaveformNetworkStatus(waveformNetworkEl); waveformArm.addStatusMonitor(wns); //in case all the networks have been processed already wns.change((NetworkAttrImpl)null, Status.get(Stage.PROCESSOR, Standing.SUCCESS)); } } protected Object getTemplate(String tagName, Element el) throws ConfigurationException { if(tagName.equals("eventMap")) { mapEventStatus = new MapEventStatus(el); return new RelativeLocationTemplate(getOutputLocation(), mapEventStatus.getLocation()); } return super.getTemplate(tagName, el); } protected void initExceptionHandler() throws IOException { File errorDir = new File(getOutputDirectory(), "Errors"); errorDir.mkdirs(); GlobalExceptionHandler.add(new HTMLReporter(errorDir)); } private void convertToHTML(String statusDir) throws TransformerException, FileNotFoundException, TransformerConfigurationException, IOException { String wrapperFile = statusDir + "/xmlverbatimwrapper.xsl"; String mainXSL = statusDir + "/xmlverbatim.xsl"; SodUtil.copyFile(xslWrapperFileLoc, wrapperFile); SodUtil.copyFile(supportXslFileLoc, mainXSL); SodUtil.copyFile(cssFileLoc, statusDir + "/xmlverbatim.css"); String htmlFile = statusDir + "/" + getHtmlConfigFileName(); TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer t = tFactory.newTransformer(new StreamSource(wrapperFile)); t.transform(new StreamSource(statusDir + "/" + configFile), new StreamResult(new FileOutputStream(htmlFile))); new File(wrapperFile).delete(); new File(mainXSL).delete(); } private MapEventStatus mapEventStatus; private static String indexLoc = "jar:edu/sc/seis/sod/data/templates/index.xml"; private static String cssLoc = "jar:edu/sc/seis/sod/data/templates/main.css"; private static String sortLoc = "jar:edu/sc/seis/sod/data/templates/sorttable.js"; private static String rulLoc = "jar:edu/sc/seis/sod/data/templates/tableRuler.js"; private static String footPosLoc = "jar:edu/sc/seis/sod/data/templates/footerPositioner.js"; private static String helpMark = "jar:edu/sc/seis/sod/data/templates/defaults/helpmark.png"; private static String up = "jar:edu/sc/seis/sod/data/templates/defaults/up.gif"; private static String down = "jar:edu/sc/seis/sod/data/templates/defaults/down.gif"; private static String none = "jar:edu/sc/seis/sod/data/templates/defaults/none.gif"; private static String key = "jar:edu/sc/seis/sod/data/templates/defaults/mapkey.gif"; private static String individualKey = "jar:edu/sc/seis/sod/data/templates/defaults/individualEventMapKey.gif"; private static String eventPageHelp = "jar:edu/sc/seis/sod/data/templates/defaults/eventPageHelp.xml"; private static String xslWrapperFileLoc = "jar:edu/sc/seis/sod/data/xmlverbatimwrapper.xsl"; private static String supportXslFileLoc = "jar:edu/sc/seis/sod/data/xmlverbatim.xsl"; private static String cssFileLoc = "jar:edu/sc/seis/sod/data/xmlverbatim.css"; private static String configFile; }