package edu.stanford.nlp.objectbank;
import edu.stanford.nlp.io.IOUtils;
import edu.stanford.nlp.io.RuntimeIOException;
import edu.stanford.nlp.util.StringUtils;
import java.util.Iterator;
import java.util.Collection;
import java.util.ArrayList;
import java.io.Reader;
import java.io.File;
/**
* Vends ReaderIterators which can always be rewound.
* Java's Readers cannot be reset, but this ReaderIteratorFactory allows resetting.
* It the input types are anything other than Readers, then it resets them in
* the obvious way. If the input is a Reader, then it's contents are saved
* to a tmp file (which is destroyed when the VM exits) which is then resettable.
*
* @author Jenny Finkel
*/
public class ResettableReaderIteratorFactory extends ReaderIteratorFactory {
/**
* Constructs a ResettableReaderIteratorFactory from the input sources
* contained in the Collection. The Collection should contain
* Objects of type File, String, URL and Reader. See class
* description for details.
*
* @param c Collection of input sources.
*/
public ResettableReaderIteratorFactory(Collection<?> c) {
super(c);
}
public ResettableReaderIteratorFactory(Collection<?> c, String encoding) {
super(c, encoding);
}
/**
* Convenience constructor to construct a ResettableReaderIteratorFactory
* from a single input source. The Object should be of type File,
* String, URL or Reader. See the class description for details.
*
* @param o An input source that can be converted into a Reader
*/
public ResettableReaderIteratorFactory(Object o) {
super(o);
}
/**
* Convenience constructor to construct a ResettableReaderIteratorFactory
* from a single input source. The Object should be of type File,
* String, URL or Reader. See the class description for details.
*
* @param o An input source that can be converted into a Reader
* @param encoding The character encoding of a File or URL
*/
public ResettableReaderIteratorFactory(Object o, String encoding) {
super(o, encoding);
}
/**
* Constructs a ResettableReaderIteratorFactory with no initial
* input sources.
*/
public ResettableReaderIteratorFactory() {
super();
}
/**
* Returns an Iterator over the input sources in the underlying Collection.
*
* @return an Iterator over the input sources in the underlying Collection.
*/
@Override
public Iterator<Reader> iterator() {
Collection<Object> newCollection = new ArrayList<>();
for (Object o : c) {
if (o instanceof Reader) {
String name = o.toString()+".tmp";
File tmpFile;
try {
tmpFile = File.createTempFile(name,"");
} catch (Exception e) {
throw new RuntimeIOException(e);
}
tmpFile.deleteOnExit();
StringUtils.printToFile(tmpFile, IOUtils.slurpReader((Reader) o),
false, false, enc);
newCollection.add(tmpFile);
} else {
newCollection.add(o);
}
}
c = newCollection;
return new ReaderIterator();
}
}