Dateiverwaltung für die WebBox
ulrich
2017-04-08 21589e19b92d63e36e5f73d8c01394de6f69b9a4
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
23 import java.io.BufferedReader;
24 import java.io.File;
25 import java.io.FileFilter;
26 import java.io.FileNotFoundException;
27 import java.io.FileReader;
28 import java.io.IOException;
29 import java.io.PrintWriter;
30 import java.util.logging.Level;
31 import java.util.logging.Logger;
32 import org.apache.commons.io.FileUtils;
33
34 /**
35  * Die Klasse HtmlExportService stellt Methoden bereit, mit denen 
36  * .htmi-Dateien der WebBox zusammen mit Bildern und Stylesheets als 
37  * Ordner exportierten werden koennen, aus denen heraus die Inhalte 
38  * als HTML-Seiten im Browser zu oeffnen sind.
39  */
40 public class HtmlExportService extends Api {
41   
42   private static final Logger logger = Logger.getLogger(HtmlExportService.class.getName());
43   
44   /**
45    * Den Inhalt eines Ordners als HTML exportieren
46    * 
47    * Annahme hierbei ist, dass der Ordner, auf den im Parameter relPath 
48    * verwiesen wird eine oder mehrere .htmi-Dateien enthaelt. Optional 
49    * koennen Bilder im Ordner oder seinen Unterordnern enthalten sein, die 
50    * dann in derselben Struktur im Ausgabeordner landen.
51    * 
52    * Es werden nur .htmi-Dateien exortiert, die im mit relPath bezeichneten 
53    * Ordner liegen. Eventuell in darin befindlichen Unterordnern befindliche 
54    * .htmk-Dateien werden nicht exportiert.
55    * 
56    * Es sollten also keine komplexen Webseiten-Strukturen mit dieser Methode 
57    * erzeugt werden sondern einfache Dokumente mit einer oder wenigen 
58    * einzelnen Dateien.
59    * 
60    * Die Ausgabe erfolgt in den Ordner, in dem der mit relPath bezeichnete 
61    * Ordner liegt, also in dessen Eltern-Ordner. Der ausgegebene Ordner heisst 
62    * genauso wir der mit relPath bezeichnete Ordner und wird mit der 
63    * Ergaenzung _html versehen.
64    * 
65    * @param relPath
66    * @return 'ok' oder Fehlermeldung
67    */
68   public String exportHtml(String relPath) {
69     String result = null;
70     File dir = getTargetDir(relPath);
71     File parentDir = dir.getParentFile();
72     File outDir = new File(parentDir, dir.getName() + "_html/");
73     File[] files = dir.listFiles(new HtmiFileFilter());
74     for(int i = 0; i < files.length; i++) {
75       if (files[i].isDirectory()) {
76         try {
77           FileUtils.copyDirectoryToDirectory(files[i], outDir);
78         } catch (IOException ex) {
79           result = ex.getLocalizedMessage();
80           logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
81         }
82       } else {
83         BufferedReader br = null;
84         try {
85           File out = new File(outDir, stripExt(files[i].getName()) + ".html");
21589e 86           if(!out.exists()) {
U 87             logger.fine(out.getAbsolutePath() + " existiert nicht, erzeuge Datei..");
88             out.getParentFile().mkdirs();
89             out.createNewFile();
90           }
fad719 91           PrintWriter w = new PrintWriter(out);
U 92           printHeader(w);
93           br = new BufferedReader(new FileReader(files[i]));
94           String line = br.readLine();
95           while(line != null) {
21589e 96             w.print(line.replace("htmi", "html"));
fad719 97             line = br.readLine();
U 98           }
99           printFooter(w);
100           w.flush();
101           w.close();
102           br.close();
103         } catch (FileNotFoundException ex) {
104           result = ex.getLocalizedMessage();
105           logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
106         } catch (IOException ex) {
107           result = ex.getLocalizedMessage();
108           logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
109         } finally {
110           try {
111             if(br != null) {
112               br.close();
113             }
114           } catch (IOException ex) {
115             result = ex.getLocalizedMessage();
116             logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
117           }
118         }
119       }
120     }
6e1a29 121     File catalinaBase = new File(getCatalinaBase(getServletContext()));
fad719 122     File bsDir = new File(catalinaBase, "webapps/jslib/bootstrap/css/");
U 123     try {
124       FileUtils.copyFile(new File(bsDir, "bootstrap.min.css"), new File(outDir, "bootstrap.min.css"), true);
125       File stile = new File(dir, "stile.css");
126       if(stile.exists()) {
127         FileUtils.copyFile(stile, new File(outDir, "stile.css"), true);
128       }
21589e 129       result = "Export nach HTML ausgefuehrt.";
fad719 130     } catch (IOException ex) {
U 131       result = ex.getLocalizedMessage();
132       logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
133     }
134     return result;
135   }
136   
137   private String stripExt(String name) {
138     int dotpos = name.indexOf(".");
139     if(dotpos > -1) {
140       name = name.substring(0, dotpos);
141     }
142     return name;
143   }
144   
145   public class HtmiFileFilter implements FileFilter {
146
147     @Override
148     public boolean accept(File pathname) {
149       boolean doAccept = false;
150       if(pathname.getName().endsWith(".htmi") || pathname.isDirectory()) {
151         doAccept = true;
152       }
153       return doAccept;
154     }
155   
156   }  
157   
158   private void printHeader(PrintWriter out) throws IOException {
159     out.print("<!DOCTYPE html><html><head>\r\n");
160     out.print("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>");
161     out.print("<link rel=\"stylesheet\" type=\"text/css\" href=\"bootstrap.min.css\">\r\n");
162     out.print("<link rel=\"stylesheet\" type=\"text/css\" href=\"stile.css\">\r\n");
163     out.print("</head><body class=\"p-3\">\r\n");
164   }
165   
166   private void printFooter(PrintWriter out) throws IOException {
167     out.print("</body></html>");
168   }
169   
170   
171   
172 }