From 081606e391a352d8117210d731d252dfb43c4b84 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Mon, 05 Apr 2021 10:00:45 +0000
Subject: [PATCH] FileStorage und Interface Storage
---
src/de/uhilger/mediaz/api/StorageHandler.java | 19 ++
src/de/uhilger/mediaz/store/FileStorage.java | 151 +++++++++++++++++++++++++
/dev/null | 99 ----------------
src/de/uhilger/mediaz/store/Storage.java | 47 +++++++
src/de/uhilger/mediaz/Server.java | 30 ++++-
src/de/uhilger/mediaz/api/StoreTestHandler.java | 9
src/de/uhilger/mediaz/entity/Ablageort.java | 2
src/de/uhilger/mediaz/entity/Entity.java | 2
8 files changed, 243 insertions(+), 116 deletions(-)
diff --git a/src/de/uhilger/mediaz/Server.java b/src/de/uhilger/mediaz/Server.java
index 375d7af..4a3c97c 100644
--- a/src/de/uhilger/mediaz/Server.java
+++ b/src/de/uhilger/mediaz/Server.java
@@ -21,17 +21,19 @@
import de.uhilger.mediaz.api.AblageTestHandler;
import de.uhilger.mediaz.api.FileHandler;
import de.uhilger.mediaz.api.StopServerHandler;
-import de.uhilger.mediaz.api.StoreHandler;
+import de.uhilger.mediaz.api.StorageHandler;
import de.uhilger.mediaz.api.StoreTestHandler;
-import de.uhilger.mediaz.conf.Store;
+import de.uhilger.mediaz.store.FileStorage;
import de.uhilger.mediaz.entity.Ablageort;
-import de.uhilger.mediaz.entity.ConfigurationElement;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import java.util.logging.Level;
+import de.uhilger.mediaz.entity.Entity;
+import java.util.Iterator;
+import java.util.List;
/**
* Die Klasse Server stellt Methoden zur Ausführung eines HTTP-Servers
@@ -110,7 +112,7 @@
server.createContext(ctx + App.getRs(RB_WEBROOT),
new FileHandler(wwwDir.getAbsolutePath()));
ablageorteEinklinken(server);
- server.createContext(ctx + App.getRs(RB_STORE), new StoreHandler());
+ server.createContext(ctx + App.getRs(RB_STORE), new StorageHandler());
//server.createContext(ctx + App.getRs(RB_UI_ROOT), new FileHandler(uiDir.getAbsolutePath()));
server.createContext(ctx + App.getRs(RB_STOP_SERVER), new StopServerHandler());
server.createContext(ctx + App.getRs(RB_ABLAGE_TEST), new AblageTestHandler());
@@ -120,13 +122,28 @@
}
private void ablageorteEinklinken(HttpServer server) throws ClassNotFoundException, IOException {
- Store store = new Store();
+ String typ = Ablageort.class.getSimpleName();
+ FileStorage store = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
+ List<String> orte = store.list(typ);
+ Iterator<String> i = orte.iterator();
+ while(i.hasNext()) {
+ String ortName = i.next();
+ Entity e = store.read(typ, ortName);
+ if(e instanceof Ablageort) {
+ Ablageort ort = (Ablageort) e;
+ Ablageort ablageort = (Ablageort) e;
+ server.createContext(ctx + ablageort.getUrl(),
+ new FileHandler(new File(ablageort.getOrt()).getAbsolutePath()));
+ }
+ }
+
+ /*
String conf = App.getInitParameter(App.getRs(App.RB_AP_CONF));
File ablageortDir = new File(conf, Ablageort.class.getSimpleName());
File[] orte = ablageortDir.listFiles();
if (orte != null) {
for (File ort : orte) {
- ConfigurationElement elem = store.readFromFile(ort);
+ Entity elem = store.readFromFile(ort);
if (elem instanceof Ablageort) {
Ablageort ablageort = (Ablageort) elem;
server.createContext(ctx + ablageort.getUrl(),
@@ -134,6 +151,7 @@
}
}
}
+ */
}
}
diff --git a/src/de/uhilger/mediaz/api/StoreHandler.java b/src/de/uhilger/mediaz/api/StorageHandler.java
similarity index 83%
rename from src/de/uhilger/mediaz/api/StoreHandler.java
rename to src/de/uhilger/mediaz/api/StorageHandler.java
index 4e317bb..12c4417 100644
--- a/src/de/uhilger/mediaz/api/StoreHandler.java
+++ b/src/de/uhilger/mediaz/api/StorageHandler.java
@@ -10,22 +10,24 @@
import com.sun.net.httpserver.HttpHandler;
import de.uhilger.mediaz.App;
import de.uhilger.mediaz.Server;
-import de.uhilger.mediaz.conf.Store;
+import de.uhilger.mediaz.store.FileStorage;
import de.uhilger.mediaz.entity.Ablageort;
import java.io.BufferedReader;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author ulrich
*/
-public class StoreHandler extends Store implements HttpHandler {
+public class StorageHandler implements HttpHandler {
- private static final Logger logger = Logger.getLogger(StoreHandler.class.getName());
+ private static final Logger logger = Logger.getLogger(StorageHandler.class.getName());
/*
@@ -41,11 +43,11 @@
liest den Ablageort namens "Katalog"
HTTP POST an /mz/api/store/Ablageort
- schreibt den neuen Ablageort im Body der Anfrage
+ schreibt den neuen Ablageort im Body der Anfrage (Neu)
HTTP PUT an /mz/api/store/Ablageort
sucht den Ablageort mit dem Namen laut Body der Anfrage
- und schreibt den Inhalt aus der Anfrage in die Datei
+ und schreibt den Inhalt aus der Anfrage in die Datei (Aenderung)
HTTP DELETE an /mz/api/store/Ablageort/Katalog
löscht den Ablageort namens "Katalog"
@@ -64,11 +66,13 @@
String[] elems = path.split(App.getRs(Server.RB_SLASH));
String type = "";
String elemName = "";
+ FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
switch(method) {
case HTTP_GET:
type = elems[elems.length - 2];
elemName = elems[elems.length - 1];
//this.readFromFile(file);
+ fs.read(type, elemName);
break;
case HTTP_PUT:
@@ -83,6 +87,11 @@
Gson gson = new Gson();
Ablageort ort = gson.fromJson(elemName, Ablageort.class);
elemName = ort.getName();
+ Object o = fs.write(ort);
+ if(o instanceof File) {
+ File file = (File) o;
+ logger.log(Level.INFO, "Datei {0} geschrieben.", file.getAbsolutePath());
+ }
}
break;
diff --git a/src/de/uhilger/mediaz/api/StoreTestHandler.java b/src/de/uhilger/mediaz/api/StoreTestHandler.java
index e1da7c3..af7f54c 100644
--- a/src/de/uhilger/mediaz/api/StoreTestHandler.java
+++ b/src/de/uhilger/mediaz/api/StoreTestHandler.java
@@ -7,14 +7,15 @@
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
-import de.uhilger.mediaz.conf.Store;
+import de.uhilger.mediaz.App;
+import de.uhilger.mediaz.store.FileStorage;
import de.uhilger.mediaz.entity.Ablageort;
-import de.uhilger.mediaz.entity.ConfigurationElement;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
+import de.uhilger.mediaz.entity.Entity;
/**
*
@@ -31,10 +32,10 @@
ort.setName("Katalog");
ort.setOrt("/home/ulrich/Videos");
ort.setUrl("/media/test");
- Store store = new Store();
+ FileStorage store = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
File file = store.writeToFile(ort);
try {
- ConfigurationElement elem = store.readFromFile(file);
+ Entity elem = store.readFromFile(file);
logger.log(Level.INFO, "Typ: {0}, Name: {1}",
new Object[]{elem.getClass().getSimpleName(), elem.getName()});
} catch (ClassNotFoundException ex) {
diff --git a/src/de/uhilger/mediaz/conf/Store.java b/src/de/uhilger/mediaz/conf/Store.java
deleted file mode 100644
index fcfe3ae..0000000
--- a/src/de/uhilger/mediaz/conf/Store.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.conf;
-
-import com.google.gson.Gson;
-import de.uhilger.mediaz.App;
-import de.uhilger.mediaz.Server;
-import de.uhilger.mediaz.entity.Ablageort;
-import de.uhilger.mediaz.entity.ConfigurationElement;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.logging.Logger;
-
-/**
- *
- * @author ulrich
- */
-public class Store {
-
- private static final Logger logger = Logger.getLogger(Store.class.getName());
-
-
- private static final String typeAblageort = "Ablageort";
-
- /**
- * Ein Objekt als JSON in eine Datei schreiben
- *
- * Es wird in den Ordner geschrieben, der von conf angegeben ist
- *
- * Wenn es z.B. ein Ablage-Objekt ist, wird das Objekt in die Datei
- * [conf]/Ablage/[name der Ablage].json geschrieben
- *
- * Der Name der Ablage muss eindeutig sein
- *
- *
- * @param o
- */
- public File writeToFile(ConfigurationElement o) throws IOException {
- Gson gson = new Gson();
- String className = o.getClass().getSimpleName();
- logger.finer(className);
- File dir = new File(App.getInitParameter(App.getRs(App.RB_AP_CONF)), className);
- dir.mkdirs();
- File file = new File(dir, o.getName());
- if(file.exists()) {
- file.delete();
- }
- FileWriter fw = new FileWriter(file);
- fw.write(gson.toJson(o));
- fw.flush();
- fw.close();
- return file;
- }
-
- public ConfigurationElement readFromFile(File file) throws ClassNotFoundException, FileNotFoundException, IOException {
- String type = typeFromName(file);
- StringBuilder sb = new StringBuilder();
- FileReader in = new FileReader(file);
- BufferedReader r = new BufferedReader(in);
- String line = r.readLine();
- while(line != null) {
- sb.append(line);
- line = r.readLine();
- }
- r.close();
- in.close();
- String json = sb.toString();
- Gson gson = new Gson();
- switch(type) {
- case typeAblageort:
- return gson.fromJson(json, Ablageort.class);
- default:
- Ablageort ablage = new Ablageort();
- ablage.setName("Test");
- return ablage;
- }
- }
-
- private String typeFromName(File file) {
- //String path = file.getPath();
- //logger.info(path);
- String[] parts = file.getPath().split(App.getRs(Server.RB_SLASH));
- //for(String part : parts) {
- //logger.info(part);
- //}
- //logger.info("" + parts.length);
- logger.info(parts[parts.length-2]);
- return parts[parts.length-2];
- }
-
-
-}
diff --git a/src/de/uhilger/mediaz/entity/Ablageort.java b/src/de/uhilger/mediaz/entity/Ablageort.java
index 2ab0c85..0c80592 100644
--- a/src/de/uhilger/mediaz/entity/Ablageort.java
+++ b/src/de/uhilger/mediaz/entity/Ablageort.java
@@ -9,7 +9,7 @@
*
* @author ulrich
*/
-public class Ablageort implements ConfigurationElement {
+public class Ablageort implements Entity {
private String name;
private String ort;
diff --git a/src/de/uhilger/mediaz/entity/ConfigurationElement.java b/src/de/uhilger/mediaz/entity/Entity.java
similarity index 87%
rename from src/de/uhilger/mediaz/entity/ConfigurationElement.java
rename to src/de/uhilger/mediaz/entity/Entity.java
index 540b087..8614ad0 100644
--- a/src/de/uhilger/mediaz/entity/ConfigurationElement.java
+++ b/src/de/uhilger/mediaz/entity/Entity.java
@@ -9,6 +9,6 @@
*
* @author ulrich
*/
-public interface ConfigurationElement {
+public interface Entity {
public String getName();
}
diff --git a/src/de/uhilger/mediaz/store/FileStorage.java b/src/de/uhilger/mediaz/store/FileStorage.java
new file mode 100644
index 0000000..1d6373a
--- /dev/null
+++ b/src/de/uhilger/mediaz/store/FileStorage.java
@@ -0,0 +1,151 @@
+/*
+ * 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;
+
+import com.google.gson.Gson;
+import de.uhilger.mediaz.App;
+import de.uhilger.mediaz.Server;
+import de.uhilger.mediaz.entity.Ablageort;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.logging.Logger;
+import de.uhilger.mediaz.entity.Entity;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+/**
+ * Ablage fuer Dateien
+ *
+ * [Basispfad]/[Typ]/[Name]
+ *
+ * Typ ist eine der Klassen der Package entity
+ * Name muss identisch mit dem Element laut Entity.getName() sein
+ *
+ * @author ulrich
+ * @version 1, 5.4.2021
+ */
+public class FileStorage implements Storage {
+
+ private static final Logger logger = Logger.getLogger(FileStorage.class.getName());
+
+ /** StorageType Ablageort */
+ public static final String ST_ABLAGEORT = "Ablageort";
+
+ private String fileBase;
+
+ public FileStorage(String base) {
+ this.fileBase = base;
+ }
+
+ /**
+ * Ein Objekt als JSON in eine Datei schreiben
+ *
+ * Es wird in den Ordner geschrieben, der von conf angegeben ist
+ *
+ * Wenn es z.B. ein Ablage-Objekt ist, wird das Objekt in die Datei
+ * [conf]/Ablage/[name der Ablage].json geschrieben
+ *
+ * Der Name der Ablage muss eindeutig sein
+ *
+ *
+ * @param o
+ */
+ public File writeToFile(Entity o) throws IOException {
+ Gson gson = new Gson();
+ String className = o.getClass().getSimpleName();
+ logger.finer(className);
+ File dir = new File(fileBase, className);
+ dir.mkdirs();
+ File file = new File(dir, o.getName());
+ if(file.exists()) {
+ file.delete();
+ }
+ FileWriter fw = new FileWriter(file);
+ fw.write(gson.toJson(o));
+ fw.flush();
+ fw.close();
+ return file;
+ }
+
+ public Entity readFromFile(File file) throws ClassNotFoundException, FileNotFoundException, IOException {
+ String type = typeFromName(file);
+ StringBuilder sb = new StringBuilder();
+ FileReader in = new FileReader(file);
+ BufferedReader r = new BufferedReader(in);
+ String line = r.readLine();
+ while(line != null) {
+ sb.append(line);
+ line = r.readLine();
+ }
+ r.close();
+ in.close();
+ String json = sb.toString();
+ Gson gson = new Gson();
+ switch(type) {
+ case ST_ABLAGEORT:
+ return gson.fromJson(json, Ablageort.class);
+ default:
+ Ablageort ablage = new Ablageort();
+ ablage.setName("Test");
+ return ablage;
+ }
+ }
+
+ private String typeFromName(File file) {
+ //String path = file.getPath();
+ //logger.info(path);
+ String[] parts = file.getPath().split(App.getRs(Server.RB_SLASH));
+ //for(String part : parts) {
+ //logger.info(part);
+ //}
+ //logger.info("" + parts.length);
+ logger.info(parts[parts.length-2]);
+ return parts[parts.length-2];
+ }
+
+ @Override
+ public Object write(Entity e) {
+ try {
+ return writeToFile(e);
+ } catch (IOException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ return null;
+ }
+ }
+
+ @Override
+ public Entity read(String typ, String name) {
+ File base = new File(fileBase);
+ File dir = new File(base, typ);
+ File file = new File(dir, name);
+ try {
+ return readFromFile(file);
+ } catch (ClassNotFoundException | IOException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ return null;
+ }
+ }
+
+ @Override
+ public List<String> list(String typ) {
+ File base = new File(fileBase);
+ File dir = new File(base, typ);
+ File[] files = dir.listFiles();
+ List<String> list = new ArrayList();
+ for(File file : files) {
+ list.add(file.getName());
+ }
+ return list;
+ }
+
+
+
+}
diff --git a/src/de/uhilger/mediaz/store/Storage.java b/src/de/uhilger/mediaz/store/Storage.java
new file mode 100644
index 0000000..8e66c8a
--- /dev/null
+++ b/src/de/uhilger/mediaz/store/Storage.java
@@ -0,0 +1,47 @@
+/*
+ * 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;
+
+import de.uhilger.mediaz.entity.Entity;
+import java.util.List;
+
+/**
+ * Eine Ablage, die wie folgt organisiert ist
+ *
+ * [Ort]/[Typ]/[Name]
+ *
+ * Ort ist der Ablagort, an dem sich die folgende Struktur findet
+ * Typ ist eine der Klassen der Package entity
+ * Name muss identisch mit dem Element laut Entity.getName() sein
+ *
+ * @author Ulrich Hilger
+ * @version 1, 5.4.2021
+ */
+public interface Storage {
+
+ /**
+ * Ein Objekt in die Ablage schreiben
+ * @param e das Objekt, das geschrieben werden soll
+ * @return ein Antwortobjekt oder null
+ */
+ public Object write(Entity e);
+
+ /**
+ * Ein Objekt aus der Ablage lesen
+ * @param typ
+ * @param name
+ * @return das eingelesene Objekt
+ */
+ public Entity read(String typ, String name);
+
+ /**
+ * Die Namen der Elemente eines gegebenen Typs auflisten
+ * @param typ der gewuenschte Typ
+ * @return die Liste mit Namen
+ */
+ public List<String> list(String typ);
+
+}
--
Gitblit v1.9.3