Übung 1: Object-Inspector

Werbung
Praktikum SW 2 2015S Übung 1: Object‐Inspector Es ist ein System zu entwickeln, mit dem man Objektstrukturen bezüglich ihrer Properties analysieren und dann in einem Tree‐Viewer (JTree) anzeigen und bearbeiten kann. Properties Properties in Java sind ein standardisiertes Konzept, um Eigenschaften von Objekten mit Datenkapselung zu implementieren (siehe JavaBeans‐Standard http://www.oracle.com/technetwork/java/javase/documentation/spec‐136004.html). Properties werden mit Getter‐ und Setter‐Methoden implementiert: 
Getter: Öffentliche Methode beginnt mit „get“ (oder „is“ für Boolesche Properties) plus Name der Property (erster Buchstabe groß). Eine Getter‐Methode hat keinen Parameter und einen Rückgabewert vom Typ der Property. Zum Beispiel: public String getName() 
Setter: Öffentliche Methode beginnt mit „set“ plus Name der Property (erster Buchstabe groß). Eine Setter‐Methode einen Parameter vom Typ der Property. Typ des Rückgabewertes ist void. Zum Beispiel:
public void setName(String name) Die beiden Methoden implementieren dann gemeinsam eine Property. Fehlt der Setter ist die Property nicht schreibbar. Eine Property ist durch folgende Merkmale gekennzeichnet: 


Name der Property: Name nach „get“ oder „set“ aber klein geschrieben. Zum Beispiel: Name der Property mit Getter und Setter wie oben ist "name" Typ der Property: Rückgabetyp des Getters und Typ des Parameters des Setters ergibt Typ der Property. Zum Beispiel: Typ der Property name ist String Schreibbar: Die Property hat einen Setter. Objektanalyse Reflection erlaubt uns von Objekten die Properties zu bestimmen. Das erfolgt indem man vom Objekt auf die Klasse des Objekts zugreift und sich von dieser die Methoden holt. In der Liste der Methoden sucht man nach Getter‐Methoden. Zu diesen kann man dann direkt auf die Setter‐
Methode zugreifen (die nicht existieren müssen). Auf Basis der Getter‐ und Setter‐Methoden kann man dann ein Informations‐Objekt erstellen, das die Merkmale der Property wie folgt darstellt: 
Name der Property 
Typ der Property 
Getter‐Methode 
Setter‐Methode 
Besitzer der Property (= Ausgangsobjekt) 
Wert der Property (= Wert der Property des Besitzerobjekts) Praktikum SW 2 2015S Den Wert der Property bekommt man, indem man den Getter für das Besitzerobjekt aufruft. Dieser Wert kann wieder ein Objekt sein (oder aber auch ein primitiver Wert, oder null), der dann wiederrum Properties haben kann. Es entsteht daher ausgehend vom Anfangsobjekt analog zur Verkettung der Objekte ein Baum von Informations‐Objekten. Abbildung 1 zeigt die Klasse PropInfo und Abbildung 2 veranschaulicht die Situation anhand einer einfachen Objektstruktur. Beachten Sie, dass zwischen den Info‐Objekten eine Parent‐Child‐
Beziehung besteht. Abbildung 1: Klasse PropInfo Abbildung 2: Prop‐Info‐Objekte für die durch das Beispielprogramm aufgebaute Objektstruktur (Person‐Klasse am Ende des Dokuments) Praktikum SW 2 2015S Schränken Sie die Analyse der Properties folgend ein: 1) Expandieren sie keine Properties, deren Typ ein Standarddatentyp oder ein Enumerationstyp ist bzw. aus der Java‐Bibliothek stammt (z.B. String). 2) Exkludieren Sie alle Properties, bei denen der Getter in einer Klasse der Java‐Bibliothek deklariert ist (z.B. Methode getClass ist bei Object definiert). Hinweise: Ad (1): Mit Methode isPrimitive() bzw. isEnum() kann man prüfen, ob ein Typ ein Standarddatentyp bzw. Enumerationstyp ist. Eine Klasse stammt aus der Java‐Bibliothek, wenn der Name des Packages der Klasse mit "java" beginnt. Ad (2) Prüfen Sie, ob der Name des Packages der Declaring Class der Getter‐Methode mit "java" beginnt. Darstellung und Bearbeitung in JTree Die hierarchische Struktur der Property‐Info‐Objekte soll nun in einem JTree dargestellt und auch bearbeitet werden können. Implementieren Sie dazu ein spezielles TreeModel, der die Darstellung der PropInfo‐Objekte ermöglicht. Abbildung 3 zeigt die Darstellung der Struktur der Properties aus Abbildung 2 im JTree. Abbildung 3: JTree‐Darstellung der Person‐Struktur von Abbildung 2 Neben der Darstellung sollen die Properties im JTree auch editiert werden können. Folgende Abbildung zeigt, wie das Geburtsdatum editiert wird. Abbildung 4: Editieren eines Wertes Praktikum SW 2 2015S Editieren soll folgend umgesetzt werden:  Nur Properties, für die folgende Merkmale gegeben sind, können editiert werden - für die Property ist ein Setter definiert - der Typ der Property ist entweder ein primitiver Datentyp oder ein Typ, der einen Konstruktor mit einem Parameter von Typ String hat (= Typen die mit einem JFormattedTextField editiert werden können)  Editieren erfolgt mit einen JFormattedTextField, der in CellEditor erzeugt wird (siehe Beispielprogramme).  Setzen des Wertes passiert mit Aufruf des Setters. Des Weiteren soll es möglich sein, neue Objektwerte für ein Property zu erzeugen, wenn  der aktuelle Wert null ist  der Typ einen Standardkonstruktor (Konstruktor ohne Parameter) hat Abbildung 5 zeigt wie ein solches neuer Objektwert im JTree erzeugt wird. Durch Selektion wird ein Editorpanel erzeugt, der Buttons zum Erzeugen und Abbrechen beinhaltet. Mit „OK“ wird mit dem Standardkonstruktor ein Objekt erzeugt und gesetzt, mit „Cancel“ die Aktion abgebrochen. mit OK  Abbildung 5: Erzeugen eines Objektwertes Hinweise: 

