TreeView is an actual tree now
This commit is contained in:
parent
b43fc1663f
commit
75b9d90f89
1 changed files with 73 additions and 7 deletions
|
@ -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<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 {
|
||||
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 + "<h1>Beleg - Objektübersicht</h1><ul>";
|
||||
|
||||
for ( String s : m.getAllUids() ) {
|
||||
response += "<li><a href=\"/object/" + s + "\">" + s + "</a></li>";
|
||||
}
|
||||
|
||||
response += "</ul>" + Defaults.HTMLFOOTER;
|
||||
try { response += makeObjectTree(objPaths); } catch(Exception e) { e.printStackTrace(); }
|
||||
response += Defaults.HTMLFOOTER;
|
||||
|
||||
os = t.getResponseBody();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue