/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.engines.impl;
import java.io.*;
import java.util.*;
import org.jboss.tools.common.model.plugin.ModelPlugin;
public abstract class XProcess {
protected Process process = null;
ProcessOut err = null;
ProcessOut out = null;
Writer w = new XPWriter();
int exit = -1;
public XProcess() {}
private String[] getCommandLine() {
ArrayList<String> l = new ArrayList<String>();
buildCommandLine(l);
return l.toArray(new String[l.size()]);
}
protected abstract void buildCommandLine(ArrayList<String> l);
protected abstract String getRoot();
public void start() {
if(isRunning()) return;
exit = -1;
try {
String[] command_line = getCommandLine();
process = Runtime.getRuntime().exec(command_line, null, new File(getRoot()));
err = new ProcessOut(process, true, w);
out = new ProcessOut(process, false, w);
} catch (IOException e) {
ModelPlugin.getPluginLog().logError(e);
}
new HookMonitor();
}
/*
private void debugCommandLine(String[] command_line) {
write("Command line:\n");
for (int i = 0; i < command_line.length; i++) write(command_line[i] + "\n");
}
*/
public final void stop() {
if(!isRunning()) return;
process.destroy();
waitFor();
clear();
}
public final boolean isRunning() {
if(process == null) return false;
try {
exit = process.exitValue();
clear();
return false;
} catch (IllegalThreadStateException e) {
return true;
}
}
private void clear() {
process = null;
err = null;
out = null;
}
public final int waitFor() {
if(process == null) return exit;
ProcessOut errc = err, outc = out;
try {
exit = process.waitFor();
if(errc != null) errc.waitFor();
if(outc != null) outc.waitFor();
return exit;
} catch (InterruptedException e) {
return exit;
}
}
protected void write(String s) {}
class XPWriter extends Writer {
public void write(char cbuf[], int off, int len) throws IOException {
XProcess.this.write(new String(cbuf, off, len));
}
public void flush() throws IOException {}
public void close() throws IOException {}
}
protected void appendJava(ArrayList<String> l, Properties p) {
l.add(getJavaHome(p) + "/bin/java"); //$NON-NLS-1$
}
protected String getJavaHome(Properties p) {
File f = new File(p.getProperty("java.home")); //$NON-NLS-1$
return f.getAbsolutePath().replace('\\', '/');
//// return f.getParent().replace('\\', '/');
}
private class SD implements Runnable {
public void run() {
stop();
}
}
private class HookMonitor implements Runnable {
Thread sdhook = null;
public HookMonitor() {
if(!isRunning()) return;
sdhook = new Thread(new SD());
Runtime.getRuntime().addShutdownHook(sdhook);
new Thread(this).start();
}
public void run() {
try {
process.waitFor();
} catch (InterruptedException e) {
//do nothing
}
stop();
Runtime.getRuntime().removeShutdownHook(sdhook);
}
}
}