Dateiverwaltung fuer neon
ulrich
2024-11-19 b3d917571a5f952531ce3e060861e1a158bc04c7
Dokumentation in Arbeit: FileCreator fertig dokumentiert, kleinere Anpassungen
5 files modified
77 ■■■■■ changed files
src/de/uhilger/neon/fm/AbstractFileActor.java 45 ●●●●● patch | view | raw | blame | history
src/de/uhilger/neon/fm/FileCreator.java 26 ●●●● patch | view | raw | blame | history
src/de/uhilger/neon/fm/FileEraser.java 2 ●●● patch | view | raw | blame | history
src/de/uhilger/neon/fm/FileList.java 2 ●●● patch | view | raw | blame | history
src/de/uhilger/neon/fm/FileManipulator.java 2 ●●● patch | view | raw | blame | history
src/de/uhilger/neon/fm/AbstractFileActor.java
@@ -41,13 +41,30 @@
  protected HttpHelper h;
  protected String base;
  public void run(HttpExchange exchange) {
  /**
   * Hilfsmittel bereitstellen, die beim Ausfuehren eines Actors fuer Dateioperationen
   * immer benoetigt werden.
   *
   * Von dieser Klasse abgeleitete Actos sollten mit super.run(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);
@@ -55,6 +72,14 @@
    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) {
@@ -64,6 +89,12 @@
    }
  }
  /**
   * 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);
@@ -73,10 +104,22 @@
    }
  }
  /**
   * 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;
src/de/uhilger/neon/fm/FileCreator.java
@@ -26,15 +26,35 @@
import java.util.logging.Logger;
/**
 * Eine Klasse mit Methoden zur Erzeugung von Ordnern und Dateien
 *
 * @author Ulrich Hilger
 * @version 0.1, 08.11.2024
 */
public class FileCreator extends AbstractFileActor {
  public void run(HttpExchange exchange) {
  /**
   * Die methode run legt Ordner und Dateien neu an, sofern im hier
   * uebergebenen HttpExchange Objekt die folgenden Angaben zu finden
   * sind:
   *
   * <pre>
   * Datei neu anlegen (ohne Ueberschreiben):
   * http://localhost:[port]/[kontext]/pfad/zur/datei.txt
   * Body: Dateiinhalt
   * Erzeugt eine neue Datei mit einer laufenden Nummer,
   * falls die per URL angegebene Datei schon existiert
   *
   * Ordner anlegen:
   * http://localhost:[port]/[kontext]/pfad/zum/ordner/
   * erzeugt einen HTTP-Fehler 422, wenn der Ordner schon existiert
   * </pre>
   *
   * @param exchange Infos zu HTTP Request, -Response, Kontext usw.
   */
  public void create(HttpExchange exchange) {
    try {
      super.run(exchange);
      init(exchange);
      if (fileName.endsWith(FileServer.STR_SLASH)) { // es ist ein Ordner
        if (!file.exists()) {
          file.mkdir();
@@ -49,7 +69,7 @@
          file = trans.getNewFileName(file);
        }
        speichern(exchange);
      }
      }
    } catch (IOException ex) {
      Logger.getLogger(FileCreator.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
    } finally {
src/de/uhilger/neon/fm/FileEraser.java
@@ -34,7 +34,7 @@
  public void run(HttpExchange exchange) {
    try {
      super.run(exchange);
      init(exchange);
      String[] dateiNamen = dateiliste(exchange);
      new Eraser().deleteFiles(fileName, Arrays.asList(dateiNamen), base);
      antwort(exchange, HttpResponder.SC_OK, "Dateien geloescht.");
src/de/uhilger/neon/fm/FileList.java
@@ -34,7 +34,7 @@
  public void run(HttpExchange exchange) {
    try {
      super.run(exchange);
      init(exchange);
      HttpContext ctx = exchange.getHttpContext();
      String base = ctx.getAttributes().getOrDefault(FileServer.ATTR_FILE_BASE, "").toString();
      if(base.length() == 0) {
src/de/uhilger/neon/fm/FileManipulator.java
@@ -58,7 +58,7 @@
  public void run(HttpExchange exchange) {
    try {
      super.run(exchange);
      init(exchange);
      String query = exchange.getRequestURI().getQuery();
      if (query != null) {
        String[] params = query.split(FileServer.STR_EQUAL);