Sie sind auf Seite 1von 4

Einzelübung "Userverwaltung"

Im folgenden soll eine Grundlage für ein Benutzerverwaltungssystem in Java implementiert werden. Das System soll drei Benutzergruppen unterstützen:

registrierte Benutzer

Super-user (Admins) sowie einige Funktionalitäten für

nicht-registrierte Benutzer.

Die Benutzerdaten sollen persistent abgespeichert und abgefragt werden können. Implementieren Sie für die Benutzerverwaltung folgende Komponenten:

1. Abstrakte Klasse AbstractUser

Implementieren Sie eine abstrakte Klasse AbstractUser. Die Klasse dient zum Speichern von Informationen über Registrierte- und Superuser-typen. Dabei sollen folgende Daten als private Instanzvariablen erfasst, sowie öffentliche

Zugriffsmethoden erstellt werden:

username vom Typ String mit den Methoden getUsername und setUsername

password vom Typ String mit den Methoden setPassword und getPassword

fullName vom Typ String mit den Methoden getFullName und getFullName

email vom Typ String mit den Methoden getEmail und setEmail

sex vom Typ char mit den Methoden getSex und setSex. Der Default-Wert für diesen Parameter soll ' ' (Leeres Zeichen) sein.

birthday vom Typ Date mit den Methoden getBirthday und setBirthday

Neben dem Default-Konstruktor soll ein voller Konstrukton die entsprechenden Instanzvariablen setzen. Prüfen Sie beim Eintragen des Passwords (Methode setPassword) ob die länge der Eingabe > 6 ist und kein Leerzeichen enthält. Prüfen Sie beim Eintragen des Geschlechts (Methode setSex) ob die Eingabe 'm' oder 'f' ist. Wandeln sie dabei Groß- in Kleinbuchstaben bei der Eingabe um. Prüfen Sie beim Eintragen des Geburtsdatums (Methode setBirthday) ob die Eingabe vor dem heutigem Datum ist. Sollten die Bedingungen nicht erfüllt sein, werfen Sie jeweils eine IllegalArgumentException mit einem sinnvollen Fehlertext. Zusätzlich soll die Klasse eine konkrete Methode verifyPassword(String) implementieren. 'verifyPassword' prüft ob das übergebene Password mit dem in der Klasse übereinstimmt. Die Methode soll je nach Prüfzustand einen boolean-Wert zurückliefern. Die Klasse soll zudem eine abstrakte Methode toString deklarieren, die in den jeweils ableitenden Klassen implementiert wird.

2. Klasse RegistredUser und Superuser

Implementieren Sie nun die zwei konkrete (nicht-abstrakte) Unterklassen für Benutzer welche von der abstrakten Klasse AbstractUser ableiten. Die konkrete Klasse RegisteredUser repräsentiert registrierte Benutzer. Diese hat die zusätzliche Instanzvariable registeredDate vom Typ Date mit der entsprechenden Zugriffsmethode getRegisteredDate. Diese speichert das Datum der Registrierung und wird beim Objektkonstruktor automatisch gesetzt. Es sollen wieder zwei Konstruktoren, einerseits ein Default und andererseits ein voller Konstruktor in Bezug auf Instanzvariablen, implementiert werden. Die Klasse enthält

zusätzlich die Methode 'verifyAge()', welche prüft ob ein Benutzer Volljährig ist und einen boolean Wert zurückgibt. Zudem sollen die beiden Klassen die toString Methode ausimplementieren. In dieser sollen alle Benutzerinformationen (ausser Passwort), als String zurückgegeben werden.

Die konkrete Klasse SuperUser repräsentiert einen System-Administrator. Superuser können über verschiedene Rechte verfügen. Diese werden in drei zusätzlichen boolschen Instanzvariablen gespeichert.

canDeleteUsers - (inkl. get- und set-Methoden) repräsentiert das Recht Benutzer zu löschen

