package net.fortytwo.sesametools;
import org.openrdf.model.IRI;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.Value;
import org.openrdf.util.iterators.FilterIterator;
import java.util.Iterator;
/**
* A <code>FilterIterator</code> which matches statements against a given
* subject, predicate, object, and optional context(s).
*/
public class PatternIterator extends FilterIterator<Statement> {
private Resource subj;
private IRI pred;
private Value obj;
private Resource[] contexts;
public PatternIterator(Iterator<? extends Statement> iter, Resource subj, IRI pred, Value obj,
Resource... contexts) {
super(iter);
this.subj = subj;
this.pred = pred;
this.obj = obj;
this.contexts = contexts;
}
@Override
protected boolean accept(Statement st) {
if (subj != null && !subj.equals(st.getSubject())) {
return false;
}
if (pred != null && !pred.equals(st.getPredicate())) {
return false;
}
if (obj != null && !obj.equals(st.getObject())) {
return false;
}
if (contexts.length == 0) {
// Any context matches
return true;
} else {
// Accept if one of the contexts from the pattern matches
Resource stContext = st.getContext();
for (Resource context : contexts) {
if (context == null && stContext == null) {
return true;
}
if (context != null && context.equals(stContext)) {
return true;
}
}
return false;
}
}
}