Pflichtenheft zum Softwaretechnologie-Projekt JDBC-Treiber - Gruppe 11 Version: 2.1 Stand

 
WEITER LESEN
Pflichtenheft zum
Softwaretechnologie-Projekt
       JDBC-Treiber
           Gruppe 11

       Version: 2.1
       Stand: 2013-11-15
Historie
Version    Status         Datum        Autor(en) Erläuterung
0.1        in Arbeit      2013-10-23   *            Erster Entwurf basierend auf der
                                                    Vorlage
0.2        in Arbeit      2013-10-27   Vincent      Erster Entwurf entsprechend der ge-
                                                    gebenen Hilfestellung
0.3        in Arbeit      2013-10-28   Sebastian,   Erweiterung um erste Inhalte
                                       Simon
0.4        in   Arbeit    2013-10-28   Vincent      Weitere Inhalte
0.5        in   Arbeit    2013-10-28   *            Mehr Inhalte, ansehnlicher Zustand
0.6        in   Arbeit    2013-10-29   Sebastian    Einbau der ersten Kritik
1.0        in   Arbeit    2013-10-31   *            Konkretisierungen
1.1        in   Arbeit    2013-11-02   Sebastian    Einarbeitung      des      Meeting-
                                                    Feedbacks
1.2        in Arbeit      2013-11-05   Sebastian,   Weitere Konkretisierungen (Einar-
                                       Simon        beitung von Feedback) und aktuali-
                                                    sierte Diagramme
1.3        in Arbeit      2013-11-05   Simon,       JDBC-Connection-String
                                       Vincent
1.4        in Arbeit      2013-11-06   Sebastian    Kleine Formulierungsrevisionen
1.5        in Arbeit      2013-11-07   Vincent      Konkretisierung JDBC-Connection-
                                                    String, kleinere sonstige Änderungen
1.6        in Arbeit      2013-11-07 Sebastian,     Meeting-Feedback, Diagrammedits,
                                     Simon          Loggingedits
1.7        in Arbeit      2013-11-10 Vincent        Seite für Unterschriften, Bsp. für
                                                    Connection-String etc.
1.8        in Arbeit      2013-11-10 Simon,         Fehlerkorrektur und Erweiterung
                                     Vincent        der Beispiel-Connection-Strings
2.0        abgabebereit   2013-11-12 Vincent,       Fehlerkorrektur        und      kleine
                                     Sebastian,     Änderungen
                                     Simon
2.1        abgabebereit   2013-11-15 *              Kosmetische Änderungen

                                           ii
Inhaltsverzeichnis
1. Zielbestimmung                                                                          1
   1.1. Musskriterien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    1
   1.2. Kannkriterien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    1
   1.3. Abgrenzungskriterien . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     2

2. Produkteinsatz                                                                         2

3. Produktanwendungsfälle und -funktionen                                                 3

4. Produktdaten                                                                            5

5. Technische Produktumgebung                                                             6

6. Globale Testfälle                                                                      6

A. Glossar                                                                                 8

B. Aufbau des JDBC-Connection-Strings                                                      9

C. Sequenzdiagramme                                                                       11

D. Analyseklassendiagramm                                                                 14

                                             iii
1. Zielbestimmung
Ziel ist die Entwicklung eines Type-3-JDBC-Treibers, der mit Eclipse-Plugins, wie z.B.
dem Eclipse SQL Explorer“ verwendet werden kann.
      ”
  Der Treiber muss in Java 1.7 entwickelt werden und über eine vorgegebene WSDL-
Schnittstelle mit einem Webservice kommunizieren, um Schemadaten auslesen und OQL-
Anweisungen ausführen zu können. Dieser Webservice-Endpunkt muss nutzerkonfigurier-
bar sein.
  Der Quellcode soll dokumentiert werden (Javadoc + Anwenderdokumentation), um
die Einarbeitung eventueller späterer Entwickler möglichst einfach zu halten.

