Dateiverwaltung für die WebBox
ulrich
2018-03-03 968b07dace8f64519eaf2455729d87b66678d958
commit | author | age
8931b7 1 /*
U 2     Dateiverwaltung - File management in your browser
3     Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
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 <http://www.gnu.org/licenses/>.
17 */
18
c7c502 19 package de.uhilger.filecms.api;
U 20
6e70be 21 import de.uhilger.filecms.data.Bild;
U 22 import de.uhilger.filecms.data.FileRef;
d14d78 23 import de.uhilger.filecms.pub.AbstractComparator;
U 24 import de.uhilger.filecms.pub.FileNameComparator;
438b16 25 import java.awt.Container;
U 26 import java.awt.Image;
27 import java.awt.MediaTracker;
28 import java.awt.Toolkit;
8e51b7 29 import java.io.File;
3ad4db 30 import java.io.FileNotFoundException;
6bd2c1 31 import java.io.FileOutputStream;
3ad4db 32 import java.io.FileReader;
e5ff42 33 import java.io.FileWriter;
U 34 import java.io.IOException;
6bd2c1 35 import java.io.InputStream;
fab80c 36 import java.io.Reader;
e5ff42 37 import java.security.Principal;
7342b1 38 import java.util.ArrayList;
d14d78 39 import java.util.Arrays;
6bd2c1 40 import java.util.Enumeration;
5bfd34 41 import java.util.Iterator;
7342b1 42 import java.util.List;
e5ff42 43 import java.util.logging.Level;
8e51b7 44 import java.util.logging.Logger;
6bd2c1 45 import java.util.zip.ZipEntry;
U 46 import java.util.zip.ZipFile;
5bfd34 47 import org.apache.commons.io.FileUtils;
c7c502 48
U 49 /**
fafe1b 50  * Methoden zur Verwaltung von Dateien
c7c502 51  */
8931b7 52 public class FileMgr extends Api {
8e51b7 53   private static final Logger logger = Logger.getLogger(FileMgr.class.getName());
c7c502 54   
972e94 55   
9e2964 56   public static final int OP_COPY = 1;
U 57   public static final int OP_MOVE = 2;
58   
ea7193 59   public String hallo() {
U 60     return "Hallo Welt!";
61   }
62   
1f550a 63   /**
U 64    * Inhalte der WebBox listen. Hier wird nur der relative Pfad 
65    * ausgehend von www oder home ausgegeben sowie zudem ausgehend 
66    * von $daten und $basis, sofern der Benutzer die Rolle wbxAdmin hat.
67    * 
68    * Andere Inhalte werden nicht ausgegeben.
69    * 
70    * @param relPath
71    * @return 
72    */
7342b1 73   public List<FileRef> list(String relPath) {
d14d78 74     return listInt(relPath, "name", AbstractComparator.ORDER_ASC);
U 75   }
76   
77   public List<FileRef> listOrdered(String relPath, String orderBy, String order) {
78     return listInt(relPath, orderBy, order);
79   }
80   
81   /**
82    * Inhalte der WebBox listen. Hier wird nur der relative Pfad 
83    * ausgehend von www oder home ausgegeben sowie zudem ausgehend 
84    * von $daten und $basis, sofern der Benutzer die Rolle wbxAdmin hat.
85    * 
86    * Andere Inhalte werden nicht ausgegeben.
87    * 
88    * @param relPath
89    * @param orderBy 'name'
90    * @param order AbstractComparator.ORDER_ASC oder AbstractComparator.ORDER_DESC
91    * @return 
92    */
93   private List<FileRef> listInt(String relPath, String orderBy, String order) {
f7d8bf 94     Bild bild = new Bild();
5dfab6 95     List<FileRef> files = new ArrayList();
7342b1 96     if(relPath.length() == 0) {
2121cc 97       FileRef namedPublicFolder = new FileRef(PUB_DIR_NAME, true);
5dfab6 98       logger.finer(namedPublicFolder.getAbsolutePath());
2121cc 99       FileRef namedHomeFolder = new FileRef(HOME_DIR_NAME, true);
5dfab6 100       logger.finer(namedHomeFolder.getAbsolutePath());
968b07 101       FileRef namedDavFolder = new FileRef(DAV_DIR_NAME, true);
U 102       logger.finer(namedDavFolder.getAbsolutePath());
2121cc 103       files = new ArrayList();
7342b1 104       files.add(namedHomeFolder);
1f550a 105       files.add(namedPublicFolder);      
968b07 106       files.add(namedDavFolder);      
1f550a 107       if(getRequest().isUserInRole(WBX_ADMIN_ROLE)) {
U 108         FileRef namedBaseFolder = new FileRef(WBX_BASE, true);
109         FileRef namedDataFolder = new FileRef(WBX_DATA, true);
110         files.add(namedBaseFolder);
111         files.add(namedDataFolder);
112       }      
ea7193 113     } else {
2121cc 114       String path = getTargetDir(relPath).getAbsolutePath();
5bfd34 115       logger.fine("listing path: " + path);
U 116       File dir = new File(path);
117       if(dir.exists()) {
118         File[] fileArray = dir.listFiles();
d14d78 119         if(orderBy != null && orderBy.equalsIgnoreCase("name")) {
U 120           Arrays.sort(fileArray, new FileNameComparator(order));
121         } else {
122           Arrays.sort(fileArray, new FileNameComparator(AbstractComparator.ORDER_ASC));          
123         }
5bfd34 124         for(int i = 0; i < fileArray.length; i++) {
U 125           logger.fine(fileArray[i].toURI().toString());
126           String fname = fileArray[i].toURI().toString().replace("file:/", "");
127           if(fileArray[i].isDirectory()) {
128             fname = fname.substring(0, fname.length() - 1);
129           }
130           logger.fine(fname);
f7d8bf 131           FileRef ref = new FileRef(fname, fileArray[i].isDirectory());
U 132           ref.setMimetype(bild.getMimeType(fileArray[i]));
133           files.add(ref);
5bfd34 134         }
5dfab6 135       }
c509a0 136     }    
7342b1 137     return files;
2121cc 138   }
U 139   
d14d78 140   
c509a0 141   public FileRef newFolder(String relPath, String folderName) {
U 142     logger.finer(relPath);
143     String targetPath = null;
144     if(relPath.startsWith(PUB_DIR_NAME)) {
145       targetPath = PUB_DIR_PATH + getUserName() + "/" + relPath.substring(PUB_DIR_NAME.length()) + "/" + folderName;
146     } else if(relPath.startsWith(HOME_DIR_NAME)) {
147       targetPath = HOME_DIR_PATH + getUserName() + "/" + relPath.substring(HOME_DIR_NAME.length()) + "/" + folderName;
148     } else {
149       // kann eigentlich nicht sein..
150     }
151     logger.finer(targetPath);
152     File targetDir = new File(getBase().getAbsolutePath(), targetPath);
153     targetDir.mkdirs();
154     return new FileRef(targetDir.getAbsolutePath(), true);
5dfab6 155   }
U 156   
3ad4db 157   public String getCode(String relPath, String fileName) {
U 158     String code = null;
159     
160     Object p = getRequest().getUserPrincipal();
161     if(p instanceof Principal) {
fab80c 162       Reader reader = null;
3ad4db 163       try {
U 164         File targetFile = new File(getTargetDir(relPath), fileName);
fab80c 165         
U 166         //reader = new InputStreamReader(new FileInputStream(targetFile), "UTF8");
167         
3ad4db 168         reader = new FileReader(targetFile);
U 169         StringBuffer buf = new StringBuffer();
170         char[] readBuffer = new char[1024];
171         int charsRead = reader.read(readBuffer);
172         while(charsRead > -1) {
173           buf.append(readBuffer, 0, charsRead);
174           charsRead = reader.read(readBuffer);
175         }
176         code = buf.toString();
177       } catch (FileNotFoundException ex) {
178         Logger.getLogger(FileMgr.class.getName()).log(Level.SEVERE, null, ex);
179       } catch (IOException ex) {
180         Logger.getLogger(FileMgr.class.getName()).log(Level.SEVERE, null, ex);
181       } finally {
182         try {
183           reader.close();
184         } catch (IOException ex) {
185           Logger.getLogger(FileMgr.class.getName()).log(Level.SEVERE, null, ex);
186         }
187       }
188       
189     }    
190     
191     return code;
192   }
193   
663ee9 194   public String renameFile(String relPath, String fname, String newName) {
U 195     File targetDir = getTargetDir(relPath);
196     File file = new File(targetDir, fname);
197     file.renameTo(new File(targetDir, newName));
198     return fname + " umbenannt zu " + newName;
199   }
200   
fc1897 201   public String deleteFiles(String relPath, List fileNames) {
U 202     String result = null;
203     try {
204       logger.fine(fileNames.toString());
205       File targetDir = getTargetDir(relPath);
206       for(int i=0; i < fileNames.size(); i++) {
207         Object o = fileNames.get(i);
208         if(o instanceof ArrayList) {
209           ArrayList al = (ArrayList) o;
210           logger.fine(al.get(0).toString());
211           File targetFile = new File(targetDir, al.get(0).toString());
212           logger.fine(targetFile.getAbsolutePath());
5bfd34 213           if(targetFile.isDirectory()) {
U 214             FileUtils.deleteDirectory(targetFile);
215           } else {
216             targetFile.delete();
217           }
fc1897 218         }
U 219       }
220       result = "deleted";
221     } catch (Throwable ex) {
222       logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
223     }
224     return result;
225   }
226   
9e2964 227   public String copyFiles(String fromPath, String toPath, List fileNames) {
fab629 228     return copyOrMoveFiles(fromPath, toPath, fileNames, OP_COPY);
9e2964 229   }
U 230   
231   public String moveFiles(String fromPath, String toPath, List fileNames) {
fab629 232     return copyOrMoveFiles(fromPath, toPath, fileNames, OP_MOVE);
U 233   }
234   
235   private String copyOrMoveFiles(String fromPath, String toPath, List fileNames, int operation) {
5bfd34 236     String result = null;
U 237     try {
238       File srcDir = getTargetDir(fromPath);
239       File targetDir = getTargetDir(toPath);
240       Iterator i = fileNames.iterator();
241       while(i.hasNext()) {
242         Object o = i.next();
243         if (o instanceof ArrayList) {
244           ArrayList al = (ArrayList) o;
245           File srcFile = new File(srcDir, al.get(0).toString());
246           if(srcFile.isDirectory()) {
fab629 247             if(operation == OP_MOVE) {
U 248               FileUtils.moveDirectoryToDirectory(srcFile, targetDir, false);
249             } else {
250               FileUtils.copyDirectoryToDirectory(srcFile, targetDir);
251             }
5bfd34 252           } else {
fab629 253             if(operation == OP_MOVE) {
U 254               FileUtils.moveFileToDirectory(srcFile, targetDir, false);
255             } else {
256               FileUtils.copyFileToDirectory(srcFile, targetDir);              
257             }
5bfd34 258           }
U 259         }
260       }
261     } catch (IOException ex) {
262       logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
263     }
264     return result;
9e2964 265   }
U 266   
47e9d4 267   public FileRef saveTextFileAs(String relPath, String fileName, String contents) {
U 268     FileRef savedFile = null;
269     logger.fine(relPath + " " + fileName);
270     //FileRef datenRef = getBase();
271     Object p = getRequest().getUserPrincipal();
272     if(p instanceof Principal) {
273       File targetFile = new File(getTargetDir(relPath), fileName);
274       if(targetFile.exists()) {
275         targetFile = getNewFileName(targetFile);
276       } else {
277         targetFile.getParentFile().mkdirs();
278       }
279       saveToFile(targetFile, contents);
280     }
281     return savedFile;
282   }
283   
284   private File getNewFileName(File file) {
285     File dir = file.getParentFile();
286     String targetName = file.getName();
287     logger.fine("targetName: " + targetName);
288     String ext = "";
289     int dotpos = targetName.indexOf(".");
290     if(dotpos > -1) {
291       ext = targetName.substring(dotpos);
292       targetName = targetName.substring(0, dotpos);
293     }
294     logger.fine("targetName: " + targetName + ", ext: " + ext);
295     int i = 1;
296     while(file.exists()) {
297       StringBuffer buf = new StringBuffer();
298       buf.append(targetName);
299       buf.append("-");
300       buf.append(i);
301       if(ext.length() > 0) {
302         buf.append(ext);
303       }
304       file = new File(dir, buf.toString());
305       i++;
306     }
307     logger.fine("new file: " + file.getName());
308     return file;
942d63 309   }  
47e9d4 310   
U 311   private FileRef saveToFile(File targetFile, String contents) {
ea7193 312     FileRef savedFile = null;
e5ff42 313     try {
47e9d4 314       targetFile.createNewFile();
U 315       FileWriter w = new FileWriter(targetFile);
942d63 316       //w.write(StringEscapeUtils.unescapeHtml(contents));
47e9d4 317       w.write(contents);
U 318       w.flush();
319       w.close();
320       savedFile = new FileRef(
321               targetFile.getAbsolutePath(),
322               targetFile.isDirectory(),
323               targetFile.isHidden(),
324               targetFile.lastModified(),
325               targetFile.length());
e5ff42 326     } catch (IOException ex) {
47e9d4 327       logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
U 328     }
329     return savedFile;
330   }
331   
332   public FileRef saveTextFile(String relPath, String fileName, String contents) {
333     FileRef savedFile = null;
334     logger.fine(relPath + " " + fileName);
335     //FileRef datenRef = getBase();
336     Object p = getRequest().getUserPrincipal();
337     if(p instanceof Principal) {
338       File targetFile = new File(getTargetDir(relPath), fileName);
339       if(targetFile.exists()) {
340         /*
341           muss delete() sein?
342           pruefen: ueberschreibt der FileWriter den alteen Inhalt oder 
343           entsteht eine unerwuenschte Mischung aus altem und neuem 
344           Inhalt?
345         */
346         targetFile.delete();
347       } else {
348         targetFile.getParentFile().mkdirs();
349       }
350       saveToFile(targetFile, contents);
e5ff42 351     }
ea7193 352     return savedFile;
U 353   }
438b16 354   
U 355   public String bildVerkleinern(String relPath, String bildName) {
356     File dir = getTargetDir(relPath);
357     File original = new File(dir, bildName);
358     Bild bild = new Bild();
359     //for (int i = 0; i < Bild.GR.length; i++) {
5efd94 360     
438b16 361       //int gr = bild.getVariantenGroesse(i);
U 362       
363       String ext = "";
364       String nurname = bildName;
365       int dotpos = bildName.indexOf(".");
366       if (dotpos > -1) {
367         ext = bildName.substring(dotpos);
368         nurname = bildName.substring(0, dotpos);
369       }
370         
371       Image image = Toolkit.getDefaultToolkit().getImage(original.getAbsolutePath());
372       MediaTracker mediaTracker = new MediaTracker(new Container());
373       mediaTracker.addImage(image, 0);
374       try {
375         mediaTracker.waitForID(0);
376
377         if(!mediaTracker.isErrorAny()) {
378           for(int i = 0; i < Bild.GR.length; i++) {
379             StringBuffer buf = new StringBuffer();
380             buf.append(nurname);
381             buf.append(bild.getVariantenName(i));
382             buf.append(ext);
383             File newImgFile = new File(dir, buf.toString());
384             if(!newImgFile.exists()) {
385               logger.fine(original.getAbsolutePath() + " " + newImgFile.getAbsolutePath());
a44b26 386               bild.writeImageFile(image, bild.getVariantenGroesse(i), bild.getMimeType(original), newImgFile.getAbsolutePath());
438b16 387               //bild.writeImageFile(image, photo.getVariantenGroesse(i), photo.getMimetype(), photo.getAbsolutePath(basisPfad), photo.getVariantenName(basisPfad, i));
U 388             }
389           }
390         }
391       } catch(IOException | InterruptedException ex) {
392         logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
393       }
394
395     return "ok";
396   }
6bd2c1 397   
U 398   public String extractZipfile(String relPath, String filename) {
399     String result;
400     try {
401       File targetDir = getTargetDir(relPath);
402       File archive = new File(targetDir, filename);
403       if(extract(archive)) {
404         result = "ok";
405       } else {
406         result = "error while extracting";
407       }
408     } catch(Exception ex) {
409       result = ex.getLocalizedMessage();
410       logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
411     }
412     return result;
413   }
414   
415   /**
416      * extract a given ZIP archive to the folder respective archive resides in
417      * @param archive  the archive to extract
418      * @throws Exception
419      */
420     private boolean extract(File archive) throws Exception {
421         ZipFile zipfile = new ZipFile(archive);
422         Enumeration en = zipfile.entries();
423         while(en.hasMoreElements()) {
424             ZipEntry zipentry = (ZipEntry) en.nextElement();
425             unzip(zipfile, zipentry, archive.getParent());
426         }
427         zipfile.close();
428         return true;
429     }
430
431     /**
432      * unzip a given entry of a given zip file to a given location
433      * @param zipfile  the zip file to read an entry from
434      * @param zipentry  the zip entry to read
435      * @param destPath  the path to the destination location for the extracted content
436      * @throws IOException
437      */
438     private void unzip(ZipFile zipfile, ZipEntry zipentry, String destPath) throws IOException {
439         byte buf[] = new byte[1024];
440         InputStream is = zipfile.getInputStream(zipentry);
441         String outFileName = destPath + File.separator + zipentry.getName();
442         File file = new File(outFileName);
443         if(!zipentry.isDirectory()) {
444             file.getParentFile().mkdirs();
445             if(!file.exists())
446                 file.createNewFile();
447             FileOutputStream fos = new FileOutputStream(file);
448             int i = is.read(buf, 0, 1024);
449             while(i > -1) {
450                 fos.write(buf, 0, i);
451                 i = is.read(buf, 0, 1024);
452             }
453             fos.close();
454             is.close();
455         } else {
456             file.mkdirs();
457         }
458     }
459
460   
438b16 461
5efd94 462   /* ---- Hilfsfunktionen ---- */
ea7193 463   
547755 464 }