001: /*
002: (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
003: [See end of file]
004: $Id: FilterIterator.java,v 1.11 2008/01/02 12:07:35 andy_seaborne Exp $
005: */
006:
007: package com.hp.hpl.jena.util.iterator;
008:
009: import java.util.Iterator;
010: import java.util.NoSuchElementException;
011:
012: /**
013: Creates a sub-Iterator by filtering. This class should not be used
014: directly any more; the subclasses FilterKeepIterator and FilterDropIterator
015: should be used instead.
016: @author jjc, mods [clarity & speedup] by kers
017: */
018: public class FilterIterator extends WrappedIterator {
019: protected final Filter f;
020: protected Object current;
021: protected boolean canRemove;
022: protected boolean hasCurrent;
023:
024: /**
025: Initialises a FilterIterator with its filter and base.
026: @param fl An object is included if it is accepted by this Filter.
027: @param e The base Iterator.
028: */
029: public FilterIterator(Filter fl, Iterator e) {
030: super (e);
031: f = fl;
032: }
033:
034: /**
035: Answer true iff there is at least one more acceptable object.
036: [Stores reference into <code>current</code>, sets <code>canRemove</code>
037: false; answer preserved in `hasCurrent`]
038: */
039: synchronized public boolean hasNext() {
040: while (!hasCurrent && super .hasNext())
041: hasCurrent = accept(current = super .next());
042: canRemove = false;
043: return hasCurrent;
044: }
045:
046: /**
047: Overridden in Drop/Keep as appropriate. Answer true if the object is
048: to be kept in the output, false if it is to be dropped.
049: */
050: protected boolean accept(Object x) {
051: return f.accept(x);
052: }
053:
054: /**
055: Remove the current member from the underlying iterator. Legal only
056: after a .next() but before any subsequent .hasNext(), because that
057: may advance the underlying iterator.
058: */
059: synchronized public void remove() {
060: if (!canRemove)
061: throw new IllegalStateException(
062: "FilterIterators do not permit calls to hasNext between calls to next and remove.");
063: super .remove();
064: }
065:
066: /**
067: Answer the next acceptable object from the base iterator. The redundant
068: test of `hasCurrent` appears to make a detectable speed difference.
069: Crazy.
070: */
071: synchronized public Object next() {
072: if (hasCurrent || hasNext()) {
073: canRemove = true;
074: hasCurrent = false;
075: return current;
076: }
077: throw new NoSuchElementException();
078: }
079: }
080:
081: /*
082: * (c) Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
083: * All rights reserved.
084: *
085: * Redistribution and use in source and binary forms, with or without
086: * modification, are permitted provided that the following conditions
087: * are met:
088: * 1. Redistributions of source code must retain the above copyright
089: * notice, this list of conditions and the following disclaimer.
090: * 2. Redistributions in binary form must reproduce the above copyright
091: * notice, this list of conditions and the following disclaimer in the
092: * documentation and/or other materials provided with the distribution.
093: * 3. The name of the author may not be used to endorse or promote products
094: * derived from this software without specific prior written permission.
095:
096: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
097: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
098: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
099: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
100: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
101: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
102: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
103: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
104: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
105: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
106: *
107: * $Id: FilterIterator.java,v 1.11 2008/01/02 12:07:35 andy_seaborne Exp $
108: *
109: */
|