From e2f0bbb60123a12b84d86062789c2fb605f37dba Mon Sep 17 00:00:00 2001
From: ulrich <undisclosed>
Date: Tue, 03 Apr 2018 16:45:08 +0000
Subject: [PATCH] collectFiles als API-Methode hinzugefuegt

---
 src/java/de/uhilger/filecms/api/FileMgr.java |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 160 insertions(+), 1 deletions(-)

diff --git a/src/java/de/uhilger/filecms/api/FileMgr.java b/src/java/de/uhilger/filecms/api/FileMgr.java
index 2b8b985..c2a26a5 100644
--- a/src/java/de/uhilger/filecms/api/FileMgr.java
+++ b/src/java/de/uhilger/filecms/api/FileMgr.java
@@ -19,10 +19,14 @@
 package de.uhilger.filecms.api;
 
 import de.uhilger.filecms.data.FileRef;
+import de.uhilger.filecms.data.Inhalt;
 import de.uhilger.filecms.pub.AbstractComparator;
 import de.uhilger.filecms.pub.FileNameComparator;
 import de.uhilger.wbx.Bild;
+import de.uhilger.wbx.WbxUtils;
+import static de.uhilger.wbx.web.FeedServlet.WBX_FILE_BASE;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
@@ -38,8 +42,11 @@
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+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;
 import net.coobird.thumbnailator.Thumbnails;
 import org.apache.commons.io.FileUtils;
 
@@ -139,7 +146,70 @@
     }
     return files;
   }
-  
+ 
+  /**
+   * Wie list nur mit drill down
+   * 
+   * TODO '/data' muss noch variabel gestaltet werden
+   * 
+   * @param relativePath
+   * @param maxTiefe
+   * @param maxAnzahl
+   * @return 
+   */
+  /*
+    Beispiel
+    http://localhost:8097/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&m=collectFiles&p=/data/admin/journal/&p=2&p=200&f=JSONNICE
+  */
+  public List<Inhalt> collectFiles(String relativePath, int maxTiefe, int maxAnzahl) {
+    Bild bild = new Bild();
+    WbxUtils wu = new WbxUtils();
+    String basis = wu.getJNDIParameter(WBX_FILE_BASE, WbxUtils.EMPTY_STRING);
+    String pubDirName = wu.getJNDIParameter(WbxUtils.WBX_PUB_DIR_NAME, WbxUtils.WBX_DEFAULT_PUB_DIR_NAME);
+    String relPath = relativePath.replace("/data", pubDirName);
+    String absPath = basis + relPath;
+    
+    ArrayList beitraege = new ArrayList();
+    ArrayList<Inhalt> files = new ArrayList<>();
+    wu.collectFiles(new File(absPath), 0, beitraege, maxTiefe, maxAnzahl);
+
+    Iterator i = beitraege.iterator();
+    while(i.hasNext()) {
+      File beitrag = (File) i.next();
+      Inhalt cont = new Inhalt();
+      cont.setMimetype(bild.getMimeType(beitrag));
+      cont.setIsDirectory(beitrag.isDirectory());
+      cont.setIsHidden(beitrag.isHidden());
+      cont.setLastModified(beitrag.lastModified());
+      cont.setLength(beitrag.length());
+      
+      /*
+        den 'https://..'-Teil bis vor dem 
+        ContextPath ermitteln
+      */
+      StringBuffer requestUrl = getRequest().getRequestURL();
+      String contextPath = getRequest().getContextPath();
+      int pos = requestUrl.indexOf(contextPath);
+      
+      /*
+        den Teil des Pfades ermitteln, der zwischen dem 
+        ContextPath zum oeffentlichen Ordner und dem Dateiname 
+        steht
+      */
+      String absolutePath = beitrag.getAbsolutePath();
+      absolutePath = absolutePath.replace(beitrag.getName(), "");
+      absolutePath = absolutePath.replace(pubDirName, "");
+      String part = relativePath.replace("/data", "");
+      int pos2 = absolutePath.indexOf(part);
+      String mittelteil = absolutePath.substring(pos2);
+      mittelteil = mittelteil.replace(part, "");
+      cont.setBase(requestUrl.substring(0, pos));
+      
+      cont.setUrl(/*requestUrl.substring(0, pos) + "/data" + */ mittelteil + beitrag.getName());
+      files.add(cont);
+    }
+    return files;
+  } 
   
   public FileRef newFolder(String relPath, String folderName) {
     if (!relPath.startsWith(".")) {
@@ -447,6 +517,9 @@
       return "Pfad micht erlaubt.";
     }
   }
+  
+  /* --------- ZIP entpacken ---------------- */
+  
   public String extractZipfile(String relPath, String filename) {
     String result = null;
     if (!relPath.startsWith(".")) {    
@@ -511,6 +584,92 @@
 		}
 	}
 
+  /* ------------- Ornder als ZIP packen --------------- */
+  
+  public String packFolder(String relPath) {
+    if (!relPath.startsWith(".")) {    
+      try {
+        File targetDir = getTargetDir(relPath);
+        File parentDir = targetDir.getParentFile();
+        StringBuffer fname = new StringBuffer();
+        fname.append(targetDir.getName());
+        fname.append(".zip");
+        File archiveFile = new File(parentDir, fname.toString());
+        FileRef folderToPack = new FileRef(targetDir.getAbsolutePath());
+        FileRef archive = new FileRef(archiveFile.getAbsolutePath());
+        pack(folderToPack, archive);
+        return "ok";
+      } 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  the folder to pack
+	 * @param archive  the archive to create from the given files
+	 * @throws Exception
+	 */
+	private boolean pack(FileRef folder, FileRef archive) throws Exception {
+		File file = new File(archive.getAbsolutePath());
+		FileOutputStream fos = new FileOutputStream(file);
+		CheckedOutputStream checksum = new CheckedOutputStream(fos, new Adler32());
+		ZipOutputStream zos = new ZipOutputStream(checksum);
+		pack(zos, folder.getAbsolutePath(), "");
+		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();
+	}
+
   
 
   /* ---- Hilfsfunktionen ---- */

--
Gitblit v1.9.3