package org.archive.util.iterator;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.archive.util.StringFieldExtractor;
public class FilterStringIterator implements Iterator<String> {
private static final Logger LOGGER =
Logger.getLogger(FilterStringIterator.class.getName());
private static final int DEFAULT_FIELD = 0;
private static final char DEFAULT_DELIM = ' ';
private int field = DEFAULT_FIELD;
private char delim = DEFAULT_DELIM;
private StringFilter filter;
private Iterator<String> wrapped;
private StringFieldExtractor extractor;
private String cachedNext;
public FilterStringIterator(Iterator<String> wrapped, StringFilter filter) {
this.wrapped = wrapped;
this.filter = filter;
cachedNext = null;
extractor = new StringFieldExtractor(delim, field);
}
/**
* @return the field
*/
public int getField() {
return field;
}
/**
* @param field the field to set
*/
public void setField(int field) {
this.field = field;
extractor = new StringFieldExtractor(delim, field);
}
/**
* @return the delim
*/
public char getDelim() {
return delim;
}
/**
* @param delim the delim to set
*/
public void setDelim(char delim) {
this.delim = delim;
extractor = new StringFieldExtractor(delim, field);
}
public boolean hasNext() {
if(cachedNext != null) {
return true;
}
while(true) {
if(!wrapped.hasNext()) {
return false;
}
String tmp = wrapped.next();
String f = extractor.extract(tmp);
if(filter.isFiltered(f)) {
if(LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("Filtered:" + f);
}
} else {
cachedNext = tmp;
return true;
}
}
}
public String next() {
if(cachedNext == null) {
throw new NoSuchElementException("Call hasNext() first");
}
String tmp = cachedNext;
cachedNext = null;
return tmp;
}
public void remove() {
throw new UnsupportedOperationException();
}
}