/**
* Copyright (C) 2004 Orbeon, Inc.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by the Free Software Foundation; either version
* 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* The full text of the license is available at http://www.gnu.org/copyleft/lesser.html
*/
package org.orbeon.oxf.util;
import org.orbeon.oxf.common.OXFException;
import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;
public class SequenceReader extends Reader {
private Iterator iterator;
private Reader reader;
public SequenceReader(Iterator iterator) {
this.iterator = iterator;
try {
nextReader();
} catch (IOException ex) {
throw new OXFException("Invalid state");
}
}
public int read() throws IOException {
if (reader == null)
return -1;
int c = reader.read();
if (c == -1) {
nextReader();
return read();
}
return c;
}
public int read(char b[], int off, int len) throws IOException {
if (reader == null) {
return -1;
} else if (b == null) {
throw new NullPointerException();
} else if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) > b.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int n = reader.read(b, off, len);
if (n <= 0) {
nextReader();
return read(b, off, len);
}
return n;
}
public void close() throws IOException {
do {
nextReader();
} while (reader != null);
}
void nextReader() throws IOException {
if (reader != null)
reader.close();
if (iterator.hasNext()) {
reader = (Reader) iterator.next();
if (reader == null)
throw new OXFException("Null reader passed to " + getClass().getName());
} else
reader = null;
}
}