From cd9a49a19a52fd6d675254e3241df012a6dd92d0 Mon Sep 17 00:00:00 2001 From: joss Date: Sun, 6 Apr 2025 15:36:52 +0200 Subject: [PATCH] Added stuff --- README.txt | 4 ++-- build.xml | 2 +- src/Group.java | 23 ++++++++++++++++++ src/Main.java | 3 ++- src/Model.java | 4 ++++ src/views/AuthView.java | 3 ++- src/views/Defaults.java | 11 +++++++++ src/views/RootView.java | 52 +++++++++++++++++++++++++++++++++++----- src/views/StartView.java | 3 ++- static/style.css | 3 +++ 10 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 src/Group.java create mode 100644 src/views/Defaults.java create mode 100644 static/style.css diff --git a/README.txt b/README.txt index 9fc8d2d..57c4866 100644 --- a/README.txt +++ b/README.txt @@ -3,7 +3,7 @@ Beleg SoSe 2025 EINLEITUNG -Hier eine Kurzanleitung zum Kompilieren und ausführen. Eine ausführlichere +Hier eine Kurzanleitung zum Kompilieren und Ausführen. Eine ausführlichere Beschreibung befindet sich im schriftlichen Teil der Belegarbeit. @@ -35,4 +35,4 @@ Die Dokumentation befindet sich im Ordner doc. Neu erstellt werden kann sie mit ant doc -Dafür wird zusätzlich zu den Abhängigkeiten oben noch Javadoc benötigt. \ No newline at end of file +Dafür wird zusätzlich zu den Abhängigkeiten oben noch Javadoc benötigt. diff --git a/build.xml b/build.xml index 6cbfbe2..f2cfb0f 100644 --- a/build.xml +++ b/build.xml @@ -29,7 +29,7 @@ - + diff --git a/src/Group.java b/src/Group.java new file mode 100644 index 0000000..68d9631 --- /dev/null +++ b/src/Group.java @@ -0,0 +1,23 @@ +package hsmw.jotto5.beleg; + +import java.util.ArrayList; + +/** + * Beschreibt eine Gruppe von Resourcen. + * + * Speichert Referenzen auf die Elemente als UIDs in einem Array. + */ +public class Group extends Resource { + + private ArrayList members; + + /** + * Fügt eine Ressource in die Gruppe zu. + * + * Prüft nicht, ob die Ressource bereits in der Gruppe enthalten ist. + */ + public void addMember(String uid) { + members.add(uid); + } + +} diff --git a/src/Main.java b/src/Main.java index cb24af4..998ecc4 100644 --- a/src/Main.java +++ b/src/Main.java @@ -15,10 +15,11 @@ public class Main { * @param args Die Programmargumente */ public static void main(String[] args) throws Exception { - HttpServer s = HttpServer.create(new InetSocketAddress(8000), 0); + HttpServer s = HttpServer.create(new InetSocketAddress("127.0.0.1", 8000), 0); // Kontexts werden nach längstem Matching ausgewählt (wieso?) // Alle unbekannten Anfragen die mit / starten werden also an die RootView gegeben + // Statische Dateien werden auch von der RootView verarbeitet // TODO: Error Handling!!! s.createContext("/", new RootView()); s.createContext("/main", new StartView()); diff --git a/src/Model.java b/src/Model.java index 5dbb7b4..c5aaf67 100644 --- a/src/Model.java +++ b/src/Model.java @@ -9,11 +9,14 @@ import java.util.ArrayList; * Zugriff auf Daten ist Thread-sicher. Um ständiges Zusammenbauen von Objekten * zu vermeiden und um besser vom eigentlichen Backend zu abstrahieren sind viele * einfache Abfragen als Methode umgesetzt. + *

+ * Denkbar ist zum Beispiel eine Implementation auf LDAP-Basis. */ public class Model { private ArrayList students; private ArrayList resources; + private ArrayList groups; /** * Initialisiert ein leeres Model. @@ -21,6 +24,7 @@ public class Model { public Model() { students = new ArrayList(); resources = new ArrayList(); + groups = new ArrayList(); } } diff --git a/src/views/AuthView.java b/src/views/AuthView.java index 75c3e90..f43c881 100644 --- a/src/views/AuthView.java +++ b/src/views/AuthView.java @@ -29,8 +29,9 @@ public class AuthView implements HttpHandler { // TODO: Versuchen zu autorisieren login = true; } else { - response = "

Beleg - Anmeldung!

"; + response = Defaults.HTMLHEADER + "

Beleg - Anmeldung!

"; response += "


"; + response += Defaults.HTMLFOOTER; t.sendResponseHeaders(200, response.length()); os.write(response.getBytes()); } diff --git a/src/views/Defaults.java b/src/views/Defaults.java new file mode 100644 index 0000000..48f4f8d --- /dev/null +++ b/src/views/Defaults.java @@ -0,0 +1,11 @@ +package hsmw.jotto5.beleg.views; + +/** + * Enthält Parameter und Funktionen welche auf alle Views zutreffen. + */ +public class Defaults { + + public static final String HTMLHEADER = "Beleg SoSe 2025"; + public static final String HTMLFOOTER = ""; + +} diff --git a/src/views/RootView.java b/src/views/RootView.java index dd70911..519cbd4 100644 --- a/src/views/RootView.java +++ b/src/views/RootView.java @@ -1,8 +1,11 @@ package hsmw.jotto5.beleg.views; -import java.io.IOException; -import java.io.OutputStream; +import java.io.FileNotFoundException; import com.sun.net.httpserver.*; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.io.IOException; +import java.io.File; /** * Fängt alle Anfragen an "/" und unbekannte URLs ab. @@ -14,11 +17,48 @@ import com.sun.net.httpserver.*; */ public class RootView implements HttpHandler { + private void handleFileOr404(HttpExchange t) throws IOException { + File f; + FileInputStream fis; + OutputStream os; + int len; + byte[] buf = new byte[4096]; // Puffer um die Datei einzulesen + + f = new File("static" + t.getRequestURI().getPath()); + + fis = null; + os = t.getResponseBody(); + try { + fis = new FileInputStream(f); + // siehe https://www.baeldung.com/java-inputstream-to-outputstream + t.sendResponseHeaders(200, f.length()); + while ((len = fis.read(buf)) != -1) + os.write(buf, 0, len); + } catch (FileNotFoundException e) { + // TODO: proper 404 response + // Datei nicht gefunden, stacktrace also unnötig + t.sendResponseHeaders(404, 0); + } catch (Exception e) { + // TODO: proper 500 response + t.sendResponseHeaders(500, 0); + e.printStackTrace(); + } finally { + if (fis != null) fis.close(); + os.close(); + } + } + public void handle(HttpExchange t) throws IOException { - // wir leiten an /main weiter, dort passiert dann die restliche Magie - t.getResponseHeaders().add("Location", "/main"); - t.sendResponseHeaders(308, 0); // 308 => "Permanent Redirect" - t.getResponseBody().close(); + // prüfen, ob WIRKLICH der Root-Endpunkt gemeint ist + if (t.getRequestURI().getPath().equals("/")) { + // wir leiten an /main weiter, dort passiert dann die restliche Magie + t.getResponseHeaders().add("Location", "/main"); + t.sendResponseHeaders(308, 0); // 308 => "Permanent Redirect" + t.getResponseBody().close(); + } else { + // entweder eine statische Datei oder ein ungültiger Pfad + handleFileOr404(t); + } } } diff --git a/src/views/StartView.java b/src/views/StartView.java index 5bf057e..f6683cf 100644 --- a/src/views/StartView.java +++ b/src/views/StartView.java @@ -10,7 +10,8 @@ public class StartView implements HttpHandler { String response; OutputStream os; - response = "

Beleg - Startseite!

Bitte waehle aus einer der nachstehenden Optionen.

"; + response = Defaults.HTMLHEADER + "

Beleg - Startseite!

Bitte waehle aus einer der nachstehenden Optionen.

"; + response += "

Ich laufe unter " + System.getProperty("user.dir") + "

" + Defaults.HTMLFOOTER; os = t.getResponseBody(); t.sendResponseHeaders(200, response.length()); diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..a6cf4ac --- /dev/null +++ b/static/style.css @@ -0,0 +1,3 @@ +* { + font-family: sans-serif; +}