Advanced Software Engineering Übung, LVNr: Übungsleiter: Ivona Brandic Dokument: Beispiel 1 v.1.4 Projekttitel: Kontoverwaltungssystem Gruppenmitglieder: MatNr: a0102290 a0000378 Nachname: Zohmann Remely Vorname: Christian Günther e-mail: [email protected] [email protected] Datum: 29.10.2006 1 1 Anforderungsanalyse 1.1 Kurzbeschreibung Es soll eine 3-tier Internetapplikation erstellt werden. Für die Realisierung der serverseitigen Komponenten soll Java EE, EJB 3.0 und JBoss verwendet werden. Zur Speicherung der Daten wird eine MySQL Datenbank verwendet die mittels JDBC angesprochen wird. Das client-seitige User Interface wird sowohl in JSP als auch mittels JavaServlets realisiert. Ein Interface wird zum auslesen der Daten verwendet, das andere zum einlesen der Daten Die User-Interfaces müssen browserfähig sein. Das Kontoverwaltungssystem dient zur Verwaltung von Bankkonten. Mit Hilfe des Kontoverwaltungssystems soll es dem registrierten Benutzer ermöglicht werden mittels eines Web-Browsers im Internet, Geldbeträge elektronisch von einem Konto auf das Konto eines anderen registrierten Benutzers zu überweisen. Bei der Gestaltung der Benutzeroberfläche wird ein besonderer Wert darauf gelegt, dass sie möglichst einfach aufgebaut ist und dadurch intuitiv benutzbar wird. Gespeichert werden die gesamten Kunden- und Kontendaten zentral in einer MySQL-Datenbank. Das Kontoverwaltungssystem soll folgende Funktionen ermöglichen: Benutzer registrieren/einloggen/sperren Konto anlegen Kontostand abfragen Online Kontoauszug Konto Einzahlung/Auszahlung Beträge auf ein Konto eines anderen Users überweisen 1.2 Funktionale Anforderungen 1.2.1 Beschreibung der Funktionalität Wie bereits unter Punkt 1.1. erwähnt soll das Kontoverwaltungssystem einem Kunden auf einfachem Weg elektronische Geschäftstransaktionen ermöglichen. Nach erfolgreicher Registrierung hat der Kunde die Möglichkeit sich in das Kontoverwaltungssystem einzuloggen. Erst nach dem Login stehen ihm die wesentlichen Funktionen unseres Systems zur Verfügung. Der Benutzer hat die Möglichkeit den Kontostand abzufragen, sich den Kontoauszug online anzusehen, Einzahlungen sowie Auszahlungen zu veranlassen und Geld auf ein anderes Konto zu transferieren. Bei Missbrauch des Kontos kann dies vom Kunden zur jeder Zeit gesperrt werden. Um einen besseren Überblick der Funktionalität zu ermöglichen, soll das folgende Use Cases Modell und deren Beschreibungen, die Funktionen des Kontoverwaltungssystems erörtern. 2 Use Case: login Ziel: User ins System einloggen Kategorie: primär Vorbedingung: User muss registriert sein Nachbedingung bei Erfolg: User kann auf Funktionen der Kontoverwaltungssystems zugreifen 3 Nachbedingung bei Fehlschlag: User nicht eingeloggt (falsche Passwort, falscher Username) Fehlermeldung am Bildschirm ausgeben Akteure: User Use Case: Kontostand abfragen Ziel: Bekanntgabe des aktuellen Kontostandes Kategorie: primär Vorbedingung: User muss eingeloggt sein Nachbedingung bei Erfolg: Ausgabe des aktuellen Kontostandes am Bildschirm Nachbedingung bei Fehlschlag: Fehlerausgabe am Bildschirm Akteure: User Use Case: Online Kontoauszug Ziel: Ausgabe der getätigten Geldüberweisungen Kategorie: primär Vorbedingung: User muss eingeloggt sein Nachbedingung bei Erfolg: Buchungszeilen ausgeben Nachbedingung bei Fehlschlag: Fehlerausgabe am Bildschirm Akteure: User Use Case: Geld überweisen Ziel: Elektronisches Geld von einem Konto auf ein anderes Konto überweisen Kategorie: 4 primär Vorbedingung: User muss eingeloggt sein Nachbedingung bei Erfolg: Geld wird vom überweisendem Konto abgezogen und auf das Konto des Empfängers gutgeschrieben Abzug des zu überweisenden Betrages am Konto des Senders Erhöhung des Kontotandes auf Seiten des Empfängers Nachbedingung bei Fehlschlag: Falscher Tan Ausgabe am Bildschirm Akteure: User Use Case: Geld Einzahlung Ziel: Geld auf das eigene Konto überweisen Kategorie: primär Vorbedingung: User muss eingeloggt sein Nachbedingung bei Erfolg: Erhöhung des Kapitalstandes am Konto Nachbedingung bei Fehlschlag: Fehlerausgabe am Bildschirm Akteure: User Use Case: Konto Auszahlung Ziel: Geld vom eigenen Konto abbuchen (z.B. Abhebung am Bankomat) Kategorie: primär Vorbedingung: User muss eingeloggt sein Nachbedingung bei Erfolg: Verringerung des Kapitalstandes am Konto 5 Nachbedingung bei Fehlschlag: Fehlerausgabe am Bildschirm Akteure: User 1.2.2 Bedienungsoberfläche 1.3 Nichtfunktionale Anforderungen Benutzbarkeit Das Kontoverwaltungssystem soll intuitiv benutzbar sein. Das heißt, es soll für den User, der ein Konto hat und mit dem Tätigen von Transaktionen vertraut ist, ohne viel Erklärungsaufwand klar sein, wie das System zu benutzen ist. Dies wird erreicht durch eine einfache Organisation der Homepage und durch die Verwendung bankengerechter Termini. Bei eventuellen Fehleingaben des Users (z.B. nicht vorhandene Kontonummer) wird der User vom Kontoverwaltungssystem darauf aufmerksam gemacht. Performance Das Kontoverwaltungssystem soll ein gutes Zeit- und Verbrauchsverhalten aufweisen, d.h. das System soll schnell auf Benutzereingaben reagieren (Reaktionszeit < 1 Sekunde). Zu beachten ist jedoch, dass die vom Nutzer wahrgenommene Antwortzeit auch wesentlich von zentralen Komponenten der produktiven Umgebung abhängen wie z.B. der Internetanbindung (Transferzeit). Sicherheit & Vertraulichkeit Es wird derzeit keine Realisierung von kryptografischen Eigenschaften geben. Die einzige Sicherheitsvorkehrung die wir in unserem System einbauen ist die Überprüfung auf Vorhandensein des Usernamens und Passwortes in der Datenbank, sowie die Zusammengehörigkeit von Namen und Passwort. Es kommt zu keiner Verschlüsselung von Datenübertragungen. 6 2 Architektur & Design 2.1 Architekturüberblick Client Tier Ein Web Browser übernimmt die Rolle des Client Tiers. Getestet wurde das Kontoverwaltungssystem mit dem Internet Explorer 6.0 und dem Mozilla Firefox 2.0. Aufgerufen wird das Kontoverwaltungssystem im Web Browser über http://localhost:8080/KontoClient/LoginServlet (lokal) Middle Tier Web Container Tier Der Web Container Tier umfasst einerseits ein Servlet (LoginServlet.java) und eine JSP Seite (Uebersicht.jsp). Beim Aufruf des Kontoverwaltungssystems (siehe Link oben) wird zuerst das Servlet aufgerufen. Nach erfolgreicher Anmeldung wird an die JSP Seite weitergeleitet, welche die restliche Funktionalität zur Verfügung stellt. Business Logic Tier Hier wird der reibungslose Ablauf der Geschäftslogik durch den Einsatz der relevanten EJB’s (sichergestellt. DB Tier Wie in der obigen Grafik zu sehen ist, kommt es beim Kontoverwaltungssystem zum Einsatz von MySQL. In der Datenbank werden die für die Geschäftslogik notwendigen Daten persistent gespeichert. 2.2 Klassendiagramme 7 Das Kontovewaltungssystem besteht aus 3 Teilen: Serverpacket Interface Client Das Serverpacket besteht aus den Klassen Server, Benutzer und Ueberweisung. Das Interfacepacket besteht aus der Interfaceklasse IServer Das Clientpacket besteht aus den JSP und Servletseiten 2.2.1 Serverpacket Die Serverklasse ist die Stateful Sessionbean Klasse. Mittels dieser Klasse wird es ermöglicht Überweisungen, Einzahlung und Auszahlungen zu machen. Login und Kontoauszug sind weitere Funktionalitäten die diese Klasse zur Verfügen stellt. Die Klassen Benutzer und Ueberweisung sind die Entitybean Klassen. Diese Klassen sind sozusagen eine Spiegelung der Datenbanktabellen. Mithilfe des Entitymanagers wird über diese Klassen in die Datenbank geschrieben. Server Extends: Implements: IServer Wichtige Klassenvariablen o protected Benutzer benutzer o protected Ueberweisung ueberweisung o protected EntityManager em o public String myDriver o public String myUrl o public String myUser o public String myPass Funktionalität: Mit dieser EJB „Stateful Sessionbean“ Klasse wird es dem Benutzer ermöglicht, Geld auf sein Konto ein uns auszuzahlen, sowie auch eine Überweisung von einem Konto auf ein anderes. Um eine Übersicht von allen Transaktionen eines Benutzers zu bekommen kann mit der Methode „kontoauszug“ alle 8 Überweisungen angezeigt werden. Der Kontostand kann ebenfalls ausgeben werden. Benutzer Extends: Implements: Serializable Wichtige Klassenvariablen o private String name o private String passwort o private int kontonummer o private double kontostand Funktionalität: Diese EJB „Entity“ Klasse ist ein Abbild des jeweiligen Tabels in der Datenbank. Mittels dieser Klasse wird es ermöglicht in die Datenbank zu schreiben, bzw. aus der Datenbank auszulesen Ueberweisung Extends: Implements: Serializable Wichtige Klassenvariablen o private int sender o private int empfaenger o private String verwendungszweck o private double betrag o private int id Funktionalität: Diese EJB „Entity“ Klasse ist ein Abbild des jeweiligen Tabels in der Datenbank. Mittels dieser Klasse wird es ermöglicht in die Datenbank zu schreiben, bzw. aus der Datenbank auszulesen 2.2.2 Interfacepacket Die Interfaceklasse IServer stellt eine Verbindung zwischen Client und Server her. Mittels dieser Klasse kann der Client Methoden des Servers aufrufen Ueberweisung Extends: Remote Implements: Funktionalität: ReservierungsServer stellt das Interface dar, anhand dessen Client Methoden „remote“ aufgerufen werden können. 2.2.3 Clientpacket Das Clientpacket besteht aus den verschiedenen JSP und Servletklassen. Mit diesen Klassen wird es dem User ermöglicht über einen Browser die verschiedenen Funktionen (Methoden) des Servers aufzurufen. 9 2.3 Beschreibung der Interfaces 10 Implementierung 2.4 Paketdiagramme 2.5 Komponentendiagramme 2.6 Deployment-Diagramme 11 3 Datenspeicherung & Zugriff Um die Daten zu Speichern wird eine MySQL Datenbank verwendet, die unter: www.swe.geschenkestube.at/mysqladmin erreichbar ist. 3.1 Datenbankmodell (ERD-Modell) ÜBERWEISUNG BENUTZER 1 n Im Table BENUTZER werden die Daten des Users gespeichert. Dabei handelt es sich um den Namen, Passwort, Kontonummer und Kontostand. Jeder Benutzer kann mehrer Überweisungen tätigen. Im Table ÜBERWEISUNG wird die Kontonummer des Senders und Empfängers, der Verwendungszweck und der zu überweisende Betrag gespeichert. 3.2 Datenzugriff 1 (z.B. JDBC) Der Datenzugriff läuft immer nach einem festgelegten Schema fest und kann in folgende Phasen aufgeteilt werden 1. Herstellen der Verbindung zu einem DBMS Treiberklasse laden (z.B. Class.forName("com.mysql.jdbc.Driver"); ) Aufbau der Verbindung zum DBMS ( getConnection (String url, String user, String password) 2. Absetzen eines SQL-Statements Für eine geöffnete Verbindung können mehrere Statements erzeugt werden Jedes SQL-Statement wird dabei durch ein Objekt realisiert, das die Schnittstelle java.sql.Statement implementiert: Statement stmt=con.createStatement(); Mögliche Abfrage: ResultSet rs=stmt.executeQuery("Select Name from Benutzer"); 3. Auswerten des Ergebnisses Generell kein Problem, da Methode executeUpdate() lediglich einen einfachen intWert zurückliefert Ein wenig komplizierter ist die Auswertung eines SELECT-Befehls der mit der Methode executeQuery() agbesetzt wird: Rückgabewert vom Typ ResultSet 4. Schließen des SQL-Statements 5. Schließen der Verbindung Dafür bietet die Schnittstelle Connection die Methode close() an 3.3 Datenzugriff 2 (z.B. Java Persistance API) 12 Mittels der EJB 3.0 Entity Beans ist es ebenfalls möglich auf relationale Datenbanken zuzugreifen. Aus der Sicht des Programmierers verschwindet hier die Lücke zwischen der Struktur eines Java Objekts in der Anwendung und der Struktur der in der relationalen DB gespeicherten Daten. Das heißt, dass das Mapping von einem Benutzer der Java Klasse Benutzer auf den Benutzer, der in der Datenbank gespeichert ist, wird automatisch vom EJB Container bewerkstelligt. Vorraussetzung ist es die Java Klasse Benutzer als Entity Bean Klasse (@Entity) zu erstellen. Folgender Zusatz @Table(name = "Benutzer") teilt dem Container den Namen der Tabelle in der relationalen Datenbank mit. Die Instanzvariablen der Entity Bean Klasse werden vom EJB Container defaultmäßig zu den Spalten in der DB gemapped. Mit @Id kann ein Attribut welches den Primärschlüssel stellt, gekennzeichnet werden. Da die EJB 3 Entity Beans lediglich POJOs (Plain old java objects) darstellen, können sie mittels des keywords „new“ instanziert werden. Um aber nun die Speicherung und den Zugriff auf die Objekte zu gewährleisten, wird ein EJB 3.0 EntityManager gebraucht. In unserem Fall wird dies folgendermaßen erreicht @PersistenceContext(unitName="Konto") protected EntityManager em; Die EntityManager.persist() Methode ermöglicht es eine Entity Bean Instanz in der Datenbank zu speichern. Die EntityManager.find() Methode hilft nun die gewünschten Daten aus der Datenbank zu lesen und sie als Java Objekt zur Verfügung zu stellen. Um die verschiedensten Arten von Anfragen auf die DB zu machen, steht die EJB Query Language (EJB QL) zur Verfügung. Um die Entity Beans ausführen zu können, werden sie in ein JAR File gepackt. Die Funktionalität kann nur gewährleistet werden, wenn auch ein persistence.xml im META-INF Verzeichnis vorhanden ist und richtig konfiguriert wurde. Ein weiters File wird im Deploy-Verzeichnis des Application Servers erwartet. Das mysql-dm.xml File verwaltet die Information für den Verbindungsaufbau zur gewünschten Datenbank. Diese Information beinhalten die URL der Datenbank und Zugangsdaten wie Username und Passwort um auf die Datenbank zugreifen zu können. 3.4 Vergleich zwischen Datenzugriffmethode 1 und Datenzugriffmethode 2 Ein wesentlicher Unterschied zwischen der Datenzugriffmethode 1 (JDBC) und der Datenzugriffmethode 2 (Java Persistance API) ergibt sich bei der Verwaltung der Datenanbindungsdaten. Bei der Datenzugriffmethode 1 werden diese Daten (wie z.B. URL der DB und Zugangsdaten) direkt in die Java Klasse geschrieben, im Gegensatz dazu werden diese Daten bei der Datenzugriffmethode 2 zentral in einem File (mysql-dm.xml) verwaltet. Das heißt, dass in diesem File die Zugangsdaten zu mehreren verschiedenen Datenbanken gleichzeitig zur Verfügung gestellt werden können. Die Datenzugriffmethode 2 wirkt um einiges intuitiver als die Datenzugriffmethode 1, da der Zuggriff über die Java Persistance API dem objektorientierten Konzept von Java entgegenkommt. Die Speicherung, Aktualisierung und das Laden von Objekten einer Entity Bean Klasse stellt keinen großen Aufwand mehr da. Bei Datenbankabfragen (JDBC) kommt es zum Einsatz der SQL Query Language. Bei der Datenzugriffsmethode 2 kommt die EJB Query Language zum Einsatz. 13 4 Test Beschreiben Sie wie die korrekte funktionsweise Ihrer Applikation getestet wurde. 4.1 Test Suite Entwickeln Sie für jede Klasse einen Test Case, und für alle Test Cases eine Test Suite. Benutzen Sie dabei JUnit. 4.2 Test Case 1 Beschreiben Sie die Inputdaten, die Bedingungen und die (erwarteten) Outputdaten des Test Cases. 4.3 Test Case 2 4.4 Test Case 3 …. 14 5 Benutzerdokumentation 5.1 Beschreibung der GUI Die GUI des Kontoverwaltungssystems wurde einfach und übersichtlich gehalten. Für den Benutzer gibt es zwei relevante Seiten, die über einen Webbrowser aufgerufen werden. http://localhost:8080/KontoClient/LoginServlet (lokal) Die erste Seite ermöglicht es sich im Kontoverwaltungssystem anzumelden. Im ersten Eingabefeld welches mit Kontonummer bezeichnet ist, wird eine dem System bekannte Kontonummer erwartet. Die erwartete Kontonummer ist ausschließlich numerisch. Das zweite Eingabefeld welches mit Passwort bezeichnet ist, erwartet das zur Kontonummer zugehörige Passwort. Bei korrekter Eingabe beider Eingabefelder wird man zur nächsten Seite Uebersicht.jsp weitergeleitet, andernfalls wird man aufgefordert das Login erneut zu probieren. Auf der folgenden Seite wird der angemeldete Benutzer willkommen geheißen. Die Kontodaten des Benutzers und der aktuelle Kontostand werden angezeigt. Außerdem wird ein OnlineKontoauszug angezeigt, welcher die Transaktionen des Benutzers auflistet. Auf der linken Seite des Fensters ist es möglich Transaktionen abzusetzen. Der Benutzer hat folgende Transaktionsmöglichkeiten: Einzahlung Auszahlung Überweisung Die Einzahlung und die Auszahlung erfordern lediglich die Eingabe eines Betrages. Bei der Überweisung muss zusätzlich die Kontonummer des Empfängers angegeben werden, außerdem kann ein Verwendungszweck angegeben werden. Durchgeführt wird die Transaktion mittels „Submit“-Button. Nach Absetzen der Transaktion wird die Übersicht-Seite automatisch aktualisiert, also mit aktuellen Kontostand und einer neuen Transaktion im Online-Kontoauszug. Die Abmeldung vom Kontoverwaltungssystem wird durch den „Abmelden“-Button rechts oben ermöglicht. 15 5.2 Installationsanleitung Vorrausgesetzte Software: JDK 1.5: Application Server: http://java.sun.com/javase/downloads/index.jsp http://www.jboss.com/products/jbossas/downloads Installation des Kontoverwaltungssystems : Im Deploy-Verzeichnis des Applikationsservers müssen sich folgende Dateien befinden (C:\Programme\jboss-4.0.4.GA\server\default\deploy): Konto.jar KontoClient.war mysql-ds.xml Ins Verzeichnis C:\Programme\Java\jre1.5.0_05\lib\ext ist die folgende Datei zu stellen mysql-connector-java-5.0.3.bin.jar Starten des Kontoverwaltungssystems: Start des Applicationservers 16