001    import sale.*;
002    import log.*;
003    import users.*;
004    import data.*;
005    import data.ooimpl.*;
006    
007    import java.io.*;
008    import java.util.*;
009    import java.lang.*;
010    
011    import javax.swing.*;
012    
013    
014    /**
015     * Diese Klasse ist der "Shop" der Anwendung. Sie stellt das Grundgerüst
016     * für die Anwendung dar.
017     */
018    public class VideoMachine extends Shop
019    {
020       
021      //// attributes ////////////////////////////////////////////////////////////
022       
023      // Liste aller registrierten Kunden
024      private static Set customerSet = new HashSet();
025      //// constructor ///////////////////////////////////////////////////////////
026       
027      /**
028       * Konstruktor. Erzeugt ein neues Objekt vom Typ VideoAutomat.
029       */
030      public VideoMachine()
031      {
032        super();
033       
034        // Name und Preis fuer die Standart-Katalogeintraege
035        String[] videos = {"Video 01", "Video 02", "Video 03", "Video 04",
036                           "Video 05", "Video 06", "Video 07", "Video 08",
037                           "Video 09", "Video 10"};
038        int[] buy  = {5000, 5000, 5000, 5000, 5000, 4000, 4000, 4000, 3000, 3000};
039        int[] sell = {4000, 4000, 4000, 4000, 3500, 3500, 3500, 3500, 3000, 3000};
040            
041        // Eintragung in den Catalog und den Stock
042        Catalog videoCatalog = new CatalogImpl("Video-Catalog");
043        addCatalog(videoCatalog);
044          
045        for (int i = 0; i < videos.length; i++) 
046        {
047          videoCatalog.add(new VideoCassette (videos[i], new QuoteValue
048            (new IntegerValue (buy[i]), new IntegerValue (sell[i]))), null);
049        }
050          
051        CountingStock cs = new CountingStockImpl("Video-Countingstock",
052                                                 (CatalogImpl)videoCatalog);
053        addStock(cs);
054          
055        // Erstellen eines Bestands von je 5 Videos (sollte spaeter
056        // vom Manager uebernommen werden
057        Iterator cassettes = videoCatalog.keySet(null).iterator();
058        while (cassettes.hasNext()) 
059        {
060          cs.add((String)cassettes.next(), 5, null);
061        }
062          
063        // Anlegen einer Waehrung und Erstellen eines dazugehoerigen
064        // Geldbestandes
065        addCatalog(new CurrencyImpl("DM"));
066         
067        MoneyBag coinSlot = new MoneyBagImpl("coin slot",
068                                             (CurrencyImpl)getCatalog("DM"));
069        coinSlot.add(CurrencyImpl.PFENNIG_STCK_1, 100000, null);
070        addStock(coinSlot);
071      }
072       
073       
074      //// public methods ///////////////////////////////////////////////////////
075       
076      /**
077       * Die Main-Methode startet die Anwendung.
078       */
079      public static void main (String[] args)
080      {
081        // neuen Videoautomaten erzeugen
082        VideoMachine vidMachine = new VideoMachine();
083        setTheShop(vidMachine);
084                
085        // Datei zuweisen, in die das Log geschrieben werden soll
086        try {
087          Log.setGlobalOutputStream(new FileOutputStream("machine.log", true));
088        }
089        catch (IOException ioex) {
090          System.err.println("Unable to create log file.");
091        }
092          
093        // Verleih bzw. Kasse anlegen
094        Counter c = new Counter("Video Rental");
095        c.attach(new DataBasketImpl());
096        c.attach(new User("SalespointUser"));
097        vidMachine.addSalesPoint(c);
098          
099        // Anlegen des Manager-Passworts
100        // Paßwortfelder erzeugen
101        JPasswordField jPasswordField1 = new JPasswordField();
102        JPasswordField jPasswordField2 = new JPasswordField();
103          
104        // neues JPanel anlegen und vertikales Boxlayout setzen
105        JPanel jPasswordRequest = new JPanel();
106        jPasswordRequest.setLayout(new BoxLayout(jPasswordRequest,
107                                                 BoxLayout.Y_AXIS));
108          
109        // Label und Paßwortfelder einfuegen
110        jPasswordRequest.add(new JLabel("Enter the manager's password:"));
111        jPasswordRequest.add(jPasswordField1);
112        jPasswordRequest.add(new JLabel("Re-enter the manager's password:"));
113        jPasswordRequest.add(jPasswordField2);
114          
115        // Paßwortabfrage wiederholen bis Uebereinstimmung zwischen den Worten
116        do {
117          JOptionPane.showMessageDialog (null,
118                                         jPasswordRequest,
119                                         "Manager",
120                                         JOptionPane.QUESTION_MESSAGE);
121        } 
122        while (!new String(jPasswordField1.getPassword()).equals(
123                new String(jPasswordField2.getPassword())));
124          
125        // Managerpasswort setzen
126        Office.setPassword(new String(jPasswordField1.getPassword()));
127          
128        // Titel setzen und starten
129        vidMachine.setShopFrameTitle("Videoverleihautomat *** HOMECINEMA *** 24h");
130        vidMachine.start();
131          
132        vidMachine.getShopFrame().setSize(640,480);
133        vidMachine.getShopFrame().validate();
134      }
135       
136       
137      /**
138       * Erzeugt die Menueleiste des Hauptfensters unseres Automatens.
139       */
140      public MenuSheet createShopMenuSheet()
141      {
142        // urspruengliche Menueleiste erzeugen und abspeichern
143        MenuSheet msMenuBar = super.createShopMenuSheet();
144          
145        // 'Shop'-Menue heraussuchen lassen
146        MenuSheet msShopMenu =
147          (MenuSheet)msMenuBar.getTaggedItem (SHOP_MENU_TAG, true);
148          
149        // nach unten zu schiebende Menuepunkte zunaechst aus dem
150        // Menue loeschen, aber in lokalen Variablen speichern
151        MenuSheetItem msLoadItem = (MenuSheetItem)msShopMenu.remove(LOAD_TAG);
152        MenuSheetItem msSaveItem = (MenuSheetItem)msShopMenu.remove(SAVE_TAG);
153        MenuSheetSeparator msSeparator =
154          (MenuSheetSeparator)msShopMenu.remove(SEPARATOR_TWO_TAG);
155        MenuSheetItem msQuitItem = (MenuSheetItem)msShopMenu.remove(QUIT_SHOP_TAG);
156          
157        MenuSheetItem msManagerItem = 
158          new MenuSheetItem(
159            "Open Office",
160            new sale.Action()
161            {
162              public void doAction (SaleProcess p, SalesPoint sp)
163              {
164                List l = getSalesPoints();
165                for (int i = 0; i < l.size(); i++) 
166                {
167                  if (((SalesPoint)l.get(i)).getName() == "Office") 
168                  {
169                    javax.swing.JOptionPane.showMessageDialog(
170                                null,
171                                "There is an already an Office",
172                                "Error", 
173                                javax.swing.JOptionPane.ERROR_MESSAGE);
174                    return;
175                  }
176                }
177                                     
178                // Paßwortfeld erzeugen
179                JPasswordField jPasswordField = new JPasswordField();
180                                     
181                // neues JPanel anlegen und vertikales Boxlayout setzen
182                JPanel jPasswordRequest = new JPanel();
183                jPasswordRequest.setLayout(new BoxLayout(jPasswordRequest,
184                                                         BoxLayout.Y_AXIS));
185                                     
186                // Label und Passwortfelder einfuegen
187                jPasswordRequest.add(new JLabel("Enter the manger's password:"));
188                                                jPasswordRequest.add(jPasswordField);
189                                     
190                // Passwortabfrage
191                JOptionPane.showMessageDialog (null,
192                                               jPasswordRequest,
193                                               "Manager",
194                                               JOptionPane.QUESTION_MESSAGE);
195                                     
196                // ist eingegebenes Passwort korrekt?
197                if (Office.testPassword(new String(jPasswordField.getPassword()))) 
198                {                                    
199                  // ja -> Buero anlegen
200                  Office o = new Office("Office");
201                  o.attach (new DataBasketImpl());
202                  o.attach (new User("Manager"));
203                  Shop.getTheShop().addSalesPoint (o);
204                }
205                                        
206                // nein -> Info an Nutzer
207                else 
208                  JOptionPane.showMessageDialog(null, "Access denied!");
209              }
210            });
211          
212        // Menueeintraege in der gewuenschten Reihenfolge wieder einfuegen
213        msShopMenu.add (msManagerItem);
214        msShopMenu.add (msSeparator);
215        msShopMenu.add (msLoadItem);
216        msShopMenu.add (msSaveItem);
217        msShopMenu.add (msSeparator);
218        msShopMenu.add (msQuitItem);
219          
220        // Menueleiste zurueckgeben
221        return msMenuBar;
222      }
223       
224       
225     /**
226      * Beendet das Programm ohne den Stand abzuspeichern.
227      */
228      public void quit()
229      {
230        if (Shop.getTheShop().shutdown (false)) {
231          System.exit (0);
232        }
233      }
234       
235     /**
236      * Fügt der Liste registrierter Kunden einen neuen hinzu.
237      */
238      public static void addCustomer(Customer customer)
239      {
240        customerSet.add(customer);
241      }
242       
243     /**
244      * Löscht den angegebenen Kunden aus der Liste registrierter
245      * Kunden heraus.
246      */
247      public static void removeCustomer(Customer customer)
248      {
249        customerSet.remove(customer);
250    
251        // Bestand des Kunden loeschen
252        Shop.getTheShop().removeStock(customer.getCustomerID());
253      }
254       
255     /**
256      * Liefert eine Liste aller registrierter Kunden.
257      */
258      public static Set getAllCustomer()
259      {
260        return customerSet.isEmpty() ? null : customerSet;
261      }
262         
263     /** 
264      * Liefert das Kundenobject zur übergebenen Kundennummer.
265      */
266      public static Customer getCustomerByID(String customerID)
267      {
268        Iterator i = customerSet.iterator();
269        while (i.hasNext()) 
270        {
271          Customer customer = (Customer)i.next();
272          if (customer.getCustomerID().equals(customerID))
273            return customer;
274        }
275        return null;
276      }
277    
278    }