/* The contents of this file are subject to the license and copyright terms * detailed in the license directory at the root of the source tree (also * available online at http://fedora-commons.org/license/). */ package fedora.server.utilities; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.jrdf.graph.Triple; import org.trippi.TripleIterator; import org.trippi.TrippiException; public class FilteredTripleIterator extends TripleIterator { TripleIterator m_baseIter; boolean m_add; Triple m_filter; Triple m_next; boolean m_changeMade = false; public FilteredTripleIterator(TripleIterator baseIter, Triple filter, boolean add) throws TrippiException { m_baseIter = baseIter; m_filter = filter; m_add = add; // FIXME restore these later - eddie // Map<String, String> map = m_baseIter.getAliasMap(); // setAliasMap(map); m_next = getNext(); } public FilteredTripleIterator(Map<String, String> aliasMap, Triple filter, boolean add) throws TrippiException { m_baseIter = null; m_filter = filter; m_add = add; // FIXME restore this later - eddie // setAliasMap(aliasMap); m_next = getNext(); } @Override public boolean hasNext() throws TrippiException { return m_next != null; } @Override public Triple next() throws TrippiException { Triple last = m_next; m_next = getNext(); return last; } private Triple getNext() throws TrippiException { Triple next; if (!m_add) // purging entries { next = m_baseIter.next(); while (next != null && matches(next, m_filter)) { m_changeMade = true; next = m_baseIter.next(); } return next; } else if (m_baseIter == null) { // adding entry to empty set m_changeMade = true; next = m_filter; m_filter = null; return next; } else { // adding entry to existing set next = m_baseIter.next(); if (matches(next, m_filter)) { m_filter = null; // Triple to be added already present } if (next == null) { if (m_filter != null) { m_changeMade = true; } next = m_filter; m_filter = null; } return next; } } private boolean matches(Triple next, Triple filter) { if (filter == null || next == null) { return false; } return partMatches(next.getSubject().toString(), filter.getSubject() .toString()) && partMatches(next.getPredicate().toString(), filter .getPredicate().toString()) && partMatches(next.getObject().toString(), filter.getObject() .toString()); } private boolean partMatches(String next, String filter) { if (next.equals(filter)) { return true; } Map<String, String> map = getAliasMap(); Set<String> keys = map.keySet(); Iterator<String> iter = keys.iterator(); while (iter.hasNext()) { String key = iter.next(); if (next.startsWith(key + ":")) { next = next.replaceFirst(key + ":", map.get(key)); } if (filter.startsWith(key + ":")) { filter = filter.replaceFirst(key + ":", map.get(key)); } if (next.equals(filter)) { return true; } } return false; } @Override public void close() throws TrippiException { m_filter = null; if (m_baseIter != null) { m_baseIter.close(); } } public boolean wasChangeMade() { return m_changeMade; } }