Compare commits

..

2 commits

Author SHA1 Message Date
75b9d90f89 TreeView is an actual tree now 2025-06-14 20:33:01 +02:00
b43fc1663f Activated debug build mode 2025-06-14 19:24:36 +02:00
2 changed files with 74 additions and 8 deletions

View file

@ -10,7 +10,7 @@
<target name="compile"> <target name="compile">
<mkdir dir="build/classes"/> <mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes"/> <javac debug="true" srcdir="src" destdir="build/classes"/>
</target> </target>
<target name="jar" depends="compile"> <target name="jar" depends="compile">

View file

@ -2,26 +2,92 @@ package hsmw.jotto5.beleg.views;
import hsmw.jotto5.beleg.data.Model; import hsmw.jotto5.beleg.data.Model;
import java.util.Arrays;
import java.util.ArrayList;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import com.sun.net.httpserver.*; import com.sun.net.httpserver.*;
public class TreeView implements HttpHandler { 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<String> stack;
int levels;
result = "<ul>";
stack = new ArrayList<String>();
// 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 += "</ul></li>";
}
}
// 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 += "<li>" + e[stack.size() + i] + "<ul>";
stack.add(e[stack.size() + i]);
}
// Wir müssen die URL für die Bearbeitungsseite noch zusammenbauen
result += "<li><a href=\"/object";
for ( int i = 0; i < e.length; i++ ) result += "/" + e[i];
result += "\">" + e[e.length - 1] + "</a></li>";
}
result += "</ul>";
return result;
}
public void handle(HttpExchange t) throws IOException { public void handle(HttpExchange t) throws IOException {
String response; String response;
OutputStream os; OutputStream os;
Model m; Model m;
String[] uids; // enthält alle UIDs als String
String[][] objPaths; // enthält alle Objekt-IDs, aufgeteilt in ihre Pfadelemente
m = Model.getModel(); 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 + "<h1>Beleg - Objekt&uuml;bersicht</h1><ul>"; response = Defaults.HTMLHEADER + "<h1>Beleg - Objekt&uuml;bersicht</h1><ul>";
try { response += makeObjectTree(objPaths); } catch(Exception e) { e.printStackTrace(); }
for ( String s : m.getAllUids() ) { response += Defaults.HTMLFOOTER;
response += "<li><a href=\"/object/" + s + "\">" + s + "</a></li>";
}
response += "</ul>" + Defaults.HTMLFOOTER;
os = t.getResponseBody(); os = t.getResponseBody();