1.1. Musskriterien
Das Produkt muss

   • in Java 1.7 geschrieben sein und die JDBC-Interfaces implementieren,

   • kompatibel mit dem Eclipse SQL Explorer“ sein,
                            ”
   • eine Übersicht der verfügbaren Datenbanken eines CEE-Datenbank-Servers zurückliefern,

   • eine Verbindung zu einer frei einstellbaren CEE-Datenbank aufbauen,

   • sich gegenüber dem Webservice mit einem auswählbaren X.509-Zertifikat authen-
     tifizieren,

   • eine Übersicht über das Datenbank-Schema zurückliefern können (BusinessObjects
     inkl. aller Felder, etc., OQL-Views inkl. aller Felder),

   • OQL-Statements (via SOAP) über diesen Webservice an die Datenbank senden
     können und dadurch
        – Daten aus der Datenbank auslesen können,
        – Daten in der Datenbank ebenso ändern können,

   • die Verbindung sauber schließen können,

   • bei Fehlern aller Art eine adäquate Fehlermeldung erzeugen und

   • alle Aktionen und Ereignisse (mit dem java.util.logging-Paket) loggen.

1.2. Kannkriterien
Weitere gewünschte Kriterien sind, dass das Programm

   • SELECT FROM x“ automatisch durch SELECT a, b, c FROM x“ ersetzt (wobei
     ”                                    ”
     a, b, c alle Felder des Business Objects x sind),

                                          1
• Kommentare (--, bzw. /* */) vor dem Senden aus dem Statement entfernt,

   • mit anderen Eclipse-SQL-Plugins kompatibel ist,

   • ebenfalls eine Authentifizierung via Benutzername und Passwort ermöglicht,

   • Statements nicht nur mit folgendem (automatischen) Commit sondern auch mit
     folgendem Rollback ausführen kann, praktisch also bloß die potenziellen Ergebnis-
     se anzeigt, die Datenbank aber nicht ändert (ggf. werden dann auch Savepoints
     implementiert und es wird nicht nur der auto-commit-Modus möglich sein) und

   • Verbundstatements mit Hilfe der execute()-Methode des JDBC-Statement-Interfaces
     ausführen kann.

1.3. Abgrenzungskriterien
   • Über die in den JDBC-Interfaces vorgesehenen Funktionen hinaus werden keine
     weiteren Features implementiert.

2. Produkteinsatz
Der JDBC-Treiber soll zusammen mit Plugins wie dem SQL-Explorer“ in Eclipse ver-
                                                       ”
wendet werden, dabei gibt der User eine OQL-Anfrage in den SQL-Explorer ein und
erhält in diesem auch seine Antwort von der Datenbank.
   Ein Type-3-JDBC-Treiber, wie der, der entwickelt wird, kommuniziert mit der eigent-
lichen Datenbank immer über eine Zwischensoftware (hier ein Webserver).
   Ein entsprechendes Kontextdiagramm ist in Abb. 1 zu sehen.

                           Abbildung 1: Kontextdiagramm

                                          2
3. Produktanwendungsfälle und -funktionen
Im Use-Case-Diagramm (Abb. 2) sind folgende Anwendungsfälle zu sehen:
  1. OQL-Query. Der Nutzer (Entwickler) kann eine OQL-Abfrage (SELECT) ausführen
     und darüber eine Ergebnisliste erhalten.
  2. OQL-Update. Der Nutzer (Entwickler) kann ein OQL-Update (also eine verändernde
     Abfrage wie UPDATE, INSERT, DELETE) ausführen und darüber eine Meldung über
     die Änderung erhalten.
  3. fehlerhaftes OQL-Statement. Der Nutzer (Entwickler) kann eine fehlerhafte
     Abfrage senden und die entsprechende Fehlermeldung erhalten.
  In jedem Fall wird für diese Anwendungsfälle vorausgesetzt, dass der Nutzer (Ent-
wickler) eine Verbindung zum Server aufbauen kann.

                         Abbildung 2: Use-Case-Diagramm

  Hinweise:
   • Bis auf /F10/ und /FW80/ setzen alle folgenden Funktionen voraus, dass das
     Programm erfolgreich mit einer Datenbank verbunden ist und die Verbindung noch
     nicht geschlossen wurde (andernfalls werden Exceptions erzeugt, s. /F40/).

                                         3
• Der Aufbau des JDBC-Connection-Strings wird in Anhang B aufgezeigt.

