2 * put your module comment here
12 import freemarker.template.*;
15 import javax.servlet.http.*;
19 * Hilfsklasse zum Mergen von Template und Daten
21 public final class HTMLTemplateProcessor {
23 public static String templateDir;
24 private static FileTemplateCache templateCache;
25 private static Logfile theLog;
26 private static String docRoot;
27 private static String actionRoot;
28 private static String productionHost;
29 private static String audioHost;
30 private static String videoHost;
31 private static String imageHost;
32 private static String openAction;
33 protected static String producerDocRoot = MirConfig.getProp("Producer.DocRoot");
34 protected static String producerStorageRoot = MirConfig.getProp("Producer.StorageRoot");
41 /** @todo either in the above block or here :) //rk */
42 templateDir = MirConfig.getPropWithHome("HTMLTemplateProcessor.Dir");
43 templateCache = new FileTemplateCache(templateDir);
44 templateCache.setLoadingPolicy(templateCache.LOAD_ON_DEMAND);
45 // gone in freemarker 1.7.1
46 // templateCache.startAutoUpdate();
47 theLog = Logfile.getInstance(MirConfig.getPropWithHome("HTMLTemplateProcessor.Logfile"));
48 docRoot = MirConfig.getProp("RootUri");
49 //the quick hack is back in effect as it was more broken than ever before
51 // sorry: nadir back in town, i have to debug the mirbase.jar in the
52 // nadir evironment. from my point of coding, this needs an urgent
54 // yeah, from my point too - tob.
55 //actionRoot = docRoot + "/servlet/" + MirConfig.getProp("ServletName");
56 //actionRoot = docRoot + "/servlet/NadirAktuell";
58 actionRoot = docRoot + "/servlet/Mir";
60 openAction = MirConfig.getProp("Producer.OpenAction");
61 productionHost = MirConfig.getProp("Producer.ProductionHost");
62 videoHost = MirConfig.getProp("Producer.VideoHost");
63 audioHost = MirConfig.getProp("Producer.AudioHost");
64 imageHost = MirConfig.getProp("Producer.Image.Host");
65 producerDocRoot = MirConfig.getProp("Producer.DocRoot");
66 producerStorageRoot = MirConfig.getProp("Producer.StorageRoot");
70 * empty private constructor, to avoid instantiation
72 private HTMLTemplateProcessor () { }
75 // process-methods to merge different datastructures
76 // with freemarker templates
80 * Wandelt <code>anEntity</code> in freemarker-Struktur um, mischt die Daten mit
81 * Template <code>templateFilename</code> und gibt das Ergebnis an den PrintWriter
84 * @param templateFilename
87 * @exception HTMLParseException
90 public static void process(String templateFilename, Entity anEntity, PrintWriter out)
91 throws HTMLParseException {
92 if (anEntity == null) throw new HTMLParseException("entity is empty!");
93 else process(templateFilename, anEntity, out);
98 * Wandelt Liste mit Entities <code>entList</code> in freemarker-Struktur um, mischt die Daten mit
99 * Template <code>templateFilename</code> und gibt das Ergebnis an den PrintWriter
102 * @param templateFilename
105 * @exception HTMLParseException
107 public static void process(HttpServletResponse res,String templateFilename, EntityList entList, PrintWriter out)
108 throws HTMLParseException {
109 process(res, templateFilename, entList, (String)null, (TemplateModelRoot)null, out);
113 * Wandelt Entitylist in freemarker-Struktur um, fügt <code>additionalModel</code>
114 * unter dem Namen <code>additionalModelName</code> ein und mischt die Daten mit
115 * Template <code>templateFilename</code> und gibt das Ergebnis an den PrintWriter
118 * @param templateFilename
120 * @param additionalModelName
121 * @param additionalModel
123 * @exception HTMLParseException
125 public static void process(HttpServletResponse res,String templateFilename, EntityList entList, String additionalModelName,
126 TemplateModelRoot additionalModel, PrintWriter out)
127 throws HTMLParseException {
129 SimpleHash modelRoot = new SimpleHash();
131 if (entList == null) {
132 process(null,templateFilename, modelRoot, out);
135 modelRoot = makeSimpleHashWithEntitylistInfos(entList);
137 // Quickhack um mal ein Popup mit reinzunhemen ..
138 if (additionalModelName != null && additionalModel != null)
139 modelRoot.put(additionalModelName, additionalModel);
141 process(res,templateFilename, modelRoot, out);
142 } catch (StorageObjectException e) {
143 throw new HTMLParseException(e.toString());
149 * Wandelt HashMap <code>mergeData</code> in freemarker-Struktur und mischt diese mit
150 * Template <code>templateFilename</code> und gibt das Ergebnis an den PrintWriter
153 * @param templateFilename
154 * @param mergeData - a HashMap with mergeData to be converted in SimpleHash
156 * @exception HTMLParseException
158 public static void process(HttpServletResponse res,String templateFilename, HashMap mergeData, PrintWriter out)
159 throws HTMLParseException {
160 process(res,templateFilename, makeSimpleHash(mergeData), out);
164 * Gibt Template <code>templateFilename</code> an den PrintWriter
167 * @param templateFilename
170 * @exception HTMLParseException
172 public static void process(String templateFilename, PrintWriter out)
173 throws HTMLParseException {
174 process(null,templateFilename, (TemplateModelRoot)null, out);
179 * Mischt die freemarker-Struktur <code>tmr</code> mit
180 * Template <code>templateFilename</code> und gibt das Ergebnis an den PrintWriter
183 * @param templateFilename
186 * @exception HTMLParseException
188 public static void process(HttpServletResponse res,String templateFilename, TemplateModelRoot tmr, PrintWriter out)
189 throws HTMLParseException {
190 if (out==null) throw new HTMLParseException("no outputstream");
191 Template tmpl = getTemplateFor(templateFilename);
192 if (tmpl == null) throw new HTMLParseException("no template: " + templateFilename);
193 if (tmr==null) tmr = new SimpleHash();
195 /** @todo what is this for? (rk) */
198 session=res.encodeURL("");
201 /** @todo why do we double those? should be cleaned up and
202 * statically initialized, we do not need to assemble a config
203 * hash everytime we give out a page, only exception is
204 * date "now" // rk */
205 // put standard configuration into tempalteRootmodel
206 SimpleHash configHash = new SimpleHash();
207 configHash.put("producerDocRoot", new SimpleScalar(producerDocRoot));
208 configHash.put("storageRoot", new SimpleScalar(producerStorageRoot));
209 configHash.put("productionHost", new SimpleScalar(productionHost));
210 configHash.put("openAction", new SimpleScalar(openAction));
211 configHash.put("actionRootLogin",new SimpleScalar(actionRoot));
212 configHash.put("docRoot", new SimpleScalar(docRoot));
213 configHash.put("now", new SimpleScalar(StringUtil.date2readableDateTime(new GregorianCalendar())));
214 configHash.put("actionRoot", new SimpleScalar(actionRoot+session));
215 configHash.put("productionHost", new SimpleScalar(productionHost));
216 configHash.put("videoHost", new SimpleScalar(videoHost));
217 configHash.put("audioHost", new SimpleScalar(audioHost));
218 configHash.put("imageHost", new SimpleScalar(imageHost));
219 // this conform to updated freemarker syntax
220 configHash.put("compressWhitespace", new freemarker.template.utility.CompressWhitespace() );
222 SimpleHash outPutHash = new SimpleHash();
223 outPutHash.put("data",tmr);
224 outPutHash.put("config", configHash);
226 tmpl.process(outPutHash,out);
231 * Converts Entity-List to SimpleList of SimpleHashes.
232 * @param aList ist eine Liste von Entity
233 * @return eine freemarker.template.SimpleList von SimpleHashes.
235 * @deprecated EntityLists comply with TemplateListModel now.
237 public static SimpleList makeSimpleList(EntityList aList) throws StorageObjectException
239 theLog.printWarning("## using deprecated makeSimpleList(entityList) - a waste of resources");
240 SimpleList simpleList = new SimpleList();
242 for(int i=0;i<aList.size();i++) {
243 simpleList.add(aList.elementAt(i));
250 * Konvertiert ein EntityList in ein freemarker.template.SimpleHash-Modell. Im Hash
251 * sind die einzelnen Entities ueber ihre id zu erreichen.
252 * @param aList ist die EntityList
253 * @return SimpleHash mit den entsprechenden freemarker Daten
256 public static SimpleHash makeSimpleHash(EntityList aList) throws StorageObjectException
258 SimpleHash simpleHash = new SimpleHash();
259 Entity currentEntity;
262 for (int i=0;i<aList.size();i++) {
263 currentEntity = (Entity)aList.elementAt(i);
264 simpleHash.put(currentEntity.getId(), currentEntity);
271 * Konvertiert ein Entity in ein freemarker.template.SimpleHash-Modell
272 * @param entity ist die Entity
273 * @return SimpleHash mit den entsprechenden freemarker Daten
275 * @deprecated This method is deprecated and will be deleted in the next
276 * release. Entity interfaces freemarker.template.TemplateHashModel now
277 * and can be used in the same way as SimpleHash. It is not necessary any
278 * more to make a SimpleHash from an Entity
280 public static SimpleHash makeSimpleHash(Entity entity) {
281 if (entity != null) {
282 theLog.printWarning("## using deprecated makeSimpleHash(entity) - a waste of resources");
283 return makeSimpleHash(entity.getValues());
290 * Konvertiert ein Hashtable mit den keys und values als String
291 * in ein freemarker.template.SimpleHash-Modell
292 * @param mergeData der HashMap mit den String / String Daten
293 * @return SimpleHash mit den entsprechenden freemarker Daten
296 public static SimpleHash makeSimpleHash(HashMap mergeData)
298 SimpleHash modelRoot = new SimpleHash();
300 if (mergeData != null) {
301 Set set = mergeData.keySet();
302 Iterator it = set.iterator();
303 for (int i=0; i<set.size();i++) {
304 aField = (String)it.next();
305 modelRoot.put(aField, (String)mergeData.get(aField));
313 * Converts EntityList in SimpleHash and adds additional information
314 * to the returned SimpleHash
317 * @return SimpleHash returns SimpleHash with the converted EntityList plus
318 * additional Data about the list.
319 * @exception StorageObjectException
322 public static SimpleHash makeSimpleHashWithEntitylistInfos(EntityList entList) throws StorageObjectException {
323 SimpleHash modelRoot = new SimpleHash();
325 modelRoot.put("contentlist", entList);
326 modelRoot.put("count", new SimpleScalar((new Integer(entList.getCount())).toString()));
327 if (entList.getWhere()!=null) {
328 modelRoot.put("where", new SimpleScalar(entList.getWhere()));
329 modelRoot.put("where_encoded", new SimpleScalar(URLEncoder.encode(entList.getWhere())));
331 if(entList.getOrder()!=null) {
332 modelRoot.put("order", new SimpleScalar(entList.getOrder()));
333 modelRoot.put("order_encoded", new SimpleScalar(URLEncoder.encode(entList.getOrder())));
335 modelRoot.put("from", new SimpleScalar((new Integer(entList.getFrom())).toString()));
336 modelRoot.put("to", new SimpleScalar((new Integer(entList.getTo())).toString()));
338 if (entList.hasNextBatch())
339 modelRoot.put("next", new SimpleScalar((new Integer(entList.getNextBatch())).toString()));
340 if (entList.hasPrevBatch())
341 modelRoot.put("prev", new SimpleScalar((new Integer(entList.getPrevBatch())).toString()));
347 * Private methods to get template from a templateFilename
348 * @param templateFilename
350 * @exception HTMLParseException
352 private static Template getTemplateFor(String templateFilename) throws HTMLParseException
354 Template returnTemplate = null;
355 if (templateFilename!=null)
356 returnTemplate = (Template)templateCache.getItem(templateFilename,"template");
359 if (returnTemplate==null) {
360 theLog.printError("CACHE (ERR): Unknown template: " + templateFilename);
361 throw new HTMLParseException("Templatefile: "+ templateFilename + " not found.");
364 return returnTemplate;
367 public static void stopAutoUpdate(){
368 templateCache.stopAutoUpdate();