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