Nachdem es dem Kunden möglich ist, Videos auszuleihen, wird es Zeit den Manager einzuführen. Dieser benötigt für seine Arbeit ein Büro. Am wichtigsten ist, für den Manager eine Möglichkeit zu schaffen, das Büro und den Shop wieder zu verlassen. Dies geschieht ähnlich wie beim Counter durch Buttons im Standard-FormSheet. Zur Erstellung dieses FormSheets wird auch hier der FormSheetContentCreator verwendet.

Es wird die Klasse DefaultOfficeFormCreator mit Code gefüllt:


  import sale.*;
  
  public class DefaultOfficeFormCreator extends FormSheetContentCreator
  {
  }
        

Diese Klasse benötigt einen Konstruktor. Als Parameter wird dort das Office übergeben, zu dem der DefaultOfficeFormCreator gehört:


  public DefaultOfficeFormCreator(Office officeOwner) 
  {
    super();
    this.officeOwner = officeOwner;
  }      
        

Die Variable officeOwner muß vor dem Konstruktor deklariert werden:


  private Office officeOwner;
        

Außerdem muß wie schon so oft die Methode createFormSheetContent implementiert werden:


  public void createFormSheetContent(FormSheet fsToCreate)
  {
  }
        

Dann werden alle eventuell vorhandenen Buttons entfernt und der Button zum Schließen des Office eingebaut. In der doAction-Methode der zum Button gehörenden Aktion wird einfach die quit-Methode aufgerufen.

    
  fsToCreate.removeAllButtons();
  fsToCreate.addButton("Close", 1, new sale.Action() 
  {
    public void doAction(SaleProcess p, SalesPoint sp) 
    {
      officeOwner.quit();
    }
  });
        

Im folgenden soll die noch leere Fläche über dem Button gefüllt werden.

Zunächst wird jedoch eine import-Anweisung eingefügt, um die zu verwendenden Swing-Klassen dem Compiler bekannt zu machen:


  import javax.swing.*;
        

Um die gewünschten Daten im FormSheet anzeigen zu können, wird in der Methode createFormSheetContent noch vor der Erzeugung des Buttons ein JPanel erstellt, auf dem die Daten als JLabel plaziert werden können. An diesem wird ein vertikales BoxLayout eingestellt, d.h. die eingefügten Komponenten erscheinen untereinander.


  JPanel jpFSComponent = new JPanel();
  jpFSComponent.setLayout(new BoxLayout(jpFSComponent, BoxLayout.Y_AXIS));
        

Nun kann das Label mit der aktuellen Zeit in das Panel eingefügt werden. Es wird zunächst der aktuelle Shop ermittelt und von diesem das verwendete Timer-Objekt geholt.

Objekte, die das Timer-Interface implementieren, sind in der Lage, das Zeitmanagement eines Shops zu übernehmen. Standardmäßig wird vom Shop ein StepTimer verwendet, der die Zeit nur dann weiterzählt, wenn seine goAhead-Methode aufgerufen wird. Ein zweiter im Framework schon implementierter Timer ist der AutoTimer. An ihm kann ein Zeitintervall eingestellt werden, nach dem die Zeit weitergezählt werden soll. Der zu verwendende Timer kann am Shop über setTimer gesetzt werden.

Timer

Timer sollten immer so implementiert werden, daß sie mit Objekten zusammenarbeiten, die das Timer-Interface implementieren. Ein derartiges Time-Objekt sollte dem Konstruktor des Timers bei der Erzeugung übergeben werden können. Auf diese Weise ist es möglich, mit einem Timer verschiedene Zeitformate zu verwenden. Mit dem Framework werden bereits zwei Formate bereitgestellt: Step benutzt eine einfache Variable vom Typ long, um die Zeit festzuhalten. Dies ist das von Shop standardmäßig verwendete Format. Außerdem steht die Klasse Date zur Verfügung. Ein Objekt dieser Klasse verwaltet ein Datum mit je zwei Stellen für Tag, Monat und Jahr.

In einem Paar aus Timer und Time ist das Time-Objekt verantwortlich für das Speichern der Zeit und (auf Anforderung) für das Weiterzählen um ein gewünschtes Intervall. In der Verantwortlichkeit des Timer-Objektes liegt es, festzulegen, wann und um welches Intervall die Zeit weiterzuschalten ist.

