/* Mediazentrale - Personal Media Center Copyright (C) 2021 Ulrich Hilger This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.mediaz.api; import com.google.gson.Gson; import com.sun.net.httpserver.HttpExchange; import de.uhilger.mediaz.App; import static de.uhilger.mediaz.App.RB_EP_LISTE; import de.uhilger.mediaz.Server; import static de.uhilger.mediaz.Server.RB_SLASH; import de.uhilger.mediaz.store.FileStorage; import de.uhilger.mediaz.entity.Entity; import java.io.IOException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * HttpHandler fuer die Verwaltung von Entitaeten der Mediazentrale * * @author Ulrich Hilger * @version 1, 5.4.2021 */ public class StorageHandler extends AbstractHandler { private static final Logger logger = Logger.getLogger(StorageHandler.class.getName()); /* Das REST-Muster fuer die Mediazentrale (Beispiel Ablageort): 1. HTTP GET Ablageort/[Name] - Liefere den Ablageort namens [Name] 2. HTTP GET Ablageort/liste/ - Liefere eine Liste mit Namen aller Ablageorte Es duerfen keine Elemente namens "liste" angelegt werden 3. HTTP GET Ablageort/ - Liefere eine Liste aller Ablageort-Objekte als JSON 4. HTTP PUT Ablageort/[Name] - Der Ablageort wird angelegt. Wenn er bereits existiert, wird er geändert. (im Falle einer Aenderung des Namens muss der alte Name im URL stehen und im Body die Aenderung) 5. HTTP DELETE - loesche den Ablageort Beispiele: HTTP GET /mz/api/store/Ablageort/ liefert alle Ablageort-Objekte HTTP GET /mz/api/store/Ablageort/liste/ liefert eine Liste der Namen vorhandener Ablageorte HTTP GET /mz/api/store/Ablageort/[Name] liest den Ablageort namens [Name] HTTP PUT /mz/api/store/Ablageort/[Name] wenn [Name] existiert: Aenderung, sonst neu anlegen HTTP DELETE /mz/api/store/Ablageort/[Name] löscht den Ablageort namens [Name] */ /** Name der HTTP Methode GET */ //public static final String HTTP_GET = "GET"; /** Name der HTTP Methode PUT */ //public static final String HTTP_PUT = "PUT"; /** Name der HTTP Methode POST */ //public static final String HTTP_POST = "POST"; /** Name der HTTP Methode DELETE */ //public static final String HTTP_DELETE = "DELETE"; //public static final String EP_LISTE = "liste/"; /* @Override public void handle(HttpExchange e) throws IOException { String method = e.getRequestMethod(); String response = ""; int code = 200; switch(method) { case HTTP_GET: String json = lesen(e); if(json != null) { response = json; } else { response = "nicht gefunden"; code = 404; } break; case HTTP_PUT: response = put(e); break; case HTTP_POST: response = "nicht unterstuertzt."; code = 404; break; case HTTP_DELETE: boolean geloescht = loeschen(e); if(geloescht) { response = "geloescht"; } else { response = "nicht geloescht"; } break; } logger.fine(response); e.sendResponseHeaders(code, response.length()); OutputStream os = e.getResponseBody(); os.write(response.getBytes()); os.close(); } */ @Override protected 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 boolean loeschen(HttpExchange e) { 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]; FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF))); return fs.delete(type, elemName); } private String lesen(HttpExchange e) { String path = e.getRequestURI().toString(); String[] elems = path.split(App.getRs(Server.RB_SLASH)); FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF))); if(path.endsWith(App.getRs(RB_SLASH))) { List list = null; if(elems[elems.length - 1].equalsIgnoreCase(App.getRs(RB_EP_LISTE))) { String type = elems[elems.length - 2]; logger.fine(type); list = fs.list(type); } else { String type = elems[elems.length - 1]; logger.fine(type); list = fs.listObjects(type); } return jsonWithEnclosingType(list); } else { String type = elems[elems.length - 2]; String elemName = elems[elems.length - 1]; return fs.readJson(type, elemName); } } @Override public String get(HttpExchange e) { return lesen(e); } @Override public String post(HttpExchange e) { return "nicht unterstuetzt"; } @Override public boolean delete(HttpExchange e) { return loeschen(e); } }