1 / 23

Die Persistenzschicht

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. Design der Persistenzschicht.

thuong
Download Presentation

Die Persistenzschicht

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Die Persistenzschicht Interfaces, Muster und DOM

  2. Persistenzschicht • Speicherung und Laden von fachlichen Objekten • Mapping zwischen Objekten und „XML“ • kein Wissen über die Anwendungsschicht, Präsentationsschicht

  3. 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)

  4. 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.

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

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

  7. 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);

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

  9. 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

  10. 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

  11. DOM <?xml version=“1.0“?> document <addressbook> addressbook <person> person <name>Henrike S.</name> name=“Henrike S.“ <email>schuhart@ifis….</email> </person> email=“schuhart@..“ <person> person <name>...</name> name=“…“ <email>…</email> </person> email=“…“ </addressbook>

  12. 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 NodeList getElementsByTagName(String tag); String getAttribute(String name); Attr getAttributeNode(String name); String getTagName(); <<interface>> Document Element getDocumentElement(); Attr createAttribute(String name); Element createElement(String tagName); …

  13. Das Node Interface

  14. 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

  15. 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);

  16. 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; • }

  17. 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

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

  19. 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; • }

  20. 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

  21. 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.

  22. Entwurfsmuster Proxy Klient Subject +request() request(){ realSubject.request(); } Proxy +request() RealSubject +request()

  23. publicclass 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() { returnthis.anbieter; } Entwurfsmuster Proxy (Bsp.)

More Related