BookFilterIterator.java |
1 /** 2 * Distribution License: 3 * JSword is free software; you can redistribute it and/or modify it under 4 * the terms of the GNU Lesser General Public License, version 2.1 or later 5 * as published by the Free Software Foundation. This program is distributed 6 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 7 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 8 * See the GNU Lesser General Public License for more details. 9 * 10 * The License is available on the internet at: 11 * http://www.gnu.org/copyleft/lgpl.html 12 * or by writing to: 13 * Free Software Foundation, Inc. 14 * 59 Temple Place - Suite 330 15 * Boston, MA 02111-1307, USA 16 * 17 * © CrossWire Bible Society, 2005 - 2016 18 * 19 */ 20 package org.crosswire.jsword.book; 21 22 import java.util.Iterator; 23 import java.util.NoSuchElementException; 24 25 /** 26 * An iterator that filters as it goes. 27 * 28 * @see gnu.lgpl.License The GNU Lesser General Public License for details. 29 * @author Joe Walker 30 * @author DM Smith 31 */ 32 public class BookFilterIterator implements Iterable<Book>, Iterator<Book> { 33 /** 34 * Simple ctor 35 * 36 * @param books an iterator over a set of books 37 * @param filter 38 * The filter to use, if null, will iterate over all values 39 */ 40 public BookFilterIterator(Iterable<Book> books, BookFilter filter) { 41 this.it = books.iterator(); 42 this.filter = filter; 43 } 44 45 /* (non-Javadoc) 46 * @see java.lang.Iterable#iterator() 47 */ 48 public Iterator<Book> iterator() { 49 return this; 50 } 51 52 /* (non-Javadoc) 53 * @see java.util.Iterator#hasNext() 54 */ 55 public boolean hasNext() { 56 next = findNext(); 57 return next != null; 58 } 59 60 /* (non-Javadoc) 61 * @see java.util.Iterator#next() 62 */ 63 public Book next() { 64 if (next == null) { 65 throw new NoSuchElementException(); 66 } 67 return next; 68 } 69 70 /* (non-Javadoc) 71 * @see java.util.Iterator#remove() 72 */ 73 public void remove() { 74 throw new UnsupportedOperationException(); 75 } 76 77 /** 78 * Find the next (if there is one) 79 * 80 * @return the next book 81 */ 82 private Book findNext() { 83 while (it.hasNext()) { 84 Book book = it.next(); 85 if (filter == null || filter.test(book)) { 86 return book; 87 } 88 } 89 90 return null; 91 } 92 93 /** 94 * The stored next value 95 */ 96 private Book next; 97 98 private Iterator<Book> it; 99 100 /** 101 * The value filter 102 */ 103 private BookFilter filter; 104 105 } 106