From 0c14c00bab23e52508e0d30ef5fdf82399096612 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Fri, 23 Apr 2021 17:57:31 +0000
Subject: [PATCH] Ablageorte werden im laufenden Betrieb ein- und ausgeklinkt

---
 src/de/uhilger/mediaz/api/StorageHandler.java |   35 +++++++++++++++++++++++++++++++++--
 src/de/uhilger/mediaz/App.java                |   10 +++++++++-
 src/de/uhilger/mediaz/Server.java             |   13 ++++++++++++-
 3 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/src/de/uhilger/mediaz/App.java b/src/de/uhilger/mediaz/App.java
index 92f151f..042fcdf 100644
--- a/src/de/uhilger/mediaz/App.java
+++ b/src/de/uhilger/mediaz/App.java
@@ -48,6 +48,9 @@
   /* Name des ResourceBundles dieser App */
   private static final String RB_NAME = "mediaz";
   
+  /* Der Server dieser App */
+  private static Server server;
+  
   /* ResourceBundle-Kennungen */
   public static final String RB_PARAM_FEHLT = "msgParamFehlt";
   public static final String RB_AP_PORT = "appParamPort";
@@ -80,7 +83,8 @@
 
     String portStr = getInitParameter(getRs(RB_AP_PORT));
     if (portStr != null) {
-      Server server = new Server(Integer.parseInt(portStr));
+      //Server server = new Server(Integer.parseInt(portStr));
+      server = new Server(Integer.parseInt(portStr));
       try {
         String ctxName = getInitParameter(getRs(RB_AP_CTX));
         if (ctxName != null) {
@@ -130,5 +134,9 @@
   public static String getRs(String key) {
     return rb.getString(key);
   }
+  
+  public static Server getServer() {
+    return server;
+  }
 
 }
diff --git a/src/de/uhilger/mediaz/Server.java b/src/de/uhilger/mediaz/Server.java
index a3f1b1c..a758078 100644
--- a/src/de/uhilger/mediaz/Server.java
+++ b/src/de/uhilger/mediaz/Server.java
@@ -63,6 +63,8 @@
   private int port;
 
   private String ctx;
+  
+  private HttpServer server;
 
   /**
    * Ein neues Objekt der Kalsse Server erzeugen
@@ -110,7 +112,7 @@
     String wwwData = App.getInitParameter(App.getRs(App.RB_AP_WWW_DATA));
     File wwwDir = new File(wwwData);
 
-    HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
+    server = HttpServer.create(new InetSocketAddress(port), 0);
     server.createContext(ctx + App.getRs(RB_WEBROOT), new FileHandler(wwwDir.getAbsolutePath()));
     ablageorteEinklinken(server);
     server.createContext(ctx + App.getRs(RB_STORE), new StorageHandler());
@@ -121,7 +123,16 @@
     server.setExecutor(Executors.newFixedThreadPool(20));
     server.start();
   }
+  
+  public void ablageortEntfernen(String url) {
+    server.removeContext(ctx + url);
+  }
 
+  public void ablageortHinzufuegen(Ablageort ort) {
+    server.createContext(ctx + ort.getUrl(),  
+          new ListFileHandler(new File(ort.getOrt()).getAbsolutePath()));
+  }
+  
   private void ablageorteEinklinken(HttpServer server) 
               throws ClassNotFoundException, IOException {
     String typ = Ablageort.class.getSimpleName();
diff --git a/src/de/uhilger/mediaz/api/StorageHandler.java b/src/de/uhilger/mediaz/api/StorageHandler.java
index a8bc567..f84629f 100644
--- a/src/de/uhilger/mediaz/api/StorageHandler.java
+++ b/src/de/uhilger/mediaz/api/StorageHandler.java
@@ -23,6 +23,7 @@
 import static de.uhilger.mediaz.App.RB_EP_LISTE;
 import static de.uhilger.mediaz.App.RB_EP_LISTE_ALLES;
 import de.uhilger.mediaz.Server;
+import de.uhilger.mediaz.entity.Ablageort;
 import de.uhilger.mediaz.store.FileStorage;
 import de.uhilger.mediaz.entity.Entity;
 import de.uhilger.mediaz.entity.Geraet;
@@ -73,11 +74,33 @@
       Object o = gson.fromJson(bodyLesen(e), fs.typeFromName(type).getType());
       if(o instanceof Entity) {
         Entity entity = (Entity) o;
-        if(fs.exists(type, elemName)) {
+        if(fs.exists(type, elemName)) { // Aenderung
           fs.delete(type, elemName);
+          // wenn Ablageort, hier noch alten Kontext entfernen
+          if(type.equalsIgnoreCase(FileStorage.ST_ABLAGEORT)) {
+            Entity aoe = fs.read(type, elemName);
+            if(aoe instanceof Ablageort) {
+              Ablageort ablageort = (Ablageort) aoe;
+              App.getServer().ablageortEntfernen(ablageort.getUrl());      
+            }
+          }
           fs.write(entity, true);
-        } else {
+          // wenn Ablageort, hier noch neuen Kontext anlegen
+          if(type.equalsIgnoreCase(FileStorage.ST_ABLAGEORT)) {
+            if(entity instanceof Ablageort) {
+              Ablageort ablageort = (Ablageort) entity;
+              App.getServer().ablageortHinzufuegen(ablageort);
+            }
+          }
+        } else { // Neu
           fs.write(entity, false);
+          // wenn Ablageort, hier noch neuen Kontext anlegen
+          if(type.equalsIgnoreCase(FileStorage.ST_ABLAGEORT)) {
+            if(entity instanceof Ablageort) {
+              Ablageort ablageort = (Ablageort) entity;
+              App.getServer().ablageortHinzufuegen(ablageort);
+            }
+          }
         }
         return type + Server.SLASH + entity.getName();
       } else {
@@ -94,6 +117,14 @@
     String type = elems[elems.length - 2];
     String elemName = elems[elems.length - 1];
     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
+    if(type.equalsIgnoreCase(FileStorage.ST_ABLAGEORT)) {
+      // im laufenden Server den Context entfernen
+      Entity entity = fs.read(type, elemName);
+      if(entity instanceof Ablageort) {
+        Ablageort ablageort = (Ablageort) entity;
+        App.getServer().ablageortEntfernen(ablageort.getUrl());      
+      }
+    }
     return fs.delete(type, elemName);
   }
   

--
Gitblit v1.9.3