package edu.sc.seis.sod.process.waveform; import java.io.BufferedReader; import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter; import java.io.StringReader; import java.io.StringWriter; import java.util.Properties; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.w3c.dom.Element; import edu.iris.Fissures.IfSeismogramDC.RequestFilter; import edu.iris.Fissures.network.ChannelImpl; import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl; import edu.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.fissuresUtil.display.configuration.DOMHelper; import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler; import edu.sc.seis.fissuresUtil.gmt.GenericCommandExecute; import edu.sc.seis.sod.CookieJar; import edu.sc.seis.sod.status.StringTreeLeaf; import edu.sc.seis.sod.velocity.SimpleVelocitizer; /** * @author crotwell Created on May 20, 2005 */ public class SacExecute implements WaveformProcess { public SacExecute(Element el) throws Exception { application = DOMHelper.extractText(el, "application", "sac"); commands = DOMHelper.extractText(el, "commands", ""); prefix = DOMHelper.extractText(el, "prefix", ""); writer = new PipedWriter(new PipedReader()); stdout = new PipedWriter(new PipedReader()); stderr = new PipedWriter(new PipedReader()); Thread t = new Thread(new Runnable() { public void run() { int exitValue; try { sacAlive = true; exitValue = GenericCommandExecute.execute(application, reader, stdout, stderr); sacAlive = false; logger.info("SacExecute exit value is: " + exitValue); } catch(Throwable e) { GlobalExceptionHandler.handle(e); } } }, "SacExecute"); t.setDaemon(true); t.start(); expect("SAC>"); ve = new VelocityEngine(); Properties props = new Properties(); SimpleVelocitizer.setupVelocityLogger(props, logger); ve.init(props); } /** * */ public WaveformResult accept(CacheEvent event, ChannelImpl channel, RequestFilter[] original, RequestFilter[] available, LocalSeismogramImpl[] seismograms, CookieJar cookieJar) throws Exception { String files = ""; for(int i = 0; i < seismograms.length; i++) { files += " " + (String)cookieJar.get(AbstractSeismogramWriter.getCookieName(prefix, channel.get_id(), i)); } // end of for (int i=0; i<seismograms.length; i++) VelocityContext context = new VelocityContext(); context.put("files", files); StringWriter buffer = new StringWriter(); ve.evaluate(context, buffer, "SacExecute", commands); BufferedReader readBuffer = new BufferedReader(new StringReader(buffer.getBuffer() .toString())); String line; while((line = readBuffer.readLine()) != null) { send(line.trim()); expect("SAC>"); } return new WaveformResult(seismograms, new StringTreeLeaf(this, true)); } private void expect(String response) throws IOException { System.err.println("Expecting: " + response); int index = stdoutBuffer.indexOf(response); char[] cbuf = new char[100]; String buffer; PipedReader inReader; while(index == -1) { System.out.println("Waiting on read..."); if(!sacAlive) { throw new IOException("Application " + application + " has exited"); } if(stdOutReader.ready()) { int numRead = stdOutReader.read(cbuf); stdoutBuffer += new String(cbuf, 0, numRead); System.err.println("Does '" + stdoutBuffer + "' match '" + response + "'?"); index = stdoutBuffer.indexOf(response); String prior = stdoutBuffer.substring(0, index + response.length()); System.out.println("Match: " + prior); stdoutBuffer = stdoutBuffer.substring(index + response.length()); System.out.println("Buffer: " + stdoutBuffer); } else if(stdErrReader.ready()) { int numRead = stdErrReader.read(cbuf); stderrBuffer += new String(cbuf, 0, numRead); System.err.println("Does stderr '" + stderrBuffer + "' match '" + response + "'?"); index = stderrBuffer.indexOf(response); String prior = stderrBuffer.substring(0, index + response.length()); System.out.println("Match: " + prior); stderrBuffer = stderrBuffer.substring(index + response.length()); System.out.println("Buffer: " + stderrBuffer); } if(index != -1) { System.err.println("Yes."); } else { System.err.println("No."); } try { Thread.sleep(1000); } catch(InterruptedException e) {} } } private void send(String cmd) throws IOException { System.err.println("Sending: " + cmd); writer.write(cmd + "\n"); } protected void finalize() throws Throwable { send("q"); super.finalize(); } protected VelocityEngine ve; private String application, commands, prefix; private GenericCommandExecute externalApp; private boolean sacAlive = false; PipedReader reader; PipedWriter writer; PipedWriter stdout, stderr; PipedReader stdOutReader; PipedReader stdErrReader; String stdoutBuffer = ""; String stderrBuffer = ""; private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SacExecute.class); }