001package co.codewizards.cloudstore.core.childprocess;
002
003import java.io.IOException;
004import java.io.InputStream;
005import java.io.OutputStream;
006
007import org.slf4j.Logger;
008import org.slf4j.LoggerFactory;
009
010/**
011 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
012 */
013public class DumpStreamThread extends Thread
014{
015        private final Logger logger = LoggerFactory.getLogger(DumpStreamThread.class);
016        private InputStream inputStream;
017        private OutputStream outputStream;
018        private volatile boolean ignoreErrors = false;
019        private volatile boolean forceInterrupt = false;
020        private LogDumpedStreamThread logDumpedStreamThread;
021
022        public void setIgnoreErrors(boolean ignoreErrors) {
023                this.ignoreErrors = ignoreErrors;
024        }
025
026        @Override
027        public void interrupt() {
028                forceInterrupt = true;
029                super.interrupt();
030        }
031
032        @Override
033        public boolean isInterrupted() {
034                return forceInterrupt || super.isInterrupted();
035        }
036
037        public DumpStreamThread(InputStream inputStream, OutputStream outputStream, String childProcessLoggerName) throws IOException
038        {
039                if (inputStream == null)
040                        throw new IllegalArgumentException("inputStream == null"); //$NON-NLS-1$
041                if (outputStream == null)
042                        throw new IllegalArgumentException("outputStream == null"); //$NON-NLS-1$
043
044                this.inputStream = inputStream;
045                this.outputStream = outputStream;
046                this.logDumpedStreamThread = new LogDumpedStreamThread(childProcessLoggerName);
047        }
048
049        @Override
050        public synchronized void start() {
051                logDumpedStreamThread.start();
052                super.start();
053        }
054
055        @Override
056        public void run() {
057                try {
058                        final byte[] buffer = new byte[10240];
059                        while (!isInterrupted()) {
060                                try {
061                                        int bytesRead = inputStream.read(buffer);
062                                        if (bytesRead > 0) {
063                                                outputStream.write(buffer, 0, bytesRead);
064                                                logDumpedStreamThread.write(buffer, bytesRead);
065                                        }
066                                } catch (Throwable e) {
067                                        if (!ignoreErrors)
068                                                logger.error("run: " + e, e); //$NON-NLS-1$
069                                        else
070                                                logger.info("run: " + e); //$NON-NLS-1$
071
072                                        return;
073                                }
074                        }
075                } finally {
076                        logDumpedStreamThread.interrupt();
077                        try {
078                                outputStream.close();
079                        } catch (IOException e) {
080                                logger.warn("run: outputStream.close() failed: " + e, e); //$NON-NLS-1$
081                        }
082                }
083        }
084
085        public void setOutputStringBuffer(StringBuffer outputStringBuffer) {
086                logDumpedStreamThread.setOutputStringBuffer(outputStringBuffer);
087        }
088        public StringBuffer getOutputStringBuffer() {
089                return logDumpedStreamThread.getOutputStringBuffer();
090        }
091        public void setOutputStringBufferMaxLength(int outputStringBufferMaxLength) {
092                logDumpedStreamThread.setOutputStringBufferMaxLength(outputStringBufferMaxLength);
093        }
094        public int getOutputStringBufferMaxLength() {
095                return logDumpedStreamThread.getOutputStringBufferMaxLength();
096        }
097        public void flushBuffer() {
098                logDumpedStreamThread.flushBuffer();
099        }
100}