Login |
 
 

Aufgabe 1, Abgabe spätestens am 04.05.2010, 8:00 Uhr

Teil 1 - Die Basisklassen

Wie bereits in der ersten Vorlesung kurz vorgestellt, werden wir in diesem Semester ein größeres Softwareprojekt programmieren. In diesem ersten Teil geht es darum, einige der Basisklassen zu implementieren, Room und StudyCourse sowie die Ableitungen Lecture, Seminar und Exercise.

Zuerst solltet ihr euch ein Eclipse-Projekt erstellen. In der zweiten Vorlesung werden wir zeigen, wie ihr das Projekt unter Versionskontrolle stellt (und was das überhaupt ist). Für die Bearbeitung der Aufgabe ist das zunächst unerheblich, zum Abgabetermin müssen aber alle euren Dateien eingecheckt sein.

Holt euch die JAR-Datei ue1-1.jar mit den Interfaces, den Implementierungen der anderen Basisklassen und den Testcases aus dem Subversion-Repository und bindet sie in euer Eclipse-Projekt ein. Dazu im Projekt einen lib-Ordner anlegen, die JAR-Datei dorthin kopieren (evtl. das Projekt refreshen), und dann rechte Maustaste aufs Projekt -> Properties -> Java Build Path -> Libraries -> Add JAR .... Die JAR-Datei enthält neben den Klassendateien auch den Quellcode. Ihr könnt Eclipse so konfigurieren, dass dieser angezeigt wird, indem ihr im Library-Registerblatt als Source-Attachment nochmal die JAR-Datei selber angebt (s. auch zweite Vorlesung).

Wichtig: Die Klassendateien in den JAR-Archiven sind mit Java 6 übersetzt, laufen also auch nur zusammen mit Java 6 und nicht mit Java 5!

Bevor ihr nun mit dem Implementieren beginnt, solltet ihr euch mit den Interfaces im Package de.unikn.bioml.mpi2.stuvove.definitions.core vertraut machen. Dazu gibt es auch die Javadoc des kompletten Projekts.

Der erste Teil der Aufgabe ist jetzt recht einfach: Implementiert die folgenden Klassen. Damit die Testcases funktionieren, ist es wichtig, dass ihr die Konstruktoren von unten übernehmt! Es gibt jeweils einen Konstruktur, bei dem die ID des Objekt explizit gesetzt werden kann und einen Konstruktur (ohne den id-Parameter), bei dem die ID automatisch auf -1 gesetzt wird. Schaut euch dazu die bereits von uns implementieren Klassen an.

package de.unikn.bioml.mpi2.stuvove.implementation.core;

public class Room implements IRoom, IMutableRoom {
public Room(int id, String number, int capacity) ...
public Room(String number, int capacity) ...
}

public class StudyCourse implements IStudyCourse, IMutableStudyCourse {
public StudyCourse(int id, String title,
ILecturer lecturer, Set<ITimeSlot> timeSlots,
IRoom room, int maxStudents, String description) ...
public StudyCourse(String title,
ILecturer lecturer, Set<ITimeSlot> timeSlots,
IRoom room, int maxStudents, String description) ...
}

public class Lecture extends StudyCourse implements ILecture {
public Lecture(int id, String title,
ILecturer lecturer, Set<ITimeSlot> timeSlots,
IRoom room, int maxStudents, String description) ...
public Lecture(String title,
ILecturer lecturer, Set<ITimeSlot> timeSlots,
IRoom room, int maxStudents, String description) ...
}

public class Exercise extends StudyCourse implements IExercise, IMutableExercise {
public Exercise(int id, String title, ILecturer lecturer,
Set<ITimeSlot> timeSlots, IRoom room, int maxStudents,
String description, ILecture parent) ...
public Exercise(String title, ILecturer lecturer,
Set<ITimeSlot> timeSlots, IRoom room, int maxStudents,
String description, ILecture parent) ...
}

public class Seminar extends StudyCourse implements ISeminar {
public Seminar(int id, String title,
ILecturer lecturer, Set<ITimeSlot> timeSlots,
IRoom room, int maxStudents, String description) ...
public Seminar(String title,
ILecturer lecturer, Set<ITimeSlot> timeSlots,
IRoom room, int maxStudents, String description) ...
}

Wichtig, ist, dass die Klassen in dem oben angegeben Paket sind. Was die in den Interfaces spezifierten Methoden machen müssen, ist in der Dokumentation beschrieben.

Testet eure Klassen mit den Testcases! Die Testcases sind in einem separatem Eclipse-Projekt in der Versionsverwaltung zu finden: public/StuVoVe-Tests. Das Projekt müsst ihr euch auschecken, das andere Eclipse-Projekt als abhängiges Projekt eintragen (Properties->Java Build Path->Projects) und wiederum in eurem Projekt ue1-1.jar exportieren (Properties->Java Build Path->Order And Export, ue1-1.jar muss einen Haken haben).

 

Teil 2 - Der Manager

