ingo@1127: package de.intevation.flys.wsplgen; ingo@1127: ingo@1127: import java.io.InputStream; ingo@1127: import java.io.IOException; ingo@1127: import java.io.File; ingo@1127: ingo@1127: import org.apache.log4j.Logger; ingo@1127: ingo@1128: import de.intevation.artifacts.CallContext; ingo@1128: ingo@1127: import de.intevation.flys.artifacts.model.WSPLGENJob; ingo@1127: ingo@1127: ingo@1127: public class JobExecutor { ingo@1127: ingo@1127: public static final String WSPLGEN_PARAMETER_FILE = ingo@1127: "wsplgen.par"; ingo@1127: ingo@1127: public static final String WSPLGEN_BIN_PATH = ingo@1127: System.getProperty("wsplgen.bin.path"); ingo@1127: ingo@1127: ingo@1127: private Logger logger = Logger.getLogger(JobExecutor.class); ingo@1127: ingo@1127: private Process process; ingo@1127: ingo@1127: protected WSPLGENJob job; ingo@1127: ingo@1127: protected JobObserver observer; ingo@1127: ingo@1127: ingo@1127: public JobExecutor(WSPLGENJob job) { ingo@1127: this.job = job; ingo@1127: this.observer = new JobObserver(job); ingo@1127: } ingo@1127: ingo@1127: ingo@1127: public void execute() { ingo@1127: File dir = job.getWorkingDir(); ingo@1127: File parameter = new File(dir, WSPLGEN_PARAMETER_FILE); ingo@1127: ingo@1127: String[] args = new String[] { ingo@1127: WSPLGEN_BIN_PATH, ingo@1127: "-PAR=\"" + parameter.getAbsolutePath() + "\"" ingo@1127: }; ingo@1127: ingo@1127: execute(args, dir, observer); ingo@1127: } ingo@1127: ingo@1127: ingo@1127: public void execute(String[] args, File dir, JobObserver observer) { ingo@1127: logger.info("Start JobExecutor for artifact: " + dir.getName()); ingo@1127: ingo@1127: String errorMsg = null; ingo@1127: ingo@1127: try { ingo@1127: synchronized (this) { ingo@1127: process = Runtime.getRuntime().exec(args, null, dir); ingo@1127: ingo@1127: InputStream out = process.getInputStream(); ingo@1127: observer.setInputStream(out); ingo@1127: ingo@1127: observer.start(); ingo@1127: ingo@1127: try { ingo@1127: process.waitFor(); ingo@1127: } ingo@1127: catch (InterruptedException ie) { ingo@1127: logger.error("WSPLGEN job interrupted: " + ie.getMessage()); ingo@1127: } ingo@1127: ingo@1127: try { ingo@1127: observer.join(); ingo@1127: } ingo@1127: catch (InterruptedException iee) { /* do nothing */ } ingo@1127: ingo@1128: job.getCallContext().afterBackground(CallContext.STORE); ingo@1128: ingo@1127: logger.info("WSPLGEN exit value: " + process.exitValue()); ingo@1127: ingo@1127: return; ingo@1127: } ingo@1127: } ingo@1127: catch (SecurityException se) { ingo@1128: logger.error(se); ingo@1127: } ingo@1127: catch (IOException ioe) { ingo@1128: logger.error(ioe); ingo@1127: } ingo@1127: catch (NullPointerException npe) { ingo@1128: logger.error(npe, npe); ingo@1127: } ingo@1127: catch (IndexOutOfBoundsException ioobe) { ingo@1128: logger.error(ioobe, ioobe); ingo@1127: } ingo@1127: } ingo@1127: } ingo@1127: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :