package edu.illinois.codingspectator.refactoringproblems.parser;
/**
* This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details.
*/
import java.io.IOException;
import java.io.Reader;
/**
* Allows composition of two generic readers. Allows reading and resetting but doesn't allow marking
* or skipping. For usage example see {@link RefactoringProblemsLogDeserializer}
*
* @author Mohsen Vakilian
* @author nchen
*
*/
public class CompositeReader extends Reader {
private Reader firstInput;
private Reader secondInput;
public CompositeReader(Reader firstInput, Reader secondInput) {
this.firstInput= firstInput;
this.secondInput= secondInput;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
synchronized (lock) {
int remaining;
// Attempt to read from first
int amountReadFromFirst= firstInput.read(cbuf, off, len);
if (amountReadFromFirst == -1) {
amountReadFromFirst= 0;
}
remaining= len - amountReadFromFirst;
return amountReadFromFirst + secondInput.read(cbuf, off + amountReadFromFirst, remaining);
}
}
@Override
public void close() throws IOException {
firstInput.close();
secondInput.close();
}
@Override
public long skip(long n) throws IOException {
throw new UnsupportedOperationException();
}
@Override
public boolean ready() throws IOException {
return firstInput.ready() && secondInput.ready();
}
@Override
public boolean markSupported() {
return false;
}
@Override
public void mark(int readAheadLimit) throws IOException {
throw new UnsupportedOperationException();
}
@Override
public void reset() throws IOException {
firstInput.reset();
secondInput.reset();
}
}