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 }