Datenbank-Synchronisation Bericht zur Master Thesis Abstract Die Konfigurationsdaten von Geschäftssystemen müssen zwischen den Datenbanken der Systemumgebungen für Entwicklung, Integration und Produktion abgeglichen werden. Ziel dieser Arbeit ist es, ein Tool zu entwickeln, mit dem die Synchronisation der Konfigurationsdaten einfach, fehlerfrei und nachvollziehbar durchgeführt werden kann. Schlüsselwörter: Datenbank, Synchronisation, Java, Rich-Client Master Thesis: MT-10-02.09 Klasse: MAS-IT-10-02 Datum: 23.03.2011 Student: Thomas Schenker XpertCenter AG, Seftigenstrasse 7, 3007 Bern 031 389 89 53 [email protected] Betreuer: Joachim Brandt XpertCenter AG, Seftigenstrasse 7, 3007 Bern 031 389 89 55 [email protected] Experte: Pierre Fierz [email protected] Bericht zur Master Thesis Inhaltsverzeichnis 1 2 3 4 Einleitung ....................................................................................................................... 5 1.1 Zweck dieses Dokuments ....................................................................................... 5 1.2 Zielpublikum ............................................................................................................ 5 1.3 Referenzierte Dokumente ....................................................................................... 5 Analyse .......................................................................................................................... 6 2.1 Vorgehen ................................................................................................................ 6 2.2 Anwendungsfälle ..................................................................................................... 6 2.3 Funktionale Anforderungen ..................................................................................... 6 2.4 Nicht-Funktionale Anforderungen ............................................................................ 7 2.5 System-Kontext ....................................................................................................... 7 2.6 Fachklassenmodell ................................................................................................. 8 2.7 Fachklassenmodell mit Änderungsverwaltung ......................................................... 9 2.8 Ablaufmodell der Synchronisation ..........................................................................10 Architektur und Grob-Design .........................................................................................13 3.1 Vorgehen ...............................................................................................................13 3.2 Applikations-Framework .........................................................................................13 3.3 Schichtenmodell .....................................................................................................14 3.3.1 Einführung.......................................................................................................14 3.3.2 Beschreibung des Schichtenmodells ...............................................................14 3.4 Verteilungsmodell ...................................................................................................16 3.5 Komponentenmodell ..............................................................................................17 3.5.1 Einführung.......................................................................................................17 3.5.2 Beschreibung des Komponentenmodells ........................................................18 Detail-Design und Implementation .................................................................................22 4.1 Die Hauptseite der Applikation ...............................................................................22 4.1.1 GUI-Design .....................................................................................................22 4.1.2 Implementation................................................................................................23 4.2 Benutzeridentifikation .............................................................................................23 4.2.1 Detail-Analyse .................................................................................................23 4.2.2 Detail-Design ..................................................................................................23 4.2.3 Klassenmodell .................................................................................................24 4.2.4 GUI .................................................................................................................24 4.2.5 GUI-Steuerung ................................................................................................25 4.2.6 Applikations-Steuerung ...................................................................................26 4.2.7 Geschäftsobjekt ..............................................................................................26 4.2.8 Datenbank-Zugriff mit O/R-Mapper .................................................................26 4.2.9 Datenbank.......................................................................................................26 4.3 Synchronisation......................................................................................................27 Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 2/54 Bericht zur Master Thesis 4.3.1 Detail-Analyse des Modells der Konfigurationsdaten .......................................27 4.3.2 Detail-Design ..................................................................................................27 4.3.3 Klassenmodell .................................................................................................28 4.3.4 GUI .................................................................................................................29 4.3.5 GUI-Steuerung ................................................................................................32 4.3.6 Applikations-Steuerung ...................................................................................32 4.3.7 Geschäfts-Komponente zur Differenz-Berechnung .........................................33 4.3.8 Modell der Differenz ........................................................................................35 4.3.9 Geschäfts-Komponente zur Differenz-Ausführung ..........................................36 4.3.10 Geschäftsobjekte ............................................................................................38 4.3.11 Datenbank-Zugriff mit JDBC............................................................................38 4.3.12 Datenbank-Zugriff mit O/R-Mapper .................................................................38 4.3.13 Datenbank.......................................................................................................39 4.4 5 4.4.1 Datenmodell ....................................................................................................40 4.4.2 GUI .................................................................................................................41 4.4.3 GUI-Steuerung ................................................................................................43 4.4.4 Applikations-Steuerung ...................................................................................44 4.4.5 Geschäftsobjekte ............................................................................................45 4.4.6 Datenbank-Zugriff mit O/R-Mapper .................................................................45 4.4.7 Datenbank.......................................................................................................45 Test ...............................................................................................................................46 5.1 Konzept ..................................................................................................................46 5.2 Testumgebung .......................................................................................................46 5.3 Testdaten ...............................................................................................................47 5.3.1 Testdaten für die Synchronisation ...................................................................47 5.3.2 Testdaten für das Datenmodell von DB-Sync ..................................................48 5.4 6 Synchronisationsprotokoll ......................................................................................40 Durchführung der Tests..........................................................................................49 5.4.1 Unit-Tests........................................................................................................49 5.4.2 Integrations-Tests ...........................................................................................49 Entwicklungs-Umgebung ...............................................................................................50 6.1 Entwicklungs-Rechner............................................................................................50 6.2 Rich-Client-Framework „CaptainCasa Enterprise Client“ ........................................50 6.2.1 Installation .......................................................................................................50 6.2.2 Lizenz .............................................................................................................50 6.3 Software-Entwicklungsumgebung ..........................................................................50 6.3.1 MyEclipse........................................................................................................50 6.3.2 Tomcat ............................................................................................................50 6.3.3 Entwicklungswerkzeuge von CaptainCasa Enterprise Client ...........................50 6.4 Datenbank ..............................................................................................................50 Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 3/54 Bericht zur Master Thesis 6.5 7 Tools ......................................................................................................................51 6.5.1 AQT ................................................................................................................51 6.5.2 Dia ..................................................................................................................51 6.5.3 JUDE ..............................................................................................................51 Zusammenfassung ........................................................................................................52 7.1 Resultat ..................................................................................................................52 7.2 Ablauf und Aufwand ...............................................................................................52 7.3 Schlusswort ............................................................................................................52 Anhang .................................................................................................................................53 A – Glossar .......................................................................................................................53 B – Quellenverzeichnis .....................................................................................................54 Abbildungsverzeichnis Abbildung 1: Systemkontext-Diagramm................................................................................. 7 Abbildung 2: Fachklassen-Diagramm .................................................................................... 8 Abbildung 3: Fachklassen-Diagramm mit Änderungsverwaltung ........................................... 9 Abbildung 4: Aktivitätsdiagramm zum Anwendungsfall "Daten synchronisieren" ..................11 Abbildung 5: Schichtenmodell ..............................................................................................15 Abbildung 6: Verteilungsmodell ............................................................................................17 Abbildung 7: Komponentenmodell Synchronisation ..............................................................20 Abbildung 8: Komponentenmodell Sync-Protokoll und Benutzeridentifikation (Login) ...........21 Abbildung 9: Hauptseite .......................................................................................................22 Abbildung 10: Statuszeile mit Erfolgs-, Warn- und Fehlermeldung, Popup mit Details ..........23 Abbildung 11: Klassendiagramm Benutzeridentifikation .......................................................24 Abbildung 12: Titelzeile mit dem angemeldeten Benutzer ....................................................24 Abbildung 13: Login-Seite ....................................................................................................25 Abbildung 14: Tabelle der Benutzeridentifikation ..................................................................26 Abbildung 15: Fachklassendiagramm Konfigurationsdaten-Modell .......................................27 Abbildung 16: Klassendiagramm Synchronisation ................................................................28 Abbildung 17: GUI Synchronisation ......................................................................................29 Abbildung 18: GUI Synchronisation: Auswahl der Konfigurations-Daten ..............................29 Abbildung 19: GUI Synchronisation: Anzeige der berechneten Differenzen..........................30 Abbildung 20: GUI Synchronisation: Auswahl der Differenzen..............................................31 Abbildung 21: GUI Synchronisation: Differenzen kopieren ...................................................31 Abbildung 22: GUI Synchronisation: Differenzen löschen .....................................................32 Abbildung 23: Klassendiagramm Synchronisations-Steuerungs-Komponente ......................32 Abbildung 24: Klassendiagramm Differenz-Berechnungs-Komponente ................................33 Abbildung 25: Klassendiagramm der Differenz .....................................................................35 Abbildung 26: Klassendiagramm Differenz-Ausführungs-Komponente .................................36 Abbildung 27: Klassendiagramm der Geschäftsobjekte ........................................................38 Abbildung 28: Klassendiagramm der Entitäts-Klassen für die Konfig-Daten .........................39 Abbildung 29: Tabellen des Konfigurationsdaten-Modells ....................................................39 Abbildung 30: GUI Synchronisations-Protokoll .....................................................................41 Abbildung 31: GUI Synchronisations-Protokoll: Auswahl der Konfigurations-Daten ..............42 Abbildung 32: GUI Synchronisations-Protokoll: Weitere Suchkriterien ..................................42 Abbildung 33: GUI Synchronisations-Protokoll: Anzeige der Einträge ..................................43 Abbildung 34: GUI Synchronisations-Protokoll: Kompletter Eintrag ......................................43 Abbildung 35: Klassendiagramm Steuerungs-Komponente Synchronisations-Protokoll .......44 Abbildung 36: Tabelle des Synchronisations-Protokolls........................................................45 Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 4/54 Bericht zur Master Thesis 1 Einleitung 1.1 Zweck dieses Dokuments Dieses Dokument ist dient als Abschlussbericht zur Master Thesis. Es beschreibt das im Rahmen der Master Thesis erstellte Tool mit dem Namen „DB-Sync“. Abgrenzung: Die Aufgabenstellung und die Anforderungen an DB-Sync sind im Pflichtenheft [Ref1] dokumentiert. 1.2 Zielpublikum Dieses Dokument richtet sich an: Pierre Fierz, Experte der SWS Joachim Brandt, Auftraggeber und Betreuer der XpertCenter AG alle Personen, die an dieser Master Thesis interessiert sind 1.3 Referenzierte Dokumente Die hier aufgeführten Dokumente sind in der ZIP-Datei mit den Anhängen zu dieser Master Thesis enthalten. Referenz Dokument [Ref1] Pflichtenheft, 14.11.10 [Ref2] Entwicklungsjournal [Ref3] Testprotokoll Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 5/54 Bericht zur Master Thesis 2 Analyse 2.1 Vorgehen Für die Analyse wurde im Pflichtenheft [Ref1] eine detaillierte Beschreibung der Ist-Situation erstellt (Pflichtenheft Kapitel 2.3). Daraus wurden die Anwendungsfälle (Pflichtenheft Kapitel 3.2) abgeleitet und die Anforderungen definiert (Pflichtenheft Kapitel 3.3 und 3.4). In diesem Dokument werden die Anwendungsfälle (Kapitel 2.2) und die Anforderungen (Kapitel 2.3) nochmals als Kurzreferenz aufgeführt. Angelehnt an das Buch „Analyse und Design mit UML“ [Lit1], werden in den weiteren Kapiteln der System-Kontext, das Fachklassenmodell und das Ablaufmodell einzelner Anwendungsfälle beschrieben. 2.2 Anwendungsfälle Der Haupt-Anwendungsfall „Synchronisieren“ besteht aus den Anwendungsfällen: UC-S1: Änderungen an den Daten im Änderungs-Protokoll eintragen UC-S2: Daten synchronisieren UC-S3: Synchronisation rückgängig machen UC-S4: Synchronisation der Daten im Änderungs-Protokoll eintragen Der Haupt-Anwendungsfall „Administrieren“ besteht aus den Anwendungsfällen: UC-A1: Umgebung konfigurieren UC-A2: Tabelle konfigurieren UC-A3: Synchronisations-Set konfigurieren 2.3 Funktionale Anforderungen FA-1 Benutzer-Identifikation Alle 1 – MUSS FA-2 Benutzer-Verwaltung Alle 3 – ERW. FA-3 Benutzeroberfläche Synchronisation S2+3 1 – MUSS FA-4 Synchronisations-Protokoll S3 1 – MUSS FA-5 Synchronisations-Protokoll erweitert S3 2 – KANN FA-6 Synchronisation mit SynchronisationsProtokoll rückgängig machen im Tool S3 3 – ERW. FA-7 Änderungsverwaltung S1, S4 3 – ERW. FA-8 Konfiguration A1-3 1 – MUSS FA-9 Konfigurations-Daten A1-3 1 – MUSS FA-10 Benutzeroberfläche Administration A1-3 2 – KANN FA-11 Sprache der Benutzeroberfläche Alle 1 – MUSS Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 6/54 Bericht zur Master Thesis 2.4 Nicht-Funktionale Anforderungen NFA-1 Applikations-Framework 1 - MUSS NFA-2 Datenbank-Unterstützung DB2 1 - MUSS NFA-3 Datenbank-Unterstützung andere 2 - KANN NFA-4 Betriebsystem-Unterstützung 1 - MUSS NFA-5 Kein Release für Tabellen- Änderungen 2 - KANN 2.5 System-Kontext Mit folgenden Akteuren und Systemen interagiert das System „DB-Sync“: Der Akteur „Entwickler“ ist der einzige Benutzer. Er bedient die grafische Oberfläche des Systems. Das System kommuniziert mit den Datenbank-Systemen die auf den Datenbankservern installiert sind. Die Kommunikation besteht aus SQL-Befehlen für die CRUD-Operationen. Das System liest die User-Id des Benutzers aus dem Betriebssystem des ClientRechners aus, auf dem es ausgeführt wird. Abbildung 1: Systemkontext-Diagramm Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 7/54 Bericht zur Master Thesis 2.6 Fachklassenmodell Eine Fachklasse beschreibt „etwas, über das die Fachleute im Zusammenhang mit dem System reden“ – also z.B. eine Person die das System benutzt, Dokumente die das System produziert sowie Abläufe, Tätigkeiten und Konzepte. Ein Fachklassenmodell zeigt die grundsätzlichen fachlichen Zusammenhänge auf – ohne Details. Das nachstehende Fachklassenmodell beschreibt das System „DB-Sync“. Es berücksichtigt sämtliche Anwendungsfälle – auch diejenigen die im System nicht umgesetzt werden, da für sie keine Muss-Anforderung definiert ist. Abbildung 2: Fachklassen-Diagramm Beschreibung der Fachklassen: Fachklasse Beschreibung Entwickler Der Entwickler benutzt das System und führt auch die Aktivitäten ausserhalb des Systems durch. Änderung an Daten in der Datenbank Eine Änderung an Daten in einer Datenbank besteht aus dem Einfügen, dem Verändern oder dem Löschen eines oder mehrerer Datensätze in einer Tabelle in einer bestimmten Umgebung. Synchronisations- Ein Synchronisations-Set dient zur Gruppierung von Tabellen, die z.B. Set zu einer Geschäftsanwendung gehören. Es kann aber auch eine Querschnittsgruppierung von bestimmten Tabellen über alle Geschäftsanwendungen abbilden. Dadurch kann eine Tabelle zu mehr als einem Synchronisations-Set zugeordnet sein. Tabelle Die Tabelle enthält die Daten, welche verändert wurden und synchronisiert werden sollen. Umgebung Eine Umgebung dient zur Auswahl der Quelle und des Ziels für die Synchronisation einer Tabelle. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 8/54 Bericht zur Master Thesis ÄnderungsProtokoll Im Änderungs-Protokoll werden sowohl die an den Daten vorgenommenen Änderungen als auch die Synchronisation dieser Änderungen zwischen den verschiedenen Umgebungen festgehalten. Siehe auch Anwendungsfälle UC-S1 und UC-S4. Synchronisation Die Synchronisation ist der Vorgang, bei dem die Daten in einer Tabelle A einer Umgebung X mit den Daten in der gleichen Tabelle A in einer anderen Umgebung Y verglichen und die Differenzen so bereinigt werden, dass die Daten in beiden Tabellen genau gleich sind. Dabei müssen nicht alle Daten in der Tabelle synchronisiert werden – welche das sind, bestimmt der Benutzer. Synchronisations- Jede Synchronisation wird vom System im Synchronisations-Protokoll Protokoll eingetragen. Falls der Entwickler eine Synchronisation rückgängig machen muss, kann er im Synchronisations-Protokoll nachschauen und findet dort die ausgeführten SQL-Statements. 2.7 Fachklassenmodell mit Änderungsverwaltung Das nachstehende Fachklassenmodell berücksichtigt zusätzlich die Anforderung FA-7 „Änderungsverwaltung“. Die Änderungsverwaltung ist eine Erweiterung, die grossen Einfluss auf das System haben wird. Deshalb wird hier ihr Einfluss auf das Fachklassenmodell genauer betrachtet, obwohl sie im System nicht umgesetzt wird. Abbildung 3: Fachklassen-Diagramm mit Änderungsverwaltung Beschreibung des Einflusses der Änderungsverwaltung: Die Änderungsverwaltung ist Teil des Systems und ersetzt das vom System lösgelöste Änderungs-Protokoll. Das hat grossen Einfluss auf die Arbeitsweise des Entwicklers. Die Unterschiede in der Arbeitsweise sind in folgender Tabelle aufgeführt: Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 9/54 Bericht zur Master Thesis Arbeitsweise mit Änderungs-Protokoll Arbeitsweise mit Änderungsverwaltung Der Entwickler trägt jede Änderung an den Daten im Protokoll ein. Welche Daten sich wie geändert haben, hält er (wenn überhaupt) nur mit einer groben Beschreibung in Textform fest. Der Entwickler zeichnet jede Änderung an den Daten mit der Änderungsverwaltung auf. Die Aufzeichnung geschieht mit einer simulierten Synchronisation, bei der die erzeugten SQL-Statements aber nicht ausgeführt sondern gespeichert werden. So werden die Änderungen an den Daten vollständig festgehalten. Der Entwickler schaut im Protokoll nach, welche Synchronisationen er durchführen muss. Dazu wird im Protokoll mit Einfärbung und Anweisungen in Textform (z.B. „Produktion erst mit Release XY“) gearbeitet. Der Entwickler schaut in der Änderungsverwaltung nach, welche Synchronisationen anstehen. Der Aufzeichner einer Änderung kann die Synchronisation dieser Änderung z.B. für die Produktions-Umgebung sperren. Der Entwickler trägt jede Synchronisation einer Änderung im Protokoll ein. Bei der Synchronisation wählt der Entwickler die betroffenen Differenzen aufgrund der Beschreibung im Protokoll aus. Der Entwickler lässt die Synchronisation einer Änderung von der Änderungsverwaltung durchführen. Dabei werden die vorher aufgezeichneten SQL-Statements ausgeführt. Wenn der Entwickler eine FehlSynchronisation rückgängig machen will, schaut er im vom System erzeugten Synchronisations-Protokoll nach, was genau geändert wurde. Er kann dann den Fehler durch eine Gegensynchronisation oder eine manuelle Änderung korrigieren. Eine Fehl-Synchronisation ist weitestgehend ausgeschlossen. Es kann aber vorkommen, dass ein Fehler beim Aufzeichnen einer Änderung gemacht wurde und die Änderung bereits synchronisiert wurde. Der Aufzeichner der fehlerhaften Änderung kann sich vom System eine „Gegen-Änderung“ erzeugen lassen und diese dann in die betroffenen Umgebungen synchronisieren. Fazit: Mit Hilfe der Änderungsverwaltung könnte die Synchronisation der Daten komplett unter der Kontrolle des Systems erfolgen. Dadurch könnte die Synchronisation noch sicherer und noch einfacher durchgeführt werden. Der Aufwand für die Implementierung der Änderungsverwaltung ist allerdings beträchtlich. Vor dem Entscheid, diese Erweiterung umzusetzen, müssen Aufwand und Nutzen also genau abgewogen werden. 2.8 Ablaufmodell der Synchronisation Der zentrale Anwendungsfall, den das System unterstützen muss, ist die Synchronisation der Daten. Der Ablauf der Synchronisation ist bereits in der Dokumentation zum Anwendungsfall UC-S2 „Daten synchronisieren“ beschrieben, wird hier aber zum besseren Verständnis zusätzlich mit Hilfe eines Aktivitätsdiagramms visualisiert. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 10/54 Bericht zur Master Thesis Abbildung 4: Aktivitätsdiagramm zum Anwendungsfall "Daten synchronisieren" Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 11/54 Bericht zur Master Thesis Bemerkungen zum Aktivitätsdiagramm: Im Diagramm ist der Standard-Ablauf beschreiben. Es gibt allerdings keine fachlich begründeten Alternativ-Abläufe. Das einzige was den Ablauf „stören“ könnte (von Systemfehlern natürlich abgesehen) ist der Abbruch durch den Benutzer. Der Benutzer hat nach beinahe jeder Aktivität die Möglichkeit den Ablauf abzubrechen. Dies ist im Diagramm mit dem gestrichelten Rahmen dargestellt. Ein Abbruch kann dazu führen, dass Daten nicht oder nur teilweise synchronisiert sind. Zusammenfassung: Die Synchronisation einer Tabelle beinhaltet die folgenden Kern-Aktivitäten: 1. Erkennen und Anzeigen der Differenzen zwischen den Daten in der Quell- und ZielUmgebung durch das System. 2. Auswahl der zur synchronisierenden Differenzen durch den Benutzer. 3. Auslösen der Synchronisation der ausgewählten Differenzen durch den Benutzer. 4. Erstellen und Ausführen der Datenbank-Befehle zum Einfügen, Kopieren und Löschen der ausgewählten Daten durch das System. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 12/54 Bericht zur Master Thesis 3 Architektur und Grob-Design 3.1 Vorgehen Wie schon im Pflichtenheft definiert, wird zuerst die Architektur und das Grob-Design der Applikation erstellt und in diesem Kapitel dokumentiert. Als erstes wird die Architektur des verwendeten Applikations-Frameworks beschrieben. Angelehnt an das Buch „Analyse und Design mit UML“ [Lit1] und die Skripte [Lit2] und [Lit3] zum Thema „Architektur und Design“, werden in den folgenden Unterkapiteln die Architektur und das Grob-Design in Form des Schichtenmodells, des Verteilungsmodells und des Komponentenmodells beschrieben. Aus den Komponenten werden Arbeitspakete gebildet und diese dann „agil“ implementiert – d.h. jede Komponente wird (wenn möglich) jeweils komplett fertiggestellt, mit Detaildesign, Implementierung, Test und Dokumentation. Das Detaildesign der Applikations-Komponenten wird also nicht schon hier festgelegt, sondern erst unmittelbar vor deren Implementierung. Dokumentiert wird das Detaildesign jeweils beim Beschrieb der Komponente im Kapitel 4 „Detail-Design und Implementation“. 3.2 Applikations-Framework Für die Applikation DB-Sync wird das Rich-Client-Framework „Captain Casa Enterprise Client“ eingesetzt. Siehe [Web1]. Wie in der Anforderung NFA-1 im Pflichtenheft definiert, soll das gleiche Framework eingesetzt werden, das für alle Geschäftssysteme der XpertCenter AG eingesetzt wird. So kann das im Entwicklungsteam vorhandene Know-How genutzt und die spätere Wartung sichergestellt werden. Das Framework dient zur Entwicklung von Java-Webapplikationen auf der Basis der JavaEnterprise-Technologie „Java Server Faces“ (JSF). Siehe [Web2]. Die Besonderheit des Frameworks ist seine Rich-Client-Architektur für das Erzeugen und Anzeigen der grafischen Benutzeroberfläche (GUI): Statt HTML wie bei JSF, verwendet das Framework eine eigene GUIBeschreibungssprache im XML-Format. Statt dem Browser zu Anzeige des HTML-GUI’s, verwendet das Framework einen eigenen Client, der die serverseitig erzeugte XML-GUI-Definition in Form von JavaSwing GUI-Komponenten anzeigt. Durch diese Technologie wird eine performante und an GUI-Elementen reiche grafische Benutzeroberfläche möglich. Einen technischen Überblick gibt [Web3] - eine Beschreibung des Einsatzes von JSF im Framework findet man in [Web4]. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 13/54 Bericht zur Master Thesis 3.3 Schichtenmodell 3.3.1 Einführung Der Hauptnutzen der Unterteilung einer Applikation in Schichten (die Schichten-Architektur) ist das Erreichen einer losen Kopplung. Lose Kopplung bedeutet, dass nur wenige Abhängigkeiten zwischen den Schichten, resp. den Komponenten der Schichten existieren. Eine Abhängigkeit entsteht durch den Zugriff aus einer Schicht in eine andere Schicht. Die Richtung der Zugriffe wird durch die Schichten-Architektur klar definiert: Obere Schichten greifen auf die unteren zu, nie umgekehrt. Nach Möglichkeit sollte die Schichten-Architektur strikt sein, d.h. es sollte kein Zugriff aus einer oberen Schicht auf eine weiter unten liegende erfolgen, bei dem dazwischen liegende Schichten übersprungen werden. Innerhalb einer Schicht sind Zugriffe beliebig möglich – es sollten aber so wenige wie möglich sein. Dadurch können z.B. die Komponenten welche die Geschäftslogik implementieren wieder verwendet werden, d.h. von verschiedenen Clients (Web-Applikation, Desktop-Applikation, Web-Service) oder anderen Geschäftslogik-Komponenten aufgerufen werden. Für verteilte Systeme ist die Schichtenbildung Voraussetzung dafür, dass sie überhaupt verteilt, d.h. ihre Komponenten auf verschiedenen Software- und Hardware-Knoten installiert werden können. Zwischen den verteilten Schichten gibt es dann wenige, über Schnittstellen klar definierte, stabile Zugriffswege. 3.3.2 Beschreibung des Schichtenmodells Im folgenden Schichtenmodell sind die in der Applikation vorhandenen Schichten und die generelle Zugriffs- resp. Abhängigkeits-Richtung aufgeführt. Die in den einzelnen Schichten enthaltenen Komponenten sind nur grob in Form von Paketen (Java-Packages) aufgeführt. Das detaillierte Design der Komponenten und deren Abhängigkeiten untereinander ist im Kapitel 3.5 beschrieben. Es gibt die drei Hauptschichten Präsentation, Geschäftslogik und Persistenz. Diese sind jeweils in zwei Unterschichten aufgeteilt. Innerhalb der Präsentations-Schicht und zwischen der Präsentations- und GeschäftslogikSchicht, sind die Zugriffe „strikt“, d.h. es wird keine der Schichten übersprungen. Die Zugriffe aus der Geschäftslogik-Schicht in die Persistenz-Schicht sind hingegen nicht strikt: Die Steuerungs-Komponenten der Geschäftslogik holen die im GUI benötigten Konfigurationsdaten (Sets, Tabellen und Umgebungen) direkt über den O/R-Mapper aus der Datenbank. Ausserdem greift die Differenz-Ausführungs-Komponente auch direkt auf die Datenbank zu, ohne die JDBC-Datenbankzugriffs-Komponente zu nutzen. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 14/54 Bericht zur Master Thesis Abbildung 5: Schichtenmodell Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 15/54 Bericht zur Master Thesis 3.4 Verteilungsmodell Das Verteilungsmodell zeigt, wo die Applikation installiert wird. Durch die Verwendung des CaptainCasa-Frameworks ist die Applikation grundsätzlich eine auf Client und Applikationsserver verteilbare Webapplikation. Sie wird aber wie eine reine Client-Applikation eingesetzt – d.h. auf jedem Client-PC wird die komplette Server-Applikation installiert und nicht nur der Client-Teil. Beide Teile der Applikation, Server und Client, laufen auf demselben Client-PC. Die Applikation wird also auf dem Client-PC des Entwicklers installiert und kommuniziert per JDBC mit der lokalen Entwicklungs-Datenbank und den Datenbanken auf den DatenbankServern der anderen Umgebungen. Die Applikation kann im normalen Modus verwendet werden, bei dem Client und Server über das HTTP-Protokoll kommunizieren. Dieser Modus wird für die Entwicklung der Applikation verwendet. Zum Starten der Applikation sind dabei folgende Schritte notwendig und folgende Varianten des Aufrufs möglich: 1. Start des Tomcat-Applikationsservers (Servlet Container) 2. Aufruf der Applikation per: a. URL im Browser für den Start als im Browser eingebettetes Applet b. URL im Browser für den Start als Java-Webstart-Applikation in einem eigenen Fenster ausserhalb des Browsers c. Batch-Datei für den Start als eigenständige Java-Applikation (Kommunikation mit dem Server trotzdem über HTTP) Die Applikation kann im sogenannten „Embedded-Modus“ verwendet werden, bei dem Client und Server direkt über Java-API-Aufrufe kommunizieren. Dazu wird der „Embedded-Modus“ des Tomcats genutzt. Dieser Modus wird für den produktiven Betrieb der Applikation verwendet. Beim Build der Applikation ist dazu ein spezielles Vorgehen notwendig. Siehe [Web5]. Zum Starten der Applikation wird eine Batch-Datei verwendet. Dabei wird sie als eigenständige Java-Applikation gestartet. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 16/54 Bericht zur Master Thesis Abbildung 6: Verteilungsmodell 3.5 Komponentenmodell 3.5.1 Einführung Eine Komponente ist eine abgeschlossene Einheit, die ein bestimmtes fachliches oder technisches Teilproblem innerhalb der gesamten Applikation löst. Durch die Bildung von Komponenten kann ein komplexes System in überschaubare, verständliche Teile gegliedert werden, die untereinander lose gekoppelt sind, d.h. über klar definierte, stabile Schnittstellen miteinander kommunizieren. Die in den Komponenten gekapselte Programmlogik ist besser wartbar, da: die Logik redundanzfrei, d.h. nur an einer einzigen Stelle, gepflegt wird. der Zugriff auf die Logik nur über die definierte Schnittstelle erfolgt und so die Details der Implementation verborgen werden. Änderungen an der Implementation haben dadurch keine Auswirkungen auf die nutzenden Komponenten. In Java besteht eine Komponente aus Klassen die in einem Package (evtl. mit UnterPackages) abgelegt sind. Die Schnittstelle der Komponente wird in Form eines Interfaces definiert. Einfache, stabile Komponenten können auch ohne Interface auskommen. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 17/54 Bericht zur Master Thesis 3.5.2 Beschreibung des Komponentenmodells Für das Design des Komponentenmodells wird die Applikation DB-Sync in die folgenden Teile (Subsysteme) unterteilt: 3.5.2.1 Synchronisation Für die Synchronisation braucht es Komponenten für das GUI, die GUI-Steuerung die Applikations-Steuerung, die Geschäftslogik und den Zugriff auf die Datenbank. Die Synchronisation besteht aus den beiden Teilschritten Differenz-Berechnung und Differenz-Ausführung. Diese Teilschritte sind als voneinander unabhängige GeschäftslogikKomponenten konzipiert. Damit wird eine optimale Flexibilität für zukünftige Erweiterungen erreicht (siehe unten bei „Änderungsverwaltung“.) Die Komponenten zur Differenz-Berechnung und Differenz-Ausführung greifen sowohl direkt als auch mit Hilfe der JDBC-Datenbankzugriffs-Komponente auf die Datenbanken der verschiedenen Umgebungen zu. Der direkte Zugriff erfolgt, weil es nicht für alle ZugriffsFunktionen sinnvoll ist, sie in die JDBC-Datenbankzugriffs-Komponente auszulagern (siehe Detaildesign der Differenz-Ausführungs-Komponente). Für den Zugriff auf das Datenmodell der Konfiguration und des Synchronisationsprotokolls gibt es die entsprechenden Geschäftsobjekte (Business-Objects, BO‘s). Diese stellen den Geschäftslogik-Komponenten die notwendigen Lese- und Schreib-Funktionen zur Verfügung und nutzen dazu die generierten Entitäts-Klassen (POJO‘s) des Objekt/RelationalenMapping-Frameworks für den Zugriff auf die Konfigurations-Datenbank. Für den (nur lesenden) Zugriff auf die Daten der Konfiguration zur Anzeige/Auswahl der Sets, Tabellen und Umgebungen im GUI, werden hingegen direkt die generierten Klassen (POJO‘s) des Objekt/Relationalen-Mapping-Frameworks verwendet. Dieses Design wurde gewählt, da auf die Synchronisations-Steuerungs-Komponente ausschliesslich durch das eigene GUI zugegriffen wird und nicht auch noch von anderen, externen Applikationen. Dadurch kann auf den Einsatz von Transfer-Objekten für die Konfigurationsdaten verzichtet werden – auch die entsprechenden BO’s werden nicht genutzt. Stattdessen werden durchgängig die O/R-Mapper-POJO’s verwendet. 3.5.2.2 Synchronisationsprotokoll Für die Anzeige des Synchronisationsprotokolls braucht es Komponenten für das GUI, die GUI-Steuerung, die Applikations-Steuerung und den Zugriff auf die Datenbank. Die Logik für die Suche/Filterung der Protokoll-Einträge ist direkt in der SynchronisationsSteuerungs-Komponente implementiert – es gibt keine separate GeschäftslogikKomponente. Für den (nur lesenden) Zugriff auf die Daten des Synchronisationsprotokolls zur Anzeige der Einträge im GUI, werden auch hier durchgängig die O/R-Mapper-POJO’s verwendet. 3.5.2.3 Hauptseite/Benutzeridentifikation Die Hauptseite bildet den Rahmen für die Applikation, in welchem das GUI, d.h. die Seiten für die Synchronisation und das Synchronisationsprotokoll angezeigt werden. Beim Start der Applikation wird die in der Muss-Anforderung FA-1 verlangte Identifikation des Benutzers durchgeführt. Zusätzlich wird noch ein Teil der Erweiterung FA-2 „Benutzer-Verwaltung“ implementiert: Für die berechtigten Benutzer wird in der Datenbank das Merkmal abgelegt, mit dem sie identifiziert werden (die User-Id des Betriebssystems) – nicht eingetragene Benutzer können die Applikation nicht benutzen. Für die Benutzeridentifikation und die damit verbundene Steuerung der Hauptseite der Applikation, braucht es Komponenten für das GUI, die GUI-Steuerung, die ApplikationsSteuerung und den Zugriff auf die Datenbank. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 18/54 Bericht zur Master Thesis Die Applikations-Steuerungs-Komponente ist als Singleton ausgelegt und stellt den anderen Komponenten die Informationen über den identifizierten Benutzer zur Verfügung. Für den Zugriff auf das Datenmodell der Benutzeridentifikation gibt es ein entsprechendes BO, welches die generierte Entitäts-Klasse (POJO) des Objekt/Relationalen-MappingFrameworks für den Zugriff auf die Konfigurations-Datenbank nutzt. 3.5.2.4 Administration/Konfiguration Das GUI für die Administration, d.h. für die Konfiguration der Synchronisations-Sets, Tabellen und Umgebungen, wird nicht realisiert – die entsprechende Anforderung FA10 hat die Priorität 2 (Kann). Für das Design wird es trotzdem berücksichtigt, damit es später problemlos eingebaut werden kann. Wie für die vorhergehenden Subsysteme, braucht es Komponenten für das GUI, die GUISteuerung, die Applikations-Steuerung und den Zugriff auf die Datenbank. Das GUI ist unabhängig vom Rest der Applikation. Die Applikations-Steuerung wird aber auf die BO’s des Konfigurationsdaten-Modells zugreifen. Die dafür notwendigen zusätzlichen Schreib-Funktionen, können in den BO’s aber problemlos eingebaut werden. Somit müssen im jetzigen Design keine besonderen Vorkehrungen getroffen werden. 3.5.2.5 Änderungsverwaltung Die Änderungsverwaltung ist eine Erweiterung (Anforderung FA-7) und wird nicht realisiert. Schon bei der Analyse (Kapitel 2.7 Fachklassenmodell mit Änderungsverwaltung) wurde die Änderungsverwaltung speziell berücksichtigt, da sie weitreichenden Einfluss auf das System hat. Für das Design muss sie deshalb ebenfalls berücksichtigt werden, damit es später überhaupt möglich ist, die Änderungsverwaltung einzubauen. Für die Änderungsverwaltung braucht es Komponenten für das GUI, die GUI-Steuerung die Applikations-Steuerung, die Geschäftslogik und den Zugriff auf die Datenbank. Das GUI ist unabhängig vom Rest der Applikation. Die Applikations-Steuerung wird auf die BO’s des Konfigurationsdaten-Modells zugreifen und die Applikations-Steuerung der Synchronisation benutzen – dies ist mit dem jetzigen Design bereits möglich. Neu hinzukommen wird das Datenmodell für die aufgezeichneten Änderungen und deren Synchronisation – ebenso die entsprechenden BO’s und O/R-Mapper-POJO’s. Die Aufzeichnung der Änderungen und deren davon getrennte Synchronisation ist der grosse Unterschied zur Synchronisation ohne Änderungsverwaltung. Die beiden Teilschritte Differenz-Berechnung und Differenz-Ausführung werden zeitlich getrennt ausgeführt: Die Differenz-Berechnung einmalig bei der Aufzeichnung der Änderungen, die DifferenzAusführung mehrmals bei der Synchronisation der Änderungen durch die verschiedenen Benutzer in den verschiedenen Umgebungen. Als Folge davon müssen diese Teilschritte bereits im jetzigen Design auf voneinander unabhängige Komponenten aufgeteilt werden. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 19/54 Bericht zur Master Thesis Abbildung 7: Komponentenmodell Synchronisation Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 20/54 Bericht zur Master Thesis Abbildung 8: Komponentenmodell Sync-Protokoll und Benutzeridentifikation (Login) Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 21/54 Bericht zur Master Thesis 4 Detail-Design und Implementation In diesem Kapitel werden das Detail-Design und die Implementation der einzelnen Teile und Komponenten der Applikation DB-Sync beschrieben. Alle in diesem Kapitel beschriebenen Klassen und die DDL-Skripts der beschriebenen Datenbank-Tabellen sind in der ZIP-Datei mit den Anhängen zu dieser Master Thesis enthalten. 4.1 Die Hauptseite der Applikation 4.1.1 GUI-Design Die Hauptseite der Applikation bildet den Rahmen, in welchem die Seiten für die Synchronisation und das Synchronisationsprotokoll angezeigt werden. Sie bietet verschiedene Grundfunktionen zur Bedienung der Applikation an. 1 2 3 4 5 Abbildung 9: Hauptseite Beschreibung der Hauptseite: 1. Fenster der Applikation mit den Standard-Funktionen zum Minimieren, Maximieren und Schliessen des Fensters. 2. Titelzeile mit dem Namen der Applikation. Rechts wird der Name des angemeldeten Benutzers angezeigt. 3. Navigation: Die vorhandenen Seiten werden in Form eines Registers aufgeführt. Mit einem Klick auf den Registertitel wird die entsprechende Seite angezeigt. 4. Die aktuelle Seite. Nach dem Start der Applikation ist immer die Seite für die Synchronisation sichtbar. 5. Statuszeile: In der Statuszeile werden Erfolgs-, Warnungs- und Fehlermeldungen anzeigt. Wird eine Meldung angezeigt, so kann mit einem Klick auf die Statuszeile ein Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 22/54 Bericht zur Master Thesis Popup-Fenster geöffnet werden, in dem zusätzliche Details zur Meldung angezeigt werden. Mit den Symbolen am rechten Rand kann die Applikation neu gestartet und der Dialog mit den Einstellungen für Skalierung und Sprache geöffnet werden. Abbildung 10: Statuszeile mit Erfolgs-, Warn- und Fehlermeldung, Popup mit Details 4.1.2 Implementation Das eingesetzte Rich-Client-Framework „Captain Casa Enterprise Client“ kennt das Konzept des „Arbeitsplatzes“ (Workplace). Die Hauptseite besteht aus den vorhandenen ArbeitsplatzKomponenten. So kann mit minimalem Aufwand eine ausgereifte Hülle für die Applikation erstellt werden. Die mit dem Layout-Editor der CaptainCasa-Entwicklungstools erstellte Hauptseite, ist in der Datei workplace.jsp abgelegt. 4.2 Benutzeridentifikation 4.2.1 Detail-Analyse Die Muss-Anforderung FA-1 gibt vor, dass der Benutzer der die Applikation startet, identifiziert werden muss. Eine weitergehende Benutzerverwaltung wird nicht verlangt – sie ist als Erweiterung in der Anforderung FA-2 definiert. Benutzt wird der identifizierte Benutzer für das Synchronisations-Protokoll. 4.2.2 Detail-Design Der Benutzer wird automatisch über das Betriebssystem identifiziert – es gibt keinen LoginDialog. Zugelassen werden aber nur „registrierte“ Benutzer. Diese Benutzer werden in der Tabelle „SYNCUSER“ in der Datenbank eingetragen. Dadurch wird auf einfache Weise der Benutzer-Kreis strenger kontrolliert als vorgegeben. Damit wird bereits ein Teil der Anforderung FA-2 umgesetzt. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 23/54 Bericht zur Master Thesis In der Datenbank eingetragene Benutzer können deaktiviert werden. Grund: Für das Synchronisations-Protokoll wird nur die Id des Benutzers gespeichert – damit im Protokoll der Name angezeigt werden kann, dürfen Benutzer nie gelöscht werden. 4.2.3 Klassenmodell Die Implementation erfolgt wie im Komponentenmodell definiert (siehe Abbildung 8). Das folgende Klassendiagramm gibt einen Überblick über die Klassen, welche die Benutzeridentifikation implementieren. Die einzelnen Klassen/Komponenten werden in den nachfolgenden Kapiteln beschrieben. Abbildung 11: Klassendiagramm Benutzeridentifikation 4.2.4 GUI In der Titelzeile der Hauptseite wird angezeigt, welcher Benutzer die Applikation gestartet hat. Abbildung 12: Titelzeile mit dem angemeldeten Benutzer Falls ein nicht registrierter Benutzer die Applikation startet, wird ihm nur die Login-Seite angezeigt – die Seiten für die Synchronisation und das Synchronisations-Protokoll sind ausgeblendet. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 24/54 Bericht zur Master Thesis Auf der Login-Seite wird angezeigt, mit welcher System-User-Id der Benutzer identifiziert wurde und dass er keine Berechtigung hat, die Applikation zu benutzen. Die mit dem Layout-Editor der CaptainCasa-Entwicklungstools erstellte Login-Seite, ist in der Datei login.jsp abgelegt. Abbildung 13: Login-Seite 4.2.5 GUI-Steuerung Grundsätzliches Das eingesetzte Rich-Client-Framework „Captain Casa Enterprise Client“ basiert auf dem „Java Server Faces“-Framework (JSF) der Java Enterprise Edition (JEE) [Web2]. In JSF wird das GUI durch „Managed Beans“ gesteuert [Web4], d.h. in der JSP-Seite mit der GUI-Definition wird die „Expression Language“ (EL) verwendet um auf Daten und Methoden in einem oder mehreren Beans zuzugreifen. Sämtliche Beans zur GUI-Steuerung sind im Package ch.xpertcenter.dbsync.ui abgelegt. Dispatcher-Bean CaptainCasa kennt das Konzept eines zentralen Managed Beans der „Dispatcher“ genannt wird [Web7]. Über den Dispatcher-Bean können die selbst erstellten Beans zur Steuerung der verschiedenen GUI-Seiten miteinander kommunizieren. Dieser Dispatcher-Bean wird beim Start der Applikation vom Framework instanziiert und ist der ideale Ort um die Identifizierung des Benutzers anzustossen und zu steuern, welche Seite(n) angezeigt werden. Der Dispatcher-Bean (Klasse Dispatcher) steuert die Hauptseite wie folgt: Im Konstruktor des Dispatcher-Beans wird über den LoginController ermittelt, ob der Benutzer berechtigt ist oder nicht. Falls er berechtigt ist, werden die Seiten für die Synchronisation und das SyncProtokoll angezeigt Falls er nicht berechtigt ist, wird nur die Login-Seite angezeigt. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 25/54 Bericht zur Master Thesis LoginUI-Bean Die Login-Seite wird durch den LoginUI-Bean (Klasse LoginUI) gesteuert, d.h. die LoginSeite holt aus dem LoginUI-Bean die angezeigte System-User-Id. 4.2.6 Applikations-Steuerung Die Login-Controller-Komponente im Package ch.xpertcenter.dbsync.business. login stellt der GUI-Steuerung die Schnittstelle zur Verfügung, über die sie die Daten des identifizierten Benutzers abrufen kann. Die Klasse LoginControllerImpl implementiert das Interface LoginController und ist als Singleton realisiert, damit immer dieselbe Instanz benutzt wird. So muss die Identifikation des Benutzers nur einmal durchgeführt werden und alle Anfragen liefern immer das gleiche Ergebnis. 4.2.7 Geschäftsobjekt Die Klasse UserBO im Package ch.xpertcenter.dbsync.business.login.bo stellt der Applikations-Steuerung die Daten zum Benutzer zur Verfügung. Sie prüft, ob zur übergebenen Betriebssystem-User-Id ein autorisierter Benutzer existiert und greift dazu mit dem O/R-Mapper auf die in der Datenbank abgelegten Benutzer zu. 4.2.8 Datenbank-Zugriff mit O/R-Mapper Der Zugriff auf das Datenmodell der Benutzeridentifikation erfolgt mit dem O/R-MappingFramework „Hibernate“ [Web8]. Die Objekte der generierten Klasse Syncuser im Package ch.xpertcenter.dbsync.database.hibernate repräsentieren dabei jeweils einen Datensatz aus der Tabelle SYNCUSER. 4.2.9 Datenbank Das Datenmodell der Benutzeridentifikation besteht aus der Tabelle SYNCUSER, welche wie folgt definiert ist: Abbildung 14: Tabelle der Benutzeridentifikation Beschreibung der Tabelle: SYNCUSER: Tabelle für die registrierten Benutzer der Applikation SYNCUSER.USER_ID: Generierter Primär-Schlüssel (automatische Inkrementierung durch die Datenbank) SYSTEM_USER_ID: User-Id, die aus dem Betriebssystem ausgelesen wird, um den Benutzer automatisch zu identifizieren (mit Unique-Constraint) USER_NAME: Name des Benutzer (zur Anzeige) SYNCUSER.IS_ACTIVE: Gibt an, ob der Benutzer aktiv ist. Nur aktive Benutzer können die Applikation benutzen. Werte: der Benutzer ist aktiv: ''1'' = true, der Benutzer ist nicht aktiv: ''0'' = false Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 26/54 Bericht zur Master Thesis 4.3 Synchronisation 4.3.1 Detail-Analyse des Modells der Konfigurationsdaten Konfiguriert werden Synchronisations-Sets, Tabellen und Umgebungen. Diese drei Fachklassen wurden aus den Anwendungsfällen UC-A1-3 des Haupt-Anwendungsfalls „Administrieren“ abgeleitet und sind dort (Pflichtenheft Kapitel 3.2.4) und im Fachklassenmodell (Kapitel 2.6) beschrieben. Für das Datenmodell sind die Beziehungen wichtig – deshalb werden sie hier noch detaillierter analysiert. Abbildung 15: Fachklassendiagramm Konfigurationsdaten-Modell Beschreibung der Beziehungen: Nr. Klasse Beziehung Multiplizität Klasse 1 Synchronisations-Set enthält 1..* Tabelle 2 Tabelle ist zugeordnet 1..* Synchronisations-Set 3 Umgebung wird verwendet von 1..* Tabelle 4 Tabelle ist definiert in 2..* Umgebung 1. Ein Synchronisations-Set kann eine oder mehrere Tabellen enthalten. Eine bestimmte Tabelle darf aber nur einmal darin vorkommen. 2. Eine Tabelle ist in der Regel einem, kann aber auch mehreren Synchronisations-Sets zugeordnet sein. 3. Eine Umgebung wird von einer oder mehreren Tabellen verwendet. 4. Eine Tabelle ist in zwei oder mehreren Umgebungen definiert. 4.3.2 Detail-Design Die wesentlichen Merkmale des Designs werden bereits beim Komponentenmodell beschrieben (Kapitel 3.5.2.1) – bis auf eines: die Differenz. Die Differenz wird in der Komponente zur Differenz-Berechnung erzeugt und ist eine Datenklasse, die folgendes enthält: Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 27/54 Bericht zur Master Thesis die Informationen, die zur Anzeige einer Differenz im GUI benötigt werden sämtliche Daten, die von der Komponente zur Differenz-Ausführung benötigt werden Über die Differenz-Objekte können die drei an der Synchronisation beteiligten Komponenten einfach und effizient Daten austauschen. Durch die Persistierung der Daten der Differenz-Objekte könnte die Berechnung, die Anzeige und die Ausführung einer Differenz auch zeitlich komplett entkoppelt werden – damit sind mit dem aktuellen Design bereits die Voraussetzungen für die Einführung der Änderungsverwaltung (siehe Kapitel 3.5.2.5) gegeben. 4.3.3 Klassenmodell Die Implementation erfolgt wie im Komponentenmodell definiert (siehe Abbildung 7). Das folgende Klassendiagramm gibt einen Überblick über die Klassen, welche die Synchronisation implementieren. Die einzelnen Klassen/Komponenten/Packages werden in den nachfolgenden Kapiteln beschrieben. Abbildung 16: Klassendiagramm Synchronisation Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 28/54 Bericht zur Master Thesis 4.3.4 GUI 4.3.4.1 Übersicht 1 2 3 4 5 Abbildung 17: GUI Synchronisation Beschreibung der Bereiche der Synchronisations-Seite: 1. Bereich für die Auswahl der Konfigurations-Daten 2. Buttons für die Berechnung der Differenzen und die Anzeige des SynchronisationsProtokolls aufgrund der ausgewählten Konfigurations-Daten 3. Bereich für die Anzeige der berechneten Differenzen 4. Buttons für die Auswahl/Markierung der berechneten Differenzen 5. Buttons für das Ausführen der ausgewählten Differenzen Durch den Einsatz von Icons [Web11], werden die Buttons besser erkenn- und unterscheidbar. Die Synchronisations-Seite ist in der Datei synchronisation.jsp abgelegt. 4.3.4.2 Auswahl der Konfigurations-Daten Das Set, die Tabelle, die Quell- und Ziel-Umgebung für die Differenz-Berechnung werden mit Hilfe der Auswahllisten (ComboBox) ausgewählt. Die Auswahllisten sind abhängig voneinander: Erst wenn ein Set ausgewählt ist, können die zugehörigen Tabellen angezeigt werden und erst wenn eine Tabelle ausgewählt ist, können die zugehörigen Umgebungen angezeigt werden. Sobald der Benutzer in einer übergeordneten Liste einen anderen Eintrag auswählt, wird die Auswahl in den untergeordneten Listen gelöscht. Abbildung 18: GUI Synchronisation: Auswahl der Konfigurations-Daten Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 29/54 Bericht zur Master Thesis 4.3.4.3 Berechnung der Differenzen Die Berechnung der Differenzen wird mit dem entsprechenden Button ausgelöst. Die Berechnung kann nur durchgeführt werden, wenn ein Set, eine Tabelle, die Quell- und die Ziel-Umgebung ausgewählt sind – andernfalls wird eine Warnmeldung angezeigt. Die Berechnung der Differenzen wird immer von der Quell-Tabelle ausgehend durchgeführt. Um alle Differenzen zwischen zwei Umgebungen zu finden, muss die Berechnung jeweils in beide Richtungen durchgeführt werden. Mit dem Button „Quelle und Ziel vertauschen“ kann die Richtung bequem geändert werden. 4.3.4.4 Synchronisations-Protokoll anzeigen Mit dem Button „Protokoll anzeigen“ wird zur Synchronisations-Protokoll-Seite gewechselt und mit den in der Synchronisations-Seite ausgewählten Konfigurations-Daten als Suchkriterien eine Suche ausgelöst. Zusätzlich wird noch auf den aktuell angemeldeten Benutzer eingeschränkt. So kann vor oder nach dem Berechnen/Kopieren/Löschen von Differenzen nachgeschaut werden, welche Differenzen man selber mit den aktuellen Einstellungen zuletzt synchronisiert hat. 4.3.4.5 Anzeige der berechneten Differenzen Nach der Berechnung werden die gefundenen Differenzen in einer zweiteiligen Tabelle angezeigt. In der Statusleiste wird zudem die Anzahl der gefundenen Differenzen angezeigt. Abbildung 19: GUI Synchronisation: Anzeige der berechneten Differenzen Der linke Teil der Tabelle enthält die Spalte in der der Typ der Differenz angezeigt wird. In der Spalte gibt es eine Checkbox die angezeigt, ob die entsprechende Differenz ausgewählt ist oder nicht. Diese Spalte ist statisch und bleibt immer sichtbar – sie kann nicht „weggescrollt“ werden. Der rechte Teil der Tabelle enthält die Spalten der Tabelle mit ihren Werten und wird jeweils, entsprechend der Struktur der Tabelle, dynamisch erzeugt. Für binäre Daten (z.B. PDFDateien) wird der Text „<BLOB>“ angezeigt, da es keinen Sinn macht, die Bytes anzuzeigen. NULL-Werte werden mit dem Text „<null>“ angezeigt. 4.3.4.6 Auswahl der Differenzen Die angezeigten Differenzen können auf zwei Arten ausgewählt (und auch wieder abgewählt) werden: 1. Mit einem (einfachen) Maus-Klick in irgendeiner Spalte der Differenz oder auch direkt auf die Checkbox. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 30/54 Bericht zur Master Thesis 2. Mit den Buttons „Alle auswählen“, „Neue auswählen“, „Geänderte auswählen“ und „Alle abwählen“. Die ausgewählten Differenzen sind am Haken in der Checkbox erkennbar. Abbildung 20: GUI Synchronisation: Auswahl der Differenzen 4.3.4.7 Synchronisation der Differenzen Das Synchronisieren von Differenzen kann auf zwei Arten erfolgen: Eine Differenz wird von der Tabelle der Quell-Umgebung in die Tabelle der ZielUmgebung kopiert. Eine Differenz wird in der Tabelle der Quell-Umgebung gelöscht. Der Typ der Differenz spielt dabei keine Rolle, d.h. DB-Sync schränkt z.B. das Löschen nicht auf Differenzen vom Typ „Neu“ ein – der Benutzer muss wissen was er macht. Das Änderungs-Protokoll in dem steht, welche Datensätze geändert, neu eingefügt oder gelöscht wurden, wird ausserhalb von DB-Sync geführt. Für das Kopieren und Löschen gibt es die Buttons „Ausgewählte kopieren“ und „Ausgewählte löschen“ – wie die Beschriftung schon sagt, betrifft das jeweils nur die ausgewählten Differenzen. Bevor kopiert/gelöscht wird, muss der Benutzer noch eine Sicherheits-Abfrage mit „Ja„ bestätigen. Nach dem Kopieren/Löschen wird in der Statuszeile eine entsprechende Erfolgsmeldung angezeigt. Abbildung 21: GUI Synchronisation: Differenzen kopieren Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 31/54 Bericht zur Master Thesis Abbildung 22: GUI Synchronisation: Differenzen löschen 4.3.5 GUI-Steuerung Die Synchronisations-Seite wird durch den SynchronisationUI-Bean (Klasse SynchronisationUI) gesteuert. Der Bean stellt dem GUI die Daten für die Auswahllisten und die Differenz-Tabelle zur Verfügung und enthält die Methoden die durch die Buttons aufgerufen werden. 4.3.6 Applikations-Steuerung Die Synchronisations-Steuerungs-Komponente im Package ch.xpertcenter.dbsync. business.sync stellt der GUI-Steuerung die Schnittstelle zur Verfügung, über die sie die Methoden für die Synchronisation aufrufen kann. Die Klasse SynchronisationControllerImpl implementiert das Interface SynchronisationController welches die folgenden Methoden anbietet: Abbildung 23: Klassendiagramm Synchronisations-Steuerungs-Komponente Neben den Methoden für das Berechnen/Kopieren/Löschen von Differenzen, gibt es noch die Methode getAllSynchronisationSets() welche eine Liste mit SyncSet-Objekten zurückgibt. Aus diesen O/R-Mapper-Objekten kann die GUI-Steuerung sämtliche Daten extrahieren, die sie für das Füllen der Konfigurationsdaten-Auswahllisten benötigt. Siehe Kapitel 4.3.12 „Datenbank-Zugriff mit O/R-Mapper“. Exception-Handling: Alle Fehler die in der Komponente selbst oder in den daraus aufgerufenen Komponenten auftreten, werden in eine SynchronisationException verpackt. Sie ist die einzige Exception die ans GUI weitergegeben wird. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 32/54 Bericht zur Master Thesis 4.3.7 Geschäfts-Komponente zur Differenz-Berechnung Die Differenz-Berechnungs-Komponente im Package ch.xpertcenter.dbsync. business.sync.diffcalculator stellt der Applikations-Steuerung die Funktion für die Berechnung der Differenzen zur Verfügung. Die Klasse DifferenceCalculatorImpl implementiert dabei das Interface DifferenceCalculator welches die Methode zur Berechnung von Differenzen anbietet: Abbildung 24: Klassendiagramm Differenz-Berechnungs-Komponente Implementation der Differenz-Berechnung: 1. Alle Datensätze der Quell-Tabelle werden aus der Datenbank geladen. 2. Zu jedem Quell-Datensatz wird mit Hilfe des Primär-Schlüssels der entsprechende Datensatz aus der Ziel-Tabelle geladen. Wenn kein entsprechender Ziel-Datensatz existiert, wird das als Differenz vom Typ „Neu“ erkannt. 3. Wenn ein entsprechender Ziel-Datensatz existiert, werden die Werte der Datensätze Spalte für Spalte verglichen. Sobald ein Unterschied festgestellt wird, wird das als Differenz vom Typ „Geändert“ erkannt. 4. Für jede erkannte Differenz wird ein Objekt der Klasse Difference erzeugt (siehe Kapitel 4.3.8 Modell der Differenz). Als Resultat der Berechnung wird eine Liste von Differenz-Objekten zurückgegeben. Die Berechnung geht immer von den in der Quell-Tabelle vorhandenen Datensätzen aus. Ein in der Quell-Tabelle gelöschter Datensatz wird auf diese Weise nicht als Differenz erkannt. Ein solcher Datensatz wird bei der Berechnung in der umgekehrten Richtung (Quell- und Ziel-Umgebung vertauscht) als Differenz vom Typ „Neu“ erkannt und kann dann gelöscht werden. Dieses Vorgehen (siehe auch Kapitel 2.8 Ablaufmodell der Synchronisation) ist nötig, da nicht genug Informationen vorhanden sind, um die Differenzen gleichzeitig in beide Richtungen zu berechnen und deren Typ richtig zu erkennen: Würde man die nur in der Ziel-Umgebung vorhandenen Datensätze auch noch berücksichtigen und z.B. als Typ „Gelöscht“ anzeigen, wäre das nicht in jedem Fall korrekt, da nicht erkannt werden kann, ob der Datensatz in der Quell-Tabelle gelöscht oder in der Ziel-Tabelle neu eingefügt wurde. Diese Information muss vom Urheber der Änderung im Änderungsprotokoll festgehalten werden. Ebenso kann nicht festgestellt werden, in welcher Umgebung ein geänderter Datensatz geändert wurde – ob ein Datensatz also von der Quelle ins Ziel oder in der umgekehrten Richtung kopiert werden muss, kann nur dem Änderungsprotokoll entnommen werden. Vergleich der Datensätze: Der Vergleich zweier Datensätze wird abgebrochen, sobald die Werte in einer Spalte verschieden sind. Falls weitere Spalten unterschiedliche Werte enthalten, ist das für die Erkennung einer Differenz ohne Bedeutung. Durch dieses (effiziente) Vorgehen kann nicht festgehalten werden, welche Spalten Änderungen enthalten – dadurch kann diese Information auch nicht im GUI angezeigt werden. Das wird in Kauf genommen, da diese Information vom Benutzer in der Regel nicht benötigt wird, resp. im Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 33/54 Bericht zur Master Thesis Änderungsprotokoll festgehalten wird. Eine entsprechende Erweiterung der Funktionalität wäre aber ohne weiteres möglich. Ein anderer Aspekt ist das sichere Erkennen von Unterschieden in den Daten. Die meisten Datentypen können mit der equals()-Methode ihrer Java-Repräsentation einfach verglichen werden. Bei binären Daten (BLOB, Binary Large OBject) geht das aber nicht – dort muss der Inhalt byte-weise verglichen werden. Konsequenz: Jeder Datentyp muss auf seine Vergleichbarkeit geprüft werden. Deshalb unterstützt die Differenz-BerechnungsKomponente nur geprüfte Datentypen und wirft eine Exception, wenn eine Tabelle einen nicht geprüften Datentyp verwendet. Die unterstützten Datentypen sind in der Klasse DifferenceCalculatorImpl im Set<Integer> SUPPORTED_SQL_DATATYPES abgelegt. Die Integer-Werte repräsentieren dabei den entsprechenden Datentyp der in der Klasse java.sql.Types definiert ist. Entkopplung von der Datenbankzugriffs-Schicht: Die Datensätze werden nicht direkt in der Differenz-Berechnungs-Komponente aus der Datenbank geladen. Dies geschieht in der Hilfsklasse JDBCDatabaseAccessor. So wird die Komponente vom umfangreichen Code für den Auf- und Abbau der Datenbank-Verbindungs-Objekte entlastet. Der JDBCDatabaseAccessor gibt die Datensätze als javax.sql.rowset.CachedRowSet zurück. Ein CachedRowSet ist ein ResultSet, das keine geöffnete Datenbank-Verbindung mehr unterhält und so komplett unabhängig von der Datenbank-Infrastruktur verwendet werden kann [Web10]. Durch die Verwendung des CachedRowSets kann die Entkoppelung noch verstärkt werden. Schutz vor Fehlmanipulationen in der Datenbank: Besonderes Augenmerk wurde auf das fehlerfreie Zusammenstellen der notwendigen SQL-Statements gerichtet. In den Konfigurationsdaten werden nur das Schema und der Name der Tabelle abgelegt. Die Primärschlüssel-Spalten werden direkt aus der Datenbank ausgelesen. Die Methode JDBCDatabaseAccessor.getPrimaryKeysOfTable() gibt ein CachedRowSet zurück, welches von der Methode generateSQLToSelectWithPrimaryKey() benutzt wird, um das Prepared-SQL-Statement für das Laden eines Datensatzes aus der Ziel-Tabelle zu erzeugen. Die für dieses SQL-Statement benötigten Werte der Primärschlüssel-Spalten, werden aus dem Quell-Datensatz gelesen, der sich wiederum im CachedRowSet mit allen Datensätzen der Quell-Tabelle befindet. Die Werte werden zusammen mit ihren Datentypen im Object[][] primaryKeyValuesAndTypes gespeichert. Das fehleranfällige Konfigurieren der Primärschlüssel-Spalten von Hand und das noch fehleranfälligere Zusammenstellen des SQL-Statements mit Primärschlüssel-Spalten-Werten als Strings wird so komplett vermieden. Unterstützung von Views: Für die Synchronisation von Tabellen werden Views eingesetzt um irrelevante oder störende Spalten auszublenden. Hier zwei typische Beispiele: Eine Tabelle mit Texten z.B. für Erfolgs-, Warn- und Fehlermeldungen, enthält eine Spalte in der das Datum des letzten Zugriffs abgelegt ist. Dieses Datum dient zur Pflege der Tabelle – es können damit nicht oder nicht mehr benutzte Texte erkannt und bereinigt werden. Bei der Synchronisation stört es, da ein unterschiedliches Datum keine inhaltliche Änderung darstellt. Die Synchronisation dieser Tabelle erfolgt deshalb über eine View, die diese Datums-Spalte nicht enthält, sonst aber mit der Tabelle identisch ist. Eine Tabelle enthält binäre Daten (als BLOB), z.B. PDF-Dokumente. Damit bei der Synchronisation einer Änderung in einer der anderen Spalten nicht jedesmal auch die BLOB-Spalte verglichen werden muss, wird zusätzlich zur Tabelle auch noch eine View benutzt, die diese BLOB-Spalte nicht enthält, sonst aber mit der Tabelle identisch ist. So kann beim Synchronisieren viel Zeit gespart werden, da das Vergleichen der umfangreichen BLOB-Daten lange dauert. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 34/54 Bericht zur Master Thesis Im Unterschied zu den Tabellen, können aus den JDBC-Metadaten einer View die Primärschlüssel-Spalten nicht ermittelt werden. Views können nämlich auch Spalten aus mehreren verschiedenen Tabellen enthalten und selbst wenn sich eine View nur auf eine Tabelle bezieht, muss sie nicht zwingend alle zum Primärschlüssel gehörenden Spalten umfassen. Damit auch für Views die Primärschlüssel-Spalten aus der Datenbank ausgelesen werden können und nicht von Hand konfiguriert werden müssen, unterstützt DB-Sync nur Views die folgende Bedingungen erfüllen: 1. eine View darf sich nur auf eine Tabelle beziehen 2. die View muss alle Primärschlüssel-Spalten der Tabelle enthalten 3. in der View dürfen die Primärschlüssel-Spalten der Tabelle nicht umbenannt werden Durch diese Bedingungen ist es möglich, die Primärschlüssel-Spalten über die Basis-Tabelle der View auszulesen und dadurch die genau gleichen Mechanismen wie bei den Tabellen zu nutzen. Ausserdem sind Views, welche sich auf mehr als eine Tabelle beziehen, so wie so schreibgeschützt und können deshalb für die Synchronisation gar nicht benutzt werden. Die Views, die als Hilfsmittel für die Synchronisation von Tabellen verwendet werden, sind aber so einfach, dass sie diese Bedingungen problemlos erfüllen. Die Funktionalität von DBSync wird durch das gewählte Design also nicht eingeschränkt. Exception-Handling: Auch hier werden alle Fehler die in der Komponente selbst oder in den daraus aufgerufenen Komponenten auftreten, in eine DifferenceCalculatorException verpackt. Sie ist die einzige Exception die an die Applikations-Steuerung weitergegeben wird. 4.3.8 Modell der Differenz Die Klasse Difference im Package ch.xpertcenter.dbsync.business.sync. difference repräsentiert eine Differenz. Sie wird in der Komponente zur Differenz-Berechnung erzeugt, im GUI zur Anzeige der Differenz benutzt und in der Komponente zur Differenz-Ausführung verwendet, um den Datensatz zur Differenz in der Datenbank zu aktualisieren, einzufügen oder zu löschen (siehe auch Kapitel 4.3.2 Detail-Design). Abbildung 25: Klassendiagramm der Differenz Die zentralen Datenelemente in der Klasse Difference sind das Prepared-SQL-Statement und die zugehörigen Werte und Typen der Primärschlüssel-Spalten. Mit diesen Angaben kann der zur Differenz gehörende Datensatz aus der Datenbank geladen werden. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 35/54 Bericht zur Master Thesis Der Typ der Differenz („Neu" DifferenceType definiert. oder "Geändert“) ist in der Enumeration-Klasse Die Enumeration-Klasse DifferenceExecutionType wird von der Differenz-AusführungsKomponente für den Eintrag im Synchronisations-Protokoll verwendet, ist aber wegen ihrer Verwandtschaft im selben Package wie die Differenz abgelegt. Die Daten für die Anzeige der Differenz im GUI, sind in einer eigenen Daten-Klasse definiert - der Klasse DifferenceDisplayInfo. 4.3.9 Geschäfts-Komponente zur Differenz-Ausführung Die Differenz-Ausführungs-Komponente im Package ch.xpertcenter.dbsync. business.sync.diffexecutor stellt der Applikations-Steuerung die Funktionen für das Kopieren und Löschen der Differenzen zur Verfügung. Die Klasse DifferenceExecutorImpl implementiert dabei das Interface DifferenceExecutor welches die beiden Methoden anbietet: Abbildung 26: Klassendiagramm Differenz-Ausführungs-Komponente Implementation der Differenz-Ausführung: Die Differenzen die kopiert oder gelöscht werden sollen, werden als Liste von Difference-Objekten übergeben. Diese Objekte enthalten alle Daten, die für das Ausführen notwendig sind. Nach dem erfolgreichen Ausführen einer Differenz, wird ein Eintrag im SynchronisationsProtokoll angelegt. Für diesen Eintrag werden zusätzlich die Id des Synchronisations-Sets und des Benutzers benötigt. Das Kopieren von Differenzen: 1. Der Datensatz zur Differenz wird aus der Quell-Tabelle geladen. 2. Der Datensatz zur Differenz wird aus der Ziel-Tabelle geladen. 3. Alle Daten aus dem Quell-Datensatz werden in den Ziel-Datensatz kopiert. 4. Bei einer Differenz vom Typ „Neu“: Der neue Ziel-Datensatz wird in der ZielTabelle eingefügt. 5. Bei einer Differenz vom Typ „Geändert“: Der geänderte Ziel-Datensatz wird in der Ziel-Tabelle aktualisiert. Es mag seltsam erscheinen, dass auch für eine Differenz vom Typ „Neu“ ein Datensatz aus der Ziel-Tabelle geladen wird – dort existiert ja noch gar kein solcher Datensatz! Das liegt aber an der Verwendung von JDBC-ResultSets: Um einen Datensatz in eine Tabelle einzufügen, muss ein ResultSet vorhanden sein, welches eine Datenbankverbindung zur Tabelle aufgebaut hat. In unserem Fall wird dazu das Select-Statement für den QuellDatensatz auf die Ziel-Tabelle angewendet. Das Resultat ist ein leeres ResultSet mit einer Verbindung zur Ziel-Tabelle. In diesem ResultSet wird mit der Methode moveToInsertRow() zu einer speziellen, leeren Einfüge-Zeile gewechselt. In diese Zeile Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 36/54 Bericht zur Master Thesis können dann die Daten des Quell-Datensatzes hineinkopiert werden. Mit der Methode insertRow() wird dann der neue Datensatz in die Ziel-Tabelle eingefügt. Bei einer Differenz vom Typ „Geändert“ werden alle Daten des Quell-Datensatzes in den bestehenden Ziel-Datensatz kopiert - der Ziel-Datensatz wird also komplett überschrieben. Es wird nicht selektiv kopiert, da in der Differenz nicht festgehalten wird, in welchen Spalten Daten geändert wurden. Mit der Methode updateRow() wird dann der bestehende Datensatz in der Ziel-Tabelle aktualisiert. Das Löschen von Differenzen: 1. Der Datensatz zur Differenz wird aus der Quell-Tabelle geladen. 2. Der Datensatz wird aus der Quell-Tabelle gelöscht. Hier ist das Prinzip das gleiche wie beim Kopieren: Mit der ResultSet-Methode deleteRow() wird der bestehende Datensatz in der Quell-Tabelle gelöscht. Eintrag im Synchronisations-Protokoll: Für einen Eintrag werden einerseits die übergebenen Daten benutzt, andererseits liefert die Differenz-Ausführungs-Komponente noch den Zeitstempel der Ausführung und den Ausführungs-Typ. Die möglichen Ausführungs-Typen sind: Eingefügt in der Ziel-Umgebung (Differenz vom Typ „Neu“ kopiert) Aktualisiert in der Ziel-Umgebung (Differenz vom Typ „Geändert“ kopiert) Gelöscht in der Quell-Umgebung (Differenz gelöscht) Sie sind in der Enumeration-Klasse DifferenceExecutionType im Package ch.xpertcenter.dbsync.business.sync.difference definiert. Entkopplung von der Datenbankzugriffs-Schicht: Wie in der Differenz-BerechnungsKomponente, wird für die Entkoppelung der JDBCDatabaseAccessor und das CachedRowSet benutzt. Die Entkoppelung kann allerdings nicht konsequent umgesetzt werden: Die eingesetzte Datenbank DB2 hat die Eigenheit, dass sie für das Einfügen, Aktualisieren und Löschen von Datensätzen, die Spalten vom Typ VARCHAR oder BLOB enthalten, nur ResultSets zulässt, die nicht navigierbar (scrollable) sind. Ein CachedRowSet ist per Definition aber immer navigierbar und kann daher nicht verwendet werden (siehe auch Klasse test.sync.TestInsertUpdateDelete). Darum muss für die Differenz-Ausführung das normale ResultSet benutzt werden. Da es nicht sinnvoll ist, die zentrale Funktionalität der Differenz-Ausführungs-Komponente in eine Hilfsklasse wir den JDBCDatabaseAccessor auszulagern, greift die Differenz-AusführungsKomponente also auch selbst direkt auf die Datenbank zu. Schutz vor Fehlmanipulationen in der Datenbank: In der Differenz-Ausführungs-Komponente werden keine SQL-Statements erzeugt – es wird ausschliesslich das Select-Statement und die zugehörigen Werte und Typen der Primärschlüssel-Spalten aus dem übergebenen Differenz-Objekt verwendet. Für das Laden des Quell-Datensatzes, das Aktualisieren/Einfügen der Daten in der ZielTabelle und das Löschen des Datensatzes in der Quell-Tabelle werden die Funktionen des CachedRowSets, resp. des normalen ResultSets verwendet – die Daten werden also nie „von Hand“ angefasst. Zusätzlich wird vor der Ausführung geprüft, ob das SQL-Statement in der Quell- und in der Ziel-Umgebung tatsächlich die richtige Anzahl Datensätze selektiert (einen oder keinen). Andernfalls wäre das ein Fehler im Select-Statement oder der Datensatz wurde seit der Berechung der Differenz verändert oder gelöscht. In einem solchen Fall wird eine Exception geworfen. Exception-Handling: Analog den anderen Komponenten, werden auch hier alle Fehler die in der Komponente selbst oder in den daraus aufgerufenen Komponenten auftreten, in eine Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 37/54 Bericht zur Master Thesis eigene Exception-Klasse, die DifferenceExecutorException, verpackt. Sie ist die einzige Exception die an die Applikations-Steuerung weitergegeben wird. 4.3.10 Geschäftsobjekte Die Geschäftsobjekte (BO's) kapseln die darunterliegende Datenzugriffs-Schicht. Für den Datenzugriff nutzen sie die vom O/R-Mapper generierten Entitäts-Klassen (POJO‘s). Die Geschäftsobjekte für das Modell der Konfigurationsdaten im Package ch.xpertcenter.dbsync.business.sync.bo bieten nur lesenden Zugriff auf die Konfigurationsdaten an. Ein Schreib-Zugriff ist im Moment nicht nötig, da die Konfigurationsdaten direkt in der Datenbank bearbeitet werden und (noch) nicht in der Applikation. Beim Geschäftsobjekt für das Modell des Synchronisations-Protokolls im Package ch.xpertcenter.dbsync.business.syncprotocol.bo ist es genau umgekehrt: Es bietet nur die Funktion zum Speichern eines neuen Eintrags in der Datenbank an. Es wird ausschliesslich von der Differenz-Ausführungs-Komponente zum Anlegen neuer Einträge verwendet. Abbildung 27: Klassendiagramm der Geschäftsobjekte 4.3.11 Datenbank-Zugriff mit JDBC Die Hilfsklasse JDBCDatabaseAccessor im Package ch.xpertcenter.dbsync. database.jdbc bietet statische Hilfsmethoden rund um den Datenbank-Zugriff mit JDBC an. So können die Geschäftskomponenten vom umfangreichen Code für den Auf- und Abbau der JDBC-Datenbank-Verbindungen entlastet werden. Ausserdem wird CodeDuplizierung in den einzelnen Komponenten vermieden. 4.3.12 Datenbank-Zugriff mit O/R-Mapper Die Objekte der durch Hibernate generierten Entitäts-Klassen (POJO‘s) im Package ch.xpertcenter.dbsync.database.hibernate repräsentieren jeweils einen Datensatz aus der entsprechenden Datenbank-Tabelle. Die Beziehungen zwischen den drei Klassen Syncset, Synctable und Synclevel werden durch beidseitig navigierbare java.util.Sets abgebildet. Dadurch muss dem GUI, für die Anzeige der Konfigurationsdaten in den Auswahllisten, nur die Liste mit den Synchronisations-Sets übergeben werden – die zugeordneten Tabellen und Umgebungen können dann über die java.util.Sets erreicht werden. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 38/54 Bericht zur Master Thesis Abbildung 28: Klassendiagramm der Entitäts-Klassen für die Konfig-Daten 4.3.13 Datenbank Das Datenmodell der Konfiguration besteht in der Datenbank aus den drei Tabellen SYNCSET, SYNCTABLE und SYNCLEVEL. Deren n-zu-n-Beziehungen werden durch die zwei Zwischentabellen SYNC_SET_TABLE und SYNC_TABLE_LEVEL abgebildet: Abbildung 29: Tabellen des Konfigurationsdaten-Modells Die Beschreibung der Tabellen und ihrer Spalten kann dem DDL-Skript „Tabellen für die Konfigurationsdaten.sql“ entnommen werden. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 39/54 Bericht zur Master Thesis 4.4 Synchronisationsprotokoll 4.4.1 Datenmodell 4.4.1.1 Detail-Analyse des Datenmodells Gemäss der Anforderung FA-4 „Synchronisations-Protokoll“ ergeben sich für einen Eintrag im Synchronisations-Protokoll mindestens folgende Attribute: Zeitstempel: Datum und Zeit des Eintrags. Benutzer: User-Id oder Benutzername des Benutzers, der die Synchronisation durchgeführt hat. SQL-Statement: Ausgeführtes Insert-, Update- oder Delete-Statement. Die Kann-Anforderung FA-5 „Synchronisations-Protokoll erweitert“ sieht vor, dass das Synchronisations-Protokoll neben dem ausgeführten SQL-Statement auch noch das „Umkehr“-Statement enthalten soll, damit eine Synchronisation einfach rückgängig gemacht werden kann. Diese Anforderung wird im Moment nicht umgesetzt, soll aber im Design berücksichtigt werden. 4.4.1.2 Detail-Design des Datenmodells Attribut „Benutzer“: Durch die Benutzeridentifikation kann die Datenbank-Id des Benutzers verwendet werden (siehe Kapitel 4.2.9). Attribut „SQL-Statement“: Das Design der Differenz-Berechnung und Differenz-Ausführung ist so ausgelegt, dass keine Insert-, Update- oder Delete-Statements generiert werden um einen möglichst hohen Schutz vor Fehlmanipulationen in der Datenbank zu erreichen. Als SQL-Statement wird im Protokoll daher das in der Differenz vorhandene SelectStatement und die zugehörigen Werte und Typen der Primärschlüssel-Spalten eingetragen (siehe Kapitel 4.3.8). Ein „Umkehr“-Statement kann aufgrund des Designs nicht erzeugt werden – die KannAnforderung FA-5 wird deshalb fallen gelassen. Weitere Attribute: Eingetragen werden auch die zugehörigen Konfigurationsdaten, sowie der Typ und der Ausführungs-Typ der Differenz. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 40/54 Bericht zur Master Thesis 4.4.2 GUI 4.4.2.1 Übersicht 2 1 3 4 Abbildung 30: GUI Synchronisations-Protokoll Beschreibung der Bereiche der Synchronisations-Protokoll-Seite: 1. Bereich für die Auswahl der Konfigurations-Daten, die als Suchkriterien dienen 2. Bereich für die Auswahl von weiteren Suchkriterien 3. Buttons für die Anzeige des Synchronisations-Protokolls aufgrund der ausgewählten Suchkriterien und zum Zurücksetzen der Suchkriterien 4. Bereich für die Anzeige der Protokoll-Einträge Die Synchronisations-Protokoll-Seite ist in der Datei synchronisation_protocol.jsp abgelegt. 4.4.2.2 Auswahl der Konfigurations-Daten Die Auswahl der Konfigurationsdaten ist genau gleich aufgebaut wie in der SynchronisationsSeite. Es gibt aber zwei Unterschiede: 1. Es gibt jeweils auch einen leeren Eintrag. So kann z.B. ein Synchronisations-Set als alleiniges Suchkriterium ausgewählt werden - eine Tabelle und die Umgebungen müssen nicht ausgewählt werden. 2. Es werden alle Sets, Tabellen und Umgebungen angezeigt – auch diejenigen die nicht (mehr) aktiv sind. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 41/54 Bericht zur Master Thesis Abbildung 31: GUI Synchronisations-Protokoll: Auswahl der Konfigurations-Daten 4.4.2.3 Die weiteren Suchkriterien Abbildung 32: GUI Synchronisations-Protokoll: Weitere Suchkriterien Beschreibung der weiteren Suchkriterien: „Auf den angemeldeten Benutzer einschränken“: Wenn markiert, werden nur Protokoll-Einträge angezeigt, die vom aktuellen Benutzer stammen. So sieht man nur die eigenen Synchronisationen. Benutzer: In der Auswahlliste werden alle in der Datenbank vorhandenen Benutzer angeboten – auch die nicht (mehr) aktiven. So kann auf die Protokoll-Einträge eingeschränkt werden, die vom ausgewählten Benutzer stammen. Wenn die obige Checkbox markiert ist, dann ist die Auswahlliste deaktiviert. Das Feld kann leer gelassen werden. Datum von: Wenn ein Datum eingetragen ist, werden nur Protokoll-Einträge angezeigt, die am oder nach diesem Datum angelegt wurden. Das Feld kann leer gelassen werden. Ein Kalender hilft bei der Auswahl des Datums. Er wird beim Klicken auf das Auswahl-Symbol (Dreieck) des Felds geöffnet. Datum bis und mit: Wenn ein Datum eingetragen ist, werden nur Protokoll-Einträge angezeigt, die am oder vor diesem Datum angelegt wurden. Das Feld kann leer gelassen werden. Ein Kalender hilft bei der Auswahl des Datums. Er wird beim Klicken auf das Auswahl-Symbol (Dreieck) des Felds geöffnet. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 42/54 Bericht zur Master Thesis 4.4.2.4 Suchkriterien zurücksetzen Mit dem Button „Suchkriterien zurücksetzen“ werden alle Suchkriterien gelöscht resp. auf ihre Standard-Werte zurückgesetzt. Standard-Werte gibt es für folgende Suchkriterien: Datum von: Heute vor einem Monat „Auf den angemeldeten Benutzer einschränken“: Ja (Checkbox ist markiert) 4.4.2.5 Anzeige der Protokoll-Einträge Mit dem Button „Protokoll anzeigen“ werden die Protokoll-Einträge, die den angegebenen Suchkriterien entsprechen, gesucht und im Bereich „Protokoll-Einträge“ in einer Tabelle angezeigt. In der Statuszeile wird die Anzahl der gefundenen Einträge angezeigt. Abbildung 33: GUI Synchronisations-Protokoll: Anzeige der Einträge Hier als Beispiel ein kompletter Eintrag: Abbildung 34: GUI Synchronisations-Protokoll: Kompletter Eintrag 4.4.3 GUI-Steuerung Die Synchronisations-Protokoll-Seite wird durch den SynchronisationProtocolUI-Bean (Klasse SynchronisationProtocolUI) gesteuert. Der Bean stellt dem GUI die Daten für die Auswahllisten der Suchkriterien und die Tabelle mit den Einträgen zur Verfügung und enthält die Methoden die durch die Buttons aufgerufen werden. Im Bean enthält ein Objekt der Klasse SyncProtocolSearchParams die Werte der Suchkriterien. Hier zeigt sich, wie komfortabel das Programmieren mit dem GUI-Framework ist: Die Felder der Suchkriterien im GUI sind direkt mit den Feldern in diesem Objekt Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 43/54 Bericht zur Master Thesis verknüpft – jede Wert-Änderung im GUI wird direkt ins Objekt geschrieben. Dasselbe Objekt wird dann beim Aufruf der Such-Methode der Applikations-Steuerungs-Komponente als Parameter mitgegeben. Im Bean selbst muss auf diese Weise nur ein einziges Feld angelegt werden, um die Werte aller Eingabefelder im GUI zu sammeln und weiterzugeben. 4.4.4 Applikations-Steuerung Die Steuerungs-Komponente für das Synchronisations-Protokoll im Package ch.xpertcenter.dbsync.business.syncprotocol stellt der GUI-Steuerung die Schnittstelle zur Verfügung, über die sie die Methoden für die Anzeige des SynchronisationsProtokolls aufrufen kann. Die Klasse SynchronisationProtocolControllerImpl implementiert das Interface SynchronisationProtocolController welches die folgenden Methoden anbietet: Abbildung 35: Klassendiagramm Steuerungs-Komponente Synchronisations-Protokoll Suche: Die Kriterien für die Suche werden der Methode search() in Form eines Objekts der Klasse SyncProtocolSearchParams übergeben. Durch diese Hilfsklasse bleibt die Signatur der Such-Methode übersichtlich und neue Suchkriterien können in Zukunft sehr einfach hinzugefügt werden. Die Suche ist direkt im Controller implementiert. Die Logik für die Suche ist einfach und übersichtlich, deshalb ist es nicht nötig sie in eine eigene Geschäftskomponente auszulagern. Auch hier wird das Select-Statement nicht „von Hand“ zusammengestellt. Die passenden Protokoll-Einträge können mit Hilfe des Hibernate Criteria API elegant und typsicher aus der Datenbank gelesen werden. Das Resultat wird als Liste von Syncprotocol-O/R-Mapper-Objekten zurückgegeben. Der GUI-Steuerung werden mit den Methoden getAllSynchronisationSets() und getAllUsers() die Daten zur Verfügung gestellt, die sie für das Füllen der SuchkriterienAuswahllisten benötigt. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 44/54 Bericht zur Master Thesis Für einen Protokoll-Eintrag wird in der Datenbank nur die Id des Sets, der Tabelle, der Umgebung, usw. abgelegt – nur das SQL-Statement wird in Textform gespeichert. Die GUISteuerung braucht für die Anzeige der Einträge aber den zugehörigen Namen oder Text. Um die Anzahl der dafür notwendigen Datenbankzugriffe zu minimieren, implementiert die Klasse SyncProtocolDisplayCache einen Cache für die Namen der Konfigurationsdaten und der Benutzer. Für den Differenz- und den Ausführungs-Typ ist der Text in der entsprechenden Enumeration-Klasse definiert. Exception-Handling: Auch hier werden alle Fehler, die in der Komponente selbst oder in einer daraus aufgerufenen Komponente auftreten, in eine eigene Exception, die SynchronisationProtocolException verpackt. Sie ist die einzige Exception die ans GUI weitergegeben wird. 4.4.5 Geschäftsobjekte Das Geschäftsobjekt für das Modell des Synchronisations-Protokolls, die Klasse SynchronisationProtocolEntryBO im Package ch.xpertcenter.dbsync. business.syncprotocol.bo, wird von der Differenz-Ausführungs-Komponente zum Speichern eines neuen Eintrags in der Datenbank verwendet (siehe Kapitel 4.3.10). Von der Applikations-Steuerung des Synchronisations-Protokolls wird es nicht benutzt, da die Protokoll-Einträge direkt über den O/R-Mapper aus der Datenbank gelesen werden. 4.4.6 Datenbank-Zugriff mit O/R-Mapper Der Zugriff auf das Datenmodell des Synchronisations-Protokolls erfolgt mit dem O/RMapping-Framework „Hibernate“ [Web8]. Die Objekte der generierten Klasse Syncprotocol im Package ch.xpertcenter.dbsync.database.hibernate repräsentieren dabei jeweils einen Datensatz aus der Tabelle SYNCPROTOCOL. 4.4.7 Datenbank Das Datenmodell wird in der Datenbank mit der Tabelle SYNCPROTOCOL abgebildet. Abbildung 36: Tabelle des Synchronisations-Protokolls Die Beschreibung der Tabelle und ihrer Spalten kann dem DDL-Skript „Tabellen für das Synchronisations-Protokoll.sql“ entnommen werden. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 45/54 Bericht zur Master Thesis 5 Test 5.1 Konzept Um die verschiedenen Komponenten des GUI’s, der Geschäftslogik und der DatenzugriffsSchicht zu testen, werden sowohl Unit-Tests also auch Integrations-Tests durchgeführt. Mit Unit-Tests werden einzelne Komponenten isoliert gestestet. Sie werden während der Implementation der Komponente mit Hilfe der Software-Entwicklungsumgebung durchgeführt. Unit-Tests beinhalten neben funktionalen Tests (siehe unten) vor allem strukturelle Tests, mit denen der innere Aufbau (Whitebox), also die Verzweigungen und Schleifen im Code, getestet wird. Mit Integrations-Tests wird das Zusammenspiel der Komponenten innerhalb der Applikation getestet. Sie werden nach Abschluss der Implementation mit der fertig zusammengebauten Applikation durchgeführt. Integrations-Tests sind funktionale Tests mit denen die Funktion einer Komponente „von aussen“ (Blackbox) durch den Aufruf ihrer öffentlichen Methoden getestet wird. Vor allem wird auch das Zusammenspiel der verschiedenen Komponenten getestet. 5.2 Testumgebung Die Tests werden auf dem Entwicklungs-Rechner durchgeführt – es wird keine davon getrennte Testumgebung aufgebaut, da der Entwicklungs-Rechner die Zielplattform ist, auf dem DB-Sync eingesetzt werden soll. Die Unit-Tests werden mit JUnit direkt in der Software-Entwicklungsumgebung ausgeführt. Für die manuellen Unit-Tests im GUI wird DB-Sync aus der Entwicklungsumgebung heraus gestartet. Für die Integrations-Tests wird ein Release erstellt, d.h. die Applikation wird komplett zusammengebaut und kann unabhängig von der Entwicklungsumgebung gestartet werden. In dieser Form wird DB-Sync dann auch den Benutzern ausgeliefert. Zentral für das Testen der Applikation sind die Datenbanken und die darin enthaltenen Testdaten. Die Test-Datenbanken sollen möglichst nahe an den realen Gegebenheiten der Systemumgebung sein, in der DB-Sync später betrieben wird - zugleich soll komplett unabhängig von der bestehenden Datenbank-Infrastruktur der XpertCenter AG getestet werden können. Zu diesem Zweck werden auf dem Entwicklungs-Rechner die folgenden Datenbanken angelegt, welche die drei realen Umgebungen repräsentieren: Lokale Test-Datenbank Repräsentierte Umgebung DBSYNCPR Produktion DBSYNCIN Integration DBSYNCDV Entwicklung Die Dateien mit den SQL-Befehlen zur Erzeugung der hier aufgeführten Test-Datenbanken sind im Verzeichnis „Datenbank“ in der ZIP-Datei mit den Anhängen zu dieser Master Thesis enthalten. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 46/54 Bericht zur Master Thesis 5.3 Testdaten Die Testdaten lassen sich in zwei Kategorien unterteilen: Testdaten für die Synchronisation: Das sind diejenigen Daten, die synchronisiert werden sollen. Jede Geschäftsapplikation hat mehrere Tabellen, in denen Daten abgelegt sind, die z.B. zur Steuerung des GUI’s dienen oder die Berechnungsfaktoren, Texte oder Dokumente enthalten. Testdaten für das Datenmodell von DB-Sync: Das sind die Daten für die Konfiguration von DB-Sync, d.h. die vom Benutzer angelegten SynchronisationsSets, die zu synchronisierenden Tabellen und die vorhandenen Umgebungen. Dazu kommen noch Daten für das Synchronisations-Protokoll und die Benutzer. Die Dateien mit den SQL-Befehlen zur Erzeugung der in den nachfolgenden Kapiteln aufgeführten Test-Tabellen und Test-Daten sind im Verzeichnis „Datenbank“ in der ZIP-Datei mit den Anhängen zu dieser Master Thesis enthalten. 5.3.1 Testdaten für die Synchronisation Es werden vier Geschäftsapplikationen simuliert. Jede hat in der Datenbank ein eigenes Schema. Ein Schema dient zur Gruppierung von Tabellen - es ist eine Art Namensraum in der Datenbank. So können für jede der Geschäftsapplikationen die gleichen Tabellennamen verwendet werden – durch den Schema-Namen als Präfix sind die Tabellen eindeutig definiert. Folgende Schemas werden für die die Simulation der Geschäftsapplikationen angelegt: (Die Schemas sind nach den vier Geschäftsbereichen der XpertCenter AG benannt) Test-Schemas TESTAPP_MOTORBUSINESS TESTAPP_INTERCLAIMS TESTAPP_RECOURSE TESTAPP_CIF Es werden die folgenden Test-Tabellen verwendet. Die Tabellen-Struktur ist den bei der XpertCenter AG existierenden Tabellen nachempfunden. Es wurde darauf geachtet, dass alle Daten-Typen, die synchronisiert werden müssen in mindestens einer Tabelle vorhanden sind. Auch die Primär-Schlüssel wurden entsprechend unterschiedlich gewählt. Test-Tabellen DATATYPES DECIMAL_CONSTANT DOCUMENT DOCUMENTINFO (View) ROLETASK TEXT Der Zugriff auf diese Tabellen erfolgt mit einem technischen Test-User. Dieser ist im Betriebssystem des Entwicklungsrechners als lokaler Benutzer definiert. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 47/54 Bericht zur Master Thesis Technischer Test-User SDBSYNCTEST (Passwort: sdbsynctest) Die Tabellen werden mit einem repräsentativen Satz an Test-Daten gefüllt. Diese Daten bilden den Ausgangspunkt für die Tests und sind auf allen Umgebungen gleich. Für die einzelnen Tests werden dann Daten hinzugefügt, gelöscht und verändert. 5.3.2 Testdaten für das Datenmodell von DB-Sync Die Tabellen des Datenmodells werden alle in demselben Schema angelegt. Für die Tests werden diese Tabellen in der Test-Datenbank DBSYNCPR angelegt, welche die Produktions-Umgebung repräsentiert. Schema für DB-Sync DBSYNC Der Zugriff auf alle Tabellen des Datenmodells von DB-Sync erfolgt mit einem technischen User. Dieser ist im Betriebssystem des Entwicklungsrechners als lokaler Benutzer definiert. Technischer User für DB-Sync SDBSYNC (Passwort: sdbsync) 5.3.2.1 Testdaten für die Konfiguration Die Tabellen für die Konfiguration sind im Kapitel 4.3.13 beschrieben. Konfigurations-Tabellen SYNCSET SYNC_SET_TABLE SYNCTABLE SYNC_TABLE_LEVEL SYNCLEVEL Die Konfigurations-Tabellen werden mit Test-Daten gefüllt, welche die vorhandenen TestGeschäftsapplikationen und deren Test-Tabellen abbilden. Diese Daten bilden die Basis für das Testen der Synchronisation. Diese Test-Daten werden auch für das Testen des Konfigurations-Modells verwendet - für bestimmte Tests werden noch Daten hinzugefügt, gelöscht und verändert. 5.3.2.2 Testdaten für das Synchronisations-Protokoll Die Tabelle für das Synchronisations-Protokoll ist im Kapitel 4.4.7 beschrieben. Tabelle Synchronisations-Protokoll SYNCPROTOCOL Die Synchronisations-Protokoll-Tabelle wird mit Test-Daten gefüllt, welche die durchgeführten Synchronisationen abbilden. Obwohl man bei der Durchführung der Tests für die Synchronisation automatisch Einträge in dieser Tabelle erhält, wird ein Satz von Testdaten von Hand erstellt, damit stabil und nachvollziehbar getestet werden kann. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 48/54 Bericht zur Master Thesis 5.3.2.3 Testdaten für die Benutzeridentifikation Die Tabelle für die Benutzeridentifikation ist im Kapitel 4.2.9 beschrieben. Tabelle Benutzeridentifikation SYNCUSER Die Benutzeridentifikations-Tabelle wird mit Test-Daten gefüllt, welche einerseits nicht existierende Test-Benutzer für Unit-Tests und andererseits reale Benutzer, welche die Applikation entwickeln und testen, repräsentieren. 5.4 Durchführung der Tests 5.4.1 Unit-Tests Während der Implementation der Komponenten wurden konsequent Unit-Tests durchgeführt. Mit diesen Unit-Tests wurde sowohl die Funktion als auch der innere Aufbau aller Methoden überprüft. Mit ihrer Hilfe sollten möglichst alle vorhandenen Fehler gefunden werden. Nur für einige, wenige Unit-Tests wurden Juni-Testklassen und -Methoden erstellt, die komplett eigenständig lauffähig sind. Das liegt vor allem an der aufwändigen Bereitstellung der notwendigen Testdaten in der Datenbank – dazu hätte ein Testframework wie z.B. DBUnit verwendet werden müssen. Darauf wurde aber wegen dem Aufwand für die Einarbeitung ins Framework und dem hohen Aufwand für die Erstellung solcher Tests verzichtet. Damit für jeden Test die genau gleichen Testdaten zur Verfügung stehen, wurden die komplett erstellten Testdaten mit dem DB2-Tool „db2move“ aus der Datenbank exportiert. So konnten sie vor jedem Test gelöscht und neu importiert werden. Für den überwiegenden Teil der Unit-Tests wurde eine JUnit-Klasse oder das GUI dazu benutzt, die zu testende Methode aufzurufen. Die Testdaten wurden vor dem Test in der Datenbank von Hand angepasst und nach dem Test in der Datenbank überprüft. Bedingungen, Verzweigungen und Schleifen innerhalb der Methoden wurden mit Hilfe des Debuggers der Entwicklungsumgebung getestet. 5.4.2 Integrations-Tests Die Integrations-Tests wurden nach der Implementation mit der fertigen, zusammengebauten Applikation durchgeführt. Sie sollen beweisen, dass die Applikation fehlerfrei und den Anforderungen entsprechend funktioniert. Bei den Testfällen für die Differenz-Berechnung und -Ausführung wurde besonders die Robustheit der Applikation gegenüber Fehler-Situationen geprüft, die auftreten können, wenn die Applikation läuft und gleichzeitig jemand anderes die Daten in der Datenbank verändert. Insgesamt wurden 22 (mehrteilige) Testfälle erstellt. Der Zweck, die Vorbedingungen und der genaue Ablauf dieser Testfälle sowie das Datum und das Resultat der Durchführung sind im Test-Protokoll dokumentiert. Dieses ist in der ZIP-Datei mit den Anhängen zu dieser Master Thesis enthalten. Wenn bei einem Testfall ein Fehler aufgetreten ist, wurde dieser korrigiert, die Applikation neu gebaut und der Testfall nochmals wiederholt. Nachdem alle Integrations-Tests fehlerfrei durchgeführt werden konnten, wurde die Applikation für den produktiven Einsatz im Entwicklungs-Team der XpertCenter AG freigegeben. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 49/54 Bericht zur Master Thesis 6 Entwicklungs-Umgebung 6.1 Entwicklungs-Rechner Für die Entwicklung wird der normale Laptop eingesetzt, den alle Entwickler der XpertCenter AG als Arbeitsgerät benutzen. Dieser Laptop ist zugleich die Zielplattform, auf der dann DBSync installiert und produktiv genutzt wird. Betriebssystem ist Windows XP mit SP3. 6.2 Rich-Client-Framework „CaptainCasa Enterprise Client“ 6.2.1 Installation Für Windows-Betriebssysteme existiert ein Installationsprogramm. Dieses kann von der Webseite des Herstellers heruntergeladen werden: http://captaincasa.com, auf der Seite „Forum/Download“. Für den Download muss man sich registrieren. Anleitung siehe [Web6]. 6.2.2 Lizenz Für den produktiven Einsatz des CaptainCasa Enterprise Clients, muss man beim Hersteller eine Lizenz beziehen. Neben den kostenpflichtigen Lizenzen (mit Support und bei Bedarf mit Source-Code) gibt es die sogenannte „binäre Lizenz“, mit der das Framework kostenlos eingesetzt werden kann. Siehe http://captaincasa.com/pdf/eclnt_Copyright.pdf 6.3 Software-Entwicklungsumgebung 6.3.1 MyEclipse Als Java-Entwicklungsumgebung wird MyEclipse Version 8.6.1 eingesetzt. MyEclipse ist eine kommerzielle Entwicklungsumgebung auf der Basis von Eclipse. MyEclipse kann runtergeladen und dann 30 Tage lang kostenlos getestet werden. Webseite: http://www.myeclipseide.com 6.3.2 Tomcat Als Applikationsserver (Servlet-Container) für das auf JSF [Web2] basierende Rich-ClientFramework wird der Tomcat in Version 6.0.29 eingesetzt. Der Tomcat ist OpenSource und kostenlos. Webseite: http://tomcat.apache.org 6.3.3 Entwicklungswerkzeuge von CaptainCasa Enterprise Client CaptainCasa bietet eine eigene Entwicklungsumgebung an, die so konfiguriert werden kann, dass sie problemlos mit MyEclipse und dem Tomcat zusammen arbeitet. In dieser Entwicklungsumgebung kann mit dem Layout-Editor das GUI erstellt und mit den Managed Beans verknüpft werden. Anleitung siehe [Web7]. 6.4 Datenbank Als Datenbank wird DB2 Version 9.7 von IBM eingesetzt. Auf dem Entwicklungs-Rechner ist eine Instanz des Datenbank-Managementsystems installiert. Pro Instanz können mehrere unabhängige Datenbanken betrieben werden. Neben verschiedenen kostenpflichtigen Versionen, stellt IBM auch eine kostenlose Version zu Verfügung: DB2 Express-C. Webseite: http://www-01.ibm.com/software/data/db2/express/. Für die Entwicklung werden drei Datenbanken angelegt, welche die drei realen Umgebungen repräsentieren. So kann komplett unabhängig von der bestehenden Datenbank-Infrastruktur der XpertCenter AG entwickelt und getestet werden. Diese Datenbanken sind im Kapitel 5.2 beschrieben. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 50/54 Bericht zur Master Thesis Für den manuellen Zugriff auf die Datenbanken wird das Datenbank-Tool „AQT“ eingesetzt. Der Zugriff erfolgt über CLI/ODBC (Open Database Connectivity). Dazu werden die Datenbanken per CATALOG-Befehl als „System Data Source“ registriert. Der Zugriff auf die Datenbanken aus der Applikation „DB-Sync“ heraus, erfolgt über JDCB (Java Database Connectivity) mit dem IBM-Treiber „com.ibm.db2.jcc.DB2Driver“. Dieser Treiber ist einer vom „Typ 4“, d.h. komplett in Java geschrieben, und greift über das Netzwerk-Protokoll TCP/IP auf die Datenbank zu. Es wird die neuste Version verwendet, die den JDBC-Standard 4.0 unterstützt. Die einzelnen Datenbanken werden in der Tomcat-Konfiguration als Ressourcen vom Typ „javax.sql.DataSource“ definiert. Diese DataSources können dann im Java-Code für den DBZugriff benutzt werden. 6.5 Tools 6.5.1 AQT AQT steht für „Advanced Query Tool“ und wird in der XpertCenter AG zur Administration und Abfrage von DB2-Datenbanken verwendet. AQT ist ein kommerzielles Produkt, also kostenpflichtig. Webseite: http://www.querytool.com/index.html 6.5.2 Dia Dia ist ein Diagramm-Zeichnungsprogramm ähnlich wie Visio von Microsoft. Mit Dia können u.a. auch UML-Diagramme gezeichnet werden. Dabei können bei Bedarf beliebige UMLElemente kombiniert werden, was hilfreich ist bei Diagrammen, die nicht zum Standard von UML gehören (z.B. das Systemkontext-Diagramm). Dia ist OpenSource und kostenlos. Webseite: http://live.gnome.org/Dia 6.5.3 JUDE JUDE Community 5.5 ist ein Tool zur Erstellung von UML-Diagrammen aller Art. Mit JUDE können aus bestehendem Java-Sourcecode Klassendiagramme erzeugt werden. JUDE Community ist kostenlos, mittlerweile wurde die Entwicklung aber eingestellt. Es gibt zwar den ebenfalls kostenlosen Nachfolger „astah* community“ – dieser enthält die ImportFunktion für Java-Sourcecode aber leider nicht mehr. Webseite: http://jude.change-vision.com/jude-web/index.html Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 51/54 Bericht zur Master Thesis 7 Zusammenfassung 7.1 Resultat Mit dem Resultat der Master Thesis bin ich sehr zufrieden. Die Applikation DB-Sync erfüllt alle im Pflichtenheft definierten Muss-Anforderungen. Auch das im Abstract formulierte Ziel wird voll und ganz erfüllt: mit DB-Sync kann die Synchronisation der Konfigurationsdaten einfach, fehlerfrei und nachvollziehbar durchgeführt werden. DB-Sync wird in der Entwicklungs-Abteilung der XpertCenter AG bereits produktiv eingesetzt. 7.2 Ablauf und Aufwand Die Arbeit konnte ich wie geplant durchführen. Besondere Probleme sind nicht aufgetreten. Der Ablauf lässt sich in die Phasen Pflichtenheft, Architektur und Grob-Design, Implementierung (mit Detaildesign, Codierung, Unit-Tests und Dokumentation im Code), Integrations-Tests und Abschlussarbeiten (Dokumentation im Diplom-Bericht, Poster, Vortrag) aufteilen. Für die Arbeit habe ich rund 400 Stunden aufgewendet – das sind 10% mehr als veranschlagt. Der Mehraufwand liegt im Rahmen meiner Erwartungen und verteilt sich gleichmässig auf alle Phasen. 7.3 Schlusswort Die Master Thesis war eine spannende, lehrreiche und anstrengende Zeit – genau so wie das gesamte MAS-IT. Bei der Master Thesis wollte ich möglichst viel von dem umsetzen, was ich in den vorangegangenen Semestern dazugelernt hatte. Das konnte ich besonders im Bereich Architektur und Design. Im Ganzen betrachtet hat sich diese Weiterbildung für mich sehr gelohnt – sie hat meine Kenntnisse in der Software-Entwicklung noch vertieft und abgerundet. Ich möchte mich bei allen bedanken, die mich während der Master Thesis und der gesamten Weiterbildung unterstützt haben. Besonders möchte ich auch meiner Arbeitgeberin, der XpertCenter AG danken, die mir diese Weiterbildung durch ihre grosszügige Unterstützung möglich gemacht hat. Ganz besonders danke ich meiner Familie. Sie hat mich immer inspiriert, motiviert und die Belastung dieser Weiterbildung mitgetragen. März 2011, Thomas Schenker Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 52/54 Bericht zur Master Thesis Anhang A – Glossar Begriff CRUD-Operationen POJO Schema SQL-Statement Synchronisation SynchronisationsSet Tabelle Tool Umgebung View Erklärung Die auf einer Datenbank für einen Datensatz ausführbaren Befehle: C = Create (Erstellen) R = Read (Lesen) U = Update (Ändern) D = Delete (Löschen) Plain Old Java Object. Wird als Bezeichnung für die Entitäts-Klassen verwendet, die vom O/R-Mapping-Framework generiert werden. Das sind normale, leichtgewichtige Klassen – im Gegensatz zu den früher verwendeten, schwergewichtigen Entity-EJB’s (Enterprise Java Beans). Ein Schema dient zur Gruppierung von Tabellen in der Datenbank es ist eine Art Namensraum in der Datenbank. So können z.B. für verschiedene Geschäftsapplikationen die gleichen Tabellennamen verwendet werden – durch den Schema-Namen als Präfix sind die Tabellen eindeutig definiert. Ein Befehl der Datenbank-Änderungs- und Abfragesprache SQL. Dient zum Ausführen der CRUD-Operationen auf der Datenbank. Synchronisation (auch Synchronisierung) ist der Vorgang, bei dem die Daten in einer Tabelle A einer Umgebung X mit den Daten in der gleichen Tabelle A in einer anderen Umgebung Y verglichen und die Differenzen so bereinigt werden, dass die Daten in beiden Tabellen genau gleich sind. Dabei müssen nicht alle Daten in der Tabelle synchronisiert werden – welche das sind, bestimmt der Benutzer. Ein Synchronisations-Set dient zur Gruppierung von Tabellen. Es ist ein Satz von Tabellen, die zusammengehören. Typischerweise besteht ein solcher Satz aus den Tabellen einer einzelnen Geschäftsanwendung. So trägt ein Synchronisations-Set normalerweise den Namen einer Geschäftsanwendung. In einer Datenbank sind die Daten in Form einer Tabelle, also in Zeilen und Spalten, abgelegt. englisch: „Werkzeug“, „Hilfsmittel für die Arbeit“. Software (Programm, Anwendung, Applikation) mit deren Hilfe eine Aufgabe erledigt werden kann. Eine Umgebung ist eine logische Gruppierung von Applikations- und Datenbank-Servern, die eine bestimmte Aufgabe erfüllen. Zum Beispiel eine Umgebung für die Entwicklung, eine für die Integration und eine für die Produktion. Bei der Synchronisation entspricht eine Umgebung einer bestimmten Datenbank auf einem der Datenbank-Server. Eine Umgebung dient zur Auswahl der Quell- und der Ziel-Tabelle für eine Synchronisation. Eine View ist, wie der Name schon sagt, eine „Sicht“ auf eine oder mehrere Tabellen in einer Datenbank. Eine View ist eine virtuelle Tabelle mit der z.B. nur bestimmte Spalten und/oder Datensätze einer Tabelle angezeigt werden können. Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 53/54 Bericht zur Master Thesis B – Quellenverzeichnis Literatur: [Lit1] Analyse und Design mit UML 2.3 - Objektorientierte Softwareentwicklung, Bernd Oesterreich, Oldenbourg Wissenschaftsverlag GmbH, München, 2009. [Lit2] Skript „Architektur und Design“, Stefan Meichtry, 2009 CAS Enterprise Application Development Java EE (EADJ), http://www.sws.bfh.ch/studium/cas/eadj.xhtml [Lit3] Skript „Architektur und Design“, Simon Martinelli, 2009 CAS Distributed Systems (DS), http://www.sws.bfh.ch/studium/cas/ds.xhtml Im Internet: [Web1] CaptainCasa Enterprise Client-Framework, http://captaincasa.com [Web2] JavaServer Faces (kurz: JSF), http://de.wikipedia.org/wiki/JavaServer_Faces [Web3] Einführung in die Technik des CaptainCasa Enterprise Client-Frameworks, http://captaincasa.com/pdf/eclnt_TechnicalOverview.pdf [Web4] Beschreibung des Einsatzes von JSF im CaptainCasa Enterprise ClientFramework, http://captaincasa.com/pdf/eclnt_JSFUtilization.pdf [Web5] Beschreibung des „Embedded-Modus“ des CaptainCasa Enterprise ClientFrameworks, http://captaincasa.com/pdf/eclnt_embeddedusagemode.pdf [Web6] Installation und Konfiguration des CaptainCasa Enterprise Client-Frameworks, http://captaincasa.com/pdf/eclnt_Installation.pdf [Web7] Entwickler-Handbuch für das CaptainCasa Enterprise Client-Framework, http://captaincasa.com/pdf/eclnt_DevelopersGuide.pdf [Web8] Hibernate, Objekt/Relationales-Mapping-Framework für Java, http://www.hibernate.org/ [Web9] Dokumentation der Datenbank DB2 von IBM, Version 9.7 für Windows http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp [Web10] Beschreibung des RowSets von JDBC, Java SE Dokumentation, http://download.oracle.com/javase/6/docs/technotes/guides/jdbc/getstart/rows etImpl.html#997347 [Web11] In der Applikation werden die kostenlosen „Silk“-Icons von famfamfam.com verwendet. http://www.famfamfam.com/lab/icons/silk/ Thomas Schenker, Master Thesis Datenbank-Synchronisation, MT-10-02.09 54/54