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}