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

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

Transcript of Universität zu Lübeck Institut für Informationssysteme Die Persistenzschicht Interfaces, Muster...

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; }