From 020a97355fdd8133da6cfd490b7b1e9618a1eb06 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Mon, 15 Jan 2024 16:34:39 +0000
Subject: [PATCH] Packen von FileManager in Klasse Zipper, Entpacken in Unzipper verlegt

---
 src/de/uhilger/httpserver/cm/Zipper.java      |  128 ++++++++++++++++++
 src/de/uhilger/httpserver/cm/Unzipper.java    |   87 ++++++++++++
 src/de/uhilger/httpserver/cm/FileManager.java |  189 --------------------------
 3 files changed, 217 insertions(+), 187 deletions(-)

diff --git a/src/de/uhilger/httpserver/cm/FileManager.java b/src/de/uhilger/httpserver/cm/FileManager.java
index bef1009..ea70988 100644
--- a/src/de/uhilger/httpserver/cm/FileManager.java
+++ b/src/de/uhilger/httpserver/cm/FileManager.java
@@ -31,7 +31,6 @@
 import de.uhilger.httpserver.oauth.BearerAuthenticator;
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -43,15 +42,9 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Enumeration;
 import java.util.List;
 import java.util.logging.Logger;
 import java.util.logging.Level;
-import java.util.zip.Adler32;
-import java.util.zip.CheckedOutputStream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import java.util.zip.ZipOutputStream;
 
 /**
  * <p>Der FileManager verknuepft einen HTTP-Endpunkt mit einem Ordner des lokalen
@@ -208,7 +201,7 @@
         case P_ZIP:
           String path = exchange.getRequestURI().toString();
           //logger.fine(path);
-          String antwort = packFolder(helper.getFileName(exchange), path, exchange);
+          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 {
@@ -218,7 +211,7 @@
         case P_UNZIP:
           path = exchange.getRequestURI().toString();
           //logger.fine(path);
-          antwort = extractZipfile(helper.getFileName(exchange), path, exchange);
+          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 {
@@ -667,185 +660,7 @@
     new HttpResponder().antwortSenden(exchange, status, antwort);
   }  
   
-  /* --------- ZIP entpacken ---------------- */
-  
-  public String extractZipfile(String fName, String relPath, HttpExchange e) {  
-    //logger.fine("fName: " + fName + ", relPath: " + relPath);
-    String result = null;
-    if (!relPath.startsWith(".")) {    
-      try {
-        //File targetDir = new File(fileBase, relPath);
-        //File targetDir = getTargetDir(relPath);
-        File archive = new File(e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), fName);
-        if(extract(archive)) {
-          result = "ok";
-        } else {
-          result = "error while extracting";
-        }
-      } catch(Exception ex) {
-        result = ex.getLocalizedMessage();
-        //logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
-      }
-    } else {
-      result = "Falsche relative Pfadangabe.";
-    }
-    return result;
-  }
-  
-  /**
-	 * extract a given ZIP archive to the folder respective archive resides in
-	 * @param archive  the archive to extract
-	 * @throws Exception
-	 */
-	private boolean extract(File archive) throws Exception {
-		ZipFile zipfile = new ZipFile(archive);
-		Enumeration en = zipfile.entries();
-		while(en.hasMoreElements()) {
-			ZipEntry zipentry = (ZipEntry) en.nextElement();
-			unzip(zipfile, zipentry, archive.getParent());
-		}
-		zipfile.close();
-		return true;
-	}
 
