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