Author: jacopoc
Date: Tue Sep 20 14:51:20 2016
New Revision: 1761586

URL: http://svn.apache.org/viewvc?rev=1761586&view=rev
Log:
Fix for: Freemarker's ignore_missing attribute of the #include directive was 
not 
working because of an issue in the OFBiz custom TemplateLoader for Freemarker 
templates.
(OFBIZ-8292)

The OFBiz custom TemplateLoader now returns null if the resource is missing as 
required by the TemplateLoader specification.
Additional cleanups for unused methods in the FreeMarkerWorker class and some 
minor fine tuning; improved the way errors are rendered: now the full stack 
trace is not shown in the screen but only in the logs.

Thanks: Jacques Le Roux for the report.

Modified:
    
ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/webapp/ftl/CheckPermissionTransform.java
    
ofbiz/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java

Modified: 
ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/webapp/ftl/CheckPermissionTransform.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/webapp/ftl/CheckPermissionTransform.java?rev=1761586&r1=1761585&r2=1761586&view=diff
==============================================================================
--- 
ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/webapp/ftl/CheckPermissionTransform.java
 (original)
+++ 
ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/webapp/ftl/CheckPermissionTransform.java
 Tue Sep 20 14:51:20 2016
@@ -87,7 +87,6 @@ public class CheckPermissionTransform im
         final StringBuilder buf = new StringBuilder();
         final Environment env = Environment.getCurrentEnvironment();
         final Map<String, Object> templateCtx = 
FreeMarkerWorker.createEnvironmentMap(env);
-        //FreeMarkerWorker.convertContext(templateCtx);
         final Delegator delegator = 
FreeMarkerWorker.getWrappedObject("delegator", env);
         final HttpServletRequest request = 
FreeMarkerWorker.getWrappedObject("request", env);
         final GenericValue userLogin = 
FreeMarkerWorker.getWrappedObject("userLogin", env);

Modified: 
ofbiz/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java?rev=1761586&r1=1761585&r2=1761586&view=diff
==============================================================================
--- 
ofbiz/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java
 (original)
+++ 
ofbiz/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java
 Tue Sep 20 14:51:20 2016
@@ -18,22 +18,17 @@
  
*******************************************************************************/
 package org.apache.ofbiz.base.util.template;
 
+import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
 import java.io.Reader;
 import java.io.StringReader;
-import java.io.StringWriter;
 import java.io.Writer;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -47,14 +42,13 @@ import javax.servlet.http.HttpServletReq
 import org.apache.ofbiz.base.location.FlexibleLocation;
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.StringUtil;
-import org.apache.ofbiz.base.util.UtilCodec;
 import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.base.util.UtilMisc;
 import org.apache.ofbiz.base.util.UtilProperties;
 import org.apache.ofbiz.base.util.UtilValidate;
 import org.apache.ofbiz.base.util.cache.UtilCache;
 
-import freemarker.cache.TemplateLoader;
+import freemarker.cache.URLTemplateLoader;
 import freemarker.core.Environment;
 import freemarker.ext.beans.BeanModel;
 import freemarker.ext.beans.BeansWrapper;
@@ -70,8 +64,8 @@ import freemarker.template.TemplateModel
 import freemarker.template.TemplateModelException;
 import freemarker.template.Version;
 