Vom am Shop geholten Timer-Objekt wird mit getTime die aktuelle Zeit geholt, mit einem Kommentar verknüpft und dem Label übergeben:


  jpFSComponent.add(new JLabel(
    "Turn: " + Shop.getTheShop().getTimer().getTime()));    
        

Als nächstes soll das noch vorhandene Geld angezeigt werden. Dazu muß zunächst der Stock geholt werden, der den Münzschacht des Videoverleihs darstellt. Das Interface Stock ist im Paket data definiert, das also importiert werden muß:


  import data.*;  
        

Nun kann der Stock ermittelt werden:


  Stock coinSlot = Shop.getTheShop().getStock("coin slot");  
        

Außerdem wird der DataBasket des Office' benötigt. Um den Datenkorb zu erhalten, wird die Methode createFormSheetContent wie folgt ergänzt:


  DataBasket db = officeOwner.getBasket();          
        

Um die Summe in einen korrekt formatierten Geldbetrag umwandeln zu können, wird noch die vom Shop verwendete Währung benötigt:


  Currency currency = (Currency)Shop.getTheShop().getCatalog("DM");  
        

Nun wird mit Hilfe des Datenkorbes die Methode sumStock auf den Geldbestand angewendet. Diesem wird außerdem ein CatalogItemValue und ein Initialwert übergeben.

Die Klasse CatalogItemValue wird verwendet, um den Wert des CatalogItem festzustellen. In der Standardimplementation ruft ihre getValue-Methode einfach die getValue-Methode des CatalogItems auf und gibt den erhaltenen Wert weiter. Wird ein anderer Wert gewüscht, muß eine angepaßte Unterklasse von CatalogItem verwendet werden. Dies ist hier jedoch nicht der Fall.


  IntegerValue money =
    (IntegerValue)coinSlot.sumStock(db, new CatalogItemValue(),
                                    new IntegerValue(0));
        

Der durch die Aufsummierung erhaltene Wert muß korrekt formatiert werden. Dazu wird die toString-Methode der verwendeten Währung benutzt.

Der so aufgebaute String wird noch mit einem Kommentar versehen und an das JLabel übergeben.


  jpFSComponent.add(new JLabel("Money: " +
                               currency.toString(money)));
        

Nun muß das JPanel noch am FormSheet als zu verwendende Komponente gesetzt werden, dazu wird die Methode setComponent verwendet.


  fsToCreate.setComponent(jpFSComponent);
        

Die Vorbereitungen für das Büro sind abgeschlossen und die Klasse Office kann nun implementiert werden.

Die Klasse Office implementiert das Büro. Hier kann der Manager das Logfile einsehen, den Automaten mit neuen Videos füllen oder Videos aus dem Bestand nehmen. Zuerst wird die Klasse mit ihrem Konstruktor wie folgt erstellt:


  import sale.*;
  import sale.stdforms.*;

  public class Office extends SalesPoint
  {
    public Office(String name)
    {
      super(name);
    }
  }           
        

Der Konstruktor ruft, wie der Konstruktor von Counter, einfach den Konstruktor von SalesPoint auf und übergibt den Namen des Office an ihn.

Das Office soll mit dem gerade erstellten DefaultOfficeFormCreator aufgebaut werden. Es wird eine Methode implementiert, die das FormSheet für das Büro zurückgibt:


  public FormSheet getDefaultFormSheet()
  {
    return new FormSheet("Office",
                         new DefaultOfficeFormCreator(this), false);
  }
        

Außerdem wird in dieser Klasse das Passwort des Managers in der Variable password verwaltet. Diese wird wie folgt deklariert:


  private static String password;    
        

Da die Variable als private deklariert wurde, kann man nicht ohne weiteres von außen auf sie zugreifen. Daher werden zwei weitere Methoden benötigt: eine zum Ändern des Paßworts (setPassword) und eine zum Überprüfen des Paßworts (testPassword).


  public static void setPassword(String password)
  {
    Office.password = password;
  }

  public static boolean testPassword(String password)
  {
    return password.equals(Office.password);
  }    
        

Hier der Quelltext der in diesem Kapitel geänderten Klassen:

Die Rückgabe des Videos Der Manager

last modified on 24.09.2001
by kk15 and ch17