/F10/    Verbindungsaufbau Der Treiber versucht, eine Verbindung mit einer
         CEE-Datenbank aufzubauen, indem er sich gegenüber dem dafür zu nut-
         zenden Webservice mit einem einstellbaren (s. Anhang B) X.509-Zertifikat
         authentifiziert.

             • /F10.1/: Verbindung mit einem im JDBC-Connection-String fest-
               gelegten CEE-Server aufbauen (ohne direkt eine Datenbank aus-
               zuwählen).

             • /F10.2/: Auswahl einer Datenbank (Nennung beim Namen) auf dem
               Server, mit dem der Treiber verbunden ist.

             • /F10.3/: Verbindung mit einem im JDBC-Connection-String festge-
               legten CEE-Server aufbauen und direkte Auswahl der Datenbank, de-
               ren Name ebenfalls im JDBC-Connection-String enthalten ist.

             • /F10.4/: Time out. Wurde die Verbindung nicht innerhalb einer im
               JDBC-Connection-String konfigurierbaren Zeit aufgebaut, wird der
               Verbindungsaufbau unterbrochen.

/F20/    Datenbankliste Eine Liste aller Datenbanken des CEE-Servers kann ab-
         gerufen werden.
/F30/    Ausführen von einzelnen Statements Übermittlung einer OQL-
         Anfrage an den Webservice. Die OQL-Anfrage des Entwicklers wird an die
         Datenbank übermittelt, danach wartet der Treiber auf eine Antwort des
         Servers:

             • /F30.1/: Daten abfragen. Der Treiber gibt die erhaltenen Objekte
               zurück oder erzeugt aus der Fehlermeldung, die er vom Webserver
               erhalten hat eine Exception, die dann entsprechend behandelt wird
               (s. /F40/).

             • /F30.2/: Daten ändern. Der Treiber gibt die Anzahl der geänderten
               Zeilen (insbesondere 0, wenn keine Zeile geändert wurde) zurück und
               behandelt Fehler analog zu /F30.1/.

             • /F30.3/: Time out. Antwortet der Server bei einer einzelnen Abfrage
               innerhalb einer gewissen Zeit (s. Anhang B) nicht, gibt der Treiber
               eine Fehlermeldung zurück.

                                       4
/F40/       Fehlerbehandlung Fehler werden als Exceptions behandelt, sofern
             möglich bzw. sinnvoll abgefangen und verarbeitet (bspw. Retry), oder sonst
             an den Benutzer weitergegeben. Die Exceptions sind hier die in den JDBC-
             Interfaces spezifizierten Exceptions (java.sql.SQLException und Kind-
             klassen).
 /F50/       Log Erfolgsmeldungen und Fehler werden gleichermaßen (mit den Logging-
             Möglichkeiten des java.util.logging-Pakets) geloggt und dem Entwickler
             zurückgegeben, dabei ist zu beachten, dass die Ereignisse ihrer Wichtigkeit
             und Wirkung nach den verschiedenen Log-Leveln eindeutig zugeordnet wer-
             den (ähnlich der in den Programming Guidelines festgelegten Herangehens-
             weise)
 /F60/       Verbindungstrennung Die Verbindung kann vom Benutzer geschlossen
             werden.
 /FW70/      Statementoptimierung OQL-Statements werden vor dem Senden an den
             Webservice optimiert, dies kann im JDBC-Connection-String deaktiviert
             werden (s. Anhang B).

                • /FW70.1/: Statements der Form SELECT FROM x“ werden automa-
                                                    ”
                  tisch durch SELECT a, b, c FROM x“ ersetzt, wobei a, b, c alle
                              ”
                  Felder des Business Objects x sind.

                • /FW70.2/: Kommentare (--, bzw. /* */) werden vor dem Senden
                  aus dem Statement entfernt.

 /FW80/  Alternative Authentifizierung Eine Authentifizierung via Benutzerna-
         me und Passwort (wird im Plugin eingestellt und über die properties an
         den Treiber weitergegeben) ist ebenso möglich wie die Authentifizierung via
         Zertifikat (s. /F10/).
 /FW90/ Rollback-Modus Neben dem auto-commit-Modus soll es auch möglich
         sein, die Wirkung eines Statements auf die Datenbank zu erfahren, ohne
         diese tatsächlich zu ändern (d.h. das Statement wird ausgeführt und das
         Resultat angezeigt, die Änderung wird jedoch nicht in die Datenbank ge-
         schrieben). Gegebenenfalls wird dies über Savepoints ermöglicht.
 /FW100/ Verbundstatements Es sind Verbundstatements (also Kombinationen aus
         /F30.1/ und /F30.2/, s. Glossar) mit der execute()-Methode möglich, der
         Treiber stellt bei einer solchen Abfrage alle Rückgabewerte (wie in /F30.1/
         und /F30.2/ beschrieben) bereit.