canEditUsers - (inkl. get- und set-Methoden) repräsentiert das Recht Benutzerinformationen zu editieren

canViewUsers - (inkl. get- und set-Methoden) repräsentiert das Recht Benutzerinformationen zu sehen

Die Default-Werte der drei Instanzvariablen sollen false sein. Das heisst, wenn sie nicht explizit auf true gesetzt werden, bleibt ein Superuser machtlos. Auch in dieser Klasse sollen zwei Konstruktoren implementiert werden. Nutzen Sie beim vollen Konstruktor die super()-Method um den Konstruktor der Überklasse aufzurufen. Die Klasse SuperUser soll die toString Methode entsprechend implementieren.

Packen Sie die Klassen AbstractUser, RegisteredUser und SuperUser in das Package

swe2013.um.users.

3. Interface UserDAO Dieses Interface definiert die Data Access Object (DAO) Methoden für persistente Benutzer Objekte. Das DAO-programmier Pattern ermöglicht es, Benutzer auf verschiedene Datenquellen-typen über eine Schnittstelle generisch zu speichern. Für mehr Information und einem konkreten Beispiel zu DAO, lesen Sie bitte «hier» nach. Das DAO Interface soll generische Methoden zum Einlesen und zum Auslesen von Benutzerobjekten deklarieren. Die Methode getUserList() soll eine Listen(java.util.List)-interface benutzen um alle persistent gespeicherten Benutzer zurückgeben. Die Methode getUserbyUsername(String username) soll einen AbstractUser Objekt anhand seines Usernamen zurückgeben. Fall der user nicht gefunden wird, soll diese Methode den Wert null zurückliefern. Die Methode saveUser(AbstractUser) soll ein neuen Benutzer persistent abspeichern. Stellen Sie sicher, dass beim abspeichern eines neuen Benutzers nicht ein bereits gespeicherter Name verwendet wird. Werfen Sie ein IllegalArgumentException von der Methode aus, wenn es einen User mit dem selben Usernamen schon gibt. Die Methode deleteUser(AbstractUser) soll ein bestehenden Benutzer löschen. Falls es keinen solchen Benutzer gibt, soll IllegalArgumentException geworfen werden. Die Methode updateUser(AbstractUser) soll Daten eines bestehenden Benutzers ändern. Dabei soll die Methode ein Userobjekt suchen, welches mit der Username des übergebenen AbstractUser übereinstimmt. Alle Daten des Input-AbstractUsers werden dabei übernommen ausser seinen Username. Auch diese Methode soll IllegalArgumentException werfen, falls es keinen solchen Benutzer gibt.

4. Klassen SerializedSuperUserDAO und CSVRegisteredUserDAO Für diese Übung, sollen Sie, ausser die standard Java File-serialisierung, einen zweiten Typ einer Datenquelle simulieren. Der zweite Typ soll zwar auch die Daten in ein File speichern, allerings in einem Klartext CSV (Comma Separated Value) Format. Je nach Wunsch, dürfen Sie allerdings statt CSV-serialisierung, eine echte Datenbank benutzen, so wie im obigen Link beschrieben. Dafür würde sich «SQLite» (eine einfache Java-SQL-Datenbank) wegen der sehr simplen integration ins program gut eignen.

Diese Klassen SerializedSuperUserDAO und CSVRegisteredUserDAO sind Implementierungen des Interface UserDAO müssen auch die deklarierten Methoden des DAO Interfaces implementieren. Obwohl beide Klassen in wirklichkeit beide Benutzertypen speichern würden, gehen wir einfachheitshalber davon aus, dass SerializedSuperUserDAO SuperUser Objekte speichert und CSVRegisteredUserDAO RegisteredUser Objekte. Diese Klassen sollen im Konstruktor ein String mit dem File-namen übergeben kriegen. Implementieren Sie die Methoden in den jeweiligen DAOs und achten Sie darauf, dass bei Methoden welche in das File schreiben alle Instanzvariablen der Userobjekte vorhanden und nicht-leer sind. Sollte eines der Parameter fehlen, soll wieder eine IllegalArgumentException geworfen werden. Alle möglichen (nicht-Applikations-spezifische) System-Fehler, beispielsweise der Fehler aus einer Datei zu lesen, können in den Methoden abgefangen und auf die System-Konsole rausgeschrieben werden und müssen nicht unbedingt weitergeleitet werden.

