001    package videoautomat;
002    import java.awt.Rectangle;
003    import java.io.FileOutputStream;
004    import java.io.IOException;
005    import java.util.Iterator;
006    
007    import log.Log;
008    import sale.*;
009    import users.UserManager;
010    import videoautomat.gui.Global;
011    import data.*;
012    import data.events.VetoException;
013    import data.ooimpl.CatalogImpl;
014    import data.ooimpl.CountingStockImpl;
015    import data.ooimpl.CurrencyItemImpl;
016    import data.ooimpl.EUROCurrencyImpl;
017    import data.ooimpl.MoneyBagImpl;
018    
019    /**
020     * This is the central class for this application - the <code>Shop</code>. It contains the
021     * video-catalog and stock of this video-shop, the shop`s money and therefor a currency-catalog
022     * containing which coins this automat accepts and a <code>Timer</code> for simulation purposes.
023     *  
024     */
025    public class VideoShop extends Shop {
026            /**
027             * Key of the video -<code>Catalog</code>
028             */
029            public static final String C_VIDEOS = new String("VideoCatalog");
030            /**
031             * Key of the currency -<code>Catalog</code>
032             */
033            public static final String C_CURRENCY = new String("CurrencyCatalog");
034            /**
035             * Key of the video -<code>CountingStock</code>
036             */
037            public static final String CC_VIDEOS = new String("VideoStock");
038            /**
039             * Key of the <code>MoneyBag</code>
040             */
041            public static final String MB_MONEY = new String("Money");
042            /**
043             * The name of the global log file
044             */
045            public static final String FILENAME = "automat.log";
046            /**
047             * Constructs a new VideoShop and set it as <code>Shop#setTheShop()</code>. Also initialize
048             * the global <code>Catalogs</code> and <code>Stocks</code> and sets a <code>Timer</code>.
049             *  
050             */
051            public VideoShop() {
052                    super();
053                    setShopFrameBounds(new Rectangle(0, 0, 640, 480));
054    
055                    addCatalog(new CatalogImpl(C_VIDEOS));
056                    addCatalog(new EUROCurrencyImpl(C_CURRENCY));
057                    addStock(
058                            new CountingStockImpl(
059                                    CC_VIDEOS,
060                                    (CatalogImpl) getCatalog(C_VIDEOS)));
061                    
062                    UserManager.setGlobalUM(new UserManager());
063                    
064                    addStock(
065                            new MoneyBagImpl(
066                                    MB_MONEY,
067                                    (EUROCurrencyImpl) getCatalog(C_CURRENCY)));
068                    
069                    setTimer(new StepTimer(new CalendarTime(System.currentTimeMillis())));
070                    setShopFrameTitle(getTimer().getTime().toString());
071                    try {
072                            Log.setGlobalOutputStream(new FileOutputStream(FILENAME, true));
073                    } catch (IOException ioex) {
074                            System.err.println("Unable to create log file.");
075                    }
076            }
077    
078            /**
079             * @return the <code>Shop`s MenuSheet</code>, containing the default one, a button to start
080             *              an automat and a button to switch the time further.
081             * @see sale.Shop#createShopMenuSheet()
082             */
083            protected MenuSheet createShopMenuSheet() {
084                    MenuSheet ms_default = super.createShopMenuSheet();
085                    MenuSheet ms_new = new MenuSheet(Global.MS_NEW);
086                    MenuSheetItem msi_automat =
087                            new MenuSheetItem(Global.MSI_AUTOMAT, new Action() {
088                            public void doAction(SaleProcess p, SalesPoint sp)
089                                    throws Throwable {
090                                    addSalesPoint(new VideoAutomat());
091                            }
092                    });
093                    ms_new.add(msi_automat);
094                    MenuSheetItem msi_time =
095                            new MenuSheetItem(Global.MSI_DAY, new Action() {
096                            public void doAction(SaleProcess p, SalesPoint sp)
097                                    throws Throwable {
098                                    getTimer().goAhead();
099                                    setShopFrameTitle(getTimer().getTime().toString());
100                            }
101                    });
102                    ms_new.add(msi_time);
103                    ms_default.add(ms_new);
104                    return ms_default;
105            }
106            /**
107             * Overidden to avoid the annoying save-query, when quiting the application.
108             * 
109             * @see sale.Shop#quit()
110             */
111            public void quit() {
112                    if (shutdown(false)) {
113                            System.exit(0);
114                    }
115            }
116            /**
117             * Helper method to avoid to long code-lines.
118             * 
119             * @return the global <code>Catalog</code> of videos.
120             */
121            public static CatalogImpl getVideoCatalog() {
122                    return (CatalogImpl) Shop.getTheShop().getCatalog(C_VIDEOS);
123            }
124            /**
125             * Helper method to avoid to long code-lines.
126             * 
127             * @return the global <code>Stock</code> of videos
128             */
129            public static CountingStockImpl getVideoStock() {
130                    return (CountingStockImpl) Shop.getTheShop().getStock(CC_VIDEOS);
131            }
132    
133            /**
134             * Helper method to avoid to long code-lines.
135             * 
136             * @return the global <code>MoneyBag</code> containing the money of the shop.
137             */
138            public static MoneyBagImpl getMoneyBag() {
139                    return (MoneyBagImpl) Shop.getTheShop().getStock(MB_MONEY);
140            }
141            /**
142             * Helper method to avoid to long code-lines.
143             * 
144             * @return the global <code>EUROCurrencyImpl</code> -instance
145             */
146            public static EUROCurrencyImpl getCurrency() {
147                    return (EUROCurrencyImpl) Shop.getTheShop().getCatalog(C_CURRENCY);
148            }
149    
150            /**
151             * Method to iterate over all rented videos and taking out those, which renting costs exceed
152             * the purchase price
153             *  
154             */
155            public static void checkRentedVideos() {
156                    Iterator it_users = UserManager.getGlobalUM().getUsers().iterator();
157                    while (it_users.hasNext()) {
158                            AutomatUser c = (AutomatUser) it_users.next();
159                            Iterator it_stock = c.getVideoStock().iterator(null, false);
160                            while (it_stock.hasNext()) {
161                                    VideoCassette vc = (VideoCassette) it_stock.next();
162                                    Value v =
163                                            ((QuoteValue) vc.getAssociatedItem(null).getValue())
164                                                    .getOffer();
165                                    if (vc.getCost().compareTo(v) >= 0) {
166                                            try {
167                                                    c.getVideoStock().remove(vc, null);
168                                            } catch (VetoException e) {
169                                                    e.printStackTrace();
170                                            }
171                                    }
172                            }
173                    }
174            }
175    }