UE 6 ObjectComposer, Reflection, XML

Werbung
Institut für Systemsoftware (Markus Löberbauer)
Praktikum aus Softwareentwicklung SS 2012
Repository URL: svn://ssw.jku.at/2012S/PSW2/k<MatrNr>/ObjectComposer/
Letzter Abgabetermin: Montag, 04.06.2012, 1200 Uhr
Object Composer (24 Punkte)
Übung 6
Abgabe Verschoben auf:
11.06.2012, 1200 Uhr
Implementieren Sie eine Klasse ObjectComposer mit der man Objektstrukturen aus einer XMLBeschreibung (siehe Abbildung 1) aufbauen kann. Ein solcher Object-Composer könnte teil eines
GUI-Frameworks sein.
<?xml version="1.0" encoding="UTF-8"?>
<component id="frame" class="javax.swing.JFrame">
<call name="setTitle" class="java.lang.String" value="Text View" />
<call name="setDefaultCloseOperation">
<constant class="javax.swing.JFrame" field="EXIT_ON_CLOSE" />
</call>
...
Abbildung 1: Ausschnitt aus einer XML-Beschreibung
Als Vorgabe erhalten Sie die Schnittstelle der Klasse ObjectComposer, JUnit-Tests (Anmerkung:
bitte ansehen, hilft beim Verstehen der Aufgabe) und ein Testprogramm (umgebautes TextViewProgramm aus der Übungsstunde 2), dass die GUI mit dem Composer erstellt (siehe Abbildung 2). Vervollständigen Sie die Klasse ObjectComposer aus der Vorgabe, lassen Sie dabei die
öffentliche Schnittstelle (public) der Klasse unverändert.
Abbildung 2: GUI des Testprogrammes TextView, mit Goethes Faust als Inhalt.
Die Klasse ObjectComposer hat die öffentlichen statischen Methoden: parseFile(String), parseString(String) und parseStream(InputStream), jede dieser Methoden liefert eine Map<String, Object> in der die Objekte gespeichert sind für die im XML eine id angegeben ist. Die Methode parseFile(String) liest die Objekt-Beschreibung aus einer Datei (mit dem gegebenen Namen),
parseString(String) liest direkt aus dem gegebenen String, und parseStream(InputStream) aus
dem gegeben Stream. Jede dieser Methoden darf beliebige Exceptions werfen, zur Laufzeit werden darunter folgende Exceptions sein: IOException, ReflectiveOperationException (zB: NoSuchMethodException, ClassNotFoundException), und XML-Exceptions abhängig von der verwendeten XML-Technologie (zB: XMLStreamException, SAXException).
Institut für Systemsoftware (Markus Löberbauer)
Praktikum aus Softwareentwicklung SS 2012
Repository URL: svn://ssw.jku.at/2012S/PSW2/k<MatrNr>/ObjectComposer/
Letzter Abgabetermin: Montag, 04.06.2012, 1200 Uhr
Übung 6
Die XML-Beschreibung kann die Elemente component, call, und constant enthalten:
• Mit component kann eine Komponente angelegt werden, mit dem Attribut class wird die Klasse
angegeben. Sie können davon ausgehen, dass hier nur Klassen verwendet werden die einen
parameterlosen Default-Konstruktor haben. Ist das Attribut id angegeben, dann wird das erzeugte Objekt in der Map zurückgeliefert. Eine componenent kann beliebig viele Kind-Elemente
vom Typ call haben.
• Das Element call beschreibt einen Methodenaufruf auf die umgebende Komponente (component). Ein Methodenname ist im Attribut name abgelegt. Die Parameter für den Methodenaufruf
werden als Kind-Elemente angegeben. Optional kann der erste Parameter auch über Attribute
angegeben werden. Das Attribut class bestimmt die Klasse des Parameters, hat der Konstruktor des Parameter einen String-Parameter, dann kann dieser über das Attribut value angegeben
werden. Über diese Attribute kann der erste Parameter daher nur angegeben werden, wenn:
der Parameter mit einem Default-Konstruktor angelegt werden kann, oder wenn er einen
String-Parameter erwartet und dieser als value gegeben ist. Weitere Parameter können als
Kind-Elemente angegeben werden. Diese Parameter können von den Typen component und
constant sein.
• Eine Konstante wird mit dem Element constant beschrieben. Mit dem Attribut class wird die
Klasse der Konstanten angegeben. Mit dem Attribut value der Wert oder mit dem Attribut field
der Name des statischen Feldes in der Klasse der die Konstante enthält. Wird ein value angegeben, dann können Sie davon ausgehen, dass die Klasse einen Konstruktor mit einem StringParameter hat. Hat eine Konstante das Attribut id, dann wird sie in der Map zurückgeliefert.
Unterstützen Sie in Ihrer Implementierung auch primitive Datentypen (zB: int, bool, float). Wenn
sie ein Objekt für einen primitiven Datentyp erzeugen müssen, dann erzeugen Sie bitte ein Objekt
der zugehörigen Wrapper-Klasse (zB: Integer für int, Boolean für bool, Float für float). Sie können
davon ausgehen, dass Wrapper-Klasse einen Konstruktor mit String-Parameter haben.
Hinweise
Zum Lesen der XML-Beschreibung können sie eine beliebige Technologie aus der Java Klassenbibliothek verwenden (zB: StAX, SAX oder DOM).
Sie können davon ausgehen, dass alle Klassen, Felder, und Methoden die in der XML-Beschreibung verwendet werden public sind.
Implementieren Sie saubere, kurze Methoden; wählen Sie sprechende Klassen-, Methode- und
Variablennamen. Verwenden Sie geeignete Sichtbarkeitsattribute, d.h., so wenig sichtbar wie
möglich, so viel sichtbar wie nötig. Halten Sie Ihren Code sauber, d.h., entfernen Sie toten Code,
entfernen Sie auskommentierten Code, verzichten Sie auf Vergleiche mit Boolean-Literalen (zB: if
(a == true) ... sollte if (a) ... sein) und sinnlose if-Statements (zB: if (a) { return false; } else { return
true; } sollte return !a; sein). Geben Sie ihre Klassen in passende packages.
Herunterladen