CatalogItems

Items hinzufügen und enfernen

CatalogItems sind die Inhalte eines Katalogs und bilden die Grundlage für die Counting- und StoringStocks.

Ein CatalogItem ist Instanz einer Unterklasse von CatalogItemImpl. Im Konstruktor muss ein Name übergeben werden, optional auch ein Zahlenwert vom Typ IntegerValue. Der Name fungiert als Schlüssel, jedes CatalogItem braucht also einen eindeutigen Bezeichner.

CatalogItems müssen explizit einem Katalog zugewiesen werden. Dafür hat jeder Katalog die Methode add(CatalogItem, DataBasket). Das Entfernen von Items aus einem Katalog geschieht analog mit remove(CatalogItem, DataBasket) oder remove(String, DataBasket). Die Methode muss in dabei in einem try catch Block stehen. Das entfernte Item ist zugleich Rückgabewert.

Die Items können einen ganz unterschiedlichen Aufbau haben, man muss sich nicht auf einen speziellen Typ von Einträgen festlegen. (vergleiche auch Type1Item und Type2Item im Beispiel).
import sale.Shop;

public class MainClass {

  public static void main(String[] args) {
    SalesPointApplication spa = new SalesPointApplication();
    Shop.setTheShop(spa);
    spa.start();
    testData();
  }

  private static void testData() {
    ApplicationCatalog c = SalesPointApplication.getApplicationCatalog();
    c.add(new Type1Item("Typ1", 100));
    c.add(new Type2Item("Typ2", "next Generation", false, 180));
    Type2Item ciLimited = new Type2Item("Typ2-limited", "next Generation limited", true, 500);
    c.add(ciLimited);
    //Ausgabe der Itemschlüssel von Katalog c
    System.out.println(c.keySet(null));
    c.remove("Typ1");
    c.remove(ciLimited);
    System.out.println(c.keySet(null));
  }
}
import sale.Shop;

public class SalesPointApplication extends Shop {

  private static final String KAT_KATALOGNAME = "Hauptkatalog";

  public SalesPointApplication() {
    super();
    addCatalog(new ApplicationCatalog(KAT_KATALOGNAME));
  }

  public void quit() {
    if (shutdown(false)) {
      System.exit(0);
    }
  }

  public static ApplicationCatalog getApplicationCatalog() {
    return (ApplicationCatalog)getTheShop().getCatalog(KAT_KATALOGNAME);
  }
}
import data.ooimpl.CatalogImpl;
import data.CatalogItem;

public class ApplicationCatalog extends CatalogImpl {

  public ApplicationCatalog(String name) {
    super(name);
  }

  public void add(CatalogItem item) {
    add(item, null);
  }

  public void remove(String name) {
    try {
      remove(name, null);
    }
    catch (Exception e) {System.err.println(e.getMessage());}
  }

  public void remove(CatalogItem item) {
    try {
      remove(item, null);
    }
    catch (Exception e) {System.err.println(e.getMessage());}
  }
}
import data.ooimpl.CatalogItemImpl;
import data.IntegerValue;

public class Type1Item extends CatalogItemImpl {

  private int value;

  public Type1Item(String name, int value) {
    super(name, new IntegerValue(value));
    this.value = value;
  }

  protected CatalogItemImpl getShallowClone() {
    return new Type1Item(new String(getName()), value);
  }
}
import data.ooimpl.CatalogItemImpl;
import data.IntegerValue;

public class Type2Item extends CatalogItemImpl {

  private int value;
  private String description;
  private boolean isLimitedEdition;

  public Type2Item(String name, String description, boolean isLimitedEdition, int value) {
    super(name, new IntegerValue(value));
    this.description = description;
    this.isLimitedEdition = isLimitedEdition;
  }

  protected CatalogItemImpl getShallowClone() {
    return new Type2Item(new String(getName()), description, isLimitedEdition, value);
  }
}


Geschachtelte Kataloge

Auch Kataloge selbst können als CatalogItems in einem übergeordneten Katalog enthalten sein. Allerdings wird beim Versuch, Items zu diesen Unterkatalogen hinzuzufügen oder aus ihnen zu entfernen, eine NotEditableException geworfen. Abhilfe bietet das Überschreiben der Methode isEditable() eines jeden Unterkataloges, so dass stets true zurückgeliefert wird.
import sale.Shop;

public class MainClass {

  public static void main(String[] args) {
    SalesPointApplication spa = new SalesPointApplication();
    Shop.setTheShop(spa);
    spa.start();
    testData();
  }

  private static void testData() {
    ApplicationCatalog c = SalesPointApplication.getApplicationCatalog();
    SubCatalog sc = SalesPointApplication.getSubCatalog();
    c.add(sc);
    //ohne die überschriebene isEditable()-Methode würde hier eine notEditableException geworfen
    sc.add(new Type1Item("Typ1", 100));
    System.out.println("Inhalt von ApplicationCatalog c: " + c.keySet(null));
    System.out.println("Inhalt von SubCatalog sc: " + sc.keySet(null));
  }
}
import sale.Shop;

public class SalesPointApplication extends Shop {

  private static final String KAT_KATALOGNAME = "Hauptkatalog";
  private static final String KAT_UNTERKATALOGNAME = "Unterkatalog";

  public SalesPointApplication() {
    super();
    addCatalog(new ApplicationCatalog(KAT_KATALOGNAME));
    addCatalog(new SubCatalog(KAT_UNTERKATALOGNAME));		
  }

  public void quit() {
    if (shutdown(false)) {
      System.exit(0);
    }
  }

  public static ApplicationCatalog getApplicationCatalog() {
    return (ApplicationCatalog)getTheShop().getCatalog(KAT_KATALOGNAME);
  }
	
  public static SubCatalog getSubCatalog() {
    return (SubCatalog)getTheShop().getCatalog(KAT_UNTERKATALOGNAME);
  }	
}
import data.ooimpl.CatalogImpl;
import data.CatalogItem;

public class SubCatalog extends CatalogImpl {

  public SubCatalog(String name) {
    super(name);
  }

  public void add(CatalogItem item) {
    add(item, null);
  }

  public boolean isEditable() {
    return true;
  }
}