4. Produktdaten
Der Treiber selbst behält keine persistenten Daten: Die Daten, die er handhabt, stammen
aus der hinter dem Webinterface liegenden Datenbank und werden immer direkt an den
Nutzer weitergegeben.

                                           5
5. Technische Produktumgebung
Software

   • Java: Version 1.7 muss verwendet werden.

   • Eclipse: Der JDBC-Treiber wird im Kontext mit Eclipse verwendet, um das Erstel-
     len von OQL-Anfragen an CEE zu erleichtern. Die konkrete Einbindung in Eclipse
     findet dann bspw. über das Plugin SQL-Explorer“ statt, das die erforderliche GUI
                                       ”
     liefert.

   • Für die direkte Low-Level-SOAP-Kommunikation mit dem Server kann auf Basis
     der WSDL des Webservers bereits eine geeignete Library generiert werden, die
     Funktionen für das Senden von OQL-Statements und das Empfangen von Resul-
     taten via SOAP bereitstellt.

Hardware Ein Java-fähiger Rechner mit funktionierender Netzwerkverbindung (um die
Verbindung zu einem CEE-Datenbank-Webserver aufbauen zu können) ist nötig.

6. Globale Testfälle
Hinweis: Die Testfälle /T30/ bis /T80/ setzen voraus, dass die Aktionen aus /T10/ und
/T20/ bereits ausgeführt wurden.

 /T10/ Der Treiber wird von dem Plugin ordnungsgemäß akzeptiert und kann sich
       beim DriverManager registrieren.
 /T20/ Der Treiber bekommt die URL https://localhost:4434 übergeben und
       baut erfolgreich eine Verbindung mit dem laufenden Webservice-Dummy
       auf.
 /T30/ Die Software liefert eine Übersicht der verfügbaren Datenbanken an das
       Eclipse-Plugin.
 /T40/ Es können OQL-Statements, sofern durch den Webservice unterstützt, an
       diesen gesendet werden. Die folgenden Querys werden an die Datenbank
        DUMMYDV01“ des Webservice-Dummys gesendet:
       ”
           • /T40.1a/:
                     SELECT i:number FROM com.cisag.app.general.obj.Item i
                     WHERE i:number = ’10010’ORDER BY i:number DESC
                Der Treiber gibt das korrekte ResultSet zurück.

                                          6
• /T40.1b/
                  SELECT i:number FROM com.cisag.app.general.obj.Item i
                  WHERE i:number = ’3141592653’ORDER BY i:number DESC
             Die WHERE-clause soll äquivalent zu WHERE 0=1 sein, wähle also
             eine sicher nicht auftretende number. Der Treiber gibt das korrekte
             (leere) ResultSet zurück.

           • /T40.2/:
                  SELECT i:number AS Item, i:description
                  FROM com.cisag.app.general.obj.Item i
                  WHERE i:_timeZoneGuid = toGuid(’0DE013F0446F1D10A1908464960F0000’)
                  ORDER BY i:number
             Der Treiber gibt das korrekte ResultSet zurück.

           • /T40.3/:
                  SELECT FROM com.cisag.app.general.obj.Item i
                  ORDER BY i:number
             Der Treiber gibt das korrekte ResultSet zurück.

/T50/   Nicht erfolgreiche OQL-Statements resultieren in einem Fehler. Die folgende
        Query wird an die Datenbank DUMMYDV02“ des Dummy-Webservers gesen-
                                     ”
        det:

             SELECT FROM com.cisag.app.general.obj.Item i
             ORDER BY i:number

      Der Treiber wirft eine Exception.
