Major restructure

This commit is contained in:
joss 2025-05-20 20:36:31 +02:00
parent a35d259fd8
commit 9d0efb2a68
6 changed files with 117 additions and 95 deletions

View file

@ -1,56 +1,42 @@
package hsmw.jotto5.beleg.data; package hsmw.jotto5.beleg.data;
import java.lang.annotation.*;
/** /**
* Basisklasse für ein beliebiges DataObject. * Basisklasse für ein beliebiges DataObject.
* *
* Alle spezifischen Objekte (im Sinne dieser Anwendung) erben von dieser Klasse. * Alle spezifischen Objekte (im Sinne dieser Anwendung) erben von dieser Klasse.
* DataObjects haben eine UID. Diese wird im Model vergeben, und ist einmalig.
* Vorgesehen ist die UID als Pfad-formatierter String mit "/" als Trennsymbol, um
* DataObjects hierarchisch zu gliedern - der Inhalt ist aber eigentlich egal
* (solange eindeutig).
* <p> * <p>
* Für alle DataObjects gilt, dass der Zugriff auf Methoden und Felder der Objekte * Das DataObject und alle Kindklassen sind für Klassen außerhalb des Data-Pakets vollständig mutable,
* nicht definiert ist, solange sie nicht an ein Modell gebunden sind. * um das Bearbeiten über das Webinterface zu erlauben.
*/ */
public abstract class DataObject { public abstract class DataObject {
protected Model model; // DataObjects speichern eine Referenz auf das Modell zu dem sie gehören /**
protected String uid; // einmalige UID des Objektes * Annotation um über das Webinterface abrufbare Felder zu kennzeichnen.
protected String displayName; */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface WebField {
public String displayAs() default "";
}
@WebField(displayAs = "Anzeigename")
public final String displayName;
// Wird absichtlich nicht angezeigt, als Demonstration
public final String uid;
/** /**
* Konstruktor für manuelles Erzeugen. * Konstruktor für manuelles Erzeugen.
* *
* Wird nur von Kindklassen verwendet. Dient dazu, ein temporäres * Wird nur von Kindklassen verwendet. Dient dazu, ein temporäres
* DataObject ohne Model-Bindung zu erzeugen. * DataObject ohne Model-Bindung zu erzeugen.
* @param uid Die vorgegebene UID des Objektes (wird beim Binden an ein Model verwendet)
* @param displayName Der Anzeigename des Objektes * @param displayName Der Anzeigename des Objektes
*/ */
protected DataObject(String uid, String displayName) { protected DataObject(String uid, String displayName) {
this.model = null;
this.uid = uid; this.uid = uid;
this.displayName = displayName; this.displayName = displayName;
} }
/**
* Setzt das Model.
*
* Nur aus dem Model zu verwenden!
*/
protected void setModel(Model m) {
this.model = m;
}
public Model getModel() {
return this.model;
}
public String getDisplayName() {
return this.displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
} }

View file

@ -15,11 +15,4 @@ public class Group extends DataObject {
super(uid, displayName); super(uid, displayName);
} }
/**
* Fügt das DataObject mit der gegebenen UID zu der Gruppe hinzu.
*/
public void addMember(String uid) {
this.model.addRelation(this.uid, uid);
}
} }

View file

