diff --git a/build.xml b/build.xml
index f4b462b..27d6d8e 100644
--- a/build.xml
+++ b/build.xml
@@ -10,7 +10,7 @@
-
+
diff --git a/src/views/TreeView.java b/src/views/TreeView.java
index 272d427..964a90c 100644
--- a/src/views/TreeView.java
+++ b/src/views/TreeView.java
@@ -2,26 +2,92 @@ package hsmw.jotto5.beleg.views;
import hsmw.jotto5.beleg.data.Model;
+import java.util.Arrays;
+import java.util.ArrayList;
import java.io.IOException;
import java.io.OutputStream;
import com.sun.net.httpserver.*;
public class TreeView implements HttpHandler {
+ /**
+ * Generiert HTML-Code für einen Baum aus dem gegebenen mehrstufigen Array.
+ * Damit der Baum "richtig" aussieht sollte das Eingabearray zumindest gruppiert
+ * sein (nach den Ast-Knoten).
+ */
+ private String makeObjectTree(String[][] data) {
+ String result;
+ ArrayList stack;
+ int levels;
+
+ result = "";
+ stack = new ArrayList();
+
+ // Zum gruppierten Ausgeben wird ein Stack verwendet
+ // Diese nicht-rekursive Lösung ist hier einfacher zu implementieren, wenn auch etwas unschön
+ // Wir machen uns zu nutze dass die UIDs/Pfade vorsortiert sind
+ for ( String[] e : data ) {
+ // Wir suchen zuerst die erste Abweichung im Pfad
+ // dabei wird das letzte Element (Blattknoten) in e übersprungen.
+ int firstDeviation = -1;
+ for ( int i = 0; i < Math.min(stack.size(), e.length - 1); i++ ) {
+ if ( !e[i].equals(stack.get(i)) ) {
+ firstDeviation = i;
+ break;
+ }
+ }
+
+ // Nun springen wir bis zur ersten Abweichung zurück und schließen dabei alle HTML Tags
+ if ( firstDeviation != -1 ) {
+ // Hilfsvariable da wir den Stack in der Schleife verändern
+ levels = stack.size() - firstDeviation;
+ for ( int i = 0; i < levels; i++ ) {
+ stack.remove(stack.size() - 1);
+ result += "
";
+ }
+ }
+
+ // Jetzt gehen wir einfach so viele Stufen nach unten wie wir müssen
+ // Es ist jetzt garantiert dass e = stack oder e > stack
+ // Auch hier überspringen wir das letzte Element in e, um es nicht auszugeben
+ // Hilfsvariable da wir stack verändern
+ levels = e.length - 1 - stack.size();
+ for ( int i = 0; i < levels; i++ ) {
+ result += "" + e[stack.size() + i] + "";
+ stack.add(e[stack.size() + i]);
+ }
+
+ // Wir müssen die URL für die Bearbeitungsseite noch zusammenbauen
+ result += "- " + e[e.length - 1] + "
";
+ }
+ result += "
";
+
+ return result;
+ }
+
public void handle(HttpExchange t) throws IOException {
String response;
OutputStream os;
Model m;
-
+ String[] uids; // enthält alle UIDs als String
+ String[][] objPaths; // enthält alle Objekt-IDs, aufgeteilt in ihre Pfadelemente
+
m = Model.getModel();
+ uids = m.getAllUids();
+ // Array noch sortieren, da es zum Baum generieren sortiert sein muss und sich String[]s
+ // aus irgendeinem Grund nur SEHR schlecht sortieren lassen :(
+ Arrays.sort(uids);
+
+ // Wir nutzen Javas Lambda-Notation um mit einem Mapping zu arbeiten.
+ // Außerdem müssen wir den Allokator überschreiben um ein Array des richtigen Typs zu bekommen, siehe
+ // https://stackoverflow.com/questions/52416381/how-can-i-map-over-an-array-in-java
+ objPaths = Arrays.stream(uids).map(uid -> uid.split("/")).toArray(size -> new String[size][]);
response = Defaults.HTMLHEADER + "Beleg - Objektübersicht
";
-
- for ( String s : m.getAllUids() ) {
- response += "- " + s + "
";
- }
-
- response += "
" + Defaults.HTMLFOOTER;
+ try { response += makeObjectTree(objPaths); } catch(Exception e) { e.printStackTrace(); }
+ response += Defaults.HTMLFOOTER;
os = t.getResponseBody();