Persoenliche Mediazentrale
ulrich
2021-04-08 dfb7d34f88efbb3eb7632ae628ccfd4576824477
src/de/uhilger/mediaz/api/StorageHandler.java
@@ -27,7 +27,6 @@
import de.uhilger.mediaz.store.FileStorage;
import de.uhilger.mediaz.entity.Entity;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -48,13 +47,29 @@
  
  /*
    PUT Die angegebene Ressource wird angelegt. Wenn die Ressource bereits
           existiert, wird sie geändert.
    Das REST-Muster sieht je Entitaet fuenf Faelle vor (Beispiel Ablageort):
    
    1. HTTP GET Ablageort/[Name]: Liefere den Ablageort als JSON
    2. HTTP GET Ablageort/: Liefere einer Liste von Ablageorten als JSON
    3. HTTP PUT: schreibe einen neuen Ablageort auf die Platte
    4. HTTP POST: schreibe Aenderungen auf die Platte
    5. HTTP DELETE: loesche den Ablageort
    1. HTTP GET Ablageort/[Name]  - Liefere den Ablageort namens [Name] als JSON
    2. HTTP GET Ablageort/liste/  - Liefere eine Liste mit Namen aller Ablageorte
                                     Es duerfen also keine Elemente namens "liste" angelegt werden
    3. HTTP GET Ablageort/        - Liefere eine Liste aller Ablageort-Objekte als JSON
    4. HTTP PUT Ablageort/[Name]  - Die angegebene Ressource wird angelegt. Wenn die Ressource
                                     bereits existiert, wird sie geändert.
    5. HTTP DELETE                - loesche den Ablageort
    falsch:
    1. HTTP GET Ablageort/[Name]  - Liefere den Ablageort namens [Name] als JSON
    2. HTTP GET Ablageort/liste/  - Liefere eine Liste mit Namen aller Ablageorte
    2. HTTP GET Ablageort/  - Liefere eine Liste aller Ablageort-Objekte als JSON
    3. HTTP PUT  - schreibe einen neuen Ablageort auf die Platte
    4. HTTP POST  - schreibe Aenderungen auf die Platte
    5. HTTP DELETE  - loesche den Ablageort
  
    Beispiele:
  
@@ -64,18 +79,14 @@
    HTTP GET an /mz/api/store/Ablageort/liste/  
    liefert eine Liste der Namen vorhandener Ablageorte
  
    HTTP GET an /mz/api/store/Ablageort/Katalog
    liest den Ablageort namens "Katalog"
    HTTP GET an /mz/api/store/Ablageort/[Name]
    liest den Ablageort namens [Name]
  
    HTTP POST an /mz/api/store/Ablageort
    schreibt den neuen Ablageort im Body der Anfrage (Neu)
    HTTP PUT an /mz/api/store/Ablageort/[Name]
    wenn [Name] existiert: Aenderung, sonst neu anlegen
  
    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 (Aenderung)
    HTTP DELETE an /mz/api/store/Ablageort/Katalog
    löscht den Ablageort namens "Katalog"
    HTTP DELETE an /mz/api/store/Ablageort/[Name]
    löscht den Ablageort namens [Name]
  
  */
  
@@ -110,11 +121,12 @@
        break;
        
      case HTTP_PUT:
        response = aendern(e);
        response = put(e);
        break;
        
      case HTTP_POST:
        response = neu(e);
        response = "nicht unterstuertzt.";
        code = 404;
        break;
        
      case HTTP_DELETE:
@@ -133,6 +145,51 @@
    os.close();        
  }
  
  private String put(HttpExchange e) throws IOException {
    String path = e.getRequestURI().toString();
    String[] elems = path.split(App.getRs(Server.RB_SLASH));
    String type = elems[elems.length - 2];
    String elemName = elems[elems.length - 1]; // alter Name, wenn Aenderung
    if(!elemName.equalsIgnoreCase(App.getRs(RB_EP_LISTE))) {
      FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
      Gson gson = new Gson();
      logger.log(Level.FINE, "type: {0}, token: {1}", new Object[]{type, fs.typeFromName(type).getType().getTypeName()});
      Object o = gson.fromJson(bodyLesen(e), fs.typeFromName(type).getType());
      if(o instanceof Entity) {
        Entity entity = (Entity) o;
        if(fs.exists(type, elemName)) {
          fs.delete(type, elemName);
          fs.write(entity, true);
        } else {
          fs.write(entity, false);
        }
        return type + App.getRs(Server.RB_SLASH) + entity.getName();
      } else {
        return "Ungueltiges Objekt im Body.";
      }
    } else {
      return "Ungueltiger Elementname: " + App.getRs(RB_EP_LISTE);
    }
  }
  /*
  private String schreiben(FileStorage fs, String typ, String name, String body, boolean overwrite) {
    Gson gson = new Gson();
    logger.log(Level.FINE, "type: {0}, token: {1}", new Object[]{typ, fs.typeFromName(typ).getType().getTypeName()});
    Object o = gson.fromJson(body, fs.typeFromName(typ).getType());
    if(o instanceof Entity) {
      Object antwortObjekt = fs.write((Entity) o, overwrite);
      if(antwortObjekt instanceof File) {
        File file = (File) antwortObjekt;
        logger.log(Level.FINE, "Datei {0} geschrieben.", file.getAbsolutePath());
        String filename = file.getName();
        return typ + FileHandler.STR_BLANK + filename;
      }
    }
    return typ + FileHandler.STR_BLANK + " etwas Seltsames ist passiert.";
  }
  */
  /*
  private String neu(HttpExchange e) throws IOException {
    return schreiben(e, false);
  }
@@ -140,7 +197,9 @@
  private String aendern(HttpExchange e) throws IOException {
    return schreiben(e, true);
  }
  */
  
  /*
  private String schreiben(HttpExchange e, boolean overwrite) throws IOException {
    String path = e.getRequestURI().toString();
    String[] elems = path.split(App.getRs(Server.RB_SLASH));
@@ -162,6 +221,7 @@
    }
    return type + FileHandler.STR_BLANK + " Operation 'neu' fuer bereits existierende Entitaet.";
  }
  */
  
  /*
  private String aendern(HttpExchange e) throws IOException {
@@ -184,7 +244,7 @@
    FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
    if(path.endsWith(App.getRs(RB_SLASH))) {
      List list = null;
      if(path.endsWith(App.getRs(RB_EP_LISTE))) {
      if(elems[elems.length - 1].equalsIgnoreCase(App.getRs(RB_EP_LISTE))) {
        String type = elems[elems.length - 2];
        logger.fine(type);
        list = fs.list(type);