Dateiverwaltung für die WebBox
ulrich
2017-04-08 bf105c1879dbe483cda1beebcd744abb6f528e8f
commit | author | age
fad719 1 /*
U 2
3     Dateiverwaltung - File management in your browser
4     Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
5
6     This program is free software: you can redistribute it and/or modify
7     it under the terms of the GNU Affero General Public License as
8     published by the Free Software Foundation, either version 3 of the
9     License, or (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU Affero General Public License for more details.
15
16     You should have received a copy of the GNU Affero General Public License
17     along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21 package de.uhilger.filecms.api;
22
bf105c 23 import de.uhilger.filecms.data.Bild;
U 24 import java.awt.Container;
25 import java.awt.Image;
26 import java.awt.MediaTracker;
27 import java.awt.Toolkit;
fad719 28 import java.io.BufferedReader;
U 29 import java.io.File;
30 import java.io.FileFilter;
31 import java.io.FileNotFoundException;
32 import java.io.FileReader;
33 import java.io.IOException;
34 import java.io.PrintWriter;
35 import java.util.logging.Level;
36 import java.util.logging.Logger;
37 import org.apache.commons.io.FileUtils;
38
39 /**
40  * Die Klasse HtmlExportService stellt Methoden bereit, mit denen 
41  * .htmi-Dateien der WebBox zusammen mit Bildern und Stylesheets als 
42  * Ordner exportierten werden koennen, aus denen heraus die Inhalte 
43  * als HTML-Seiten im Browser zu oeffnen sind.
44  */
45 public class HtmlExportService extends Api {
46   
47   private static final Logger logger = Logger.getLogger(HtmlExportService.class.getName());
48   
49   /**
50    * Den Inhalt eines Ordners als HTML exportieren
51    * 
52    * Annahme hierbei ist, dass der Ordner, auf den im Parameter relPath 
53    * verwiesen wird eine oder mehrere .htmi-Dateien enthaelt. Optional 
54    * koennen Bilder im Ordner oder seinen Unterordnern enthalten sein, die 
55    * dann in derselben Struktur im Ausgabeordner landen.
56    * 
57    * Es werden nur .htmi-Dateien exortiert, die im mit relPath bezeichneten 
58    * Ordner liegen. Eventuell in darin befindlichen Unterordnern befindliche 
bf105c 59    * .htmi-Dateien werden nicht exportiert.
fad719 60    * 
bf105c 61    * Es sollen keine komplexen Webseiten-Strukturen mit dieser Methode 
fad719 62    * erzeugt werden sondern einfache Dokumente mit einer oder wenigen 
U 63    * einzelnen Dateien.
64    * 
65    * Die Ausgabe erfolgt in den Ordner, in dem der mit relPath bezeichnete 
66    * Ordner liegt, also in dessen Eltern-Ordner. Der ausgegebene Ordner heisst 
67    * genauso wir der mit relPath bezeichnete Ordner und wird mit der 
68    * Ergaenzung _html versehen.
69    * 
70    * @param relPath
71    * @return 'ok' oder Fehlermeldung
72    */
73   public String exportHtml(String relPath) {
74     String result = null;
75     File dir = getTargetDir(relPath);
76     File parentDir = dir.getParentFile();
77     File outDir = new File(parentDir, dir.getName() + "_html/");
78     File[] files = dir.listFiles(new HtmiFileFilter());
79     for(int i = 0; i < files.length; i++) {
80       if (files[i].isDirectory()) {
81         try {
82           FileUtils.copyDirectoryToDirectory(files[i], outDir);
83         } catch (IOException ex) {
84           result = ex.getLocalizedMessage();
85           logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
86         }
87       } else {
88         BufferedReader br = null;
89         try {
90           File out = new File(outDir, stripExt(files[i].getName()) + ".html");
21589e 91           if(!out.exists()) {
U 92             logger.fine(out.getAbsolutePath() + " existiert nicht, erzeuge Datei..");
93             out.getParentFile().mkdirs();
94             out.createNewFile();
95           }
fad719 96           PrintWriter w = new PrintWriter(out);
U 97           printHeader(w);
98           br = new BufferedReader(new FileReader(files[i]));
99           String line = br.readLine();
100           while(line != null) {
21589e 101             w.print(line.replace("htmi", "html"));
fad719 102             line = br.readLine();
U 103           }
104           printFooter(w);
105           w.flush();
106           w.close();
107           br.close();
108         } catch (FileNotFoundException ex) {
109           result = ex.getLocalizedMessage();
110           logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
111         } catch (IOException ex) {
112           result = ex.getLocalizedMessage();
113           logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
114         } finally {
115           try {
116             if(br != null) {
117               br.close();
118             }
119           } catch (IOException ex) {
120             result = ex.getLocalizedMessage();
121             logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
122           }
123         }
124       }
125     }
6e1a29 126     File catalinaBase = new File(getCatalinaBase(getServletContext()));
fad719 127     File bsDir = new File(catalinaBase, "webapps/jslib/bootstrap/css/");
U 128     try {
129       FileUtils.copyFile(new File(bsDir, "bootstrap.min.css"), new File(outDir, "bootstrap.min.css"), true);
130       File stile = new File(dir, "stile.css");
131       if(stile.exists()) {
132         FileUtils.copyFile(stile, new File(outDir, "stile.css"), true);
133       }
bf105c 134       buildThumbnailImages(outDir, new Bild());
21589e 135       result = "Export nach HTML ausgefuehrt.";
fad719 136     } catch (IOException ex) {
U 137       result = ex.getLocalizedMessage();
138       logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
139     }
140     return result;
bf105c 141   }
U 142   
143   /**
144    * Minituransichten der Bilddateien erzeugen, die beim HTML-Export 
145    * entstanden sind.
146    * 
147    * Die Methode erstellt fuer alle Dateien mit Endung png oder jpg 
148    * eine weitere Bilddatei mit Namen [Name]_tn.[Endung]. Also z.B.
149    * bild_tn.jpg fuer die Datei bild.jpg
150    */
151   private void buildThumbnailImages(File dir, Bild bild) {
152     logger.fine("Minituransichten dir: " + dir.getAbsolutePath());
153     File[] files = dir.listFiles(new ImageFileFilter());
154     if(files != null) {
155       for(int i = 0; i < files.length; i++) {
156         if(files[i].isDirectory()) {
157           buildThumbnailImages(files[i], bild);
158         } else {
159           String absPath = files[i].getAbsolutePath();
160           logger.fine("Miniaturansicht fuer Bild " + absPath);
161           String fname = files[i].getName();
162           logger.fine("fname: " + fname);
163           int dotPos = fname.lastIndexOf(".");
164           logger.fine("dotPos: " + dotPos);
165           StringBuffer tnFileName = new StringBuffer();
166           if(dotPos > -1) {
167             String fname_no_ext = fname.substring(0, dotPos);
168             logger.fine("fname_no_ext: " + fname_no_ext);
169             String fext = fname.substring(dotPos);
170             logger.fine("fext: " + fext);
171             tnFileName.append(fname_no_ext);
172             tnFileName.append("_tn");
173             //tnFileName.append(".");
174             tnFileName.append(fext);
175           } else {
176             tnFileName.append(fname);
177             tnFileName.append("_tn");
178           }
179           String outFileName = new File(dir, tnFileName.toString()).getAbsolutePath();
180           logger.fine("outFileName: " + outFileName);
181           Image image = Toolkit.getDefaultToolkit().getImage(absPath);
182           MediaTracker mediaTracker = new MediaTracker(new Container());
183           mediaTracker.addImage(image, 0);
184           try {
185             mediaTracker.waitForID(0);
186
187             if (!mediaTracker.isErrorAny()) {
188               bild.writeImageFile(image, bild.getVariantenGroesse(Bild.WINZIG), bild.getMimeType(files[i]), outFileName);
189             } else {
190               logger.fine("Fehler: Miniaturansicht konnte nicht erzeugt werden");
191             }
192           } catch (InterruptedException | IOException ex) {
193             logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
194           }      
195         }
196       }
197     } else {
198       logger.fine("files ist null");
199     }
fad719 200   }
U 201   
202   private String stripExt(String name) {
203     int dotpos = name.indexOf(".");
204     if(dotpos > -1) {
205       name = name.substring(0, dotpos);
206     }
207     return name;
208   }
209   
210   public class HtmiFileFilter implements FileFilter {
211
212     @Override
213     public boolean accept(File pathname) {
214       boolean doAccept = false;
215       if(pathname.getName().endsWith(".htmi") || pathname.isDirectory()) {
216         doAccept = true;
217       }
218       return doAccept;
219     }
220   
221   }  
222   
bf105c 223   public class ImageFileFilter implements FileFilter {
U 224
225     @Override
226     public boolean accept(File pathname) {
227       boolean doAccept = false;
228       String lcName = pathname.getName().toLowerCase();
229       if( lcName.endsWith(".jpg") || 
230           lcName.endsWith(".jpeg") || 
231           lcName.endsWith(".png") || 
232           pathname.isDirectory()) {
233         if(!lcName.contains("_tn")) {
234           doAccept = true;
235         }
236       }
237       return doAccept;
238     }
239   
240   }  
241   
fad719 242   private void printHeader(PrintWriter out) throws IOException {
U 243     out.print("<!DOCTYPE html><html><head>\r\n");
244     out.print("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>");
245     out.print("<link rel=\"stylesheet\" type=\"text/css\" href=\"bootstrap.min.css\">\r\n");
246     out.print("<link rel=\"stylesheet\" type=\"text/css\" href=\"stile.css\">\r\n");
247     out.print("</head><body class=\"p-3\">\r\n");
248   }
249   
250   private void printFooter(PrintWriter out) throws IOException {
251     out.print("</body></html>");
252   }
253   
254   
255   
256 }