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