-/** FreeMarkerWorker - Freemarker Template Engine Utilities.
- *
+/**
+ * FreeMarkerWorker - Freemarker Template Engine Utilities.
  */
 public final class FreeMarkerWorker {
 
@@ -109,6 +103,7 @@ public final class FreeMarkerWorker {
         newConfig.setSharedVariable("StringUtil", new 
BeanModel(StringUtil.INSTANCE, wrapper));
         newConfig.setTemplateLoader(new FlexibleTemplateLoader());
         
newConfig.setAutoImports(UtilProperties.getProperties("freemarkerImports"));
+        newConfig.setLogTemplateExceptions(false);
         newConfig.setTemplateExceptionHandler(new 
FreeMarkerWorker.OFBizTemplateExceptionHandler());
         try {
             newConfig.setSetting("datetime_format", "yyyy-MM-dd HH:mm:ss.SSS");
@@ -205,21 +200,6 @@ public final class FreeMarkerWorker {
         renderTemplate(template, context, outWriter);
     }
 
-    /**
-     * @deprecated Renamed to {@link #renderTemplateFromString(String, String, 
Map, Appendable, boolean)}
-     */
-    @Deprecated
-    public static Environment renderTemplateFromString(String templateString, 
String templateLocation, Map<String, Object> context, Appendable outWriter) 
throws TemplateException, IOException {
-        Template template = cachedTemplates.get(templateLocation);
-        if (template == null) {
-            Reader templateReader = new StringReader(templateString);
-            template = new Template(templateLocation, templateReader, 
defaultOfbizConfig);
-            templateReader.close();
-            template = cachedTemplates.putIfAbsentAndGet(templateLocation, 
template);
-        }
-        return renderTemplate(template, context, outWriter);
-    }
-
     public static Environment renderTemplateFromString(String templateString, 
String templateLocation, Map<String, Object> context, Appendable outWriter, 
boolean useCache) throws TemplateException, IOException {
         Template template = null;
         if (useCache) {
@@ -295,37 +275,6 @@ public final class FreeMarkerWorker {
         return defaultOfbizConfig;
     }
 
-    /** Make sure to close the reader when you're done! That's why this method 
is private, BTW. */
-    private static Reader makeReader(String templateLocation) throws 
IOException {
-        if (UtilValidate.isEmpty(templateLocation)) {
-            throw new IllegalArgumentException("FreeMarker template location 
null or empty");
-        }
-
-        URL locationUrl = null;
-        try {
-            locationUrl = FlexibleLocation.resolveLocation(templateLocation);
-        } catch (MalformedURLException e) {
-            throw new IllegalArgumentException(e.getMessage());
-        }
-        if (locationUrl == null) {
-            throw new IllegalArgumentException("FreeMarker file not found at 
location: " + templateLocation);
-        }
-
-        InputStream locationIs = locationUrl.openStream();
-        Reader templateReader = new InputStreamReader(locationIs);
-
-        String locationProtocol = locationUrl.getProtocol();
-        if ("file".equals(locationProtocol) && Debug.verboseOn()) {
-            String locationFile = locationUrl.getFile();
-            int lastSlash = locationFile.lastIndexOf("/");
-            String locationDir = locationFile.substring(0, lastSlash);
-            String filename = locationFile.substring(lastSlash + 1);
-            Debug.logVerbose("FreeMarker render: filename=" + filename + ", 
locationDir=" + locationDir, module);
-        }
-
-        return templateReader;
-    }
-
     /**
      * Gets a Template instance from the template cache. If the Template 
instance isn't
      * found in the cache, then one will be created.
@@ -338,10 +287,7 @@ public final class FreeMarkerWorker {
     public static Template getTemplate(String templateLocation, 
UtilCache<String, Template> cache, Configuration config) throws 
TemplateException, IOException {
         Template template = cache.get(templateLocation);
         if (template == null) {
-            // only make the reader if we need it, and then close it right 
after!
-            Reader templateReader = makeReader(templateLocation);
-            template = new Template(templateLocation, templateReader, config);
-            templateReader.close();
+            template = config.getTemplate(templateLocation);
             template = cache.putIfAbsentAndGet(templateLocation, template);
         }
         return template;
@@ -367,21 +313,6 @@ public final class FreeMarkerWorker {
         return returnVal;
     }
 
-    public static Object getArgObject(Map<String, ? extends Object> args, 
String key, Map<String, ? extends Object> templateContext) {
-        Object o = args.get(key);
-        Object returnVal = unwrap(o);
-        if (returnVal == null) {
-            try {
-                if (templateContext != null) {
-                    returnVal = templateContext.get(key);
-                }
-            } catch (ClassCastException e2) {
-                Debug.logInfo(e2.getMessage(), module);
-            }
-        }
-        return returnVal;
-    }
-
    /**
     * Gets BeanModel from FreeMarker context and returns the object that it 
wraps.
     * @param varName the name of the variable in the FreeMarker context.
@@ -407,21 +338,6 @@ public final class FreeMarkerWorker {
         return UtilGenerics.<T>cast(obj);
     }
 
-   /**
-    * Gets BeanModel from FreeMarker context and returns the object that it 
wraps.
-    * @param varName the name of the variable in the FreeMarker context.
-    * @param env the FreeMarker Environment
-    */
-    public static BeanModel getBeanModel(String varName, Environment env) {
-        BeanModel bean = null;
-        try {
-            bean = (BeanModel) env.getVariable(varName);
-        } catch (TemplateModelException e) {
-            Debug.logInfo(e.getMessage(), module);
-        }
-        return bean;
-    }
-
     public static Object get(SimpleHash args, String key) {
         Object o = null;
         try {
@@ -465,19 +381,6 @@ public final class FreeMarkerWorker {
         return (T) returnObj;
     }
 
-    public static void checkForLoop(String path, Map<String, Object> ctx) 
throws IOException {
-        List<String> templateList = 
UtilGenerics.checkList(ctx.get("templateList"));
-        if (templateList == null) {
-            templateList = new LinkedList<String>();
-        } else {
-            if (templateList.contains(path)) {
-                throw new IOException(path + " has already been visited.");
-            }
-        }
-        templateList.add(path);
-        ctx.put("templateList", templateList);
-    }
-
     public static Map<String, Object> createEnvironmentMap(Environment env) {
         Map<String, Object> templateRoot = new HashMap<String, Object>();
         Set<String> varNames = null;
@@ -520,7 +423,6 @@ public final class FreeMarkerWorker {
         return saveMap;
     }
 
-
     public static void reloadValues(Map<String, Object> context, Map<String, 
Object> saveValues, Environment env) {
         for (Map.Entry<String, Object> entry: saveValues.entrySet()) {
             String key = entry.getKey();
@@ -564,18 +466,6 @@ public final class FreeMarkerWorker {
         }
     }
 
-    public static void convertContext(Map<String, Object> ctx) {
-        for (Map.Entry<String, Object> entry: ctx.entrySet()) {
-            Object obj = entry.getValue();
-            if (obj != null) {
-                Object unwrappedObj = unwrap(obj);
-                if (unwrappedObj != null) {
-                    entry.setValue(unwrappedObj);
-                }
-            }
-        }
-    }
-
     public static void getSiteParameters(HttpServletRequest request, 
Map<String, Object> ctx) {
         if (request == null) {
             return;
@@ -611,58 +501,21 @@ public final class FreeMarkerWorker {
        return templateModelObj;
     }
 
-    /**
-     * OFBiz Template Source. This class is used by FlexibleTemplateLoader.
+    /*
+     * Custom TemplateLoader for Freemarker to locate templates by resource 
identifier
+     * following the format:
+     *  component://componentname/path/to/some/file.ftl
      */
-    static class FlexibleTemplateSource {
-        protected String templateLocation = null;
-        protected Date createdDate = new Date();
-
-        protected FlexibleTemplateSource() {}
-        public FlexibleTemplateSource(String templateLocation) {
-            this.templateLocation = templateLocation;
-        }
-
+    static class FlexibleTemplateLoader extends URLTemplateLoader {
         @Override
-        public int hashCode() {
-            return templateLocation.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            return obj instanceof FlexibleTemplateSource && obj.hashCode() == 
this.hashCode();
-        }
-
-        public String getTemplateLocation() {
-            return templateLocation;
-        }
-
-        public long getLastModified() {
-            return createdDate.getTime();
-        }
-    }
-
-    /**
-     * OFBiz Template Loader. This template loader uses the FlexibleLocation
-     * class to locate and load Freemarker templates.
-     */
-    static class FlexibleTemplateLoader implements TemplateLoader {
-        public Object findTemplateSource(String name) throws IOException {
-            return new FlexibleTemplateSource(name);
-        }
-
-        public long getLastModified(Object templateSource) {
-            FlexibleTemplateSource fts = (FlexibleTemplateSource) 
templateSource;
-            return fts.getLastModified();
-        }
-
-        public Reader getReader(Object templateSource, String encoding) throws 
IOException {
-            FlexibleTemplateSource fts = (FlexibleTemplateSource) 
templateSource;
-            return makeReader(fts.getTemplateLocation());
-        }
-
-        public void closeTemplateSource(Object templateSource) throws 
IOException {
-            // do nothing
+        protected URL getURL(String name) {
+            URL locationUrl = null;
+            try {
+                locationUrl = FlexibleLocation.resolveLocation(name);
+            } catch (Exception e) {
+                Debug.logWarning("Unable to locate the template: " + name, 
module);
+            }
+            return locationUrl != null && new 
File(locationUrl.getFile()).exists()? locationUrl: null;
         }
     }
 
@@ -672,17 +525,9 @@ public final class FreeMarkerWorker {
      */
     static class OFBizTemplateExceptionHandler implements 
TemplateExceptionHandler {
         public void handleTemplateException(TemplateException te, Environment 
env, Writer out) throws TemplateException {
-            StringWriter tempWriter = new StringWriter();
-            PrintWriter pw = new PrintWriter(tempWriter, true);
-            te.printStackTrace(pw);
-            String stackTrace = tempWriter.toString();
-
-            UtilCodec.SimpleEncoder simpleEncoder = 
FreeMarkerWorker.getWrappedObject("simpleEncoder", env);
-            if (simpleEncoder != null) {
-                stackTrace = simpleEncoder.encode(stackTrace);
-            }
             try {
-                out.write(stackTrace);
+                out.write(te.getMessage());
+                Debug.logError(te, module);
             } catch (IOException e) {
                 Debug.logError(e, module);
             }


Reply via email to