@ -46,53 +46,52 @@ public class Model {
* Füllt das Model mit Beispieldaten. * Füllt das Model mit Beispieldaten.
*/ */
public void fillMockData() { public void fillMockData() {
Group g1, g2, g3;
// Studierende // Studierende
this.add(new Student("students/jotto5", "Jocelyn", "Otto")); this.add(new Student("students/jotto5", "Jocelyn", "Otto", "0001"));
this.add(new Student("students/vnachn", "Vorname", "Nachname")); this.add(new Student("students/vnachn", "Vorname", "Nachname", "0002"));
this.add(new Student("students/alovel", "Ada", "Lovelace")); this.add(new Student("students/alovel", "Ada", "Lovelace", "0003"));
this.add(new Student("students/aturin", "Alan", "Turing")); this.add(new Student("students/aturin", "Alan", "Turing", "0004"));
this.add(new Student("students/dknuth", "Donald", "Knuth")); this.add(new Student("students/dknuth", "Donald", "Knuth", "0005"));
this.add(new Student("students/ltorva", "Linus", "Torvalds")); this.add(new Student("students/ltorva", "Linus", "Torvalds", "0006"));
this.add(new Student("students/dritch", "Dennis", "Ritchie")); this.add(new Student("students/dritch", "Dennis", "Ritchie", "0007"));
// Gruppen // Gruppen
g1 = new Group("groups/IF24wS2-B", "Softwareentwicklung WiSe 24/25 Seminargruppe 2"); this.add(new Group("groups/IF24wS2-B", "Softwareentwicklung WiSe 24/25 Seminargruppe 2"));
g2 = new Group("groups/admins", "Administrator:innen"); this.add(new Group("groups/admins", "Administrator:innen"));
g3 = new Group("groups/alumni", "Alumni"); this.add(new Group("groups/alumni", "Alumni"));
this.add(new Group("groups/leer", "Leere Gruppe")); this.add(new Group("groups/leer", "Leere Gruppe"));
this.add(g1);
this.add(g2); this.addRelation("groups/if24ws2-b", "students/jotto5");
this.add(g3); this.addRelation("groups/admins", "students/vnachn");
g1.addMember("students/jotto5"); this.addRelation("groups/admins", "students/ltorva");
g2.addMember("students/vnachn"); this.addRelation("groups/alumni", "students/alovel");
g2.addMember("students/ltorva"); this.addRelation("groups/alumni", "students/aturin");
g3.addMember("students/alovel"); this.addRelation("groups/alumni", "students/ltorva");
g3.addMember("students/aturin");
g3.addMember("students/ltorva");
} }
/** /**
* Fügt ein neues DataObject hinzu, also bindet es an das Model. * Fügt ein neues DataObject hinzu.
*/ */
public void add(DataObject a) { public void add(DataObject a) {
// TODO: Auf doppelte UIDs überprüfen! // TODO: Auf doppelte UIDs überprüfen!
this.objs.put(a.uid, a); this.objs.put(a.uid, a);
a.setModel(this);
} }
/*
* Folgende Funktionen sind nur durch die DataObject-Objekte
* zu verwenden, und sind daher protected.
*/
/** /**
* Fügt eine neue Objekt-Beziehung hinzu. * Fügt eine neue Objekt-Beziehung hinzu.
*/ */
protected void addRelation(String a, String b) { public void addRelation(String a, String b) {
// TODO: Prüfen ob die Objekte existieren! // TODO: Prüfen ob die Objekte existieren!
this.relations.put(a, b); this.relations.put(a, b);
} }
/**
* Gibt das DataObject mit der angegebenen UID zurück
* oder null wenn es keines gibt.
*/
public DataObject get(String path) {
if ( !objs.containsKey(path) ) return null;
return objs.get(path);
}
} }

28
src/data/Person.java Normal file
View file

@ -0,0 +1,28 @@
package hsmw.jotto5.beleg.data;
/**
* Verkapselt einige Daten die über alle Arten von Personen wichtig sind.
*/
public abstract class Person extends DataObject {
@WebField(displayAs = "Vorname")
public final String name;
@WebField(displayAs = "Nachname")
public final String lastName;
/**
* Konstruktor.
*
* Der displayName wird aus Vor- und Nachname zusammengesetzt.
* @param uid Die zu vergebende UID
* @param name Der Vorname
* @param lastName Der Nachname
*/
public Person(String uid, String name, String lastName) {
super(uid, lastName + ", " + name);
this.name = name;
this.lastName = lastName;
}
}

View file

@ -3,40 +3,23 @@ package hsmw.jotto5.beleg.data;
/** /**
* Beschreibt eine studierende Person. * Beschreibt eine studierende Person.
*/ */
public class Student extends DataObject { public class Student extends Person {
private String name; @WebField(displayAs = "Matrikelnummer")
private String lastName; public String studentNumber;
/** /**
* Konstruktor zum manuellen Erzeugen. * Konstruktor zum manuellen Erzeugen.
* *
* Der displayName wird aus Vor- und Nachname zusammengesetzt. Beim Ändern der * Siehe auch Konstruktor der Person-Klasse.
* Namensattribute wird die UID NICHT neu vergeben!
* @param uid Die zu vergebende UID * @param uid Die zu vergebende UID
* @param name Der Vorname * @param name Der Vorname
* @param lastName Der Nachname * @param lastName Der Nachname
* @param number Die Matrikelnummer
*/ */
public Student(String uid, String name, String lastName) { public Student(String uid, String name, String lastName, String studentNumber) {
super(uid, lastName + ", " + name); super(uid, name, lastName);
this.name = name; this.studentNumber = studentNumber;
this.lastName = lastName;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
} }
} }

View file

@ -2,7 +2,40 @@
font-family: sans-serif; font-family: sans-serif;
} }
body {
background-color: #ccc;
padding: 0px;
margin: 0px;
}
main { main {
max-width: 600px; background-color: #fff;
padding: 10px;
width: 100%;
}
footer {
background-color: #eee;
width: 100%;
padding: 10px;
padding-bottom: 75px;
}
#content {
max-width: 900px;
margin: auto; margin: auto;
} }
.objecttable {
width: 100%;
margin-bottom: 10px;
}
.objecttable td {
border-bottom: black 1px solid;
width: 50%;
}
.objecttable td input {
width: 100%;
}