Compare commits
2 commits
b9dc7348ce
...
75b9d90f89
Author | SHA1 | Date | |
---|---|---|---|
75b9d90f89 | |||
b43fc1663f |
2 changed files with 74 additions and 8 deletions
|
@ -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">
|
||||||
|
|
|
@ -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übersicht</h1><ul>";
|
response = Defaults.HTMLHEADER + "<h1>Beleg - Objektü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();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue