From b43fc1663f808401c62715c0646b439d937ccbdf Mon Sep 17 00:00:00 2001 From: joss Date: Sat, 14 Jun 2025 19:24:08 +0200 Subject: [PATCH 1/2] Activated debug build mode --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index f4b462b..27d6d8e 100644 --- a/build.xml +++ b/build.xml @@ -10,7 +10,7 @@ - + From 75b9d90f89438630acb6d1c39088149be67750cd Mon Sep 17 00:00:00 2001 From: joss Date: Sat, 14 Jun 2025 20:33:01 +0200 Subject: [PATCH 2/2] TreeView is an actual tree now --- src/views/TreeView.java | 80 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 7 deletions(-) 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();