Persoenliche Mediazentrale
ulrich
2021-04-05 2b5c60f130bf5d6e0ad4521d327b81947cd2eab7
commit | author | age
b379f5 1 /*
5f70da 2   Mediazentrale - Personal Media Center
U 3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
b379f5 17  */
U 18 package de.uhilger.mediaz.api;
19
20 import com.google.gson.Gson;
21 import com.sun.net.httpserver.HttpExchange;
22 import com.sun.net.httpserver.HttpHandler;
23 import de.uhilger.mediaz.App;
24 import de.uhilger.mediaz.Server;
2b5c60 25 import static de.uhilger.mediaz.Server.RB_SLASH;
081606 26 import de.uhilger.mediaz.store.FileStorage;
b1bf96 27 import de.uhilger.mediaz.entity.Entity;
b379f5 28 import java.io.BufferedReader;
081606 29 import java.io.File;
b379f5 30 import java.io.IOException;
U 31 import java.io.InputStream;
32 import java.io.InputStreamReader;
33 import java.io.OutputStream;
2b5c60 34 import java.util.List;
081606 35 import java.util.logging.Level;
b379f5 36 import java.util.logging.Logger;
U 37
38 /**
5f70da 39  * HttpHandler fuer die Ablage von Entitaeten der Mediazentrale
U 40  * 
41  * @author Ulrich Hilger
42  * @version 1, 5.4.2021
b379f5 43  */
081606 44 public class StorageHandler implements HttpHandler  {
b379f5 45   
081606 46   private static final Logger logger = Logger.getLogger(StorageHandler.class.getName());
b379f5 47
U 48   
49   /*
2b5c60 50     Das REST-Muster sieht je Entitaet fuenf Faelle vor (Beispiel Ablageort):
U 51     
52     1. HTTP GET Ablageort/[Name]: Liefere den Ablageort als JSON
53     2. HTTP GET Ablageort/: Liefere einer Liste von Ablageorten als JSON
54     3. HTTP PUT: schreibe einen neuen Ablageort auf die Platte
55     4. HTTP POST: schreibe Aenderungen auf die Platte
56     5. HTTP DELETE: loesche den Ablageort
b379f5 57   
U 58     Beispiele:
2b5c60 59   
U 60     HTTP GET an /mz/api/store/Ablageort/
61     liefert eine Liste der Namen vorhandener Ablageorte
b379f5 62   
U 63     HTTP GET an /mz/api/store/Ablageort/Katalog
64     liest den Ablageort namens "Katalog"
65   
66     HTTP POST an /mz/api/store/Ablageort
081606 67     schreibt den neuen Ablageort im Body der Anfrage (Neu)
b379f5 68   
U 69     HTTP PUT an /mz/api/store/Ablageort
70     sucht den Ablageort mit dem Namen laut Body der Anfrage 
081606 71     und schreibt den Inhalt aus der Anfrage in die Datei (Aenderung)
b379f5 72   
U 73     HTTP DELETE an /mz/api/store/Ablageort/Katalog
74     löscht den Ablageort namens "Katalog"
75   
76   */
77   
2b5c60 78   /** Name der HTTP Methode GET */
b379f5 79   public static final String HTTP_GET = "GET";
2b5c60 80   
U 81   /** Name der HTTP Methode PUT */
b379f5 82   public static final String HTTP_PUT = "PUT";
2b5c60 83   
U 84   /** Name der HTTP Methode POST */
b379f5 85   public static final String HTTP_POST = "POST";
2b5c60 86   
U 87   /** Name der HTTP Methode DELETE */
b379f5 88   public static final String HTTP_DELETE = "DELETE";
U 89
90   @Override
91   public void handle(HttpExchange e) throws IOException {
92     String method = e.getRequestMethod();
5f70da 93     String response = "";
U 94     int code = 200;
b379f5 95     switch(method) {
U 96       case HTTP_GET:
5f70da 97         String json = lesen(e);
U 98         if(json != null) {
99           response = json;
100         } else {
101           response = "nicht gefunden";
102           code = 404;
103         }
b379f5 104         break;
U 105         
106       case HTTP_PUT:
2b5c60 107         response = aendern(e);
b379f5 108         break;
U 109         
110       case HTTP_POST:
5f70da 111         response = neu(e);
b379f5 112         break;
U 113         
114       case HTTP_DELETE:
2b5c60 115         boolean geloescht = loeschen(e);
U 116         if(geloescht) {
117           response = "geloescht";
118         } else {
119           response = "nicht geloescht";
120         }
b379f5 121         break;
U 122     }
123     logger.info(response);
5f70da 124     e.sendResponseHeaders(code, response.length());
b379f5 125     OutputStream os = e.getResponseBody();
U 126     os.write(response.getBytes());
127     os.close();        
b1bf96 128   }
U 129   
5f70da 130   private String neu(HttpExchange e) throws IOException {
b1bf96 131     String path = e.getRequestURI().toString();
U 132     String[] elems = path.split(App.getRs(Server.RB_SLASH));
133     String type = elems[elems.length - 1];
134     String body = bodyLesen(e);
5f70da 135     String filename = ""; 
b1bf96 136     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
U 137     Gson gson = new Gson();
138     logger.log(Level.INFO, "type: {0}", type);
139     Object o = gson.fromJson(body, fs.typeFromName(type).getType());
140     if(o instanceof Entity) {
141       Object antwortObjekt = fs.write((Entity) o);
142       if(antwortObjekt instanceof File) {
143         File file = (File) antwortObjekt;
144         logger.log(Level.INFO, "Datei {0} geschrieben.", file.getAbsolutePath());
5f70da 145         filename = file.getName();
b1bf96 146       }
U 147     }
5f70da 148     return type + FileHandler.STR_BLANK + filename;
b1bf96 149   }
U 150   
2b5c60 151   private String aendern(HttpExchange e) throws IOException {
U 152     return neu(e); // einstweilen wird einfach ueberschrieben
b1bf96 153   }
U 154   
2b5c60 155   private boolean loeschen(HttpExchange e) {
5f70da 156     String path = e.getRequestURI().toString();
U 157     String[] elems = path.split(App.getRs(Server.RB_SLASH));
158     String type = elems[elems.length - 2];
159     String elemName = elems[elems.length - 1];
160     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
2b5c60 161     return fs.delete(type, elemName);
U 162   }
163   
164   private String lesen(HttpExchange e) {
165     String path = e.getRequestURI().toString();
166     String[] elems = path.split(App.getRs(Server.RB_SLASH));
167     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
168     if(path.endsWith(App.getRs(RB_SLASH))) {
169       String type = elems[elems.length - 1];
170       logger.info(type);
171       List list = fs.list(type);
172       Gson gson = new Gson();
173       return gson.toJson(list);
174     } else {
175       String type = elems[elems.length - 2];
176       String elemName = elems[elems.length - 1];
177       return fs.readJson(type, elemName);
178     }
b379f5 179   }
U 180   
181   
182   private String bodyLesen(HttpExchange e) throws IOException {
183     InputStream is = e.getRequestBody();
184     BufferedReader r = new BufferedReader(new InputStreamReader(is));
185     StringBuilder sb = new StringBuilder();
186     String line = r.readLine();
187     while(line != null) {
188       sb.append(line);
189       line = r.readLine();
190     }
191     r.close();
192     String json = sb.toString();
b1bf96 193     logger.log(Level.INFO, "json: {0}", json);
b379f5 194     return json;
U 195   }
196 }