-	/**
-	 * unzip a given entry of a given zip file to a given location
-	 * @param zipfile  the zip file to read an entry from
-	 * @param zipentry  the zip entry to read
-	 * @param destPath  the path to the destination location for the extracted content
-	 * @throws IOException
-	 */
-	private void unzip(ZipFile zipfile, ZipEntry zipentry, String destPath) throws IOException {
-		byte buf[] = new byte[1024];
-		InputStream is = zipfile.getInputStream(zipentry);
-		String outFileName = destPath + File.separator + zipentry.getName();
-		File file = new File(outFileName);
-		if(!zipentry.isDirectory()) {
-			file.getParentFile().mkdirs();
-			if(!file.exists())
-				file.createNewFile();
-			FileOutputStream fos = new FileOutputStream(file);
-			int i = is.read(buf, 0, 1024);
-			while(i > -1) {
-				fos.write(buf, 0, i);
-				i = is.read(buf, 0, 1024);
-			}
-			fos.close();
-			is.close();
-		} else {
-			file.mkdirs();
-		}
-	}
-
-  /* --------------- Ordner packen ----------------- */
-
-  /**
-   * Einen Ordner packen.
-   * 
-   * Als Ziel wird eine neue Datei mit Dateiendung '.zip' erzeugt, die so 
-   * heisst wie der Ordner, der gapckt werden soll. Die Datei mit 
-   * dem gepackten Ordnerinhalt wird in dem Ordner angelegt, der den zu 
-   * packenden Ordner enthaelt.
-   * 
-   * @param fName  Name des zu packenden Ordners
-   * @param relPath  relativer Pfad zum Ordner, der gepackt werden soll  
-   * @return die Meldung mit dem Ergebnis. Wenn die Meldung nicht "ok" lautet
-   * wurde die ZIP-Datei nicht erzeugt und die Meldung nennt den Grund.
-   */
-  public String packFolder(String fName, String relPath, HttpExchange e) {
-    if (!relPath.startsWith(".")) {    
-      try {        
-        //String fName = getFileName(e);
-        //logger.fine("fName: " + fName);
-        if (fName.endsWith(STR_SLASH)) {
-          File dir = new File(e.getHttpContext().getAttributes().get(FileHandler.ATTR_FILE_BASE).toString(), fName);
-          if(dir.isDirectory()) {
-            //logger.fine("absPath: " + dir.getAbsolutePath());
-            File parentDir = dir.getParentFile();
-            StringBuilder fname = new StringBuilder();
-            fname.append(dir.getName());
-            fname.append(".zip");
-            File archiveFile = new File(parentDir, fname.toString());
-            pack(dir.getAbsolutePath(), archiveFile.getAbsolutePath());
-            return "ok";
-          } else {
-            return "kein Ordner";
-          }
-        } else {
-          return "kein Ordner";
-        }
-      } catch(Exception ex) {
-        String result = ex.getLocalizedMessage();
-        //logger.log(Level.SEVERE, result, ex);
-        return result;
-      }
-    } else {
-      return "Falsche relative Pfadangabe";
-    }
-  }
-  
-	/**
-	 * pack the contents of a given folder into a new ZIP compressed archive
-	 * @param folder  absolute path and name of the folder to pack
-	 * @param archive  absolute path and name of the archive to create from the given files
-	 * @throws Exception
-	 */
-	private boolean pack(String folder, String archive) throws Exception {
-		File file = new File(archive);
-		FileOutputStream fos = new FileOutputStream(file);
-		CheckedOutputStream checksum = new CheckedOutputStream(fos, new Adler32());
-		ZipOutputStream zos = new ZipOutputStream(checksum);
-		pack(zos, folder, "");
-		zos.flush();
-		zos.finish();
-		zos.close();
-		fos.flush();
-		fos.close();
-		return true;
-	}
-
-	/**
-	 * go through the given file structure recursively
-	 * @param zipFile  the ZIP file to write to
-	 * @param srcDir  the directory to pack during this cycle
-	 * @param subDir  the subdirectory to append to names of file entries inside the archive
-	 * @throws IOException
-	 */
-	private void pack(ZipOutputStream zipFile, String srcDir, String subDir) throws IOException {
-		File[] files = new File(srcDir).listFiles();
-		for(int i = 0; i < files.length; i++) {
-			if(files[i].isDirectory()) {
-				pack(zipFile, files[i].getAbsolutePath(), subDir + File.separator + files[i].getName());
-			}
-			else {
-				packFile(zipFile, subDir, files[i]);
-			}
-		}
-	}
-
-	/**
-	 * pack a given file
-	 * @param zipFile  the ZIP archive to pack to
-	 * @param dir  the directory name to append to name of file entry inside archive
-	 * @param file  the file to pack
-	 * @throws IOException
-	 */
-	private void packFile(ZipOutputStream zipFile, String dir, File file) throws IOException
-	{
-		FileInputStream fileinputstream = new FileInputStream(file);
-		byte buf[] = new byte[fileinputstream.available()];
-		fileinputstream.read(buf);
-		String dirWithSlashes = dir.replace('\\', '/');
-		//System.out.println("zipping " + dirWithSlashes + "/" + file.getName());
-		ZipEntry ze = new ZipEntry(dirWithSlashes + "/" + file.getName());
-		ze.setMethod(ZipEntry.DEFLATED);
-		zipFile.putNextEntry(ze);
-		zipFile.write(buf, 0, buf.length);
-		zipFile.closeEntry();
-		fileinputstream.close();
-	}
-
-    
   
   
 }
