Login |
 
 

Aufgabe 5, Abgabe spätestens am 08.07.2010, 8:00 Uhr

 

Einleitung

In dieser Übung sollt ihr die Daten des Managers mittels JDBC in eine Datenbank serialisieren und daraus auch wieder deserialisieren. Dazu sollt ihr diesmal die De-/Serializer für Rooms, TimeSlots, Lecturers und StudyCoursess implementieren. Zum Testen steht diesmal ein Testcase zur Verfügung und die GUI wurde von uns angepasst, damit ihr auch von dort aus die Datenbank-De/Serialisierung aufrufen könnt. Für jeden von euch haben wir eine eigene Datenbank angelegt und ihr könnt über die URL, die wir in der Übungseinführung bekannt gegeben haben auf eure Datenbank zugreifen. Die Datenbanken und der Benutzername heißen wie euer SVN Verzeichnis und das Passwort haben wir auch in der Einführung für jeden Einzelnen bekannt gegeben.

Diesmal gibt es keine weiteren Jars mit vorgegebenen Klassen. Daher überlegt euch eventuelle, sinnvolle Superklassen, damit ihr keinen doppelten Code erzeugt. Allerdings haben wir euch den Postgres JDBC Treiber als jar ins Jars-Projekt gestellt.

Teil 1 - Die Serialisierer

Im Falle von Datenbanken kan man eigentlich nicht mehr wirklich von Serialisieren und Deserialisieren sprechen. In der Realität würde man die Daten in der Datenbank bei jedem Update neu setzen und die Daten gar nicht mehr direkt im Manager halten (bzw. nur einen Teil als Zwischenspeicher zu Performance-Zwecken). Da dies aber den Rahmen sprengen würde, sollt ihr, wie schon bei den Text- und XML-Serialisierern, das Interface ISerializer<T extends IEntity> implementieren und die Daten jedesmal neu und vollständig in die Datenbank schreiben. Ihr könnt dazu vor jedem Serialisieren die Tabellen, die ihr bei einem eventuellen vorherigen Speichern angelegt habt einfach löschen (drop table) und wieder anlegen. Alternativ, könnt ihr den Tabelleninhalt auch einfach löschen (delete from table). Die Serializer Klassen sollen alle im Package de.unikn.bioml.mpi2.stuvove.implementation.db liegen und wie folgt heißen: DBLecturerSerializer, DBRoomSerializer, DBStudyCourseSerializer, DBTimeSlotSerializer. Alle Klassen sollen im Konstruktor den Namen der JDBC Treiber Klasse als String übergeben bekommen, die Datenbank URL, den Benutzernamen und das entsprechende Passwort. Die Klassenrümpfe sollen wie folgt aussehen:

public class DBTimeSlotSerializer implements ISerializer<ITimeSlot> {

/**
* Creates a new DB serializer for time slots.
*/
public DBTimeSlotSerializer(String jdbcDriverClass, String dbUrl,
String user, String pw) {
//...
}

// methods to implement
}

public class DBLecturerSerializer implements ISerializer<ILecturer> {

/**
* Creates a new DB serializer for lecturers.
*/
public DBLecturerSerializer(String jdbcDriverClass, String dbUrl,
String user, String pw) {
//...
}

// methods to implement
}

public class DBRoomSerializer implements ISerializer<IRoom> {

/**
* Creates a new DB serializer for rooms.
*/
public DBRoomSerializer(String jdbcDriverClass, String dbUrl,
String user, String pw) {
//...
}

// methods to implement
}

public class DBStudyCourseSerializer implements ISerializer<IStudyCourse> {

/**
* Creates a new DB serializer for study courses.
*
* @param db
* @throws SQLException
*/
public DBStudyCourseSerializer(String jdbcDriverClass, String dbUrl,
String user, String pw) {
//...
}

// methods to implement
}

Denkt daran, dass die Zuordnungen von TimeSlots zu StudyCourses eine n:m Beziehung darstellt. Ein TimeSlot kann von mehreren StudyCourses referenziert werden, aber ein StudyCourse kann natürlich auch mehrere TimeSlots haben, d.h., diese Beziehungen müsst ihr über eine zusätzliche Tabelle umsetzen.

Teil 2 - Die Deserialisierer

Hier sollt ihr für alle Typen das IDeserializer<T extends IEntity> Interface implementieren und die Daten aus der Datenbank wieder in die korrekte Objektstruktur umsetzen. Die Deserializer Klassen sollen alle im selben Package (de.unikn.bioml.mpi2.stuvove.implementation.db) wie die Serializer liegen und wie folgt heißen: DBLecturerDeserializer, DBRoomDeserializer, DBStudyCourseDeserializer, DBTimeSlotDeserializer. Alle Klassen sollen im Konstruktor den Namen der JDBC Treiber-Klasse, die Datenbank URL, den Benutzernamen und das entsprechende Passwort als String übergeben bekommen. Ausnahme ist der DBStudyCourseDeserializer, da dieser noch den Manager benötigt, um die Abhängigkeiten aufzulösen. Die Klassenrümpfe sollen wie folgt aussehen:

public class DBTimeSlotDeserializer 
implements IDeserializer<ITimeSlot> {


/**
* Creates a database deserializer for time slots.
*/
public DBTimeSlotDeserializer(String jdbcDriverClass, String dbUrl,
String user, String pw)
throws SQLException, ClassNotFoundException {
//...
}

// methods to implement
}
public class DBLecturerDeserializer 
implements IDeserializer<ILecturer> {


/**
* Creates a database deserializer for lecturers.
*/
public DBLecturerDeserializer(String jdbcDriverClass, String dbUrl,
String user, String pw)
throws SQLException, ClassNotFoundException {
//...
}

// methods to implement
}
public class DBRoomDeserializer 
implements IDeserializer<IRoom> {

/**
* Creates a database deserializer for rooms.
*/
public DBRoomDeserializer(String jdbcDriverClass, String dbUrl,
String user, String pw)
throws SQLException, ClassNotFoundException {
//...
}

// methods to implement
}
public class DBStudyCourseDeserializer 
implements IDeserializer<IStudyCourse> {

/**
* Creates a database deserializer for study courses.
*/
public DBStudyCourseDeserializer(String jdbcDriverClass, String dbUrl,
String user, String pw, IManager manager)
throws SQLException, ClassNotFoundException {
//...
}

// methods to implement
}

In der Administration GUI sind seit der zweiten Übung die Methoden "SaveToDB" und "LoadFromDB" leer implementiert. In dieser Übung sollt ihr diese beiden Methoden entsprechend implementieren.

Teil 3 - Testen

Im SVN-Repository ist im StuVoVe-Tests-Projekt im Package de.unikn.bioml.mpi2.stuvove.implementation.db ein Testcase, den ihr zum Testen verwenden sollt. Ihr müsst in der Testklasse DBSerializationTest noch euren Benutzernamen, das Passwort und die URL angeben (in der URL nur noch eure Datenbank).