Persoenliche Mediazentrale
ulrich
2021-04-05 081606e391a352d8117210d731d252dfb43c4b84
FileStorage und Interface Storage
1 files deleted
2 files renamed
2 files added
3 files modified
359 ■■■■■ changed files
src/de/uhilger/mediaz/Server.java 30 ●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/api/StorageHandler.java 19 ●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/api/StoreTestHandler.java 9 ●●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/conf/Store.java 99 ●●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/entity/Ablageort.java 2 ●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/entity/Entity.java 2 ●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/store/FileStorage.java 151 ●●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/store/Storage.java 47 ●●●●● patch | view | raw | blame | history
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 @@
        }
      }
    }
    */
  }
}
src/de/uhilger/mediaz/api/StorageHandler.java
File was renamed from src/de/uhilger/mediaz/api/StoreHandler.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;
        
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) {
src/de/uhilger/mediaz/conf/Store.java
File was deleted
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;
src/de/uhilger/mediaz/entity/Entity.java
File was renamed from src/de/uhilger/mediaz/entity/ConfigurationElement.java
@@ -9,6 +9,6 @@
 *
 * @author ulrich
 */
public interface ConfigurationElement {
public interface Entity {
  public String getName();
}
src/de/uhilger/mediaz/store/FileStorage.java
New file
@@ -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;
  }
}
src/de/uhilger/mediaz/store/Storage.java
New file
@@ -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);
}