package de.micromata.borgbutler.jobs; import org.apache.commons.exec.*; import org.apache.commons.io.output.ByteArrayOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; public class TestJob extends AbstractJob { private Logger log = LoggerFactory.getLogger(TestJob.class); private int time; private File counterScript; private int failOn = -1; TestJob(int time, File counterScript) { this(time, -1, counterScript); } TestJob(int time, int failOn, File counterScript) { this.time = time; this.failOn = failOn; this.counterScript = counterScript; } @Override public Object getId() { return time; } @Override public void execute() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream errorOutputStream = new ByteArrayOutputStream(); CommandLine cmdLine = new CommandLine(counterScript.getAbsolutePath()); cmdLine.addArgument(String.valueOf(this.time)); cmdLine.addArgument(String.valueOf(this.failOn)); DefaultExecutor executor = new DefaultExecutor(); ExecuteWatchdog watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT); executor.setWatchdog(watchdog); PumpStreamHandler streamHandler = new PumpStreamHandler(new LogOutputStream() { @Override protected void processLine(String line, int level) { //log.info(line); try { outputStream.write(line.getBytes()); outputStream.write("\n".getBytes()); } catch (IOException ex) { log.error(ex.getMessage(), ex); } } }, new LogOutputStream() { @Override protected void processLine(String line, int logLevel) { //log.error(line); try { errorOutputStream.write(line.getBytes()); errorOutputStream.write("\n".getBytes()); } catch (IOException ex) { log.error(ex.getMessage(), ex); } } }); executor.setStreamHandler(streamHandler); log.info("Executing '" + counterScript.getAbsolutePath() + " " + this.time + "'..."); try { executor.execute(cmdLine); } catch (Exception ex) { failed(); if (failOn < 0) { log.error("Error while executing script: " + ex.getMessage(), ex); } } //log.info(outputStream.toString(Charset.forName("UTF-8"))); //log.error(errorOutputStream.toString(Charset.forName("UTF-8"))); } }