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.