/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package scouter.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
public class RunExec {
private String cmd;
private String[] env;
private File dir;
private Throwable exception;
private Process process;
private StringBuilder error = new StringBuilder();
private StringBuilder output = new StringBuilder();
public RunExec(String cmd) {
this.cmd = cmd;
}
public RunExec setEnv(String[] env) {
this.env = env;
return this;
}
public RunExec setWorkDir(File dir) {
this.dir = dir;
return this;
}
long timeout = 5000;
public int exec() {
try {
process = Runtime.getRuntime().exec(cmd, env, dir);
output = new StringBuilder();
Thread t1 = readAndClose("RunExec-Output", process.getInputStream(), output);
error = new StringBuilder();
Thread t2 = readAndClose("RunExec-Error", process.getErrorStream(), error);
process.getOutputStream().close();
if (timeout > 0) {
for (int i = 0; (t1.isAlive() || t2.isAlive() ) && i < timeout; i = i + 50) {
ThreadUtil.sleep(50);
}
if (t1.isAlive() || t2.isAlive()) {
process.destroy();
setException(new Exception("TimeOutException"));
return 9;
}
} else {
process.waitFor();
}
return process.exitValue();
} catch (Throwable e) {
setException(e);
}
return -1;
}
private void setException(Throwable e) {
if (this.exception == null) {
this.exception = e;
}
}
private Thread readAndClose(String name, final InputStream fin, final StringBuilder sb) {
Thread t = new Thread(new Runnable() {
public void run() {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int n = fin.read(buff);
for (int k = 0; n >= 0 && k < 1024 * 1024; k++) {
if (out.size() < 1024 * 1024) {
out.write(buff, 0, n);
}
n = fin.read(buff);
}
sb.append(new String(out.toByteArray()));
} catch (Throwable t) {
setException(t);
} finally {
FileUtil.close(fin);
}
}
});
t.setDaemon(true);
t.setName(name);
t.start();
return t;
}
public String getError() {
return this.error.toString();
}
public String getOutput() {
return this.output.toString();
}
public Throwable getException() {
return this.exception;
}
public void setTimeout(long time) {
this.timeout = time;
}
public static void main(String[] args) {
RunExec re = new RunExec("d:\\jad\\jad.exe" + " -p " + "d:\\jad\\org.jboss.jca.core.connectionmanager.pool.AbstractPool.class");
//RunExec re = new RunExec("d:\\jad\\jad.exe" + " -p " + "d:\\jad\\scouter.apache.StringUtils.class");
//RunExec re = new RunExec("\"C:\\Program Files\\Java\\jdk1.6.0_43\\bin\\java\" -cp d:\\sleep.jar Main 2000");
re.exec();
System.out.println(re.getOutput());
System.out.println(re.getError());
System.out.println(re.getException());
}
}