You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2016/09/20 14:51:20 UTC

svn commit: r1761586 - in /ofbiz/trunk: applications/content/src/main/java/org/apache/ofbiz/content/webapp/ftl/CheckPermissionTransform.java framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java

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);
             }



Re: svn commit: r1761586 - in /ofbiz/trunk: applications/content/src/main/java/org/apache/ofbiz/content/webapp/ftl/CheckPermissionTransform.java framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java

Posted by Michael Brohl <mi...@ecomify.de>.
Great, Jacopo!

I will remove the default footer file creation in build.gradle which is 
not neccesary any more.

Thanks,

Michael


Am 20.09.16 um 16:51 schrieb jacopoc@apache.org:
> 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);
>               }
>
>



Re: svn commit: r1761586 - in /ofbiz/trunk: applications/content/src/main/java/org/apache/ofbiz/content/webapp/ftl/Chec kPermissionTransform.java framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarker Worker.java

Posted by Jacques Le Roux <ja...@les7arts.com>.
This is one of the rare cases where it's OK to swallow an exception :)

Thanks Jacopo!

Jacques


Le 20/09/2016 � 16:51, jacopoc@apache.org a �crit :
> 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
>
> +        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;
>           }
>       }
>