Orientieren sie sich bei der Implementierung an der in der LVA besprochenen Implementierung zur JTree‐Darstellung der Num‐Objekte. Um das Wurzelobjekt darstellen zu können, muss man das Wurzelobjekt in einem Property eines übergeordneten Objekts speichern. Nur dadurch erhält man einen Property‐Info‐
Knoten, der als Knoten im JTree verwendet werden kann. Hier ist es sinnvoll, das Wurzelobjekt in einem Dummy‐Objekt mit z.B. einer Property „root“ zu speichern und den PropInfo‐Knoten zur Property „root“ als Wurzel im JTree zu verwenden. Folgend ist der Code dazu angegeben. public static class RootDummy {
private final Object root;
public RootDummy(Object root) {
super();
this.root = root;
}
public Object getRoot() { return root; }
RootDummy rootObj = new RootDummy(root);
try {
Method getter = rootObj.getClass().getMethod("getRoot");
rootNode = new PropInfo(rootObj, getter);
} catch (NoSuchMethodException e) {
}
Praktikum SW 2 
2015S Zum Test erhalten Sie zwei unterschiedliche Person‐Klassen. Die erste hat Properties father und mother, die man dynamisch erzeugen kann (siehe Abbildung 5). In der anderen Person‐Klasse ist eine zyklische Beziehung spouse definiert. Damit das System auch mit zyklischen Beziehungen funktioniert, müssen die PropInfo‐Objekte „on demand“ erzeugt werden. Praktikum SW 2 2015S Beispielprogramm Person with Ancestors public class Person {
private
private
private
private
String name;
int born;
Person father;
Person mother;
public Person() {
super();
this.name =
this.born =
this.father
this.mother
}
"NN";
0;
= null;
= null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBorn() {
return born;
}
public void setBorn(int age) {
this.born = age;
}
public Person getFather() {
return father;
}
public void setFather(Person father) {
this.father = father;
}
public Person getMother() {
return mother;
}
public void setMother(Person mother) {
this.mother = mother;
}
@Override
public String toString() {
return "Person [name=" + name + ", born=" + born + "]";
}
}
Beispielprogramm Person with Spouse: (siehe Download) 
Herunterladen