package de.axone.shell;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import de.axone.tools.Str;
public class ShellExec {
public static QuickResult quickexec( Path cmd, String ... args )
throws IOException, InterruptedException {
if( ! Files.isRegularFile( cmd ) )
throw new IllegalArgumentException( "Cannot find: " + cmd );
if( ! Files.isExecutable( cmd ) )
throw new IllegalArgumentException( "Not executable: " + cmd );
String commandline =
cmd.toFile().getAbsolutePath() + " " + Str.join( " ", args );
Process process = Runtime.getRuntime().exec( commandline );
QuickResultImpl result = new QuickResultImpl();
boolean working = false;
try(
BufferedReader stdoutReader = new BufferedReader(
new InputStreamReader( process.getInputStream()) );
BufferedReader stderrReader = new BufferedReader(
new InputStreamReader( process.getErrorStream()) );
) {
String line = null;
do {
line = null;
if( stdoutReader.ready() ) {
working = true;
line = stdoutReader.readLine();
if( line != null ){
result.stdout
.append( line )
.append( '\n' )
;
}
}
if( stderrReader.ready() ) {
working = true;
line = stderrReader.readLine();
if( line != null ){
result.stderr
.append( line )
.append( '\n' )
;
}
}
// If nothing to do sleep some time and wait for output
if( !working ) Thread.sleep( 10 );
//E._cho_( "." );
} while( line != null || stdoutReader.ready() || stderrReader.ready() || process.isAlive() );
}
result.exitValue = process.exitValue();
return result;
}
private static class QuickResultImpl implements QuickResult {
private final StringBuffer stdout = new StringBuffer(),
stderr = new StringBuffer()
;
private int exitValue;
@Override
public CharSequence getStdOut() {
return stdout;
}
@Override
public CharSequence getStdErr() {
return stderr;
}
@Override
public int getExitValue() {
return exitValue;
}
}
interface QuickResult {
CharSequence getStdOut();
CharSequence getStdErr();
int getExitValue();
}
}