/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.util; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNStreamGobbler extends Thread { private InputStreamReader is; private final StringBuffer result = new StringBuffer(); private IOException error; private boolean myIsEOF; private boolean myIsClosed; public SVNStreamGobbler(InputStream is) { try { this.is = new InputStreamReader(is, "UTF-8"); } catch (UnsupportedEncodingException e) { this.is = new InputStreamReader(is); } } public void run() { char[] buffer = new char[1024]; synchronized (result) { while(true) { try { int r = is.read(buffer); if (r < 0) { break; } if (r > 0) { result.append(buffer, 0, r); } } catch (IOException e) { if (!myIsClosed) { error = e; } break; } } myIsEOF = true; result.notifyAll(); } } public void waitFor() { synchronized (result) { while (!myIsEOF) { try { result.wait(); } catch (InterruptedException e) { } } } } public void close() { synchronized (result) { myIsEOF = true; result.notifyAll(); myIsClosed = true; SVNFileUtil.closeFile(is); } } public String getResult() { synchronized(result) { return result.toString(); } } public IOException getError() { return error; } }