/T60/ Ergebnisse einer Datenbankabfrage (Abfrage nach der Liste der verfügbaren
      Datenbanken) an den Webservice werden korrekt an das Plugin übergeben.
/T70/ Es können verschiedene Einstellungen des Treibers über den JDBC-
      Connection-String vorgenommen werden (z.B. Servername, Datenbankna-
      me, Timeout-Dauer; s. Anhang B).
/T80/ Alle Ereignisse (Fehler wie Erfolgsmeldungen) werden (mit den Logging-
      Möglichkeiten des java.util.logging-Pakets) geloggt.

                                        7
A. Glossar
CEE (Comarch ERP Enterprise) Auf der Serverseite befindet sich CEE, ein ERP-Server-
    system, welches die OQL-Datenbank verwaltet, der Server kann über eine SOAP-
    Schnittstelle angesteuert werden. Der Webserver lässt alle OQL-Befehle auswer-
    ten und gibt die Resultate oder bei Fehlern die entsprechenden Fehlermeldungen
    zurück.

JDBC (Java Database Connectivity) eine von Oracle in Java verankerte API, die In-
    terfaces für den Zugriff auf Datenbanken enthält, die von JDBC-Treibern zu im-
    plementieren sind.

OQL (Object Query Language) eine objektorientierte Abfragesprache, die an SQL an-
    gelehnt ist.

OQLRemoteToolkit Zusammenfassende Bezeichnung für die aus der WSDL generierten
   Klassen, welche vom JDBC-Treiber genutzt werden, um die Low-Level-Kommunikation
   mit dem Webserver zu kapseln.

SOAP (Simple Object Access Protocol) ein Netzwerkprotokoll, welches zum Daten-
   austausch zwischen zwei Systemen benutzt wird. Das Protokoll ist ein Standard
   des W3C.

Verbundstatement Eine OQL-Query, die aus mehr als einem Befehl (SELECT, UPDATE,
     INSERT, DELETE) besteht, die Befehle werden dabei mit einem ;“ verkettet und
                                                                ”
     fortan als eine Anfrage betrachtet.

                                         8
B. Aufbau des JDBC-Connection-Strings
Der JDBC-Connection-String ist von der folgenden Form:

            jdbc:cee : key1=value1;...;keyn=valuen
        Festgelegter Identifier      Liste von Key=Value Paaren

  Hinweise:

   • Die gültigen Keys sind der nachfolgenden Liste zu entnehmen.

   • Die Key-Value Paare sind mittels Semikolon (;) zu trennen. Zwischen Key und
     zugehörigem Value ist ein Gleichheitszeichen (=) zu setzen.

   • Kein Value darf ein Semikolon enthalten.

   • Der Connection-String darf keine Leerzeichen, die nicht Teil eines Values sind,
     enthalten.

   • Sollte ein obligatorischer Key nicht im String enthalten sein, wird keine Verbindung
     aufgebaut und eine Exception geworfen.

   • Sollte ein Key im Connection-String mehrmals vorkommen, so wird der letzte
     zugehörige Wert benutzt.

   • Sollte ein Key verwendet werden, welcher nicht in der unten stehenden Liste auf-
     geführt wird, wird der Key samt Value ignoriert.

   • Sollte ein Value nicht zum zugehörigen Key passen (d.h. keine ganzen Zahlen bei
     port und timeout-Werten, kein valider Fingerprint etc.), wird keine Connection
     hergestellt und eine Exception geworfen.

   • Sollte der JDBC-Connection-String nicht den beschriebenen Aufbau haben, wird
     keine Verbindung hergestellt und eine Exception geworfen.

       Keyname       Standardwert     Beschreibung                            siehe
              host   —                Adresse des Servers (obligatorisch)     /F10/
              port   80               Port für die Kommunikation mit dem
                                      Server
        database     —                Name der Datenbank                      /F10/
     certificate     —                Fingerprint des Zertifikats, kann als   /F10/
                                       4b:3a:...“, 4B:3A:...“, 4b 3a
                                      ”               ”              ”
                                      ...“, 4B 3A ...“, 4b3a...“ oder
                                             ”             ”
                                       4B3A...“ angegeben werden
                                      ”

                                           9
