Dateiverwaltung fuer neon
ulrich
2024-11-20 a9ce27642a6280f95664b0140a356e6f4ade91b1
commit | author | age
aed034 1 /*
U 2   neon-fm - Dateiverwaltung fuer neon
3   Copyright (C) 2024  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/>.
17  */
18 package de.uhilger.neon.fm;
19
20 import com.sun.net.httpserver.HttpExchange;
21 import de.uhilger.neon.FileServer;
22 import de.uhilger.neon.HttpResponder;
23 import de.uhilger.fm.Duplicator;
24 import de.uhilger.fm.Mover;
25 import de.uhilger.fm.Renamer;
26 import de.uhilger.fm.Inflator;
27 import de.uhilger.fm.Deflator;
28 import java.io.IOException;
29
30 /**
bb2648 31  * Aenderungen an bestehenden Dateien.
aed034 32  *
U 33  * @author Ulrich Hilger
34  * @version 0.1, 07.11.2024
35  */
36 public class FileManipulator extends AbstractFileActor {
37
38   private static final String P_RENAME = "renameTo";
39   private static final String P_COPY = "copyFrom";
40   private static final String P_MOVE = "moveFrom";
41   private static final String P_DUPLICATE = "duplicate";
42   private static final String P_ZIP = "zip";
43   private static final String P_UNZIP = "unzip";
44
1c3f44 45   /**
U 46    * <p>
47    * Diese Methode ist als Reaktion auf einen HTTP PUT Aufruf an folgende URLs gedacht</p>
48    *
49    * <pre>
50    * PUT [url]
51    * [body]
52    * </pre>
53    *
54    * <pre>
55    * - Inhalt einer einzelnen Datei anlegen oder ueberschreiben: url=ziel, Dateiinhalt im Body
56    * - Liste mit Dateien kopieren (?copyFrom=quelle): url=ziel, Dateiliste im Body
57    * - Liste mit Dateien verschieben (?moveFrom=quelle): url=Ziel, Dateiliste im Body
58    * - einzelne Datei duplizieren (?duplicate): url=Zieldatei
a9ce27 59    * - einzelne Datei umbenennen (?renameTo=neuer Name): url=Datei oder -ordner
1c3f44 60    * - Ordner packen (?zip): url=Ordner
U 61    * - Zip-Datei entpacken (?unzip): url=Datei
62    * </pre>
63    *
a9ce27 64    *
U 65    * <pre>
66    * <p>HTTP PUT /pfad/zur/datei.txt ueberschreibt eine bestehende Datei mit dem im Body
67    * uebergebenen Inhalt oder legt eine Datei mit diesem Inhalt an</p> 
68    * 
69    * HTTP PUT /pfad/zum/zielordner?copyFrom=/pfad/zum/quellordner
70    * kopiert die Liste der Datei- oder Ordnernamen im Body
71    * der Anfrage vom Pfad in 'copyFrom' zum Pfad dieser Anfrage. Jede Datei, die
72    * im Ziel bereits existiert, bekommt im Ziel einen neuen Namen mit einer
73    * laufenden Nummer. Bei Ordnern, die im Ziel bereits existieren, bekommt der
74    * betreffende Ordner im Ziel zunaechst einen neuen Namen mit einer laufenden
75    * Nummer, dann wird der Quellordner ans Ziel kopiert.
76    *
77    * HTTP PUT /pfad/zum/zielordner?moveFrom=/pfad/zum/quellordner
78    * verschiebt die Liste der Datei- oder Ordnernamen im
79    * Body der Anfrage vom Pfad in 'moveFrom' zum Pfad dieser Anfrage. Jede Datei,
80    * die im Ziel bereits existiert, bekommt im Ziel einen neuen Namen mit einer
81    * laufenden Nummer. Bei Ordnern, die im Ziel bereits existieren, bekommt der
82    * betreffende Ordner im Ziel zunaechst einen neuen Namen mit einer laufenden
83    * Nummer, dann wird der Quellordner ans Ziel kopiert.
84    *
85    * HTTP PUT /pfad/zur/datei.txt?duplicate legt eine Kopie der Datei an
86    *
87    * HTTP PUT /pfad/zur/datei.txt?renameTo=neuer Name benennt die Datei oder den Ordner um,
88    * sofern der neue Name noch nicht vergeben ist
89    *
90    * HTTP PUT /pfad/zum/ordner?zip' packt den Ordner
91    *
92    * HTTP PUT /pfad/zur/datei.zip?unzip' entpackt eine Datei
93    *
94    * Eine Dateiliste im Body sieht z.B. wie folgt aus
95    * ["test.txt","dok","weitere-datei.bin","bild.jpg"]
96    *
97    * </pre>
98    *
1c3f44 99    * @param exchange das Objekt mit Infos zu HTTP-Request, -Response usw.
U 100    */
101   public void change(HttpExchange exchange) {
aed034 102     try {
b3d917 103       init(exchange);
aed034 104       String query = exchange.getRequestURI().getQuery();
U 105       if (query != null) {
106         String[] params = query.split(FileServer.STR_EQUAL);
107         switch (params[0]) {
108           case P_RENAME:
109             h.inspectFileName(params[1]);
81b69f 110             String neuerDateiName = new Renamer().rename(/*fileName, */params[1], file);
aed034 111             antwort(exchange, HttpResponder.SC_OK, neuerDateiName);
U 112             break;
113           case P_COPY:
114             h.inspectFileName(params[1]);
876484 115             copyOrMove(exchange, params[1], fileName, Mover.OP_COPY);
aed034 116             break;
U 117           case P_MOVE:
118             h.inspectFileName(params[1]);
876484 119             copyOrMove(exchange, params[1], fileName, Mover.OP_MOVE);
aed034 120             break;
U 121           case P_DUPLICATE:
122             if (Boolean.parseBoolean(params[1])) {
123               String dup = new Duplicator().duplizieren(base, fileName);
124               //logger.fine("neuer Name: " + neuerDateiName);
125               antwort(exchange, HttpResponder.SC_OK, dup);
126             }
127             break;
128           case P_ZIP:
537b65 129             //String path = exchange.getRequestURI().toString();
1c3f44 130             zipAntwort(exchange, new Deflator().packFolder(fileName, /*path, */ base));
aed034 131             break;
U 132           case P_UNZIP:
537b65 133             //String path = exchange.getRequestURI().toString();
U 134             zipAntwort(exchange, new Inflator().extractZipfile(fileName, /*path,*/ base));
aed034 135             break;
U 136           default:
137             antwort(exchange, HttpResponder.SC_NOT_FOUND, "ungueltige Anfrage");
138             break;
139         }
140       } else {
141         if (fileName.endsWith(FileServer.STR_SLASH)) {
142           antwort(exchange, HttpResponder.SC_METHOD_NOT_ALLOWED, "PUT nicht erlaubt, POST verwenden.");
143         } else {
144           speichern(exchange);
145         }
146       }
147     } catch (IOException | IllegalArgumentException ex) {
148       fehlerAntwort(exchange, ex);
149     } finally {
150       free();
151     }
152   }
153
154   private void copyOrMove(HttpExchange exchange, String quelle, String ziel, int op) throws IOException {
155     String[] dateiNamen = dateiliste(exchange);
1c3f44 156     if (op == Mover.OP_COPY) {
336d97 157       new Mover().copy(quelle, ziel, dateiNamen, base);
U 158     } else {
159       new Mover().move(quelle, ziel, dateiNamen, base);
1c3f44 160     }
336d97 161     //new Mover().copyOrMoveFiles(quelle, ziel, dateiNamen, op, base);
aed034 162     antwort(exchange, HttpResponder.SC_OK, "Dateien verarbeitet.");
U 163   }
164
165   private void zipAntwort(HttpExchange exchange, String antw) throws IOException {
166     if (antw.equalsIgnoreCase("ok")) {
167       antwort(exchange, HttpResponder.SC_OK, antw);
168     } else {
169       antwort(exchange, HttpResponder.SC_UNPROCESSABLE_ENTITY, antw);
170     }
171   }
1c3f44 172 }