/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on 03/08/2005
*/
package com.aptana.shared_core.io;
import java.io.InputStream;
import java.io.InputStreamReader;
import com.aptana.shared_core.string.FastStringBuffer;
public final class ThreadStreamReader extends Thread {
/**
* Input stream read.
*/
private final InputStream is;
/**
* Buffer with the contents gotten.
*/
private final FastStringBuffer contents;
/**
* Access to the buffer should be synchronized.
*/
private final Object lock = new Object();
/**
* Whether the read should be synchronized.
*/
private final boolean synchronize;
/**
* Keeps the next unique identifier.
*/
private static int next = 0;
/**
* Get a unique identifier for this thread.
*/
private static synchronized int next() {
next++;
return next;
}
private final String encoding;
public ThreadStreamReader(InputStream is) {
this(is, true); //default is synchronize.
}
public ThreadStreamReader(InputStream is, boolean synchronize) {
this(is, synchronize, null);
}
public ThreadStreamReader(InputStream is, boolean synchronize, String encoding) {
this.setName("ThreadStreamReader: " + next());
this.setDaemon(true);
this.encoding = encoding;
contents = new FastStringBuffer();
this.is = is;
this.synchronize = synchronize;
}
public void run() {
try {
InputStreamReader in;
if (encoding != null) {
in = new InputStreamReader(is, encoding);
} else {
in = new InputStreamReader(is);
}
int c;
//small buffer because we may want to see contents as it's being written.
//(still better than char by char).
char[] buf = new char[80];
if (synchronize) {
while ((c = in.read(buf)) != -1) {
synchronized (lock) {
contents.append(buf, 0, c);
}
}
} else {
while ((c = in.read(buf)) != -1) {
contents.append(buf, 0, c);
}
}
} catch (Exception e) {
//that's ok
}
}
/**
* @return the contents that were obtained from this instance since it was started or since
* the last call to this method.
*/
public String getAndClearContents() {
synchronized (lock) {
String string = contents.toString();
contents.clear();
return string;
}
}
public String getContents() {
synchronized (lock) {
return contents.toString();
}
}
}