From 6b97d849d1853818df13314727d1bfb11ba30a01 Mon Sep 17 00:00:00 2001 From: Cristiano Nicolai Date: Thu, 24 Feb 2011 12:03:13 +1000 Subject: [PATCH 6/6] Template loading refactoring --- .../console/forms/AbstractFormDispatcher.java | 110 ++++++++++++++----- .../console/forms/ProcessFormDispatcher.java | 16 +--- .../console/forms/TaskFormDispatcher.java | 16 ++-- 3 files changed, 91 insertions(+), 51 deletions(-) diff --git a/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/AbstractFormDispatcher.java b/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/AbstractFormDispatcher.java index 37cf08d..4eea2fc 100644 --- a/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/AbstractFormDispatcher.java +++ b/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/AbstractFormDispatcher.java @@ -20,7 +20,6 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; @@ -28,6 +27,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.Map; +import java.util.Map.Entry; import java.util.Properties; import javax.activation.DataHandler; @@ -35,7 +35,14 @@ import javax.activation.DataSource; import org.jboss.bpm.console.server.plugin.FormAuthorityRef; import org.jboss.bpm.console.server.plugin.FormDispatcherPlugin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import freemarker.cache.ClassTemplateLoader; +import freemarker.cache.MultiTemplateLoader; +import freemarker.cache.TemplateLoader; +import freemarker.cache.URLTemplateLoader; +import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; @@ -43,6 +50,63 @@ import freemarker.template.Template; * @author Kris Verlaenen */ public abstract class AbstractFormDispatcher implements FormDispatcherPlugin { + + private static final String TEMPLATE_EXTENSION = ".ftl"; + private static final Logger LOG = LoggerFactory.getLogger(AbstractFormDispatcher.class); + + protected Configuration cfg; + + public AbstractFormDispatcher(){ + cfg = new Configuration(); + cfg.setObjectWrapper(new DefaultObjectWrapper()); +// TODO Disable cache? + cfg.setTemplateUpdateDelay(0); + cfg.setLocalizedLookup(false); + + URLTemplateLoader utl = new URLTemplateLoader() { + + @Override + protected URL getURL(String name) { + if(name.endsWith(TEMPLATE_EXTENSION)){ + name = name.substring(0, name.lastIndexOf(TEMPLATE_EXTENSION)); + } + + StringBuffer sb = new StringBuffer(); + Properties properties = new Properties(); + try { + properties.load(AbstractFormDispatcher.class.getResourceAsStream("/jbpm.console.properties")); + } catch (IOException e) { + throw new RuntimeException("Could not load jbpm.console.properties", e); + } + try { + sb.append("http://"); + sb.append(properties.get("jbpm.console.server.host")); + sb.append(":").append(new Integer(properties.getProperty("jbpm.console.server.port"))); + sb.append("/drools-guvnor/org.drools.guvnor.Guvnor/package/defaultPackage/LATEST/"); + sb.append(URLEncoder.encode(name, "UTF-8")); + sb.append(".drl"); + return new URL(sb.toString()); + } catch (Throwable t) { + t.printStackTrace(); + } + return null; + } + }; + + ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), "/"){ + + @Override + protected URL getURL(String name) { + return super.getURL(name.endsWith(TEMPLATE_EXTENSION) ? name : name + TEMPLATE_EXTENSION); + } + + }; + + TemplateLoader[] loaders = new TemplateLoader[] { ctl, utl }; + MultiTemplateLoader mtl = new MultiTemplateLoader(loaders); + cfg.setTemplateLoader(mtl); + } + public URL getDispatchUrl(FormAuthorityRef ref) { StringBuffer sb = new StringBuffer(); @@ -78,39 +142,27 @@ public abstract class AbstractFormDispatcher implements FormDispatcherPlugin { "Unknown form authority type: " + ref.getType()); } - public InputStream getTemplate(String name) { - InputStream result = AbstractFormDispatcher.class.getResourceAsStream("/" + name + ".ftl"); - if (result != null) { - return result; - } - StringBuffer sb = new StringBuffer(); - Properties properties = new Properties(); - try { - properties.load(AbstractFormDispatcher.class.getResourceAsStream("/jbpm.console.properties")); - } catch (IOException e) { - throw new RuntimeException("Could not load jbpm.console.properties", e); + protected DataHandler processTemplate(final String name, Map renderContext) { + + if(LOG.isDebugEnabled() && renderContext!=null){ + LOG.debug("Processing Form Template: {}", name); + for(Entry entry : renderContext.entrySet()){ + LOG.debug("Variable name: {}", entry.getKey()); + LOG.debug("Variable value: {}", entry.getValue()); + } } + + + Template temp = null; try { - sb.append("http://"); - sb.append(properties.get("jbpm.console.server.host")); - sb.append(":").append(new Integer(properties.getProperty("jbpm.console.server.port"))); - sb.append("/drools-guvnor/org.drools.guvnor.Guvnor/package/defaultPackage/LATEST/"); - sb.append(URLEncoder.encode(name, "UTF-8")); - sb.append(".ftl"); - return new URL(sb.toString()).openStream(); - } catch (Throwable t) { - t.printStackTrace(); + temp = cfg.getTemplate(name); + } catch (IOException ioex) { + LOG.warn("Error trying to get template {}", name, ioex); + return null; } - return null; - } - - protected DataHandler processTemplate(final String name, InputStream src, Map renderContext) { + DataHandler merged = null; try { - freemarker.template.Configuration cfg = new freemarker.template.Configuration(); - cfg.setObjectWrapper(new DefaultObjectWrapper()); - cfg.setTemplateUpdateDelay(0); - Template temp = new Template(name, new InputStreamReader(src), cfg); final ByteArrayOutputStream bout = new ByteArrayOutputStream(); Writer out = new OutputStreamWriter(bout); temp.process(renderContext, out); diff --git a/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/ProcessFormDispatcher.java b/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/ProcessFormDispatcher.java index 0c11bd2..29dbd51 100644 --- a/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/ProcessFormDispatcher.java +++ b/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/ProcessFormDispatcher.java @@ -16,8 +16,6 @@ package org.jbpm.integration.console.forms; -import java.io.InputStream; -import java.net.URL; import java.util.HashMap; import javax.activation.DataHandler; @@ -26,20 +24,8 @@ import org.jboss.bpm.console.server.plugin.FormAuthorityRef; public class ProcessFormDispatcher extends AbstractFormDispatcher { - public URL getDispatchUrl(FormAuthorityRef ref) { - InputStream template = getTemplate(ref.getReferenceId()); - if (template == null) { - return null; - } - return super.getDispatchUrl(ref); - } - public DataHandler provideForm(FormAuthorityRef ref) { - InputStream template = getTemplate(ref.getReferenceId()); - if (template == null) { - return null; - } - return processTemplate(ref.getReferenceId(), template, new HashMap()); + return processTemplate(ref.getReferenceId(), new HashMap()); } } diff --git a/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/TaskFormDispatcher.java b/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/TaskFormDispatcher.java index 493bc57..62a0036 100644 --- a/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/TaskFormDispatcher.java +++ b/jbpm-gwt/jbpm-gwt-form/src/main/java/org/jbpm/integration/console/forms/TaskFormDispatcher.java @@ -18,7 +18,6 @@ package org.jbpm.integration.console.forms; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.ObjectInputStream; import java.util.HashMap; import java.util.List; @@ -99,11 +98,7 @@ public class TaskFormDispatcher extends AbstractFormDispatcher { name = text.getText(); } } - InputStream template = getTemplate(name); - if (template == null) { - template = TaskFormDispatcher.class.getResourceAsStream("/DefaultTask.ftl"); - } - + // merge template with process variables Map renderContext = new HashMap(); renderContext.put("task", task); @@ -116,7 +111,14 @@ public class TaskFormDispatcher extends AbstractFormDispatcher { } } } - return processTemplate(name, template, renderContext); + + DataHandler handler = processTemplate(name, renderContext); + + if(handler == null){ + handler = processTemplate("DefaultTask.ftl", renderContext); + } + + return handler; } } -- 1.7.3.4