/* Copyright (C) 2009 Diego Darriba This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package es.uvigo.darwin.prottest.exe; import es.uvigo.darwin.prottest.exe.util.TemporaryFileManager; import es.uvigo.darwin.prottest.util.exception.ModelOptimizationException.ExternalExecutionException; import es.uvigo.darwin.prottest.util.exception.ProtTestInternalException; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; /** * * @author diego */ public class ExternalExecutor { private static final int STATE_NULL = 0; private static final int STATE_INITIALIZED = 1; private static final int STATE_EXECUTED = 2; private static final int OUTPUT_STANDARD = 1; private static final int OUTPUT_TEMPORARY = 2; private String command; private Process proc = null; private OutputStream logOutput; private int internal_state = STATE_NULL; public ExternalExecutor(String command, int outLogFormat) throws ExternalExecutionException { try { this.command = command; switch (outLogFormat) { case OUTPUT_STANDARD: logOutput = System.out; break; case OUTPUT_TEMPORARY: logOutput = new FileOutputStream(TemporaryFileManager.getInstance(). getLogFilename(Thread.currentThread())); } this.internal_state = STATE_INITIALIZED; } catch (FileNotFoundException ex) { throw new ExternalExecutionException("I/O error: " + ex.getMessage()); } } public void run() throws ExternalExecutionException { if (!checkState(STATE_INITIALIZED) || checkState(STATE_EXECUTED)) { throw new ProtTestInternalException("Invalid executor internal state"); } try { Runtime runtime = Runtime.getRuntime(); proc = runtime.exec(command); ExternalExecutionManager.getInstance().addProcess(proc); } catch (IOException ex) { throw new ProtTestInternalException(ex.getMessage()); } try { int exitVal = proc.waitFor(); } catch (InterruptedException ex) { throw new ExternalExecutionException("Interrupted execution: " + ex.getMessage()); } } private boolean checkState(int state) { return internal_state >= state; } }