Dateiverwaltung fuer neon
ulrich
2024-11-11 ca6de6f21612c7da34113c4429d7c30bbfdb3b65
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.Const;
24 import de.uhilger.fm.Duplicator;
25 import de.uhilger.fm.Mover;
26 import de.uhilger.fm.Renamer;
27 import de.uhilger.fm.Inflator;
28 import de.uhilger.fm.Deflator;
29 import java.io.IOException;
30
31 /**
32  * Ein Neon-Actor fuer Aenderungen an Dateien.
33  *
34  * Die folgenden Aktionen werden ausgefuehrt.
35  *
36  * PUT [url] [body]
37  *
38  * <pre>
39  * - Inhalt einer einzelnen Datei anlegen oder ueberschreiben: url=ziel, Dateiinhalt im Body
40  * - Liste mit Dateien kopieren (?copyFrom=quelle): url=ziel, Dateiliste im Body
41  * - Liste mit Dateien verschieben (?moveFrom=quelle): url=Ziel, Dateiliste im Body
42  * - einzelne Datei duplizieren (?duplicate): url=Zieldatei
43  * - einzelne Datei umbenennen (?renameTo=neuer Name): url=Datei oder -odner
44  * - Ordner packen (?zip): url=Ordner
45  * - Zip-Datei entpacken (?unzip): url=Datei
46  * </pre>
47  *
48  * @author Ulrich Hilger
49  * @version 0.1, 07.11.2024
50  */
51 public class FileManipulator extends AbstractFileActor {
52
53   private static final String P_RENAME = "renameTo";
54   private static final String P_COPY = "copyFrom";
55   private static final String P_MOVE = "moveFrom";
56   private static final String P_DUPLICATE = "duplicate";
57   private static final String P_ZIP = "zip";
58   private static final String P_UNZIP = "unzip";
59
60   public void run(HttpExchange exchange) {
61     try {
62       super.run(exchange);
63       String query = exchange.getRequestURI().getQuery();
64       if (query != null) {
65         String[] params = query.split(FileServer.STR_EQUAL);
66         switch (params[0]) {
67           case P_RENAME:
68             h.inspectFileName(params[1]);
69             String neuerDateiName = new Renamer().umbenennen(exchange, fileName, params[1], file);
70             antwort(exchange, HttpResponder.SC_OK, neuerDateiName);
71             break;
72           case P_COPY:
73             h.inspectFileName(params[1]);
74             copyOrMove(exchange, params[1], fileName, Const.OP_COPY);
75             break;
76           case P_MOVE:
77             h.inspectFileName(params[1]);
78             copyOrMove(exchange, params[1], fileName, Const.OP_MOVE);
79             break;
80           case P_DUPLICATE:
81             if (Boolean.parseBoolean(params[1])) {
82               String dup = new Duplicator().duplizieren(base, fileName);
83               //logger.fine("neuer Name: " + neuerDateiName);
84               antwort(exchange, HttpResponder.SC_OK, dup);
85             }
86             break;
87           case P_ZIP:
88             String path = exchange.getRequestURI().toString();
89             zipAntwort(exchange, new Deflator().packFolder(fileName, path, base));
90             break;
91           case P_UNZIP:
92             path = exchange.getRequestURI().toString();
93             zipAntwort(exchange, new Inflator().extractZipfile(fileName, path, base));
94             break;
95           default:
96             antwort(exchange, HttpResponder.SC_NOT_FOUND, "ungueltige Anfrage");
97             break;
98         }
99       } else {
100         if (fileName.endsWith(FileServer.STR_SLASH)) {
101           antwort(exchange, HttpResponder.SC_METHOD_NOT_ALLOWED, "PUT nicht erlaubt, POST verwenden.");
102         } else {
103           speichern(exchange);
104         }
105       }
106     } catch (IOException | IllegalArgumentException ex) {
107       fehlerAntwort(exchange, ex);
108     } finally {
109       free();
110     }
111   }
112
113   private void copyOrMove(HttpExchange exchange, String quelle, String ziel, int op) throws IOException {
114     String[] dateiNamen = dateiliste(exchange);
115     new Mover().copyOrMoveFiles(quelle, ziel, dateiNamen, op, base);
116     antwort(exchange, HttpResponder.SC_OK, "Dateien verarbeitet.");
117   }
118
119   private void zipAntwort(HttpExchange exchange, String antw) throws IOException {
120     if (antw.equalsIgnoreCase("ok")) {
121       antwort(exchange, HttpResponder.SC_OK, antw);
122     } else {
123       antwort(exchange, HttpResponder.SC_UNPROCESSABLE_ENTITY, antw);
124     }
125   }
126 }