You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Michael Brohl <mi...@ecomify.de> on 2016/09/20 15:03:39 UTC

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

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