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