trustStore                 Zu verwendende KeyStore-Datei             /FW80/
                  (=
                   ˆ     Windows-
                  Zertifikatstore)
   loginTimeout   15                 Zeit (in Sekunden) bis der Verbingsauf-   /F10.4/
                                     bau abgebrochen wird
    oqlTimeout       ˆ ∞)
                  0 (=               Zeit (in Sekunden) bis das Senden eines   /F30.3/
                                     OQL-Statements abgebrochen wird
addSelectFields   true               Optimierung verwenden? Ersetzen von       /FW70.1/
                                      SELECT a, b, c FROM x“
                                     ”
  stripComments   true               Optimierung verwenden? Kommentare         /FW70.2/
                                     aus dem OQL-Statement löschen

Beispiele:
 • jdbc:cee:host=https://localhost;port=4434;database=comarch1;
   ”
   certificate=43:51:53:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8;
   trustStore=C:\store1.keystore;loginTimeout=100;oqlTimeout=200;
   addSelectFields=false;stripComments=false“ ist ein Beispiel für einen (ma-
   ximalen) sinnvollen und gültigen Connection-String.
   Ebenso ist dies jdbc:cee:database=comarch1;trustStore=;
                    ”
   certificate=43:51:53:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:
   66:73:a8;oqlTimeout=0;port=80;loginTimeout=15;addSelectFields=true;
   host=https://localhost;stripComments=true“ ein gültiger Connection-String,
   allerdings ändert dieser weniger, da die Standardwerte genommen wurden.
 • jdbc:cee:host=https://localhost“ ist ein Minimalbeispiel für einen sinnvol-
   ”
   len und gültigen Connection-String.
 • Bei Übergabe von jdbc:cee:“ oder jdbc:cee:port=80;oqlTimeout=60“ wird
                     ”                 ”
   keine Verbindung aufgebaut, sondern eine Exception geworfen, da der obligatori-
   sche key host nicht gesetzt wird.
 • jdbc:cee:port=80;host=https://localhost;port=42“ ist gültig, port wird
   ”
   auf 42 gesetzt. Im Gegensatz dazu ist jdbc:cee:port=41;port=43“ ungültig,
                                         ”
   jedoch aus einem anderen Grund.
 • jdbc:cee:port=80;unknownKey=42;host=https://localhost“ und jdbc:
   ”                                                                ”
   cee:port=80;unknownKey=;host=https://localhost“ sind gültig, unknownKey
   und der entsprechende Wert 42“ bzw. “ werden einfach ignoriert.
                               ”           ”
 • jdbc:cee:host=https://localhost;port=true“ ist ein fehlerhafter Connection-
   ”
   String mit einem falschen Value für den Key port.
 • jdbc:abc:host=https://localhost“, jdbc:cee:host=;;80=port“, jdbc:
   ”                                      ”                     ”
   cee:host=https://localhost;port=oqlTimeout=80“ und host=https://
                                                      ”
   localhost;port=80;oqlTimeout=80“ sowie jdbc:cee:host=https://localhost;“
                                             ”
   entsprechen nicht dem geforderten Aufbau.

                                          10
C. Sequenzdiagramme

        Abbildung 3: Sequenzdiagramm: Verbindung aufbauen

          Abbildung 4: Sequenzdiagramm: Anfrage, Query

                               11
Abbildung 5: Sequenzdiagramm: Anfrage, Update

Abbildung 6: Sequenzdiagramm: fehlerhafte Anfrage

                       12
Abbildung 7: Sequenzdiagramm: Verbindung beenden

                      13
D. Analyseklassendiagramm

             Abbildung 8: Analyseklassendiagramm

                             14
Externer Betreuer von
                            Tutor
  der Comarch AG

   Klaus Bergmann       Balint Gyapjas

   Entwicklerteam

   Michael Günther     Simon Hanisch      Vincent Knyrim

  Sebastian Manecke     Sebastian Mielke

                               15
Sie können auch lesen