X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsonitus%2Fdata%2Ffilter%2FExternalFilter.java;h=497ba2ab289144f7e2f3ca698713f6abeb1f45c5;hb=00af65503a2076371291ce8e019da2546458bdac;hp=ff838d98b690749e119fa895c8393fca1f999f8e;hpb=fcd64fc58fa16983938cfab4510e9cf555e9e1e4;p=sonitus.git diff --git a/src/main/java/net/pterodactylus/sonitus/data/filter/ExternalFilter.java b/src/main/java/net/pterodactylus/sonitus/data/filter/ExternalFilter.java index ff838d9..497ba2a 100644 --- a/src/main/java/net/pterodactylus/sonitus/data/filter/ExternalFilter.java +++ b/src/main/java/net/pterodactylus/sonitus/data/filter/ExternalFilter.java @@ -31,6 +31,7 @@ import net.pterodactylus.sonitus.data.Connection; import net.pterodactylus.sonitus.data.Filter; import net.pterodactylus.sonitus.data.Format; import net.pterodactylus.sonitus.data.Source; +import net.pterodactylus.sonitus.io.InputStreamDrainer; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -46,13 +47,7 @@ import com.google.common.io.ByteStreams; public abstract class ExternalFilter implements Filter { /** The logger. */ - private static final Logger logger = Logger.getLogger(ExternalFilter.class.getName()); - - /** The binary to execute. */ - private final String binary; - - /** The parameters for the binary. */ - private final Iterable parameters; + private final Logger logger = Logger.getLogger(getClass().getName()); /** The format of the source. */ private Format format; @@ -60,21 +55,9 @@ public abstract class ExternalFilter implements Filter { /** The input stream that will hold the converted source. */ private PipedInputStream pipedInputStream; - /** - * Creates a new external filter. - * - * @param binary - * The binary to execute - * @param parameters - * The parameter for the binary - */ - public ExternalFilter(String binary, Iterable parameters) { - this.binary = binary; - this.parameters = parameters; - } - // // FILTER METHODS + // @Override public Format format() { @@ -85,6 +68,9 @@ public abstract class ExternalFilter implements Filter { public byte[] get(int bufferSize) throws EOFException, IOException { byte[] buffer = new byte[bufferSize]; int read = pipedInputStream.read(buffer); + if (read == -1) { + throw new EOFException(); + } return Arrays.copyOf(buffer, read); } @@ -94,24 +80,13 @@ public abstract class ExternalFilter implements Filter { format = source.format(); try { - Process process = Runtime.getRuntime().exec(Iterables.toArray(ImmutableList.builder().add(binary).addAll(parameters).build(), String.class)); + final Process process = Runtime.getRuntime().exec(Iterables.toArray(ImmutableList.builder().add(binary(format)).addAll(parameters(format)).build(), String.class)); final InputStream processOutput = process.getInputStream(); final OutputStream processInput = process.getOutputStream(); final InputStream processError = process.getErrorStream(); final PipedOutputStream pipedOutputStream = new PipedOutputStream(); pipedInputStream = new PipedInputStream(pipedOutputStream); - new Thread(new Runnable() { - - @Override - public void run() { - try { - drainInputStream(processError); - } catch (IOException ioe1) { - /* ignore, just let the thread exit. */ - } - logger.finest("ExternalFilter: Reading stderr finished."); - } - }).start(); + new Thread(new InputStreamDrainer(processError)).start(); new Thread(new Runnable() { @Override @@ -121,7 +96,7 @@ public abstract class ExternalFilter implements Filter { } catch (IOException ioe1) { /* okay, just exit. */ } - logger.finest("ExternalFilter: Reading stdout finished."); + logger.finest("Reading stdout finished."); } }).start(); new Thread(new Connection(source) { @@ -134,6 +109,14 @@ public abstract class ExternalFilter implements Filter { @Override protected void feed(byte[] buffer) throws IOException { processInput.write(buffer); + processInput.flush(); + } + + @Override + protected void finish() throws IOException { + processInput.close(); + processOutput.close(); + processError.close(); } }).start(); } catch (IOException ioe1) { @@ -142,16 +125,25 @@ public abstract class ExternalFilter implements Filter { } // - // STATIC METHODS + // SUBCLASS METHODS // - private static void drainInputStream(InputStream inputStream) throws IOException { - byte[] buffer = new byte[4096]; - int read; - while ((read = inputStream.read(buffer)) != -1) { - logger.finest(String.format("ExternalFilter: Drained %d Bytes.", read)); - /* do nothing, just read the damn thing. */ - } - } + /** + * Returns the location of the binary to execute. + * + * @param format + * The format being processed + * @return The location of the binary to execute + */ + protected abstract String binary(Format format); + + /** + * Returns the parameters for the binary. + * + * @param format + * The format being processed + * @return The parameters for the binary + */ + protected abstract Iterable parameters(Format format); }