/* neon-fm - Dateiverwaltung fuer neon Copyright (C) 2024 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.neon.fm; import com.google.gson.Gson; import com.sun.net.httpserver.HttpExchange; import de.uhilger.neon.FileServer; import de.uhilger.neon.HttpHelper; import de.uhilger.neon.HttpResponder; import de.uhilger.fm.Writer; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; /** * Abstrakte Basisklasse mit gemeinsamen Methoden fuer Dateioperationen * * @author Ulrich Hilger * @version 0.1, 07.11.2024 */ public abstract class AbstractFileActor { protected File file; protected String fileName; protected HttpHelper h; protected String base; /** * Hilfsmittel bereitstellen, die beim Ausfuehren eines Actors fuer Dateioperationen * immer benoetigt werden. * * Von dieser Klasse abgeleitete Klassen sollten mit init(exchange) stets diese * Methode ausfuehren. * * @param exchange Infos zu HTTP Request, -Response, Kontext usw. */ protected void init(HttpExchange exchange) { base = exchange.getHttpContext().getAttributes().get(FileServer.ATTR_FILE_BASE).toString(); h = new HttpHelper(); fileName = h.getFileName(exchange); file = new File(base, fileName); } /** * Eine Dateiliste als String Array aus einer Dateiliste im JSON-Format * erzeugen, die aus dem HTTP-Request-Body gelesen wurde * * @param exchange Infos zu HTTP Request, -Response, Kontext usw. * @return die Dateiliste als String Array * @throws IOException wenn etwas schief geht */ protected String[] dateiliste(HttpExchange exchange) throws IOException { String body = h.bodyLesen(exchange); //logger.fine("dateien: " + body); Gson gson = new Gson(); return gson.fromJson(body, String[].class); } /** * Den Body eines HTTP Request in eine Datei schreiben * * TODO das evtl. noch in java.nio.file ueberfuehren.. * * @param e Infos zu HTTP Request, -Response, Kontext usw. * @throws IOException wenn etwas schief geht */ protected void speichern(HttpExchange e) throws IOException { String body = h.bodyLesen(e); if (new Writer().speichern(file, body) == 0) { antwort(e, HttpResponder.SC_OK, file.getAbsolutePath()); } else { antwort(e, HttpResponder.SC_INTERNAL_SERVER_ERROR, "speichern fehlgeschlagen"); } } /** * Eine Fehler-Antwort als HTTP Status Code 401 not found senden * * @param exchange Infos zu HTTP Request, -Response, Kontext usw. * @param ex der aufgetretene Fehler */ protected void fehlerAntwort(HttpExchange exchange, Exception ex) { try { Logger.getLogger(AbstractFileActor.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); antwort(exchange, HttpResponder.SC_NOT_FOUND, ex.getMessage()); } catch (IOException ex1) { Logger.getLogger(AbstractFileActor.class.getName()).log(Level.SEVERE, ex.getMessage(), ex1); } } /** * Eine Antwort als HTTP Response senden * * @param exchange Infos zu HTTP Request, -Response, Kontext usw. * @param code HTTP Status code fuer die Antwort * @param text Inhalt der Antwort * @throws IOException wenn etwas schif geht */ protected void antwort(HttpExchange exchange, int code, String text) throws IOException { new HttpResponder().antwortSenden(exchange, code, text); } /** * Die Zeiger auf die von einer Instanz dieser abstrakten Basisklasse * erzeugten Objekte wieder frei geben */ protected void free() { file = null; fileName = null; h = null; base = null; } }