Aufbauend auf den Basisklassen, wird nun der Manager, der die Räume, Zeiten, Dozenten und Lehrveranstaltungen verwaltet, vervollständigt. Falls ihr den ersten Teil der Aufgabe nicht bearbeitet habt, holt euch ue1-2.jar aus dem Repository. Sie enthält zusätzlich die fertig implementierten Klassen aus dem ersten Teil.

Der Manager ist durch das IManager-Interface spezifiziert. Ein Teil des Managers ist bereits fertig implementiert. Eure Aufgabe ist es, den AbstractManager in einer Klasse Manager um die noch fehlenden Methoden aus dem Interface zu erweitern. Das Verhalten ist wie zuvor in der Dokumentation des Interfaces beschrieben. Eure Klasse muss in dem schon oben verwendeten Package liegen.

package de.unikn.bioml.mpi2.stuvove.implementation.core;

public class Manager extends AbstractManager {...}

Beim Hinzufügen oder Löschen von Objekten muss der Manager diverse Nebenbedingungen überprüfen, bevor die Aktion zugelassen wird. Im Einzelnen sind dies für den Raum:

  • Ein Raum muss eine eindeutige Nummer haben.
  • Eine Raum muss mindestens einen Platz haben.
  • Räume, in denen Veranstaltungen statt finden, dürfen nicht gelöscht werden.

und für die Lehrveranstaltungen:

  • Eine Lehrveranstaltung muss einen eindeutigen Titel haben.
  • Eine Lehrveranstaltung muss einen Dozenten haben, der nicht schon zur gleichen Zeit eine andere Veranstaltung hat.
  • Eine Lehrveranstaltung muss eine erwartete Studentenzahl haben, die größer als 0 ist.
  • Eine Lehrveranstaltung muss an mindestens einem Termin stattfinden.
  • Eine Lehrveranstaltung muss in einem Raum stattfinden, der Raum muss groß genug sein und er darf nicht bereits von einer anderen Veranstaltung belegt sein.

Auch für den fertigen Manager existieren Testcases.

 

Teil 3 - (De)Serialisierung

Der dritte Teil der ersten Aufgabe beschäftigt sich mit der Serialisierung und Deserialisierung der im Manager gespeichert Informationen. Wie immer gibt es die Klassen aus dem vorhergehenden Aufgabenteil fertig implementiert ue1-3.jar.

Für die De-/Serialisierung gibt es die zwei Interfaces ISerializer und IDeserializer. Eure Aufgabe ist es nun, Serialisierer und Deserialisierer für Räume und Lehrveranstaltungen zu schreiben. Dabei sollen jeweils zwei verschiedene Implementierungen programmiert werden. Die eine Sorte erzeugt bzw. liest reine Textdateien, die andere arbeitet mit XML. Das jeweilige Format ist in der Dokumentation der konkreten Implementierungen beschrieben (logischerweise nicht in den Interfaces). Die Klassen sollen die unten angegebenen Konstruktoren haben und aus den dort übergebenen Streams lesen bzw. in diese schreiben.

package de.unikn.bioml.mpi2.stuvove.implementation.core;

public class TextRoomSerializer implements ISerializer<IRoom> {
public TextRoomSerializer(OutputStream out) {...}
...
}

public class TextRoomDeserializer implements IDeserializer<IRoom> {
public TextRoomDeserializer(InputStream in) {...}
...
}

public class XMLRoomSerializer implements ISerializer<IRoom> {
public XMLRoomSerializer(OutputStream out) {...}
...
}

public class XMLRoomDeserializer implements IDeserializer<IRoom> {
public XMLRoomDeserializer(InputStream in) {...}
...
}

public class TextStudyCourseSerializer implements
ISerializer<IStudyCourse> {
public TextStudyCourseSerializer(OutputStream out) {...}
...
}

public class TextStudyCourseDeserializer implements
IDeserializer<IStudyCourse> {
public TextStudyCourseDeserializer(InputStream in,
IManager manager) {...}
...
}

public class XMLStudyCourseSerializer implements
ISerializer<IStudyCourse> {
public XMLStudyCourseSerializer(OutputStream out) {...}
...
}

public class XMLStudyCourseDeserializer implements
IDeserializer<IStudyCourse> {
public XMLStudyCourseDeserializer(InputStream in,
IManager manager) {...}
...
}

Der Konstruktor der Deserialisierer für Lehrveranstaltungen verlangt zusätzlich zu einem InputStream einen Manager. Das ist notwendig, um die gespeicherten Verweise auf Räume, Dozenten, Zeiten und Übungen auzuflösen und bereits existierende Objekte zu referenzieren.

In der JAR-Datei ist der Quellcode der De-/Serialisierer für Dozenten und Zeiten enthalten, an denen ihr euch orientieren könnt. Eure Implementierung muss aber nicht dem dort gewählten Weg folgen. Wichtig ist nur, dass das Dateiformat und die Spezifikation der Methoden eingehalten werden. Wie immer, gibt es auch für diese Klassen Testcases. Außerdem bekommt ihr mit der Klasse de.unikn.bioml.mpi2.stuvove.implementation.ui.Console eine einfache Konsolenanwendung, mit der Teile des Managers und der Basisklassen gestestet werden können.