X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmir%2Fmisc%2FHTMLTemplateProcessor.java;h=3f014cc396fcf1e58ca29a565915a2fbc019cb33;hb=855a59e03d05068abbd2d1e4f3256908269e518e;hp=4729e10d73cc6d4778e253aa6e7a4ed8add86ed8;hpb=a23ac2e3fd919044cd8769aa61d8dfe07dbd733c;p=mir.git diff --git a/source/mir/misc/HTMLTemplateProcessor.java b/source/mir/misc/HTMLTemplateProcessor.java index 4729e10d..3f014cc3 100755 --- a/source/mir/misc/HTMLTemplateProcessor.java +++ b/source/mir/misc/HTMLTemplateProcessor.java @@ -1,18 +1,48 @@ /* - * put your module comment here + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with the com.oreilly.servlet library, any library + * licensed under the Apache Software License, The Sun (tm) Java Advanced + * Imaging library (JAI), The Sun JIMI library (or with modified versions of + * the above that use the same license as the above), and distribute linked + * combinations including the two. You must obey the GNU General Public + * License in all respects for all of the code used other than the above + * mentioned libraries. If you modify this file, you may extend this exception + * to your version of the file, but you are not obligated to do so. If you do + * not wish to do so, delete this exception statement from your version. */ - package mir.misc; -import java.lang.*; -import java.util.*; -import java.io.*; -import java.net.*; -import freemarker.template.*; -import mir.entity.*; -import mir.storage.*; -import javax.servlet.http.*; +import freemarker.template.*; +import mir.util.*; +import mir.generator.*; +import mir.entity.Entity; +import mir.entity.EntityList; +import mir.storage.StorageObjectException; +import org.apache.struts.util.MessageResources; + +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.net.URLEncoder; +import java.util.*; /** @@ -20,329 +50,373 @@ import javax.servlet.http.*; */ public final class HTMLTemplateProcessor { - public static String templateDir; - private static FileTemplateCache templateCache; - private static Logfile theLog; - private static String docRoot; - private static String actionRoot; - private static String productionHost; - private static String audioHost; - private static String videoHost; - private static String imageHost; - private static String openAction; - protected static String producerDocRoot = MirConfig.getProp("Producer.DocRoot"); - protected static String producerStorageRoot = MirConfig.getProp("Producer.StorageRoot"); - - - // - // init - - static { - - templateDir = MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir"); - templateCache = new FileTemplateCache(templateDir); - templateCache.setLoadingPolicy(templateCache.LOAD_ON_DEMAND); - templateCache.startAutoUpdate(); - theLog = Logfile.getInstance(MirConfig.getPropWithHome("HTMLTemplateProcessor.Logfile")); - docRoot = MirConfig.getProp("RootUri"); - //the quick hack is back in effect as it was more broken than ever before - // -mh - // sorry: nadir back in town, i have to debug the mirbase.jar in the - // nadir evironment. from my point of coding, this needs an urgent - // fixxx. - //actionRoot = docRoot + "/servlet/" + MirConfig.getProp("ServletName"); - //actionRoot = docRoot + "/servlet/NadirAktuell"; - actionRoot = docRoot + "/servlet/Mir"; - openAction = MirConfig.getProp("Producer.OpenAction"); - productionHost = MirConfig.getProp("Producer.ProductionHost"); - videoHost = MirConfig.getProp("Producer.VideoHost"); - audioHost = MirConfig.getProp("Producer.AudioHost"); - imageHost = MirConfig.getProp("Producer.Image.Host"); - producerDocRoot = MirConfig.getProp("Producer.DocRoot"); - producerStorageRoot = MirConfig.getProp("Producer.StorageRoot"); - } - - /** - * empty private constructor, to avoid instantiation - */ - private HTMLTemplateProcessor () { } - - - // process-methods to merge different datastructures - // with freemarker templates - - - /** - * Wandelt anEntity in freemarker-Struktur um, mischt die Daten mit - * Template templateFilename und gibt das Ergebnis an den PrintWriter - * out - * - * @param templateFilename - * @param anEntity - * @param out - * @exception HTMLParseException - */ + public static String templateDir; + private static FileTemplateCache templateCache; + private static Logfile theLog; + private static String docRoot; + private static String actionRoot; - public static void process(String templateFilename, Entity anEntity, PrintWriter out) - throws HTMLParseException { - if (anEntity == null) throw new HTMLParseException("entity is empty!"); - else process(templateFilename, anEntity, out); + static { + templateDir = MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir"); + templateCache = new FileTemplateCache(templateDir); + templateCache.setLoadingPolicy(templateCache.LOAD_ON_DEMAND); + // gone in freemarker 1.7.1: templateCache.startAutoUpdate(); + theLog = Logfile.getInstance(MirConfig.getPropWithHome("HTMLTemplateProcessor.Logfile")); + + docRoot = MirConfig.getProp("RootUri"); + try { + actionRoot = docRoot + MirConfig.getProp("Producer.ActionServlet"); + } catch (ConfigException ce) { + // if Producer.ActionServlet is not set in the conf file + actionRoot = docRoot + "/servlet/Mir"; + } } + /** + * empty private constructor, to avoid instantiation + */ + private HTMLTemplateProcessor() { + } + + + // process-methods to merge different datastructures + // with freemarker templates + + + /** + * Wandelt anEntity in freemarker-Struktur um, mischt die Daten mit + * Template templateFilename und gibt das Ergebnis an den PrintWriter + * out + * + * @param templateFilename + * @param anEntity + * @param out + * @exception HTMLParseException + */ + + public static void process(String templateFilename, Entity anEntity, PrintWriter out) + throws HTMLParseException { + if (anEntity == null) + throw new HTMLParseException("entity is empty!"); + else + process(templateFilename, anEntity, out); + } - /** - * Wandelt Liste mit Entities entList in freemarker-Struktur um, mischt die Daten mit - * Template templateFilename und gibt das Ergebnis an den PrintWriter - * out - * - * @param templateFilename - * @param entList - * @param out - * @exception HTMLParseException - */ - public static void process(HttpServletResponse res,String templateFilename, EntityList entList, PrintWriter out) - throws HTMLParseException { - process(res, templateFilename, entList, (String)null, (TemplateModelRoot)null, out); - } - - /** - * Wandelt Entitylist in freemarker-Struktur um, fügt additionalModel - * unter dem Namen additionalModelName ein und mischt die Daten mit - * Template templateFilename und gibt das Ergebnis an den PrintWriter - * out - * - * @param templateFilename - * @param entList - * @param additionalModelName - * @param additionalModel - * @param out - * @exception HTMLParseException - */ - public static void process(HttpServletResponse res,String templateFilename, EntityList entList, String additionalModelName, - TemplateModelRoot additionalModel, PrintWriter out) - throws HTMLParseException { - - SimpleHash modelRoot = new SimpleHash(); - - if (entList == null) { - process(null,templateFilename, modelRoot, out); - } else { - try { - modelRoot = makeSimpleHashWithEntitylistInfos(entList); - // Quickhack um mal ein Popup mit reinzunhemen .. - if (additionalModelName != null && additionalModel != null) - modelRoot.put(additionalModelName, additionalModel); + /** + * Wandelt Liste mit Entities entList in freemarker-Struktur um, mischt die Daten mit + * Template templateFilename und gibt das Ergebnis an den PrintWriter + * out + * + * @param templateFilename + * @param entList + * @param out + * @exception HTMLParseException + */ + public static void process(HttpServletResponse res, String templateFilename, + EntityList entList, PrintWriter out, Locale locale) + throws HTMLParseException { + process(res, templateFilename, entList, (String) null, (TemplateModelRoot) null, out, locale); + } - process(res,templateFilename, modelRoot, out); - } catch (StorageObjectException e) { - throw new HTMLParseException(e.toString()); + /** + * Wandelt Entitylist in freemarker-Struktur um, fügt additionalModel + * unter dem Namen additionalModelName ein und mischt die Daten mit + * Template templateFilename und gibt das Ergebnis an den PrintWriter + * out + * + * @param templateFilename + * @param entList + * @param additionalModelName + * @param additionalModel + * @param out + * @exception HTMLParseException + */ + public static void process(HttpServletResponse res, String templateFilename, + EntityList entList, String additionalModelName, + TemplateModelRoot additionalModel, PrintWriter out, + Locale locale) + throws HTMLParseException { + + SimpleHash modelRoot = new SimpleHash(); + + if (entList == null) { + process(null, templateFilename, modelRoot, out, locale); + } else { + try { + modelRoot = makeSimpleHashWithEntitylistInfos(entList); + + // Quickhack um mal ein Popup mit reinzunhemen .. + if (additionalModelName != null && additionalModel != null) + modelRoot.put(additionalModelName, additionalModel); + + process(res, templateFilename, modelRoot, out, locale); + } catch (StorageObjectException e) { + throw new HTMLParseException(e.toString()); + } } - } } - /** - * Wandelt HashMap mergeData in freemarker-Struktur und mischt diese mit - * Template templateFilename und gibt das Ergebnis an den PrintWriter - * out - * - * @param templateFilename - * @param mergeData - a HashMap with mergeData to be converted in SimpleHash - * @param out - * @exception HTMLParseException - */ - public static void process(HttpServletResponse res,String templateFilename, HashMap mergeData, PrintWriter out) - throws HTMLParseException { - process(res,templateFilename, makeSimpleHash(mergeData), out); + /** + * Wandelt HashMap mergeData in freemarker-Struktur und mischt diese mit + * Template templateFilename und gibt das Ergebnis an den PrintWriter + * out + * + * @param templateFilename + * @param mergeData - a HashMap with mergeData to be converted in SimpleHash + * @param out + * @exception HTMLParseException + */ + public static void process(HttpServletResponse res, String templateFilename, + HashMap mergeData, PrintWriter out, Locale locale) + throws HTMLParseException { + process(res, templateFilename, makeSimpleHash(mergeData), out, locale); + } + + /** + * Gibt Template templateFilename an den PrintWriter + * out + * + * @param templateFilename + * @param mergeData + * @param out + * @exception HTMLParseException + */ + public static void process(String templateFilename, PrintWriter out, + Locale locale) + throws HTMLParseException { + process(null, templateFilename, (TemplateModelRoot) null, out, locale); } - /** - * Gibt Template templateFilename an den PrintWriter - * out - * - * @param templateFilename - * @param mergeData - * @param out - * @exception HTMLParseException - */ - public static void process(String templateFilename, PrintWriter out) - throws HTMLParseException { - process(null,templateFilename, (TemplateModelRoot)null, out); + + /** + * Mischt die freemarker-Struktur tmr mit + * Template templateFilename und gibt das Ergebnis an den PrintWriter + * out + * + * @param templateFilename + * @param mergeData + * @param out + * @exception HTMLParseException + */ + public static void process(HttpServletResponse res, String templateFilename, + TemplateModelRoot tmr, PrintWriter out, Locale locale) + throws HTMLParseException { + process(res, templateFilename, tmr, null, out, locale, "bundles.admin"); + // this method is } + /** + * Mischt die freemarker-Struktur tmr mit + * Template templateFilename und gibt das Ergebnis an den PrintWriter + * out + * + * @param templateFilename + * @param mergeData + * @param out + * @exception HTMLParseException + */ + public static void process(HttpServletResponse res, String templateFilename, + TemplateModelRoot tmr, TemplateModelRoot extra, + PrintWriter out, Locale locale, String bundles) + throws HTMLParseException { + if (out == null) throw new HTMLParseException("no outputstream"); + Template tmpl = getTemplateFor(templateFilename); + if (tmpl == null) throw new HTMLParseException("no template: " + templateFilename); + if (tmr == null) tmr = new SimpleHash(); + + /** @todo what is this for? (rk) */ + String session = ""; + if (res != null) { + session = res.encodeURL(""); + } + + SimpleHash configHash = new SimpleHash(); + + // pass the whole config hash to the templates + Enumeration en = MirConfig.getResourceKeys(); + String key; + while (en.hasMoreElements()) { + key = (String) en.nextElement(); + configHash.put(key, new SimpleScalar(MirConfig.getProp(key))); + } + + // this does not come directly from the config file + configHash.put("docRoot", new SimpleScalar(docRoot)); + configHash.put("actionRoot", new SimpleScalar(actionRoot + session)); + configHash.put("now", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar()))); - /** - * Mischt die freemarker-Struktur tmr mit - * Template templateFilename und gibt das Ergebnis an den PrintWriter - * out - * - * @param templateFilename - * @param mergeData - * @param out - * @exception HTMLParseException - */ - public static void process(HttpServletResponse res,String templateFilename, TemplateModelRoot tmr, PrintWriter out) - throws HTMLParseException { - if (out==null) throw new HTMLParseException("no outputstream"); - Template tmpl = getTemplateFor(templateFilename); - if (tmpl == null) throw new HTMLParseException("no template: " + templateFilename); - if (tmr==null) tmr = new SimpleHash(); - - /** @todo what is this for? (rk) */ - String session=""; - if (res!=null) { - session=res.encodeURL(""); - } - - // put standard configuration into tempalteRootmodel - SimpleHash configHash = new SimpleHash(); - configHash.put("docroot", new SimpleScalar(producerDocRoot)); - configHash.put("storageroot", new SimpleScalar(producerStorageRoot)); - configHash.put("productionhost", new SimpleScalar(productionHost)); - configHash.put("openaction", new SimpleScalar(openAction)); - configHash.put("actionRootLogin",new SimpleScalar(actionRoot)); - - - tmr.put("docRoot", new SimpleScalar(docRoot)); - tmr.put("now", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar()))); - tmr.put("actionRoot", new SimpleScalar(actionRoot+session)); - tmr.put("openAction", new SimpleScalar(openAction)); - tmr.put("productionHost", new SimpleScalar(productionHost)); - tmr.put("videoHost", new SimpleScalar(videoHost)); - tmr.put("audioHost", new SimpleScalar(audioHost)); - tmr.put("imageHost", new SimpleScalar(imageHost)); - - tmr.put("config", configHash); - tmpl.process(tmr, out); + // this conform to updated freemarker syntax + configHash.put("compressWhitespace", new freemarker.template.utility.CompressWhitespace()); + SimpleHash utilityHash = new SimpleHash(); + try { + utilityHash.put("compressWhitespace", new freemarker.template.utility.CompressWhitespace()); + utilityHash.put("encodeURI", FreemarkerGenerator.makeAdapter(new GeneratorHTMLFunctions.encodeURIGeneratorFunction())); + utilityHash.put("encodeHTML", FreemarkerGenerator.makeAdapter(new GeneratorHTMLFunctions.encodeHTMLGeneratorFunction())); + } + catch (Throwable t) { + throw new HTMLParseException(t.getMessage()); + } + + + SimpleHash outPutHash = new SimpleHash(); + + if (extra != null) { + outPutHash.put("extra", extra); + try { + while (((SimpleList) extra).hasNext()) { + theLog.printDebugInfo(((SimpleList) extra).next().toString()); + } + } catch (Exception e) { + } + } + outPutHash.put("data", tmr); + outPutHash.put("config", configHash); + outPutHash.put("utility", utilityHash); + + MessageResources messages = MessageResources.getMessageResources(bundles); + outPutHash.put("lang", new MessageMethodModel(locale, messages)); + + tmpl.process(outPutHash, out); } - /** - * Converts Entity-List to SimpleList of SimpleHashes. - * @param aList ist eine Liste von Entity - * @return eine freemarker.template.SimpleList von SimpleHashes. - */ - public static SimpleList makeSimpleList(EntityList aList) throws StorageObjectException - { - SimpleList simpleList = new SimpleList(); - if (aList != null) { - for(int i=0;i