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 }