| | |
| | | |
| | | import com.google.gson.Gson; |
| | | import com.sun.net.httpserver.HttpExchange; |
| | | import com.sun.net.httpserver.HttpHandler; |
| | | 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.BufferedReader; |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.io.InputStreamReader; |
| | | import java.io.OutputStream; |
| | | import java.util.List; |
| | | import java.util.logging.Level; |
| | | import java.util.logging.Logger; |
| | |
| | | * @author Ulrich Hilger |
| | | * @version 1, 5.4.2021 |
| | | */ |
| | | public class StorageHandler extends AbstractHandler implements HttpHandler { |
| | | 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(); |
| | | } |
| | | |
| | | private String put(HttpExchange e) throws IOException { |
| | | protected String put(HttpExchange e) throws IOException { |
| | | String path = e.getRequestURI().toString(); |
| | | String[] elems = path.split(App.getRs(Server.RB_SLASH)); |
| | | String[] elems = path.split(Server.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))) { |
| | |
| | | } else { |
| | | fs.write(entity, false); |
| | | } |
| | | return type + App.getRs(Server.RB_SLASH) + entity.getName(); |
| | | return type + Server.SLASH + entity.getName(); |
| | | } else { |
| | | return "Ungueltiges Objekt im Body."; |
| | | } |
| | |
| | | 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[] elems = path.split(Server.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))); |
| | |
| | | |
| | | private String lesen(HttpExchange e) { |
| | | String path = e.getRequestURI().toString(); |
| | | String[] elems = path.split(App.getRs(Server.RB_SLASH)); |
| | | String[] elems = path.split(Server.SLASH); |
| | | FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF))); |
| | | if(path.endsWith(App.getRs(RB_SLASH))) { |
| | | if(path.endsWith(Server.SLASH)) { |
| | | List list = null; |
| | | if(elems[elems.length - 1].equalsIgnoreCase(App.getRs(RB_EP_LISTE))) { |
| | | String type = elems[elems.length - 2]; |
| | |
| | | } |
| | | } |
| | | |
| | | private String bodyLesen(HttpExchange e) throws IOException { |
| | | InputStream is = e.getRequestBody(); |
| | | BufferedReader r = new BufferedReader(new InputStreamReader(is)); |
| | | StringBuilder sb = new StringBuilder(); |
| | | String line = r.readLine(); |
| | | while(line != null) { |
| | | sb.append(line); |
| | | line = r.readLine(); |
| | | } |
| | | r.close(); |
| | | String json = sb.toString(); |
| | | logger.log(Level.FINE, "json: {0}", json); |
| | | return json; |
| | | @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); |
| | | } |
| | | } |