X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmir%2Fmisc%2FHTMLTemplateProcessor.java;h=346d3d21f2cf720680793d94178e7f05c7a84d5f;hb=fa2ae3a41572f5b762b761935fc712b59c2a6933;hp=e4e38956bf1fdb0a5add63e05afdc4623aa19e77;hpb=392300017be2fc48d6e9cf978a8fb15c773abc27;p=mir.git diff --git a/source/mir/misc/HTMLTemplateProcessor.java b/source/mir/misc/HTMLTemplateProcessor.java index e4e38956..346d3d21 100755 --- a/source/mir/misc/HTMLTemplateProcessor.java +++ b/source/mir/misc/HTMLTemplateProcessor.java @@ -1,345 +1,443 @@ -/* - * put your module comment here - */ - - -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.*; - - -/** - * Hilfsklasse zum Mergen von Template und Daten - */ -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"); - actionRoot = docRoot + "/servlet/" + MirConfig.getProp("ServletName"); - - 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 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); - - process(res,templateFilename, modelRoot, out); - } 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 - * @param out - * @exception HTMLParseException - */ - public static void process(HttpServletResponse res,String templateFilename, HashMap mergeData, PrintWriter out) - throws HTMLParseException { - process(res,templateFilename, makeSimpleHash(mergeData), out); - } - - /** - * 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) - 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); - - } - - - /** - * Wandelt eine Entity-Liste in eine SimpleList von SimpleHashes um. - * @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"); - return null; - } - } - - /** - * Konvertiert ein Hashtable mit den keys und values als String - * in ein freemarker.template.SimpleHash-Modell - * @param mergeData der HashMap mit den String / String Daten - * @return SimpleHash mit den entsprechenden freemarker Daten - * - */ - public static SimpleHash makeSimpleHash(HashMap mergeData) - { - SimpleHash modelRoot = new SimpleHash(); - String aField; - if (mergeData != null) { - Set set = mergeData.keySet(); - Iterator it = set.iterator(); - for (int i=0; ianEntity 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, Locale locale) throws HTMLParseException { + process(res, templateFilename, entList, (String)null, (TemplateModelRoot)null, + out, locale); + } + + /** + * 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 (StorageObjectFailure e) { + throw new HTMLParseException(e.toString()); + } + } + } + + + /** + * 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); + } + + /** + * 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); + } + + public static void process(HttpServletResponse res, String templateFilename, + TemplateModelRoot tmr, TemplateModelRoot extra, + PrintWriter out, Locale locale) throws HTMLParseException { + process(res, templateFilename, tmr, extra, out, locale, "bundles.adminlocal", "bundles.admin"); + } + + public static void process(HttpServletResponse res, String templateFilename, + TemplateModelRoot tmr, TemplateModelRoot extra, PrintWriter out, + Locale locale, String bundles) throws HTMLParseException { + process(res, templateFilename, tmr, extra, out, locale, bundles, null); + } + + /** + * 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, + String bundles2) 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 + Iterator it = configuration.getKeys(); + String key; + while (it.hasNext()) { + key = (String) it.next(); + configHash.put(key, new SimpleScalar( + configuration.getString(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()))); + + // 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())); + utilityHash.put("isOdd", + FreemarkerGenerator.makeAdapter(new GeneratorIntegerFunctions. + isOddFunction())); + utilityHash.put("increment", + FreemarkerGenerator.makeAdapter(new GeneratorIntegerFunctions. + incrementFunction())); + } + catch (Throwable t) { + throw new HTMLParseException(t.getMessage()); + } + + SimpleHash outPutHash = new SimpleHash(); + + if (extra != null) { + outPutHash.put("extra", extra); + } + outPutHash.put("data", tmr); + outPutHash.put("config", configHash); + outPutHash.put("utility", utilityHash); + + MessageResources messages = MessageResources.getMessageResources(bundles); + if (bundles2!=null) { + outPutHash.put("lang", new MessageMethodModel(locale, MessageResources.getMessageResources(bundles), MessageResources.getMessageResources(bundles2))); + } + else { + outPutHash.put("lang", new MessageMethodModel(locale, MessageResources.getMessageResources(bundles))); + } + + 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. + * + * @deprecated EntityLists comply with TemplateListModel now. + */ + public static SimpleList makeSimpleList(EntityList aList) throws StorageObjectFailure { + logger.warn("using deprecated makeSimpleList(entityList) - a waste of resources"); + SimpleList simpleList = new SimpleList(); + if (aList != null) { + for (int i = 0; i < aList.size(); i++) { + simpleList.add(aList.elementAt(i)); + } + } + return simpleList; + } + + /** + * Konvertiert ein EntityList in ein freemarker.template.SimpleHash-Modell. Im Hash + * sind die einzelnen Entities ueber ihre id zu erreichen. + * @param aList ist die EntityList + * @return SimpleHash mit den entsprechenden freemarker Daten + * + */ + public static SimpleHash makeSimpleHash(EntityList aList) throws + StorageObjectFailure { + SimpleHash simpleHash = new SimpleHash(); + Entity currentEntity; + + if (aList != null) { + for (int i = 0; i < aList.size(); i++) { + currentEntity = (Entity) aList.elementAt(i); + simpleHash.put(currentEntity.getId(), currentEntity); + } + } + return simpleHash; + } + + /** + * Konvertiert ein Hashtable mit den keys und values als String + * in ein freemarker.template.SimpleHash-Modell + * @param mergeData der HashMap mit den String / String Daten + * @return SimpleHash mit den entsprechenden freemarker Daten + * + */ + public static SimpleHash makeSimpleHash(HashMap mergeData) { + SimpleHash modelRoot = new SimpleHash(); + String aField; + if (mergeData != null) { + Set set = mergeData.keySet(); + Iterator it = set.iterator(); + for (int i = 0; i < set.size(); i++) { + aField = (String) it.next(); + modelRoot.put(aField, (String) mergeData.get(aField)); + } + } + return modelRoot; + } + + /** + * Converts EntityList in SimpleHash and adds additional information + * to the returned SimpleHash + * + * @param entList + * @return SimpleHash returns SimpleHash with the converted EntityList plus + * additional Data about the list. + * @exception StorageObjectException + */ + + public static SimpleHash makeSimpleHashWithEntitylistInfos(EntityList entList) throws + StorageObjectFailure { + SimpleHash modelRoot = new SimpleHash(); + if (entList != null) { + modelRoot.put("contentlist", entList); + modelRoot.put("count", + new SimpleScalar( (new Integer(entList.getCount())).toString())); + if (entList.getWhere() != null) { + modelRoot.put("where", new SimpleScalar(entList.getWhere())); + modelRoot.put("where_encoded", + new SimpleScalar(URLEncoder.encode(entList.getWhere()))); + } + if (entList.getOrder() != null) { + modelRoot.put("order", new SimpleScalar(entList.getOrder())); + modelRoot.put("order_encoded", + new SimpleScalar(URLEncoder.encode(entList.getOrder()))); + } + modelRoot.put("from", + new SimpleScalar( (new Integer(entList.getFrom())).toString())); + modelRoot.put("to", + new SimpleScalar( (new Integer(entList.getTo())).toString())); + + if (entList.hasNextBatch()) + modelRoot.put("next", + new SimpleScalar( (new Integer(entList.getNextBatch())). + toString())); + if (entList.hasPrevBatch()) + modelRoot.put("prev", + new SimpleScalar( (new Integer(entList.getPrevBatch())). + toString())); + } + return modelRoot; + } + + /** + * Private methods to get template from a templateFilename + * @param templateFilename + * @return Template + * @exception HTMLParseException + */ + private static Template getTemplateFor(String templateFilename) throws + HTMLParseException { + Template returnTemplate = null; + if (templateFilename != null) + returnTemplate = (Template) templateCache.getItem(templateFilename, + "template"); + + if (returnTemplate == null) { + logger.error("CACHE (ERR): Unknown template: " + templateFilename); + throw new HTMLParseException("Templatefile: " + templateFilename + " not found."); + } + + return returnTemplate; + } + + public static void stopAutoUpdate() { + templateCache.stopAutoUpdate(); + templateCache = null; + } + +} \ No newline at end of file