Packen Sie das Interface UserDAO, als auch die Klassen SerializedSuperUserDAO und CSVRegisteredUserDAO ins Package swe2013.um.users.dao.

5. Klasse UserManagement Diese Klasse UserManagement soll Methoden zum Einlesen, sowie zum Auslesen von Benutzerobjekten aus den persistenten Dateien (unter Verwendung der Klassen SerializedSuperUserDAO, CSVRegisteredUserDAO und des Interfaces UserDAO) sowie die Logik der Userverwaltung implementieren. Die Klasse soll eine Liste von DAOs als instanzvariable besitzen. Die Methode addDAO kann dabei dymanisch weitere Arten von DAOs aufnehmen und bedienen. Zusätzlich soll die Klasse eine Instanzevariable session vom Typ AbstractUser haben. Diese repräsentiert den momentan eingeloggten user. Benutzen Sie ausschliesslich die Liste von DAOs und die session Variablen um, je nach Benutzer-typ, folgende funktionalität zu implementieren:

Dafür gilt das folgende Regelwerk.

Nicht registrierte Bentuzer (alle):

Registrierung (nur für RegisteredUser)

Gesamtzahl der erfassten Benutzer

Gesamtzahl der registrierten Benutzer

Gesamtzahl der Administratoren

Login (Userobjekt rauslesen und Passwort überprüfen). Falls das Login erfolgreich ist, soll eine Instanzvariable 'session' gesetzt werden

Registrierte Benutzer:

Alle Funktionen ausführen welche auch nicht-registrierte Benutzer ausführen dürfen.

Logout - das session Objekt auf null setzten

Anzeigen und ändern (inkl. abspeichern) von Daten vom eingeloggten Benutzer (außer Rechte für SuperUser)

Superuser:

Alle Funktionen ausführen welche auch registrierte Benutzer ausführen dürfen.

Alle Funktionen welche in den drei Berechtigungsvariablen deklariert wurden

Wenn ein SuperUser die view berechtigung hat, kann er entweder einen bestimmte user oder alle user informationen anschauen.

Ausgabe wie viele registrierte User über 18 Jahre alt sind

Die Unterscheidung des User-Typs kann mittels instanceof-Operatoren durchgeführt werden. Realisieren Sie mittels Exception-handling die Fehler (z.B. unbekannter User beim Login,…) der

Systemoperationen.

Packen Sie die Klassen UserManagement ins Package swe2013.um.

Abgabemodalitäten:

Abgabetermin: Mittwoch, 30.10.2012 in den Übungseinheiten und über den Almighty server

1. Demonstration des lauffähigen Programms mit sinnvollen Fehlermeldungen und sinnvollen Ausgaben.

2. Ausführlich dokumentierter (javadoc) Quelltext mit Name und Matrikelnummer.

3. Erstellung eines UML Klassendiagramms das alle implementierten Klassen (mit Variablen und Methoden und deren Sichtbarkeit) sowie deren Beziehungen beinhaltet.

4. Mit javadoc erstellte HTML Dokumentation.

Aufruf von javadoc z.B.: javadoc -d docs -author *.java

Anmerkung:

Zur Abgabe des fertigen Java-Programms (inklusive Dokumentation) erstellen Sie in Ihrem almighty-account Home-Verzeichnis ein Verzeichnis Abgabe1, das alle Source- und Class-Files sowie ein Unterverzeichnis docs mit der HTML Dokumentation und dem UML Klassendiagramm enthält.