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