Dateiverwaltung fuer neon
ulrich
2024-11-20 1c3f44e03372350435f5298e54949059cef509b7
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 /**
1c3f44 31  * Ein Klasse fuer 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
59    * - einzelne Datei umbenennen (?renameTo=neuer Name): url=Datei oder -odner
60    * - Ordner packen (?zip): url=Ordner
61    * - Zip-Datei entpacken (?unzip): url=Datei
62    * </pre>
63    *
64    * @param exchange das Objekt mit Infos zu HTTP-Request, -Response usw.
65    */
66   public void change(HttpExchange exchange) {
aed034 67     try {
b3d917 68       init(exchange);
aed034 69       String query = exchange.getRequestURI().getQuery();
U 70       if (query != null) {
71         String[] params = query.split(FileServer.STR_EQUAL);
72         switch (params[0]) {
73           case P_RENAME:
74             h.inspectFileName(params[1]);
81b69f 75             String neuerDateiName = new Renamer().rename(/*fileName, */params[1], file);
aed034 76             antwort(exchange, HttpResponder.SC_OK, neuerDateiName);
U 77             break;
78           case P_COPY:
79             h.inspectFileName(params[1]);
876484 80             copyOrMove(exchange, params[1], fileName, Mover.OP_COPY);
aed034 81             break;
U 82           case P_MOVE:
83             h.inspectFileName(params[1]);
876484 84             copyOrMove(exchange, params[1], fileName, Mover.OP_MOVE);
aed034 85             break;
U 86           case P_DUPLICATE:
87             if (Boolean.parseBoolean(params[1])) {
88               String dup = new Duplicator().duplizieren(base, fileName);
89               //logger.fine("neuer Name: " + neuerDateiName);
90               antwort(exchange, HttpResponder.SC_OK, dup);
91             }
92             break;
93           case P_ZIP:
537b65 94             //String path = exchange.getRequestURI().toString();
1c3f44 95             zipAntwort(exchange, new Deflator().packFolder(fileName, /*path, */ base));
aed034 96             break;
U 97           case P_UNZIP:
537b65 98             //String path = exchange.getRequestURI().toString();
U 99             zipAntwort(exchange, new Inflator().extractZipfile(fileName, /*path,*/ base));
aed034 100             break;
U 101           default:
102             antwort(exchange, HttpResponder.SC_NOT_FOUND, "ungueltige Anfrage");
103             break;
104         }
105       } else {
106         if (fileName.endsWith(FileServer.STR_SLASH)) {
107           antwort(exchange, HttpResponder.SC_METHOD_NOT_ALLOWED, "PUT nicht erlaubt, POST verwenden.");
108         } else {
109           speichern(exchange);
110         }
111       }
112     } catch (IOException | IllegalArgumentException ex) {
113       fehlerAntwort(exchange, ex);
114     } finally {
115       free();
116     }
117   }
118
119   private void copyOrMove(HttpExchange exchange, String quelle, String ziel, int op) throws IOException {
120     String[] dateiNamen = dateiliste(exchange);
1c3f44 121     if (op == Mover.OP_COPY) {
336d97 122       new Mover().copy(quelle, ziel, dateiNamen, base);
U 123     } else {
124       new Mover().move(quelle, ziel, dateiNamen, base);
1c3f44 125     }
336d97 126     //new Mover().copyOrMoveFiles(quelle, ziel, dateiNamen, op, base);
aed034 127     antwort(exchange, HttpResponder.SC_OK, "Dateien verarbeitet.");
U 128   }
129
130   private void zipAntwort(HttpExchange exchange, String antw) throws IOException {
131     if (antw.equalsIgnoreCase("ok")) {
132       antwort(exchange, HttpResponder.SC_OK, antw);
133     } else {
134       antwort(exchange, HttpResponder.SC_UNPROCESSABLE_ENTITY, antw);
135     }
136   }
1c3f44 137 }