/*
Dateiverwaltung - File management in your browser
Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package de.uhilger.filecms.api;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
/**
* Die Klasse HtmlExportService stellt Methoden bereit, mit denen
* .htmi-Dateien der WebBox zusammen mit Bildern und Stylesheets als
* Ordner exportierten werden koennen, aus denen heraus die Inhalte
* als HTML-Seiten im Browser zu oeffnen sind.
*/
public class HtmlExportService extends Api {
private static final Logger logger = Logger.getLogger(HtmlExportService.class.getName());
/**
* Den Inhalt eines Ordners als HTML exportieren
*
* Annahme hierbei ist, dass der Ordner, auf den im Parameter relPath
* verwiesen wird eine oder mehrere .htmi-Dateien enthaelt. Optional
* koennen Bilder im Ordner oder seinen Unterordnern enthalten sein, die
* dann in derselben Struktur im Ausgabeordner landen.
*
* Es werden nur .htmi-Dateien exortiert, die im mit relPath bezeichneten
* Ordner liegen. Eventuell in darin befindlichen Unterordnern befindliche
* .htmk-Dateien werden nicht exportiert.
*
* Es sollten also keine komplexen Webseiten-Strukturen mit dieser Methode
* erzeugt werden sondern einfache Dokumente mit einer oder wenigen
* einzelnen Dateien.
*
* Die Ausgabe erfolgt in den Ordner, in dem der mit relPath bezeichnete
* Ordner liegt, also in dessen Eltern-Ordner. Der ausgegebene Ordner heisst
* genauso wir der mit relPath bezeichnete Ordner und wird mit der
* Ergaenzung _html versehen.
*
* @param relPath
* @return 'ok' oder Fehlermeldung
*/
public String exportHtml(String relPath) {
String result = null;
File dir = getTargetDir(relPath);
File parentDir = dir.getParentFile();
File outDir = new File(parentDir, dir.getName() + "_html/");
File[] files = dir.listFiles(new HtmiFileFilter());
for(int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
try {
FileUtils.copyDirectoryToDirectory(files[i], outDir);
} catch (IOException ex) {
result = ex.getLocalizedMessage();
logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
}
} else {
BufferedReader br = null;
try {
File out = new File(outDir, stripExt(files[i].getName()) + ".html");
PrintWriter w = new PrintWriter(out);
printHeader(w);
br = new BufferedReader(new FileReader(files[i]));
String line = br.readLine();
while(line != null) {
w.print(line);
line = br.readLine();
}
printFooter(w);
w.flush();
w.close();
br.close();
} catch (FileNotFoundException ex) {
result = ex.getLocalizedMessage();
logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
} catch (IOException ex) {
result = ex.getLocalizedMessage();
logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
} finally {
try {
if(br != null) {
br.close();
}
} catch (IOException ex) {
result = ex.getLocalizedMessage();
logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
}
}
}
}
File catalinaBase = new File(getCatalinaBase());
File bsDir = new File(catalinaBase, "webapps/jslib/bootstrap/css/");
try {
FileUtils.copyFile(new File(bsDir, "bootstrap.min.css"), new File(outDir, "bootstrap.min.css"), true);
File stile = new File(dir, "stile.css");
if(stile.exists()) {
FileUtils.copyFile(stile, new File(outDir, "stile.css"), true);
}
} catch (IOException ex) {
result = ex.getLocalizedMessage();
logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
}
return result;
}
private String stripExt(String name) {
int dotpos = name.indexOf(".");
if(dotpos > -1) {
name = name.substring(0, dotpos);
}
return name;
}
public class HtmiFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
boolean doAccept = false;
if(pathname.getName().endsWith(".htmi") || pathname.isDirectory()) {
doAccept = true;
}
return doAccept;
}
}
private void printHeader(PrintWriter out) throws IOException {
out.print("