23
Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Embed Size (px)

Citation preview

Page 1: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Universität zu LübeckInstitut für Informationssysteme

Die Persistenzschicht

Interfaces, Muster und DOM

Page 2: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Persistenzschicht

• Speicherung und Laden von fachlichen Objekten

• Mapping zwischen Objekten und „XML“

• kein Wissen über die Anwendungsschicht, Präsentationsschicht

Page 3: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Design der Persistenzschicht

• Zugriff von aussen nur über eine Klasse -> Fassade

• Fassade wird zunächst als Interface modelliert

• Implementierung als Singleton d.h. nur ein Examplar der Klasse kann erzeugt werden

• XML-Objekte werden als DOMs persistent abgelegt (hier: mittels Infonyte)

Page 4: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Entwurfsmuster - Singleton

• Ziel: von einer Klasse existiert nur ein einziges Objekt -> zentraler Zugriffspunkt

• Beschreibung: private-Konstruktor verhindert unkontrolliertes erzeugen von Objekte mittels new

• mittels statischer Methode erhält man Referenz auf einziges Objekt.

Page 5: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Implementierung des Singleton

public class Singleton{private static Singleton instance = null;private int datum;

private Singleton(){}public static Singleton getInstance(){

if(instance == null)instance = new Singleton();

return instance;}public void setDatum(int d){this.datum = d;}public int getDatum(){ return datum;}

}

Page 6: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Entwurfsmuster Fassade

• Ziel: soll Abhängigkeiten zwischen Klassen reduzieren -> Subsystem wird durch einheitliche Schnittstelle gekapselt.

Fassade

Klient KlientKlient

Klient

KlientKlient

Subsystem Subsystem

Page 7: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Interface IPersistentMarktplatz

• commitBestellung(IBestellung bestellung);

• …

• commitPerson(IPerson person);

• IBestellung getBestellung(String bestellungID);

• …

• IMarktteilnehmer getMarktteilnehmer(String marktteilnehmerID);

• String getMarktteilnehmerID();

• Vector getBestellungen();

• removeBestellung(String bestellungsID);

• …

• removeMarktteilnehmer(String marktteilnehmerID);

Page 8: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Speichern von Objekten

• Mapping von Objekten (Person, …,Bestellung) auf XML-Objekte (DOM)

Page 9: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

DOM

• generisches Objektmodell für XML-Dokumente

• tree of nodes – enthält und erhält Daten und Struktur eines XML-Dokuments

• dieser tree of nodes kann mittels DOM API modifiziert und bearbeitet werden

• DOM ist Sammlung von Interfaces

• Siehe Infonyte DB API

Page 10: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

DOM

• Im DOM ist alles ein Knoten (Node)

• Das gesamte XML-Dokument, egal wie einfach wird in einen tree of nodes umgewandelt

• Der Wurzelknoten eines DOMs ist immer ein document object

Page 11: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

DOM

<?xml version=“1.0“?>

<addressbook>

</addressbook>

<person>

</person>

<person>

</person>

<name>Henrike S.</name>

<email>schuhart@ifis….</email>

<name>...</name>

<email>…</email>

document

addressbook

person

person

name=“Henrike S.“

email=“schuhart@..“

name=“…“

email=“…“

Page 12: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Wichtige DOM APIs

<<interface>> Node

int getNodeType();String getNodeValue();NodeList getChildNodes();boolean hasChildNodes();Node removeChild(Node oldChild);

<<interface>> NodeList

int getLength();Node item(int i);

<<interface>> Element

public NodeListgetElementsByTagName(String tag);String getAttribute(String name);Attr getAttributeNode(String name);String getTagName();

<<interface>> Document

Element getDocumentElement();Attr createAttribute(String name);Element createElement(String tagName);…

Page 13: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Das Node InterfaceInterface nodeName nodeValue attributes

Attr name of attribute

value of attribute null

Comment "#comment"

content of the comment

null

Document "#document"

null null

Text “#text“ content of the text node

null

Element tag name null NamedNodeMap

Page 14: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Wichtiges zum DOM

• Element-, Attribut-, Text-Knoten werden immer über den Dokumentknoten erzeugt und erst anschließend als Kind an ihren eigentlichen Elternknoten gehängt

• In <name>Henrike S.</name> wird ein Element „name“ mit einem Textknoten als Kind erzeugt, der Textknoten hat als Wert „Henrike S.“

• Alle Nodes eines Dokuments können nicht einfach in ein anderes übernommen werden ->import erforderlich

Page 15: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

