From 342aebc6b1143ab81a626a71b8bf7ce15eb5f361 Mon Sep 17 00:00:00 2001 From: ulrich Date: Mon, 15 Jan 2024 17:40:11 +0000 Subject: [PATCH] Zentrale Methode mit Dateioperationen von FileMAnager nach Writer ausgelagert. --- src/de/uhilger/httpserver/cm/FileManager.java | 446 +++---------------------------------------------------- 1 files changed, 25 insertions(+), 421 deletions(-) diff --git a/src/de/uhilger/httpserver/cm/FileManager.java b/src/de/uhilger/httpserver/cm/FileManager.java index f40b401..f754a93 100644 --- a/src/de/uhilger/httpserver/cm/FileManager.java +++ b/src/de/uhilger/httpserver/cm/FileManager.java @@ -17,38 +17,15 @@ */ package de.uhilger.httpserver.cm; -import de.uhilger.httpserver.cm.actor.Zipper; -import de.uhilger.httpserver.cm.actor.Eraser; -import de.uhilger.httpserver.cm.actor.Unzipper; -import de.uhilger.httpserver.cm.actor.Renamer; -import com.google.gson.Gson; import com.sun.net.httpserver.Authenticator; -import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import de.uhilger.httpserver.base.HttpResponder; import de.uhilger.httpserver.base.HttpHelper; import de.uhilger.httpserver.base.handler.FileHandler; -import de.uhilger.httpserver.image.Datei; -import de.uhilger.httpserver.image.ImageActor; -import de.uhilger.httpserver.image.ImageThread; -import de.uhilger.httpserver.image.ImageThread.ThreadListener; +import de.uhilger.httpserver.cm.actor.Lister; +import de.uhilger.httpserver.cm.actor.Writer; import de.uhilger.httpserver.oauth.BearerAuthenticator; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.URLDecoder; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.logging.Logger; -import java.util.logging.Level; /** * <p>Der FileManager verknuepft einen HTTP-Endpunkt mit einem Ordner des lokalen @@ -100,7 +77,7 @@ * @author Ulrich Hilger * @version 1, 13. Mai 2021 */ -public class FileManager extends FileHandler implements ThreadListener { +public class FileManager extends FileHandler { /* private static final String[] specialChars = {new String("\u00c4"), new String("\u00d6"), @@ -128,21 +105,6 @@ public static final String ATTR_ROLE = "role"; - private final List waitingThreads; - private final int maxThreads; - private int threadCount; - //private String role; - - //public FileManager(String absoluteDirectoryPathAndName, String role, String ctx) { - public FileManager() { - //super(absoluteDirectoryPathAndName, ctx); - //super(absoluteDirectoryPathAndName); - waitingThreads = new ArrayList(); - maxThreads = 4; - threadCount = 0; - //this.role = role; - } - @Override public void handle(HttpExchange e) throws IOException { Authenticator a = e.getHttpContext().getAuthenticator(); @@ -156,227 +118,41 @@ HttpHelper helper = new HttpHelper(); switch (method) { case HttpHelper.HTTP_GET: - liste(e, helper); + String path = e.getRequestURI().toString(); + if (path.endsWith(STR_SLASH)) { + String json = new Lister().liste(helper.getFileName(e), + e.getHttpContext().getPath(), + e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), + path); + if(null != json) { + HttpResponder r = new HttpResponder(); + r.antwortSenden(e, SC_OK, json); + } else { + emptyListResponse(e); + } + } else { + new Lister().b64Action(helper.getFileName(e), + e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString()); + super.handle(e); + } break; case HttpHelper.HTTP_PUT: - put(e, helper); + new Writer().put(e, helper); break; case HttpHelper.HTTP_POST: - speichern(e, helper); + new Writer().speichern(e, helper); break; case HttpHelper.HTTP_DELETE: - loeschen(e, helper); + new Writer().loeschen(e, helper); break; } } else { - standardHeaderUndAntwort(e, SC_FORBIDDEN, "Fehlende Rolle."); + new Writer().standardHeaderUndAntwort(e, SC_FORBIDDEN, "Fehlende Rolle."); } } else { - standardHeaderUndAntwort(e, SC_FORBIDDEN, "Fehlende Rolle."); + new Writer().standardHeaderUndAntwort(e, SC_FORBIDDEN, "Fehlende Rolle."); } } - - private void put(HttpExchange exchange, HttpHelper helper) throws IOException { - String query = exchange.getRequestURI().getQuery(); - if (query != null) { - String[] params = query.split("="); - for (String param : params) { - //logger.fine("param: " + param); - } - switch (params[0]) { - case P_COPY: - copyOrMove(exchange, params[1], helper.getFileName(exchange), OP_COPY); - break; - case P_MOVE: - copyOrMove(exchange, params[1], helper.getFileName(exchange), OP_MOVE); - break; - case P_DUPLICATE: - if(Boolean.parseBoolean(params[1])) { - String neuerDateiName = duplizieren(exchange, helper); - //logger.fine("neuer Name: " + neuerDateiName); - standardHeaderUndAntwort(exchange, SC_OK, neuerDateiName); - } - break; - case P_RENAME: - String neuerDateiName = new Renamer().umbenennen(exchange, helper, params[1]); - //logger.fine("neuer Name: " + neuerDateiName); - standardHeaderUndAntwort(exchange, SC_OK, neuerDateiName); - break; - case P_ZIP: - String path = exchange.getRequestURI().toString(); - //logger.fine(path); - String antwort = new Zipper().packFolder(helper.getFileName(exchange), path, exchange.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString()); - if(antwort.equalsIgnoreCase("ok")) { - standardHeaderUndAntwort(exchange, SC_OK, antwort); - } else { - standardHeaderUndAntwort(exchange, SC_UNPROCESSABLE_ENTITY, antwort); - } - break; - case P_UNZIP: - path = exchange.getRequestURI().toString(); - //logger.fine(path); - antwort = new Unzipper().extractZipfile(helper.getFileName(exchange), path, exchange.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString()); - if(antwort.equalsIgnoreCase("ok")) { - standardHeaderUndAntwort(exchange, SC_OK, antwort); - } else { - standardHeaderUndAntwort(exchange, SC_UNPROCESSABLE_ENTITY, antwort); - } - break; - } - } else { - speichern(exchange, helper); - } - } - - public class DirList { - private String pfad; - private List<Datei> dateien; - - public String getPfad() { - return pfad; - } - - public void setPfad(String pfad) { - this.pfad = pfad; - } - - public List<Datei> getDateien() { - return dateien; - } - - public void setDateien(List<Datei> dateien) { - this.dateien = dateien; - } - - - } - - private void liste(HttpExchange e, HttpHelper helper) throws IOException { - String path = e.getRequestURI().toString(); - //logger.fine(path); - String fName = helper.getFileName(e); - String dirListPath = e.getHttpContext().getPath() + fName; - if (path.endsWith(STR_SLASH)) { - //logger.fine("fName: " + fName); - File dir = new File(e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), fName); - //logger.fine("absPath: " + dir.getAbsolutePath()); - File[] files = dir.listFiles(new ImageFileFilter()); - if(files != null && files.length > 0) { - Arrays.sort(files); - ArrayList liste = new ArrayList(); - for (File file : files) { - Datei datei = new Datei(); - String dateiName = file.getName(); - datei.setName(dateiName); - if (file.isDirectory()) { - datei.setTyp(Datei.TYP_ORDNER); - } else { - datei.setTyp(Datei.TYP_DATEI); - } - //datei.setPfad(e.getHttpContext().getPath() + fName); - String lowerName = dateiName.toLowerCase(); - if (lowerName.endsWith(ImageActor.JPEG) - || lowerName.endsWith(ImageActor.JPG) - || lowerName.endsWith(ImageActor.PNG)) { - datei.setBild(true); - String ext = dateiName.substring(dateiName.lastIndexOf(STR_DOT)); - String ohneExt = dateiName.substring(0, dateiName.lastIndexOf(STR_DOT)); - datei.setMiniurl(ohneExt + ImageActor.TN + ext); - buildImgSrc(file, datei, ohneExt, ext); - } - liste.add(datei); - } - while(threadCount > 0) { - try { - Thread.sleep(50); - } catch (InterruptedException ex) { - Logger.getLogger(FileManager.class.getName()).log(Level.SEVERE, null, ex); - } - } - if(liste.size() > 0) { - DirList list = new DirList(); - list.setPfad(dirListPath); - list.setDateien(liste); - Gson gson = new Gson(); - //String json = gson.toJson(liste); - String json = gson.toJson(list); - //byte[] bytes = json.getBytes(); - //logger.fine("json: '" + json + "'"); - HttpResponder r = new HttpResponder(); - r.antwortSenden(e, SC_OK, json); - } else { - emptyListResponse(e); - } - } else { - emptyListResponse(e); - } - } else { - String lowerName = fName.toLowerCase(); - if(lowerName.contains(ImageActor.B64)) { - ImageActor actor = new ImageActor(); - String fromName = fName.replace(ImageActor.B64, ""); - File fromFile = new File(e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), fromName); - File toFile = new File(e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), fName); - //logger.fine("from " + fromFile.getAbsolutePath() + ", to " + toFile.getAbsolutePath()); - if(!toFile.exists()) { - actor.b64Image(fromFile, toFile); - } - super.handle(e); - } else { - super.handle(e); - } - } - } - - // data:[<mime type>][;charset=<Zeichensatz>][;base64],<Daten> - /* - [So. Juni 13 13:23:32 MESZ 2021] FEIN: - file: /home/ulrich/helix-files/bild-test/10419903-14-2-1920-r.jpg, - relname: bild-test/10419903-14-2-1920-r.jpg, ohneExt: 10419903-14-2-1920-r, ext: .jpg (de.uhilger.helix.FileManager buildImgSrc) - - */ - private void buildImgSrc(File file, Datei datei, String ohneExt, String ext) throws IOException { - //logger.fine("file: " + file.getAbsolutePath() + ", ohneExt: " + ohneExt + ", ext: " + ext); - File dir = file.getParentFile(); - String newRelName = ohneExt + ImageActor.TN + ImageActor.B64 + ext; - File b64File = new File(dir, newRelName); - //logger.fine("b64File: " + b64File.getAbsolutePath()); - if(!b64File.exists()) { - //BildErzeuger be = new BildErzeuger(); - //be.bildErzeugen(dir, newRelName, BildErzeuger.TN, 120, b64File); - ImageThread it = new ImageThread(dir, newRelName, ImageActor.TN, 120, b64File, datei, ext); - it.addListener(this); - if(threadCount < maxThreads) { - ++threadCount; - //logger.fine("Thread started, threadCount: " + threadCount); - it.start(); - } else { - waitingThreads.add(it); - //logger.fine("Thread added to wait queue."); - } - } else { - ImageActor be = new ImageActor(); - be.setImgSrc(datei, ext, b64File); - } - } - - @Override - public void finished() { - --threadCount; - //logger.fine("Thread finished, threadCound now: " + threadCount); - if (threadCount < maxThreads) { - if (waitingThreads.size() > 0) { - Object o = waitingThreads.get(0); - if (o instanceof ImageThread) { - waitingThreads.remove(o); - ImageThread it = (ImageThread) o; - ++threadCount; - //logger.fine("Thread started from wait queue, threadCount now: " + threadCount); - it.start(); - } - } - } - } private void emptyListResponse(HttpExchange e) throws IOException { HttpResponder r = new HttpResponder(); @@ -384,176 +160,4 @@ //logger.log(Level.FINE, "json: ''{0}''", json); r.antwortSenden(e, SC_OK, json); } - - private void speichern(HttpExchange exchange, HttpHelper helper) throws IOException { - String fileName = helper.getFileName(exchange); - //logger.info("fileName: " + fileName); - - // file ist die Datei, um die es geht - File file = new File(exchange.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), fileName); - - String method = exchange.getRequestMethod(); - if (fileName.endsWith(STR_SLASH)) { - //logger.info("neuer Ordner: " + file.getAbsolutePath()); - // neuen Ordner erstellen oder ablehnen, wenn der Ordner schon existiert - if (method.equalsIgnoreCase(HttpHelper.HTTP_POST)) { - if (!file.exists()) { - file.mkdir(); - standardHeaderUndAntwort(exchange, SC_OK, file.getAbsolutePath()); - } else { - String antwort = "Ordner existiert bereits."; - standardHeaderUndAntwort(exchange, SC_UNPROCESSABLE_ENTITY, antwort); - } - } else { - String antwort = "PUT fuer neuen Ordner nicht erlaubt, bitte POST verwenden."; - standardHeaderUndAntwort(exchange, SC_METHOD_NOT_ALLOWED, antwort); - } - } else { - //logger.info("Datei speichern: " + file.getAbsolutePath()); - // Datei speichern - if (method.equalsIgnoreCase(HttpHelper.HTTP_POST)) { - if (file.exists()) { - FileTransporter trans = new FileTransporter(); - file = trans.getNewFileName(file); - } - } else if (method.equalsIgnoreCase(HttpHelper.HTTP_PUT)) { - if (file.exists()) { - /* - muss delete() sein? - pruefen: ueberschreibt der FileWriter den alteen Inhalt oder - entsteht eine unerwuenschte Mischung aus altem und neuem - Inhalt? - */ - file.delete(); - } else { - file.getParentFile().mkdirs(); - } - } - // Request Body mit dem Dateiinhalt in einen String lesen - StringBuilder sb = new StringBuilder(); - InputStream is = exchange.getRequestBody(); - BufferedReader in = new BufferedReader(new InputStreamReader(is)); - String line = in.readLine(); - while (line != null) { - sb.append(line); - line = in.readLine(); - } - - // dekodieren - String content = sb.toString(); - //logger.fine(content); - String decoded = URLDecoder.decode(content, UTF8); - //logger.fine(decoded); - - // in Datei schreiben - byte[] bytes = decoded.getBytes(); - file.createNewFile(); - OutputStream os = new FileOutputStream(file); - os.write(bytes); - os.flush(); - os.close(); - is.close(); - - // Antwort senden - standardHeaderUndAntwort(exchange, SC_OK, file.getAbsolutePath()); - } - } - - private void copyOrMove(HttpExchange exchange, String quelle, String ziel, int op) throws IOException { - //logger.fine("quelle: " + quelle + ", ziel: " + ziel); - String[] dateiNamen = dateiliste(exchange); - copyOrMoveFiles(quelle, ziel, dateiNamen, op, exchange); - standardHeaderUndAntwort(exchange, SC_OK, "Dateien verarbeitet."); - } - - private String copyOrMoveFiles(String fromPath, String toPath, String[] fileNames, int operation, HttpExchange e) throws IOException { - String result = null; - File srcDir = new File(e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), fromPath); - File targetDir = new File(e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), toPath); - for (String fileName : fileNames) { - File srcFile = new File(srcDir, fileName); - //logger.fine("srcFile: " + srcFile); - if (srcFile.isDirectory()) { - //logger.fine("srcFile is directory."); - OrdnerBearbeiter bearbeiter = new OrdnerBearbeiter(); - bearbeiter.setTargetDir(targetDir.toPath()); - bearbeiter.setOperation(operation); - Files.walkFileTree(srcFile.toPath(), bearbeiter); - } else { - Path source = srcFile.toPath(); - File destFile = targetDir.toPath().resolve(source.getFileName()).toFile(); - if (destFile.exists()) { - FileTransporter trans = new FileTransporter(); - destFile = trans.getNewFileName(destFile); - } - if (operation == OP_MOVE) { - String fname = srcFile.getName().toLowerCase(); - if (fname.endsWith(ImageActor.JPEG) - || fname.endsWith(ImageActor.JPG) - || fname.endsWith(ImageActor.PNG)) { - moveImgFilesToDirectory(srcFile, srcDir, targetDir, false); - } else { - Files.move(source, destFile.toPath()); - } - } else { - Files.copy(source, destFile.toPath()); - } - } - } - return result; - } - - private void loeschen(HttpExchange exchange, HttpHelper helper) throws IOException { - String[] dateiNamen = dateiliste(exchange); - String relPfad = helper.getFileName(exchange); - new Eraser().deleteFiles(relPfad, Arrays.asList(dateiNamen), exchange.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString()); - standardHeaderUndAntwort(exchange, SC_OK, "Dateien geloescht."); - } - - private String[] dateiliste(HttpExchange exchange) throws IOException { - String body = new HttpHelper().bodyLesen(exchange); - //logger.fine("dateien: " + body); - Gson gson = new Gson(); - return gson.fromJson(body, String[].class); - } - - public String duplizieren(HttpExchange exchange, HttpHelper helper) throws IOException { - String relPfad = helper.getFileName(exchange); - File srcFile = new File(exchange.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), relPfad); - String fnameext = srcFile.getName(); - int dotpos = fnameext.lastIndexOf(STR_DOT); - String fname = fnameext.substring(0, dotpos); - String ext = fnameext.substring(dotpos); - File srcDir = srcFile.getParentFile(); - File destFile = new File(srcDir, fname + "-Kopie" + ext); - int i = 1; - while (destFile.exists()) { - destFile = new File(srcDir, fname + "-Kopie-" + Integer.toString(++i) + ext); - } - Files.copy(srcFile.toPath(), destFile.toPath()); - return destFile.getName(); - } - - - private void moveImgFilesToDirectory(File srcFile, File srcDir, File targetDir, boolean createDestDir) throws IOException { - String fnameext = srcFile.getName(); - int dotpos = fnameext.lastIndexOf(STR_DOT); - String fname = fnameext.substring(0, dotpos); - String ext = fnameext.substring(dotpos); - //logger.fine("fname: " + fname + ", ext: " + ext); - Path targetPath = targetDir.toPath(); - DirectoryStream<Path> stream = Files.newDirectoryStream(srcDir.toPath(), fname + "*" + ext); //"*.{txt,doc,pdf,ppt}" - for (Path path : stream) { - //logger.fine(path.getFileName().toString()); - //Files.delete(path); - Files.move(path, targetPath.resolve(path.getFileName())); - } - stream.close(); - } - - private void standardHeaderUndAntwort(HttpExchange exchange, int status, String antwort) throws IOException { - Headers resHeaders = exchange.getResponseHeaders(); - resHeaders.add(CONTENT_TYPE, HttpHelper.CT_TEXT_HTML); - new HttpResponder().antwortSenden(exchange, status, antwort); - } } -- Gitblit v1.9.3