blob: 79cb987da36357d68de3c0067e058351177d6853 [file] [log] [blame]
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.lib.cvsclient.io;
import org.netbeans.lib.cvsclient.util.BugLog;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
/**
* @author Thomas Singer
*/
public abstract class AbstractInputStreamReader extends Reader {
// Abstract ===============================================================
protected abstract int readChar(InputStream inputStream) throws IOException;
// Fields =================================================================
private InputStream inputStream;
// Setup ==================================================================
protected AbstractInputStreamReader(InputStream inputStream) {
BugLog.getInstance().assertNotNull(inputStream);
this.inputStream = inputStream;
}
// Implemented ============================================================
public final int read() throws IOException {
ensureOpen();
return readChar(inputStream);
}
public final int read(char buffer[], int startOffset, int length) throws IOException {
if (startOffset < 0
|| startOffset > buffer.length
|| length < 0
|| startOffset + length > buffer.length
|| startOffset + length < 0) {
throw new IndexOutOfBoundsException();
}
ensureOpen();
int charsRead = 0;
for (int offset = startOffset; length > 0; offset++, charsRead++, length--) {
final int value = readChar(inputStream);
if (value < 0) {
break;
}
buffer[offset] = (char)value;
}
return charsRead > 0 ? charsRead : -1;
}
public final boolean ready() throws IOException {
ensureOpen();
try {
return inputStream.available() > 0;
}
catch (IOException ex) {
return false;
}
}
public final void close() throws IOException {
if (inputStream == null) {
return;
}
inputStream.close();
inputStream = null;
}
// Utils ==================================================================
private void ensureOpen() throws IOException {
if (inputStream == null) {
throw new IOException("Stream closed");
}
}
}