DOM Bsp.

• Document document=…• Element person =

document.createElement(“person“);• document.appendChild(element);• Attr id = document.createAttribute(“ID“);• id.setValue(“123“);• element.setAttributeNode(id);• Element name = document.createElement(“name“);• person.appendChild(name);• Text textName =

document.createTextNode(“Henrike“);• name.append(textName);

Page 16: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Mapping von IBestellung ->Element(bestellung) (Bsp.)

• public static Node map(IBestellung bestellung, Document document)• {• Element element = document.createElement("bestellung");• if(bestellung.getBeschreibung()!=null)• createElement("beschreibung",bestellung.getBeschreibung(),document,element);

• Vector positionen = bestellung.getPosition();• for(int i=0; i<positionen.size();i++)• {• Element position = document.createElement("position");• element.appendChild(position);• map((IBestellposition)positionen.get(i),document,position);• }

• element.setAttribute("bestellungsID",bestellung.getBestellungsID());•

element.setAttribute("anbieterID",bestellung.getAnbieter().getMarktteilnehmer().getMarktteilnehmerID());

• element.setAttribute("kaeuferID",bestellung.getKaeufer().getMarktteilnehmer().getMarktteilnehmerID());

• return element;• }

Page 17: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Arbeiten mit PDOMs und Infonyte

• einfache Hilfsklasse: Util.java

• wichtig: liefert PDOMs, pdom.getDocument() liefert das dazugehörige DOM-Objekt

• wichtig: immer Referenz auf PDOM und DOM behalten!!!

• Infonyte APIs und Dokumentation

Page 18: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Laden von Objekten

• Mapping von XML-Objekten (DOMs) auf Java-Objekte der Klassen (Person, …,Bestellung)

Page 19: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Mapping von Element(bestellung) ->Bestellung (Bsp.)

• public static IBestellung toBestellung(Element element)• {• IBestellung bestellung;• String bestellungsID = element.getAttribute("bestellungsID");• String anbieterID = element.getAttribute("anbieterID");• String kaeuferID = element.getAttribute("kaeuferID");• bestellung = new BestellungProxy(bestellungsID,anbieterID,kaeuferID);

• String beschreibung = getContent("beschreibung",element);• if(beschreibung!=null)• bestellung.setBeschreibung(beschreibung);

• NodeList nl = getChilds("position",element);• for(int i=0; i<nl.getLength();i++)• {• Element position = (Element)nl.item(i);• bestellung.addPosition(toBestellposition(position,bestellung));• }• • return bestellung;• }

Page 20: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Laden von Objekten

• Was passiert, wenn ich Anbieter mit Referenzen auf Katalog lade?

• Problem: theoretisch kann durch Laden eines Objekts ganze Datenbank geladen werden

• Lösung: Proxy

Page 21: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Entwurfsmuster Proxy

• Ziel:

Einführung eines Stellvertreterobjekts, um Zugriff auf ein Objekt zu kontrollieren

• Beschreibung:

Klient benutzt Proxy statt Original. Proxy verwaltet Referenz auf Original und leitet Anforderungen vom Klient geeignet weiter.

Page 22: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Entwurfsmuster Proxy

Klient Subject

+request()

Proxy

+request()

RealSubject

+request()

request(){ realSubject.request();}

Page 23: Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster und DOM

Entwurfsmuster Proxy (Bsp.)

public class BestellungProxy implements IBestellung{

private Bestellung bestellung; private String anbieterID; private String kaeuferID;

public BestellungProxy(String bestellungsID, String anbieterID, String kaeuferID)

{ this.bestellung = new

Bestellung(bestellungsID,null,null,null); this.anbieterID = anbieterID; this.kaeuferID = kaeuferID; } public IAnbieter getAnbieter() {

IAnbieter anbieter = this.bestellung.getAnbieter(); if(anbieter!=null) return anbieter; anbieter =

PersistentMarktplatz.getInstance().getAnbieter( this.anbieterID);

this.bestellung.setAnbieter(anbieter); return anbieter; }

public class Bestellung implements IBestellung{

String bestellungsID; IAnbieter anbieter; IKaeufer kaeufer; ... public Bestellung(String bestellungsID,

IAnbieter anbieter, IKaeufer kaeufer, IBestellposition bestellposition)

{ this.bestellungsID = bestellungsID; this.anbieter = anbieter; this.kaeufer = kaeufer; this.position = new Vector(); if(bestellposition!=null) this.position.add(bestellposition); } public IAnbieter getAnbieter() { return this.anbieter; }