Ptt17 Assignment3

Metaprogramming

Aufgabe

Gegeben ist ein vereinfachtes Modell eines KLIPS-ähnlichen Systems als Klassendiagramm.

Bearbeiten Sie die Aufgabe gemäß Ihrer zugewiesenen Option.

Modalitäten:

Sie müssen in der Regel genau eine Hausaufgabe.pdf und ein Projekt abgeben.

PDF
  • Je nach Option variiert der Inhalt.
  • Zusätzlich können Sie sinnvolle Abbildungen wie Klassendiagramme hinzufügen.
  • Die PDF-Datei sollte maximal 3 Seiten bei Schriftgröße 12 inklusive Abbildungen und Code-Beispielen haben.
Projekt
  • Geben Sie das komplette Projekt ab. Verwenden Sie dabei entweder ein Buildmanagement-Tool wie Maven, Gradle oder Ant oder fügen Sie die benötigten Abhängigkeiten (In der Regel .jar-Dateien bei Java-Projekten) in ein Ordner des Projektes hinzu.
  • Kommentieren Sie ihren Code kurz (!) wo es sinnvoll erscheint.
  • Erstellen Sie ein oder mehrere JUnit4-Tests (Quellcode-Datei Demo.java), welche die Funktionsweise des Systems mit allen Bestandteilen demonstrieren.
  • Code-Dateien müssen in Unicode codiert sein (etwa UTF-8).
Abgabeordner

Laden Sie die PDF-Datei und das Projekt in ihr Gruppenverzeichnis:
https://svn.uni-koblenz.de/softlang/ptt17/GRUPPENNAME/solutions/03/

Optionen

Option A: Parsing

Motivation

Wir wollen die Lesbarkeit von Objekten und die Anwendung des Systems für Anwender ohne Programmierkenntnisse erleichtern. Dafür verwenden wir eine textuelle Notation des Klips-ähnlichen Systems. Diese Notation soll mittels eines ANTLR-basierten Parsers auf das Objektmodell für das KLIPS-ähnliche System abgebildet werden.

Aufgabe
  • Entwerfen und erklären Sie (in Hausaufgabe.pdf) eine Grammatik (EBNF-artige Notation für Grammatikregeln wie in ANTLR) für die textuelle Notation des KLIPS-ähnlichen Systems.
  • Illustrieren Sie die Notation mit einem Beispiel in einer Datei Sample.klips.
  • Implementieren Sie die Notation mittels eines ANTLR-basierten Parsers, welcher die Notation in Objektgraphen des bekannten Objektmodells für das KLIPS-ähnliche System übersetzt. Dazu vervollständigen Sie die Grammatik in eine korrekte ANTLR-Eingabe für die Parser-Generierung und implementieren Sie einen Listener, welcher vom generierten BaseListener ableitet und die Objekte des bekannten Objektmodells erzeugt.
  • Wenden Sie in einem JUnit4-Testfall (Demo.java) den Parser auf Ihre Beispieldatei Sample.klips an.

Option B: Template Processing

Motivation

Wir wollen die Objekte des KLIPS-ähnlichen Systems auf mehrere Ansichten aufteilen und mithilfe von HTML darstellen. Beispielsweise könnten in einer Veranstaltungssicht die Daten einer Veranstaltung wie Termine und angemeldete Studenten angezeigt werden. Dafür benötigen wir ein Mapping des KLIPS-ähnlichen Objektmodells auf HTML. Template Processing mittels ANTLR StringTemplate oder einer ähnlichen Technologie ermöglicht es uns, die konkreten Objekte auf das gewünschte HTML abzubilden.

Aufgabe

  • Beschreiben Sie im Detail (in Hausaufgabe.pdf) zwei oder mehrere Ansichten auf die Daten des KLIPS-ähnlichen Systems.
  • Implementieren Sie diese Ansichten als Mappings vom KLIPS-ähnlichen Objektmodell auf HTML. Für die Erzeugung von HTML benutzen Sie Template Processing mittels ANTLR StringTemplate oder einer ähnlichen Technologie. Dazu müssen Sie geeignete Templates für die HTML-Ausgabe entwerfen und diese in Ihrem Code instanziieren.
  • Erzeugen Sie in einem JUnit4-Testfall (Demo.java) HTML-Ausgaben für die Ansichten.

Option C: Introspection

Motivation

Wir wollen verschiedene Überblicksdarstellungen für Objektgraphen von dem KLIPS-ähnlichen System erstellen. Diese Darstellungen sollen in JSON ausgegeben werden. Die Implementation soll so geschehen, dass Attribute bzw. Getter von Klassen mit Annotationen markiert werden können so dass sie mittels Reflection (Java's Introspection) identifiziert werden und zu einer Überblicksdarstellung beitragen können.

Aufgabe
  • Beschreiben Sie im Detail (in Hausaufgabe.pdf) eine entsprechende Überblicksdarstellung, welche erstellt werden könnte.
  • Implementieren Sie die Erstellung der Überblicksdarstellung wie folgt.
    • Sie unterstützen eine Annotation @summary(x) für Attribute und Getter, welche besagt, dass das annotierte Attribut bzw. der Getter mittels "toString" zu der Ausgabe der Überblicksdarstellung namens x beiträgt. Hierbei ist x der Name der Überblicksdarstellung (ein String), z.B., "Veranstaltungsübersicht". Nicht annotierte Attribute und Getter tragen nicht bei.
    • Sie benutzen Reflection (Java's Introspection), um über einen gegebenen Objektgraphen zu iterieren und alle für eine gegebene Überblicksdarstellung x relevanten Attribute bzw. Getter zu finden. Sie benutzen jeweils den Namen des Attributes bzw. des Getters als Schlüssel in dem erzeugten JSON-Output. Wenn eine Annotation auf ein Attribute bzw. ein Getter von einem Collection-Typ angewendet wird, dann soll das bedeuten, dass eine JSON-Liste gebaut werden soll.
  • Erzeugen Sie in einem JUnit4-Testfall (Demo.java) eine Überblicksdarstellung.

Gruppe-Option-Zuordnung

Optionen Gruppen
Option A alpha, charlie, delta, echo, golf, hotel, juliet
Option B kilo, mike, november, oscar, quebec, romeo, sierra
Option C
 tango, uniform, whiskey, xray, yankee, zulu