001 package org.apache.tapestry.util; 002 003 import org.apache.hivemind.util.Defense; 004 005 import java.util.Iterator; 006 007 /** 008 * <p>This class implements an {@link Iterator} which can only return a fixed 009 * number of items.</p> 010 * 011 */ 012 public class SizeRestrictingIterator implements Iterator { 013 014 private static final int DEFAULT_MAX_SIZE = 20; 015 016 private final int _maxSize; 017 private final Iterator _iterator; 018 private int _currentIndex; 019 020 /** 021 * Constructs an Iterator which will return at most {@link #DEFAULT_MAX_SIZE} items. 022 * 023 * @param iterator 024 * The underlying iterator this object will defer to for actual 025 * iteration. 026 */ 027 public SizeRestrictingIterator(Iterator iterator) 028 { 029 this(iterator, DEFAULT_MAX_SIZE); 030 } 031 032 /** 033 * Constructs an Iterator which will return at most as many 034 * items as defined by the user. 035 * 036 * @param iterator 037 * The underlying iterator this object will defer to for actual 038 * iteration. 039 * @param maxSize 040 * How many items to return / filter the list by. 041 */ 042 public SizeRestrictingIterator(Iterator iterator, int maxSize) 043 { 044 Defense.notNull(iterator, "Iterator source"); 045 046 _iterator = iterator; 047 _maxSize = maxSize; 048 049 _currentIndex = 0; 050 } 051 052 /** 053 * {@inheritDoc} 054 */ 055 public boolean hasNext() 056 { 057 return _currentIndex < _maxSize && _iterator.hasNext(); 058 } 059 060 /** 061 * {@inheritDoc} 062 */ 063 public Object next() 064 { 065 _currentIndex++; 066 return _iterator.next(); 067 } 068 069 /** 070 * {@inheritDoc} 071 */ 072 public void remove() 073 { 074 _currentIndex--; 075 _iterator.remove(); 076 } 077 078 public String toString() 079 { 080 return "SizeRestrictingIterator[" + 081 "_maxSize=" + _maxSize + 082 '\n' + 083 ", _current=" + _currentIndex + 084 '\n' + 085 ", _iterator=" + _iterator + 086 '\n' + 087 ']'; 088 } 089 }