001 package market; 002 003 import market.event.OfferEventListener; 004 import data.DataBasket; 005 import data.DataBasketEntry; 006 import data.StockItem; 007 import data.ooimpl.CatalogImpl; 008 import data.ooimpl.StoringStockImpl; 009 010 /** 011 * A StoringStock that can be used as a queue for tills and warehouse, 012 * uses {@link SICustomer}s as StockItems and handles offer-events on it. 013 */ 014 public class SSListenable extends StoringStockImpl{ 015 016 /** 017 * Array with all SPCustomers used to fire events to. 018 */ 019 private OfferEventListener[] oel = new OfferEventListener[0]; 020 021 /** 022 * @param sName the name of the new Stock. 023 * @param ciRef the Catalog that is being referenced by the Stock. 024 */ 025 public SSListenable(String sName, CatalogImpl ciRef) { 026 super(sName, ciRef); 027 } 028 029 /** 030 * Adds an OfferEventListener to the array of listeners. 031 * 032 * @param e the OfferEventListener that will be added. 033 */ 034 public void addEventListener(OfferEventListener e){ 035 int len = oel.length; 036 boolean exists = false; 037 for (int i = 0; i < len; i++) { 038 exists = exists || (oel[i] == e); 039 } 040 if (!exists) { 041 OfferEventListener[] temp = new OfferEventListener[len+1]; 042 System.arraycopy(oel, 0, temp, 0, len); 043 temp[len] = e; 044 oel = temp; 045 } 046 } 047 048 /** 049 * Removes an OfferEventListener from the array of listeners. 050 * 051 * @param e the OfferEventListener that will be removed. 052 */ 053 public void removeEventListener(OfferEventListener e){ 054 for (int i = 0; i < oel.length; i++) { 055 if (oel[i] == e) { 056 OfferEventListener[] temp = new OfferEventListener[oel.length-1]; 057 if (i > 0) System.arraycopy(oel,0,temp,0,i); 058 if (i < oel.length-1) System.arraycopy(oel,i+1,temp,i,oel.length-1-i); 059 oel = temp; 060 break; 061 } 062 } 063 } 064 065 /** 066 * Fires an event to all listeners: this article is empty. 067 * 068 * @param articleKey the key of the unavaible article. 069 */ 070 public void fireOfferIsEmpty(String articleKey) { 071 for (int i = 0; i < oel.length; i++) { 072 if (oel[i] != null) oel[i].offerEmpty(articleKey); 073 } 074 } 075 076 /** 077 * Fires an event to all listeners: a delivery arrived at the market. 078 */ 079 public void fireWakeUpOrders() { 080 for (int i = 0; i < oel.length; i++) { 081 if (oel[i] != null) oel[i].wakeUpOrders(); 082 } 083 } 084 085 /** 086 * Fires an event to all listeners: count this article. 087 * 088 * @param articleKey the key of the article to count. 089 * @param spw the SProcessWorker which has sended the request. 090 */ 091 public void fireCountArticles(String articleKey, SProcessWorker spw){ 092 for (int i = 0; i < oel.length; i++) { 093 if (oel[i] != null) oel[i].countArticles(articleKey, spw); 094 } 095 } 096 097 /** 098 * Adds a StockItem to this Stock, and adds it to the array of listeners, 099 * if it`s a SICustomer. 100 * 101 * @param si the item to be added. 102 * @param db the DataBasket relative to which the item will be added. 103 */ 104 public void add(StockItem si, DataBasket db) { 105 if(si instanceof SICustomer)addEventListener(((SICustomer)si)); 106 super.add(si, db); 107 } 108 109 /** 110 * Commit the removal of a StockItem, removes it from the array of listeners. 111 */ 112 public void commitRemove(DataBasket db, DataBasketEntry dbe) { 113 SICustomer sic = (SICustomer) dbe.getValue(); 114 removeEventListener(sic); 115 super.commitRemove(db, dbe); 116 } 117 }