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