001    package market;
002    
003    import java.util.Iterator;
004    
005    import data.Catalog;
006    import data.CatalogItem;
007    import data.DataBasket;
008    import data.events.VetoException;
009    import data.ooimpl.CatalogImpl;
010    import data.ooimpl.CountingStockImpl;
011    
012    /**
013     * CountingStockImpl that always contains the same keys as its {@linkplain CArticleCatalog} source catalog,
014     * even if no StockItems have been added or some have been removed completely.
015     * Normally the keys of StockItems are removed when their number drops to zero. But this prevents
016     * StockItems with an amount of zero to be displayed in tables.
017     */
018    public class CSOffer extends CountingStockImpl {
019    
020        private Integer iNull = new Integer(0);
021    
022        /**
023         * @param sName the Stock's name.
024         * @param cat the source catalog.
025         */
026        public CSOffer(String sName, CatalogImpl cat) {
027            super(sName, cat);
028            addZeros(null);
029        }
030    
031        /**
032         * Removes StockItems from the Stock. If the item has been removed completely, its
033         * index is re-added and its amount is set to 0.
034         *
035         * @param sKey the ID of the StockItem to be removed.
036         * @param nCount the number of Items to be removed.
037         * @param db the belonging DataBasket.
038         */
039        public void remove(String sKey, int nCount, DataBasket db){
040            try {
041                super.remove(sKey, nCount, db);
042            }
043            catch (VetoException ve) {
044                System.err.println(ve.getMessage());
045            }
046            if (!contains(sKey, db)) {
047                getItemsContainer().put(sKey, iNull);
048            }
049        }
050    
051        /**
052         * Checks, which CatalogItems have no appropriate StockItems.
053         * If one is found the key of the item is added to the stock.
054         * The number of StockItems is set to 0.
055         *
056         * @param db the DataBasket to be used.
057         */
058        public void addZeros(DataBasket db) {
059            Iterator it = m_ciCatalog.iterator(null, false);
060            while (it.hasNext()) {
061                String sKey = ((CatalogItem)it.next()).getName();
062                if (!contains(sKey, db)) {
063                    getItemsContainer().put(sKey, iNull);
064                }
065            }
066        }
067    
068    
069        /**
070         * Changes the StockItems of this stock according to a new Catalog<br><br>
071         * All elements that appear in both the old and the new Catalog will be kept.<br>
072         * All elements that do not appear in the new Catalog will be deleted.<br>
073         * All elements that have not appeared in the old Catalog will be added
074         * and their number is set to 0.<br>
075         * This method is used by the filters that filter Stocks by their item's category.
076         *
077         * @param cat the new Catalog to be set.
078         */
079        public void changeArticleCatalog(Catalog cat) throws VetoException {
080            Iterator it = null;
081            //convert the given catalog to a CatalogImpl and make it the new base
082            Catalog oldBase = m_ciCatalog;
083            if (cat instanceof CatalogImpl) {   //Catalog instance of CatalogImpl => leave it
084                m_ciCatalog = (CatalogImpl)cat;
085            } else {                            //Catalog not instance of CatalogImpl (e.g. Filter)
086                CatalogImpl c = new CatalogImpl(m_ciCatalog.getName());
087                it = cat.keySet(null).iterator();
088                while (it.hasNext()) {                      //copy all CatalogItems from cat to new
089                    String nextKey = (String)it.next();     //created CatalogImpl
090                    CatalogItem ci = oldBase.get(nextKey, null, false);
091                    c.add(ci, null);
092                }
093                m_ciCatalog = c;                            //make new CatalogImpl the new base
094            }
095            //iterate through new base and remove all unneeded StockItems from this stock
096            it = this.keySet(null).iterator();
097            int nrOfItems = 0;
098            while (it.hasNext()) {
099                String sKey = (String)it.next();
100                nrOfItems = countItems(sKey, null);
101                if (!contains(sKey, null)) {
102                    if (nrOfItems > 0) {
103                        try {
104                            super.remove(sKey, nrOfItems, null);
105                        }
106                        catch (VetoException ve) {
107                            ve.printStackTrace();
108                            throw ve;
109                        }
110                    } else {
111                        getItemsContainer().remove(sKey);
112                    }
113                }
114                addZeros(null);
115            }
116        }
117    
118        /**
119         * @return a clone of CSOffer with its StockItems.
120         */
121        public Object clone() {
122            CSOffer cso = new CSOffer(getName(), m_ciCatalog);
123            Iterator it = this.keySet(null).iterator();
124            while (it.hasNext()) {
125                String sKey = (String)it.next();
126                int amount = countItems(sKey, null);
127                if (amount > 0) {                       //add all items with one or more elements
128                    cso.add(sKey, amount, null);        //(adding 0 elements is not allowed by the Framework)
129                }
130                addZeros(null);
131            }
132            return cso;
133        }
134    }