package edu.sc.seis.sod.status.waveformArm;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.w3c.dom.Element;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler;
import edu.sc.seis.sod.ConfigurationException;
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.Stage;
import edu.sc.seis.sod.Standing;
import edu.sc.seis.sod.Status;
import edu.sc.seis.sod.status.EventFormatter;
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;
import edu.sc.seis.sod.status.eventArm.EventTemplate;
public class WaveformEventTemplate extends Template implements WaveformMonitor {
public WaveformEventTemplate(Element el, String baseDir,
EventFormatter dirNameCreator, String pageName)
throws ConfigurationException {
this.baseDir = baseDir;
this.dirNameCreator = dirNameCreator;
this.pageName = pageName;
parse(el);
}
public String getOutputDirectory(CacheEvent ev) {
return baseDir + "/" + dirNameCreator.getResult(ev) + "/";
}
protected Object textTemplate(final String text) {
return new GenericTemplate() {
public String getResult() {
return text;
}
};
}
public void update(CacheEvent ev, Status status) {
String outputDir = getOutputDirectory(ev);
String loc = outputDir + pageName;
if(status.equals(Status.get(Stage.EVENT_ORIGIN_SUBSETTER,
Standing.IN_PROG))) {
try {
FileWritingTemplate.testOutputLoc(loc);
} catch(IOException e) {
GlobalExceptionHandler.handle(e);
}
}
update(ev, outputDir, pageName);
}
public void update(EventNetworkPair ecp) {
String outputDir = getOutputDirectory(ecp.getEvent());
update(ecp.getEvent(), outputDir, pageName);
}
public void update(EventStationPair ecp) {
String outputDir = getOutputDirectory(ecp.getEvent());
update(ecp.getEvent(), outputDir, pageName);
}
public void update(EventChannelPair ecp) {
String outputDir = getOutputDirectory(ecp.getEvent());
update(ecp.getEvent(), outputDir, pageName);
}
public void update(EventVectorPair ecp) {
String outputDir = getOutputDirectory(ecp.getEvent());
update(ecp.getEvent(), outputDir, pageName);
}
public void update(CacheEvent ev,
String outputDir,
String fileLoc) {
if(map != null) {
map.add(ev, outputDir + "map.png");
}
String loc = outputDir + fileLoc;
synchronized(toBeRendered) {
if(!toBeRendered.containsKey(loc)) {
toBeRendered.put(loc, ev);
OutputScheduler.getDefault().schedule(writer);
}
}
}
public class Writer implements Runnable {
public void run() {
CacheEvent[] evs = new CacheEvent[0];
String[] fileLocs = new String[0];
synchronized(toBeRendered) {
int numEvsWaiting = toBeRendered.size();
if(toBeRendered.size() > 0) {
evs = new CacheEvent[toBeRendered.size()];
fileLocs = new String[toBeRendered.size()];
Iterator it = toBeRendered.keySet().iterator();
while(it.hasNext()) {
String loc = (String)it.next();
fileLocs[--numEvsWaiting] = loc;
evs[numEvsWaiting] = (CacheEvent)toBeRendered.get(loc);
}
toBeRendered.clear();
}
}
for(int i = 0; i < evs.length; i++) {
FileWritingTemplate.write(fileLocs[i], getResult(evs[i]));
}
}
private String getResult(CacheEvent ev) {
StringBuffer buf = new StringBuffer();
Iterator it = templates.iterator();
while(it.hasNext()) {
Object cur = it.next();
if(cur instanceof EventTemplate) {
buf.append(((EventTemplate)cur).getResult(ev));
} else if(cur instanceof GenericTemplate) {
buf.append(((GenericTemplate)cur).getResult());
}
}
return buf.toString();
}
}
protected Object getTemplate(String tag, Element el)
throws ConfigurationException {
if(tag.equals("eventStations")) {
return new EventStationGroupTemplate(el);
} else if(tag.equals("map")) {
try {
if(map == null) {
map = new MapWaveformStatus();
}
return new GenericTemplate() {
public String getResult() {
return "map.png";
}
};
} catch(SQLException e) {
GlobalExceptionHandler.handle("Trouble connecting to the event channel status db to create the waveform event channel status map",
e);
return new GenericTemplate() {
public String getResult() {
return "Trouble connecting to the event channel status db to create the map";
}
};
}
} else if(tag.equals("event")) {
return new EventFormatter(el);
} else if(tag.equals("menu")) {
try {
return new MenuTemplate(TemplateFileLoader.getTemplate(el),
baseDir + "/1/2/test.html",
baseDir);
} catch(Exception e) {
GlobalExceptionHandler.handle("Problem getting template for Menu",
e);
}
}
return super.getTemplate(tag, el);
}
private Map toBeRendered = Collections.synchronizedMap(new HashMap());
private EventFormatter dirNameCreator;
private String pageName;
private String baseDir;
private MapWaveformStatus map;
private Writer writer = new Writer();
}