From 86bbf7cbbfcdc82c994b0a3d0ea9a04290160683 Mon Sep 17 00:00:00 2001 From: ulrich Date: Tue, 06 Apr 2021 14:47:48 +0000 Subject: [PATCH] Katalog (in Arbeit) --- src/de/uhilger/mediaz/entity/Einstellung.java | 33 +++++ src/de/uhilger/mediaz/store/StorageFile.java | 32 +++++ www/ui/data/menu/hauptmenue.json | 5 www/ui/data/tpl/katalog_root_liste.tpl | 19 +++ www/ui/js/app.js | 66 ++++++++++ www/ui/data/katalog.css | 10 + src/de/uhilger/mediaz/api/FileHandler.java | 5 www/ui/data/katalog.html | 45 +++++++ www/ui/data/tpl/katalog_inhalt_liste.tpl | 13 ++ src/de/uhilger/mediaz/api/StorageHandler.java | 13 -- src/de/uhilger/mediaz/Server.java | 4 src/de/uhilger/mediaz/api/ListFileHandler.java | 68 +++++++++++ src/de/uhilger/mediaz/api/AbstractHandler.java | 41 ++++++ 13 files changed, 337 insertions(+), 17 deletions(-) diff --git a/src/de/uhilger/mediaz/Server.java b/src/de/uhilger/mediaz/Server.java index 8fedc40..af203fb 100644 --- a/src/de/uhilger/mediaz/Server.java +++ b/src/de/uhilger/mediaz/Server.java @@ -19,6 +19,7 @@ import com.sun.net.httpserver.HttpServer; import de.uhilger.mediaz.api.FileHandler; +import de.uhilger.mediaz.api.ListFileHandler; import de.uhilger.mediaz.api.StopServerHandler; import de.uhilger.mediaz.api.StorageHandler; import de.uhilger.mediaz.store.FileStorage; @@ -130,8 +131,9 @@ if(e instanceof Ablageort) { Ablageort ort = (Ablageort) e; Ablageort ablageort = (Ablageort) e; + logger.fine(ctx + ablageort.getUrl()); server.createContext(ctx + ablageort.getUrl(), - new FileHandler(new File(ablageort.getOrt()).getAbsolutePath())); + new ListFileHandler(new File(ablageort.getOrt()).getAbsolutePath())); } } } diff --git a/src/de/uhilger/mediaz/api/AbstractHandler.java b/src/de/uhilger/mediaz/api/AbstractHandler.java new file mode 100644 index 0000000..4692d5d --- /dev/null +++ b/src/de/uhilger/mediaz/api/AbstractHandler.java @@ -0,0 +1,41 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package de.uhilger.mediaz.api; + +import com.google.gson.Gson; + +/** + * + * @author ulrich + */ +public class AbstractHandler { + + protected String jsonWithEnclosingType(Object o) { + /* + StringBuilder sb = new StringBuilder(); + sb.append("{\""); + sb.append(o.getClass().getSimpleName()); + sb.append("\": "); + Gson gson = new Gson(); + sb.append(gson.toJson(o)); + sb.append("}"); + return sb.toString(); + */ + return jsonWithCustomType(o, o.getClass().getSimpleName()); + } + + protected String jsonWithCustomType(Object o, String typeName) { + StringBuilder sb = new StringBuilder(); + sb.append("{\""); + sb.append(typeName); + sb.append("\": "); + Gson gson = new Gson(); + sb.append(gson.toJson(o)); + sb.append("}"); + return sb.toString(); + } + +} diff --git a/src/de/uhilger/mediaz/api/FileHandler.java b/src/de/uhilger/mediaz/api/FileHandler.java index 5c3cc6b..9155c8d 100644 --- a/src/de/uhilger/mediaz/api/FileHandler.java +++ b/src/de/uhilger/mediaz/api/FileHandler.java @@ -21,7 +21,6 @@ import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import de.uhilger.mediaz.App; -import de.uhilger.mediaz.Server; import static de.uhilger.mediaz.Server.RB_SLASH; import java.io.File; import java.io.FileInputStream; @@ -48,7 +47,7 @@ * @author Ulrich Hilger * @version 0.1, 25. März 2021 */ -public class FileHandler implements HttpHandler { +public class FileHandler extends AbstractHandler implements HttpHandler { /* Der Logger fuer diesen FileHandler */ private static final Logger logger = Logger.getLogger(FileHandler.class.getName()); @@ -83,7 +82,7 @@ public static final String RB_WELCOME_FILE = "welcomeFile"; /* Ablageort fuer Webinhalte */ - private final String fileBase; + protected final String fileBase; /** * Ein neues Objekt der Klasse FileHandler erzeugen diff --git a/src/de/uhilger/mediaz/api/ListFileHandler.java b/src/de/uhilger/mediaz/api/ListFileHandler.java new file mode 100644 index 0000000..5be132b --- /dev/null +++ b/src/de/uhilger/mediaz/api/ListFileHandler.java @@ -0,0 +1,68 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package de.uhilger.mediaz.api; + +import com.sun.net.httpserver.HttpExchange; +import de.uhilger.mediaz.App; +import de.uhilger.mediaz.Server; +import de.uhilger.mediaz.store.StorageFile; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.logging.Logger; + +/** + * + * @author ulrich + */ +public class ListFileHandler extends FileHandler { + + /* Der Logger fuer diesen ListFileHandler */ + private static final Logger logger = Logger.getLogger(ListFileHandler.class.getName()); + + public ListFileHandler(String absoluteDirectoryPathAndName) { + super(absoluteDirectoryPathAndName); + } + + @Override + public void handle(HttpExchange e) throws IOException { + String path = e.getRequestURI().toString(); + logger.fine(path); + if(path.endsWith(App.getRs(Server.RB_SLASH))) { + String fName = getFileName(e); + logger.fine(fName); + File dir = new File(fileBase, fName); + logger.fine(dir.getAbsolutePath()); + File[] files = dir.listFiles(); + ArrayList list = new ArrayList(); + if(files != null) { + for(File file : files) { + StorageFile sf = new StorageFile(); + sf.setName(file.getName()); + if(file.isDirectory()) { + sf.setTyp("folder"); + } else { + sf.setTyp("file"); + } + list.add(sf); + } + } + //Gson gson = new Gson(); + //String json = gson.toJson(fileNames); + String json = jsonWithCustomType(list, "Medialiste"); + logger.fine(json); + e.sendResponseHeaders(200, json.length()); + OutputStream os = e.getResponseBody(); + os.write(json.getBytes()); + os.close(); + } else { + super.handle(e); + } + } + + +} diff --git a/src/de/uhilger/mediaz/api/StorageHandler.java b/src/de/uhilger/mediaz/api/StorageHandler.java index 72787d2..f022ada 100644 --- a/src/de/uhilger/mediaz/api/StorageHandler.java +++ b/src/de/uhilger/mediaz/api/StorageHandler.java @@ -41,7 +41,7 @@ * @author Ulrich Hilger * @version 1, 5.4.2021 */ -public class StorageHandler implements HttpHandler { +public class StorageHandler extends AbstractHandler implements HttpHandler { private static final Logger logger = Logger.getLogger(StorageHandler.class.getName()); @@ -186,17 +186,6 @@ String elemName = elems[elems.length - 1]; return fs.readJson(type, elemName); } - } - - private String jsonWithEnclosingType(Object o) { - StringBuilder sb = new StringBuilder(); - sb.append("{\""); - sb.append(o.getClass().getSimpleName()); - sb.append("\": "); - Gson gson = new Gson(); - sb.append(gson.toJson(o)); - sb.append("}"); - return sb.toString(); } private String bodyLesen(HttpExchange e) throws IOException { diff --git a/src/de/uhilger/mediaz/entity/Einstellung.java b/src/de/uhilger/mediaz/entity/Einstellung.java new file mode 100644 index 0000000..1b2e552 --- /dev/null +++ b/src/de/uhilger/mediaz/entity/Einstellung.java @@ -0,0 +1,33 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package de.uhilger.mediaz.entity; + +/** + * + * @author ulrich + */ +public class Einstellung { + private String key; + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + +} diff --git a/src/de/uhilger/mediaz/store/StorageFile.java b/src/de/uhilger/mediaz/store/StorageFile.java new file mode 100644 index 0000000..07d2d2b --- /dev/null +++ b/src/de/uhilger/mediaz/store/StorageFile.java @@ -0,0 +1,32 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package de.uhilger.mediaz.store; + +/** + * + * @author ulrich + */ +public class StorageFile { + private String name; + private String typ; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTyp() { + return typ; + } + + public void setTyp(String typ) { + this.typ = typ; + } + +} diff --git a/www/ui/data/katalog.css b/www/ui/data/katalog.css new file mode 100644 index 0000000..9cb56ee --- /dev/null +++ b/www/ui/data/katalog.css @@ -0,0 +1,10 @@ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 06.04.2021, 15:26:45 + Author : ulrich +*/ + diff --git a/www/ui/data/katalog.html b/www/ui/data/katalog.html new file mode 100644 index 0000000..b671a97 --- /dev/null +++ b/www/ui/data/katalog.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- + Mediazentrale - Personal Media Center + Copyright (C) 2021 Ulrich Hilger + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. +--> +<html> + <head> + <title>Katalog</title> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="stylesheet" type="text/css" href="../app.css"> + <link rel="stylesheet" type="text/css" href="formulare.css"> + <link rel="stylesheet" type="text/css" href="katalog.css"> + + </head> + <body> + <div class="katalog-seite"> + <div class="katalog-ueberschrift"> + Katalog + </div> + <div class="katalog-breadcrumb"> + Breadcrumb 1 | Breadcrumb 2 | Breadcrumb 3 | Breadcrumb 4 | Breadcrumb 5 | Breadcrumb 6 + </div> + <div class="katalog-eintraege"> + <ul class="entity-liste"> + <li class="entity-eintrag">Katalog</li> + <li class="entity-eintrag">Katalog2</li> + </ul> + </div> + </div> + </body> +</html> diff --git a/www/ui/data/menu/hauptmenue.json b/www/ui/data/menu/hauptmenue.json index 18733f9..5ef3e44 100644 --- a/www/ui/data/menu/hauptmenue.json +++ b/www/ui/data/menu/hauptmenue.json @@ -8,6 +8,11 @@ }, "inhalt": [ { + "titel": "Media", + "umenue": false, + "funktion": "app.media_liste" + }, + { "titel": "Ablageorte", "umenue": false, "funktion": "app.ablageort_liste" diff --git a/www/ui/data/tpl/katalog_inhalt_liste.tpl b/www/ui/data/tpl/katalog_inhalt_liste.tpl new file mode 100644 index 0000000..bece70a --- /dev/null +++ b/www/ui/data/tpl/katalog_inhalt_liste.tpl @@ -0,0 +1,13 @@ +<div class='entity-formular'> + <div class='entity-liste-kopf'> + Media-Liste + <button class='button' id='zurueck-btn'>Zurück</button> + </div> + <ul class='entity-liste'> + {{#Medialiste}} + <li class='entity-eintrag entity-typ-{{typ}}'>{{name}}</li> + {{/Medialiste}} + </ul> +</div> + + diff --git a/www/ui/data/tpl/katalog_root_liste.tpl b/www/ui/data/tpl/katalog_root_liste.tpl new file mode 100644 index 0000000..500e6b8 --- /dev/null +++ b/www/ui/data/tpl/katalog_root_liste.tpl @@ -0,0 +1,19 @@ + +<div class='entity-formular'> + <div class='entity-liste-kopf'> + Media-Liste + <!-- <button class='button' id='neu-btn'>Neu</button> --> + </div> + <ul class='entity-liste'> + {{#ArrayList}} + <li class='entity-eintrag'>{{.}}</li> + {{/ArrayList}} + </ul> +</div> + + + + + + + diff --git a/www/ui/js/app.js b/www/ui/js/app.js index d7f6358..fbe42b3 100644 --- a/www/ui/js/app.js +++ b/www/ui/js/app.js @@ -10,6 +10,68 @@ var self = this; var appMenu; var cache; // mustache templates + var ortPfad; + var mediaPfad; + + // auf der obersten Ebene werden die Kataloge angezeigt, + // darunter der Inhalt des aktuellen Pfades + this.media_liste = function() { + if(self.ortPfad === '/') { + console.log("kein Pfad, liste Kataloge"); + // Kataloge listen + self.http_get('../api/store/Ablageort/', function (responseText) { + self.vorlage_laden_und_fuellen("data/tpl/katalog_root_liste.tpl", JSON.parse(responseText), function (html) { + document.querySelector(".zentraler-inhalt").innerHTML = html; + self.addEvtListener('.entity-eintrag', 'click', function (event) { + var t = event.target; + self.http_get('../api/store/Ablageort/' + t.textContent, function(responseText) { + var ablageort = JSON.parse(responseText); + console.log(ablageort.url); + self.ortPfad = ablageort.url; + self.media_liste(); + }); + }); + }); + }); + } else { + console.log("liste Pfad " + self.mediaPfad); + // Pfad listen + self.http_get('..' + self.ortPfad + '/' + self.mediaPfad + '/', function(responseText) { + console.log(responseText); + self.vorlage_laden_und_fuellen("data/tpl/katalog_inhalt_liste.tpl", JSON.parse(responseText), function (html) { + document.querySelector(".zentraler-inhalt").innerHTML = html; + self.addEvtListener('.entity-eintrag', 'click', function (event) { + var t = event.target; + console.log(t.textContent); + if(t.classList.contains("entity-typ-folder")) { + self.mediaPfad = self.mediaPfad + '/' + t.textContent; + self.media_liste(); + } else { + console.log("Media-Inhalt auswaehlen oder abspielen"); + } + }); + self.addEvtListener('#zurueck-btn', 'click', function (event) { + if(self.mediaPfad === '/') { + self.ortPfad = '/'; + } else { + var pos = self.mediaPfad.lastIndexOf('/'); + var parent = self.mediaPfad.substring(0, pos); + console.log("Parent: " + parent); + self.mediaPfad = parent; + /* + if(parent === '/') { + self.ortPfad = '/'; + } else { + self.mediaPfad = parent; + } + */ + } + self.media_liste(); + }); + }); + }); + } + }; this.ablageort_liste = function() { self.http_get('../api/store/Ablageort/', function (responseText) { @@ -18,7 +80,7 @@ self.addEvtListener('.entity-eintrag', 'click', function (event) { var t = event.target; self.http_get('../api/store/Ablageort/' + t.textContent, function(responseText){ - ablageort = JSON.parse(responseText); + var ablageort = JSON.parse(responseText); self.ablageort_form(ablageort); }); }); @@ -133,6 +195,8 @@ this.init = function () { //self.vorlagen = new Vorlagen(); + self.mediaPfad = '/'; + self.ortPfad = '/'; self.cache = new Array(); self.appMenu = new AppMenu(); self.appMenu.init( -- Gitblit v1.9.3