diff --git a/src/de/uhilger/httpserver/cm/Unzipper.java b/src/de/uhilger/httpserver/cm/Unzipper.java
new file mode 100644
index 0000000..f47b44d
--- /dev/null
+++ b/src/de/uhilger/httpserver/cm/Unzipper.java
@@ -0,0 +1,87 @@
+package de.uhilger.httpserver.cm;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+/**
+ *
+ * @author ulli
+ */
+public class Unzipper {
+  /* --------- ZIP entpacken ---------------- */
+  
+  public String extractZipfile(String fName, String relPath, String base) {  
+    //logger.fine("fName: " + fName + ", relPath: " + relPath);
+    String result = null;
+    if (!relPath.startsWith(".")) {    
+      try {
+        //File targetDir = new File(fileBase, relPath);
+        //File targetDir = getTargetDir(relPath);
+        File archive = new File(base, fName);
+        if(extract(archive)) {
+          result = "ok";
+        } else {
+          result = "error while extracting";
+        }
+      } catch(Exception ex) {
+        result = ex.getLocalizedMessage();
+        //logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
+      }
+    } else {
+      result = "Falsche relative Pfadangabe.";
+    }
+    return result;
+  }
+  
+  /**
+	 * extract a given ZIP archive to the folder respective archive resides in
+	 * @param archive  the archive to extract
+	 * @throws Exception
+	 */
+	private boolean extract(File archive) throws Exception {
+		ZipFile zipfile = new ZipFile(archive);
+		Enumeration en = zipfile.entries();
+		while(en.hasMoreElements()) {
+			ZipEntry zipentry = (ZipEntry) en.nextElement();
+			unzip(zipfile, zipentry, archive.getParent());
+		}
+		zipfile.close();
+		return true;
+	}
+
+	/**
+	 * unzip a given entry of a given zip file to a given location
+	 * @param zipfile  the zip file to read an entry from
+	 * @param zipentry  the zip entry to read
+	 * @param destPath  the path to the destination location for the extracted content
+	 * @throws IOException
+	 */
+	private void unzip(ZipFile zipfile, ZipEntry zipentry, String destPath) throws IOException {
+		byte buf[] = new byte[1024];
+		InputStream is = zipfile.getInputStream(zipentry);
+		String outFileName = destPath + File.separator + zipentry.getName();
+		File file = new File(outFileName);
+		if(!zipentry.isDirectory()) {
+			file.getParentFile().mkdirs();
+			if(!file.exists())
+				file.createNewFile();
+			FileOutputStream fos = new FileOutputStream(file);
+			int i = is.read(buf, 0, 1024);
+			while(i > -1) {
+				fos.write(buf, 0, i);
+				i = is.read(buf, 0, 1024);
+			}
+			fos.close();
+			is.close();
+		} else {
+			file.mkdirs();
+		}
+	}
+
+  
+}
diff --git a/src/de/uhilger/httpserver/cm/Zipper.java b/src/de/uhilger/httpserver/cm/Zipper.java
new file mode 100644
index 0000000..f806864
--- /dev/null
+++ b/src/de/uhilger/httpserver/cm/Zipper.java
@@ -0,0 +1,128 @@
+package de.uhilger.httpserver.cm;
+
+import static de.uhilger.httpserver.cm.FileManager.STR_SLASH;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.Adler32;
+import java.util.zip.CheckedOutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+/**
+ *
+ * @author ulli
+ */
+public class Zipper {
+
+  /* --------------- Ordner packen ----------------- */
+
+  /**
+   * Einen Ordner packen.
+   * 
+   * Als Ziel wird eine neue Datei mit Dateiendung '.zip' erzeugt, die so 
+   * heisst wie der Ordner, der gapckt werden soll. Die Datei mit 
+   * dem gepackten Ordnerinhalt wird in dem Ordner angelegt, der den zu 
+   * packenden Ordner enthaelt.
+   * 
+   * @param fName  Name des zu packenden Ordners
+   * @param relPath  relativer Pfad zum Ordner, der gepackt werden soll  
+   * @return die Meldung mit dem Ergebnis. Wenn die Meldung nicht "ok" lautet
+   * wurde die ZIP-Datei nicht erzeugt und die Meldung nennt den Grund.
+   */
+  public String packFolder(String fName, String relPath, String base/*, HttpExchange e*/) {
+    if (!relPath.startsWith(".")) {    
+      try {        
+        //String fName = getFileName(e);
+        //logger.fine("fName: " + fName);
+        if (fName.endsWith(STR_SLASH)) {
+          File dir = new File(base, fName);
+          if(dir.isDirectory()) {
+            //logger.fine("absPath: " + dir.getAbsolutePath());
+            File parentDir = dir.getParentFile();
+            StringBuilder fname = new StringBuilder();
+            fname.append(dir.getName());
+            fname.append(".zip");
+            File archiveFile = new File(parentDir, fname.toString());
+            pack(dir.getAbsolutePath(), archiveFile.getAbsolutePath());
+            return "ok";
+          } else {
+            return "kein Ordner";
+          }
+        } else {
+          return "kein Ordner";
+        }
+      } catch(Exception ex) {
+        String result = ex.getLocalizedMessage();
+        //logger.log(Level.SEVERE, result, ex);
+        return result;
+      }
+    } else {
+      return "Falsche relative Pfadangabe";
+    }
+  }
+  
+	/**
+	 * pack the contents of a given folder into a new ZIP compressed archive
+	 * @param folder  absolute path and name of the folder to pack
+	 * @param archive  absolute path and name of the archive to create from the given files
+	 * @throws Exception
+	 */
+	private boolean pack(String folder, String archive) throws Exception {
+		File file = new File(archive);
+		FileOutputStream fos = new FileOutputStream(file);
+		CheckedOutputStream checksum = new CheckedOutputStream(fos, new Adler32());
+		ZipOutputStream zos = new ZipOutputStream(checksum);
+		pack(zos, folder, "");
+		zos.flush();
+		zos.finish();
+		zos.close();
+		fos.flush();
+		fos.close();
+		return true;
+	}
+
+	/**
+	 * go through the given file structure recursively
+	 * @param zipFile  the ZIP file to write to
+	 * @param srcDir  the directory to pack during this cycle
+	 * @param subDir  the subdirectory to append to names of file entries inside the archive
+	 * @throws IOException
+	 */
+	private void pack(ZipOutputStream zipFile, String srcDir, String subDir) throws IOException {
+		File[] files = new File(srcDir).listFiles();
+		for(int i = 0; i < files.length; i++) {
+			if(files[i].isDirectory()) {
+				pack(zipFile, files[i].getAbsolutePath(), subDir + File.separator + files[i].getName());
+			}
+			else {
+				packFile(zipFile, subDir, files[i]);
+			}
+		}
+	}
+
+	/**
+	 * pack a given file
+	 * @param zipFile  the ZIP archive to pack to
+	 * @param dir  the directory name to append to name of file entry inside archive
+	 * @param file  the file to pack
+	 * @throws IOException
+	 */
+	private void packFile(ZipOutputStream zipFile, String dir, File file) throws IOException
+	{
+		FileInputStream fileinputstream = new FileInputStream(file);
+		byte buf[] = new byte[fileinputstream.available()];
+		fileinputstream.read(buf);
+		String dirWithSlashes = dir.replace('\\', '/');
+		//System.out.println("zipping " + dirWithSlashes + "/" + file.getName());
+		ZipEntry ze = new ZipEntry(dirWithSlashes + "/" + file.getName());
+		ze.setMethod(ZipEntry.DEFLATED);
+		zipFile.putNextEntry(ze);
+		zipFile.write(buf, 0, buf.length);
+		zipFile.closeEntry();
+		fileinputstream.close();
+	}
+
+      
+}

--
Gitblit v1.9.3