001 package data.filters; 002 003 import data.*; 004 import data.events.*; 005 006 import java.util.*; 007 008 /** 009 * StockFilter for StoringStocks. 010 * 011 * <p>The filter condition can be defined by overriding method 012 * {@link #contains(data.StockItem, data.DataBasket)}.</p> 013 * 014 * @author Steffen Zschaler 015 * @version 2.0 19/08/1999 016 * @since v2.0 017 */ 018 public abstract class StoringStockFilter extends AbstractStockFilter implements StoringStock { 019 020 /** 021 * Create a new StoringStockFilter. 022 * 023 * @param ssSource the source Stock. 024 */ 025 public StoringStockFilter(StoringStock ssSource) { 026 super(ssSource); 027 } 028 029 /** 030 * Get all StockItems for a given key that are contained in the filtered Stock. 031 * 032 * @override Never 033 */ 034 public Iterator get(final String sKey, final DataBasket db, final boolean fForEdit) { 035 class I implements Iterator { 036 protected Iterator m_iIterator = m_stSource.get(sKey, db, fForEdit); 037 protected Object m_oCurrent; 038 protected Object m_oNext; 039 040 public boolean hasNext() { 041 return findNext(false); 042 } 043 044 public Object next() { 045 if (!findNext(true)) { 046 throw new NoSuchElementException(); 047 } 048 049 return m_oCurrent; 050 } 051 052 public void remove() { 053 if (m_oCurrent == null) { 054 throw new IllegalStateException(); 055 } 056 057 try { 058 StoringStockFilter.this.remove((StockItem)m_oCurrent, db); 059 } 060 catch (VetoException ve) { 061 throw new UnsupportedOperationException(); 062 } 063 } 064 065 private boolean findNext(boolean fGet) { 066 if (m_oNext != null) { 067 if (fGet) { 068 m_oCurrent = m_oNext; 069 m_oNext = null; 070 } 071 072 return true; 073 } 074 075 while (m_iIterator.hasNext()) { 076 StockItem si = (StockItem)m_iIterator.next(); 077 078 if (contains(si, db)) { 079 if (fGet) { 080 m_oCurrent = si; 081 m_oNext = null; 082 } else { 083 m_oNext = si; 084 } 085 086 return true; 087 } 088 } 089 090 return false; 091 } 092 } 093 094 return new I(); 095 } 096 097 /** 098 * Count all StockItems for a given key that are contained in the filtered Stock. 099 * 100 * @override Never 101 */ 102 public int countItems(String sKey, DataBasket db) { 103 int nCount = 0; 104 105 for (Iterator i = get(sKey, db, false); i.hasNext(); ) { 106 nCount++; 107 i.next(); 108 } 109 110 return nCount; 111 } 112 113 /** 114 * Filter condition: Check whether a given item is contained in the filtered Stock. 115 * 116 * @override Always 117 * 118 * @param si the StockItem to be checked. 119 * @param db the DataBasket to be used to check visibility. 120 * 121 * @return true if the given item is to be contained in the filtered Stock. 122 */ 123 public abstract boolean contains(StockItem si, DataBasket db); 124 125 /** 126 * Check whether the given Stock is contained in the filtered Stock. 127 * 128 * @override Never 129 */ 130 public boolean containsStock(Stock st, DataBasket db) { 131 boolean fResult = m_stSource.containsStock(st, db); 132 133 if (fResult) { 134 for (Iterator i = st.iterator(db, false); i.hasNext(); ) { 135 if (!contains((StockItem)i.next(), db)) { 136 return false; 137 } 138 } 139 } 140 141 return fResult; 142 } 143 }