Added stuff

This commit is contained in:
joss 2025-04-06 15:36:52 +02:00
parent 9b8ecc8555
commit cd9a49a19a
10 changed files with 96 additions and 12 deletions

View file

@ -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.
Dafür wird zusätzlich zu den Abhängigkeiten oben noch Javadoc benötigt.

View file

@ -29,7 +29,7 @@
<target name="doc">
<mkdir dir="doc"/>
<javadoc sourcepath="src" destdir="doc">
<javadoc destdir="doc">
<fileset dir="src">
<include name="**"/>
</fileset>

23
src/Group.java Normal file
View file

@ -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<String> 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);
}
}

View file

@ -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());

View file

@ -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.
* <p>
* Denkbar ist zum Beispiel eine Implementation auf LDAP-Basis.
*/
public class Model {
private ArrayList<Student> students;
private ArrayList<Resource> resources;
private ArrayList<Group> groups;
/**
* Initialisiert ein leeres Model.
@ -21,6 +24,7 @@ public class Model {
public Model() {
students = new ArrayList<Student>();
resources = new ArrayList<Resource>();
groups = new ArrayList<Group>();
}
}

View file

@ -29,8 +29,9 @@ public class AuthView implements HttpHandler {
// TODO: Versuchen zu autorisieren
login = true;
} else {
response = "<h1>Beleg - Anmeldung!</h1>";
response = Defaults.HTMLHEADER + "<h1>Beleg - Anmeldung!</h1>";
response += "<form method=\"POST\"><input type=\"text\" name=\"name\"><br><input type=\"password\" name=\"pass\"><br><input type=\"submit\">";
response += Defaults.HTMLFOOTER;
t.sendResponseHeaders(200, response.length());
os.write(response.getBytes());
}

11
src/views/Defaults.java Normal file
View file

@ -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 = "<!DOCTYPE html><html><title>Beleg SoSe 2025</title><link rel=stylesheet href=\"/style.css\"><head></head><body>";
public static final String HTMLFOOTER = "</body></html>";
}

View file

@ -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);
}
}
}

View file

@ -10,7 +10,8 @@ public class StartView implements HttpHandler {
String response;
OutputStream os;
response = "<h1>Beleg - Startseite!</h1><p>Bitte waehle aus einer der nachstehenden Optionen.</p>";
response = Defaults.HTMLHEADER + "<h1>Beleg - Startseite!</h1><p>Bitte waehle aus einer der nachstehenden Optionen.</p>";
response += "<p>Ich laufe unter " + System.getProperty("user.dir") + "</p>" + Defaults.HTMLFOOTER;
os = t.getResponseBody();
t.sendResponseHeaders(200, response.length());

3
static/style.css Normal file
View file

@ -0,0 +1,3 @@
* {
font-family: sans-serif;
}