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/25 17:20:58 UTC

svn commit: r1762227 - in /ofbiz/trunk: applications/content/src/main/java/org/apache/ofbiz/content/data/ applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/ framework/base/config/ framework/base/src/main/java/org/apache/ofbi...

Author: jacopoc
Date: Sun Sep 25 17:20:58 2016
New Revision: 1762227

URL: http://svn.apache.org/viewvc?rev=1762227&view=rev
Log:
Improved: cleanups and enhancements in the FreeMarkerWorker class, and client 
code using it, that wraps most of the OFBiz integration with FreeMarker.

This is the list of the main modifications:
* simplified and cleaned up the public methods of FreeMarkerWorker, used to 
retrieve and render Freemarker templates and changed client code accordingly to 
use them
* removed unused methods in FreeMarkerWorker and made some others private
* improved the integration code in FreeMarkerWorker to better use the Freemarker 
API and specifically to leverage the various TemplateLoaders and the Freemarker 
caching mechanism; it is now possible to switch the OFBiz legacy template 
caching mechanism to use the Freemarker one instead
* improved the implementation of Freemarker template rendering from strings 
(used by DataResourceWorker): it now leverages the Freemarker's 
StringTemplateLoader that provides the ability to cache the strings, retrieved 
from DataResources records, based on the timestamp of the last modification
* moved freemarkerImports.properties from "widget" to "base" component, and 
changed its content (and the content of the associated templates 
AutoImportTemplate.ftl and HtmlTemplate.ftl) to remove the dependency from base 
to widget&common; some resources of "widget" and "common" are still referenced 
from AutoImportTemplate.ftl (that is in "base") but even if they are soft 
dependencies: if they are missing the system will load properly without any 
error or warning; before this change it was impossible to use, or unit test, 
FreeMarkerWorker before the "widget" and "common" components were loaded by the 
system, now it is possible
* created a new class for unit tests for FreeMarkerWorker, named 
FreeMarkerWorkerTests: at the moment it contains just one simple unit test but 
more should be implemented
* refactored WebToolsServices.entityImport(...) to leverage the 
FreeMarkerWorker.renderTemplate(...) method to run the Freemarker template, 
rather than dealing with the Freemarker API directly; this is now possible 
thanks to the cleanups and improvements done in the FreeMarkerWorker class; this 
same approach should be implemented for a few other similar integration points 
(mostly in the "content" component); this is a TODO item
* moved the encodeDoubleQuotes(...) method from FreeMarkerWorker to 
MacroFormRenderer and made it private since this is the only calss using it and 
its logic is not related to FreeMarker


Added:
    ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl   (with props)
    ofbiz/trunk/framework/base/config/freemarkerImports.properties
      - copied, changed from r1762109, ofbiz/trunk/framework/widget/config/freemarkerImports.properties
    ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/
    ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java   (with props)
Removed:
    ofbiz/trunk/framework/widget/config/freemarkerImports.properties
Modified:
    ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java
    ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java
    ofbiz/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java
    ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java
    ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl
    ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java
    ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java
    ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java
    ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
    ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java

Modified: ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java (original)
+++ ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java Sun Sep 25 17:20:58 2016
@@ -29,6 +29,7 @@ import java.io.Writer;
 import java.net.URL;
 import java.net.URLConnection;
 import java.nio.ByteBuffer;
+import java.sql.Timestamp;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -578,7 +579,7 @@ public class DataResourceWorker  impleme
         if (dataResource != null) {
             String dataTemplateTypeId = dataResource.getString("dataTemplateTypeId");
             if ("FTL".equals(dataTemplateTypeId)) {
-                FreeMarkerWorker.clearTemplateFromCache(delegator.getDelegatorName() + ":DataResource:" + dataResourceId);
+                FreeMarkerWorker.clearTemplateFromCache("delegator:" + delegator.getDelegatorName() + ":DataResource:" + dataResourceId);
             }
         }
     }
@@ -656,7 +657,8 @@ public class DataResourceWorker  impleme
 
                     // render the FTL template
                     boolean useTemplateCache = cache && !UtilProperties.getPropertyAsBoolean("content", "disable.ftl.template.cache", false);
-                    FreeMarkerWorker.renderTemplate(delegator.getDelegatorName() + ":DataResource:" + dataResourceId, templateText, templateContext, out, useTemplateCache);
+                    Timestamp lastUpdatedStamp = dataResource.getTimestamp("lastUpdatedStamp");
+                    FreeMarkerWorker.renderTemplateFromString("delegator:" + delegator.getDelegatorName() + ":DataResource:" + dataResourceId, templateText, templateContext, out, lastUpdatedStamp.getTime(), useTemplateCache);
                 } catch (TemplateException e) {
                     throw new GeneralException("Error rendering FTL template", e);
                 }
@@ -899,7 +901,7 @@ public class DataResourceWorker  impleme
         String location = mimeTypeTemplate.getString("templateLocation");
         StringWriter writer = new StringWriter();
         try {
-            FreeMarkerWorker.renderTemplateAtLocation(location, context, writer);
+            FreeMarkerWorker.renderTemplate(location, context, writer);
         } catch (TemplateException e) {
             throw new GeneralException(e.getMessage(), e);
         }

Modified: ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java (original)
+++ ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java Sun Sep 25 17:20:58 2016
@@ -334,7 +334,7 @@ public class FedexServices {
 
             StringWriter outWriter = new StringWriter();
             try {
-                FreeMarkerWorker.renderTemplateAtLocation(templateLocation, subscriptionRequestContext, outWriter);
+                FreeMarkerWorker.renderTemplate(templateLocation, subscriptionRequestContext, outWriter);
             } catch (Exception e) {
                 String errorMessage = "Cannot send Fedex subscription request: Failed to render Fedex XML Subscription Request Template [" + templateLocation + "].";
                 Debug.logError(e, errorMessage, module);
@@ -925,7 +925,7 @@ public class FedexServices {
 
             StringWriter outWriter = new StringWriter();
             try {
-                FreeMarkerWorker.renderTemplateAtLocation(templateLocation, shipRequestContext, outWriter);
+                FreeMarkerWorker.renderTemplate(templateLocation, shipRequestContext, outWriter);
             } catch (Exception e) {
                 String errorMessage = "Cannot confirm Fedex shipment: Failed to render Fedex XML Ship Request Template [" + templateLocation + "].";
                 Debug.logError(e, errorMessage, module);

Added: ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl?rev=1762227&view=auto
==============================================================================
--- ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl (added)
+++ ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl Sun Sep 25 17:20:58 2016
@@ -0,0 +1,21 @@
+<#--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<#include "component://widget/templates/HtmlFormMacroLibrary.ftl" ignore_missing=true />
+<#include "component://common/template/includes/HtmlTemplate.ftl" ignore_missing=true />

Propchange: ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: ofbiz/trunk/framework/base/config/freemarkerImports.properties (from r1762109, ofbiz/trunk/framework/widget/config/freemarkerImports.properties)
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/config/freemarkerImports.properties?p2=ofbiz/trunk/framework/base/config/freemarkerImports.properties&p1=ofbiz/trunk/framework/widget/config/freemarkerImports.properties&r1=1762109&r2=1762227&rev=1762227&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/config/freemarkerImports.properties (original)
+++ ofbiz/trunk/framework/base/config/freemarkerImports.properties Sun Sep 25 17:20:58 2016
@@ -17,4 +17,4 @@
 # under the License.
 ###############################################################################
 
-htmlTemplate=component://common/template/includes/HtmlTemplate.ftl
+htmlTemplate=ofbizhome://framework/base/config/AutoImportTemplate.ftl

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=1762227&r1=1762226&r2=1762227&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 Sun Sep 25 17:20:58 2016
@@ -20,10 +20,7 @@ package org.apache.ofbiz.base.util.templ
 
 import java.io.File;
 import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
 import java.io.Writer;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -39,6 +36,9 @@ import java.util.TimeZone;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 
+import freemarker.cache.MultiTemplateLoader;
+import freemarker.cache.StringTemplateLoader;
+import freemarker.cache.TemplateLoader;
 import org.apache.ofbiz.base.location.FlexibleLocation;
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.StringUtil;
@@ -101,8 +101,13 @@ public final class FreeMarkerWorker {
         }
         newConfig.setLocalizedLookup(false);
         newConfig.setSharedVariable("StringUtil", new BeanModel(StringUtil.INSTANCE, wrapper));
-        newConfig.setTemplateLoader(new FlexibleTemplateLoader());
-        newConfig.setAutoImports(UtilProperties.getProperties("freemarkerImports"));
+        TemplateLoader[] templateLoaders = {new FlexibleTemplateLoader(), new StringTemplateLoader()};
+        MultiTemplateLoader multiTemplateLoader = new MultiTemplateLoader(templateLoaders);
+        newConfig.setTemplateLoader(multiTemplateLoader);
+        Map freemarkerImports = UtilProperties.getProperties("freemarkerImports");
+        if (freemarkerImports != null) {
+            newConfig.setAutoImports(freemarkerImports);
+        }
         newConfig.setLogTemplateExceptions(false);
         newConfig.setTemplateExceptionHandler(new FreeMarkerWorker.OFBizTemplateExceptionHandler());
         try {
@@ -115,7 +120,7 @@ public final class FreeMarkerWorker {
         ClassLoader loader = Thread.currentThread().getContextClassLoader();
         Enumeration<URL> resources;
         try {
-            resources = loader.getResources("freemarkerTransforms.properties"); 
+            resources = loader.getResources("freemarkerTransforms.properties");
         } catch (IOException e) {
             Debug.logError(e, "Could not load list of freemarkerTransforms.properties", module);
             throw UtilMisc.initCause(new InternalError(e.getMessage()), e);
@@ -134,10 +139,7 @@ public final class FreeMarkerWorker {
         return newConfig;
     }
 
-    /**
-     * Public helper method.
-     */
-    public static void loadTransforms(ClassLoader loader, Properties props, Configuration config) {
+    private static void loadTransforms(ClassLoader loader, Properties props, Configuration config) {
         for (Iterator<Object> i = props.keySet().iterator(); i.hasNext();) {
             String key = (String) i.next();
             String className = props.getProperty(key);
@@ -153,43 +155,6 @@ public final class FreeMarkerWorker {
     }
 
     /**
-     * Renders a template at the specified location.
-     * @param templateLocation Location of the template - file path or URL
-     * @param context The context Map
-     * @param outWriter The Writer to render to
-     */
-    public static void renderTemplateAtLocation(String templateLocation, Map<String, Object> context, Appendable outWriter) throws MalformedURLException, TemplateException, IOException {
-        renderTemplate(templateLocation, context, outWriter);
-    }
-
-    /**
-     * Renders a template contained in a String.
-     * @param templateLocation A unique ID for this template - used for caching
-     * @param templateString The String containing the template
-     * @param context The context Map
-     * @param outWriter The Writer to render to
-     */
-    public static void renderTemplate(String templateLocation, String templateString, Map<String, Object> context, Appendable outWriter) throws TemplateException, IOException {
-        renderTemplate(templateLocation, templateString, context, outWriter, true);
-    }
-
-    /**
-     * Renders a template contained in a String.
-     * @param templateLocation A unique ID for this template - used for caching
-     * @param templateString The String containing the template
-     * @param context The context Map
-     * @param outWriter The Writer to render to
-     * @param useCache try to get template from cache
-     */
-    public static void renderTemplate(String templateLocation, String templateString, Map<String, Object> context, Appendable outWriter, boolean useCache) throws TemplateException, IOException {
-        if (templateString == null) {
-            renderTemplate(templateLocation, context, outWriter);
-        } else {
-            renderTemplateFromString(templateString, templateLocation, context, outWriter, useCache);
-        }
-    }
-
-    /**
      * Renders a template from a Reader.
      * @param templateLocation A unique ID for this template - used for caching
      * @param context The context Map
@@ -200,26 +165,30 @@ public final class FreeMarkerWorker {
         renderTemplate(template, context, outWriter);
     }
 
-    public static Environment renderTemplateFromString(String templateString, String templateLocation, Map<String, Object> context, Appendable outWriter, boolean useCache) throws TemplateException, IOException {
+    public static void renderTemplateFromString(String templateName, String templateString, Map<String, Object> context, Appendable outWriter, long lastModificationTime, boolean useCache) throws TemplateException, IOException {
         Template template = null;
         if (useCache) {
-            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);
-            }
-        } else {
-            Reader templateReader = new StringReader(templateString);
-            template = new Template(templateLocation, templateReader, defaultOfbizConfig);
-            templateReader.close();
+            template = cachedTemplates.get(templateName);
         }
-        return renderTemplate(template, context, outWriter);
+        if (template == null) {
+            StringTemplateLoader stringTemplateLoader = (StringTemplateLoader)((MultiTemplateLoader)defaultOfbizConfig.getTemplateLoader()).getTemplateLoader(1);
+            Object templateSource = stringTemplateLoader.findTemplateSource(templateName);
+            if (templateSource == null || stringTemplateLoader.getLastModified(templateSource) < lastModificationTime) {
+                stringTemplateLoader.putTemplate(templateName, templateString, lastModificationTime);
+            }
+        }
+
+        template = getTemplate(templateName);
+        renderTemplate(template, context, outWriter);
     }
 
     public static void clearTemplateFromCache(String templateLocation) {
         cachedTemplates.remove(templateLocation);
+        try {
+            defaultOfbizConfig.removeTemplateFromCache(templateLocation);
+        } catch(Exception e) {
+            Debug.logInfo("Template not found in Fremarker cache with name: " + templateLocation, module);
+        }
     }
 
     /**
@@ -249,7 +218,7 @@ public final class FreeMarkerWorker {
      * @param env An Environment instance
      * @param context The context Map containing the user settings
      */
-    public static void applyUserSettings(Environment env, Map<String, Object> context) throws TemplateException {
+    private static void applyUserSettings(Environment env, Map<String, Object> context) throws TemplateException {
         Locale locale = (Locale) context.get("locale");
         if (locale == null) {
             locale = Locale.getDefault();
@@ -509,6 +478,7 @@ public final class FreeMarkerWorker {
     static class FlexibleTemplateLoader extends URLTemplateLoader {
         @Override
         protected URL getURL(String name) {
+            if (name != null && name.startsWith("delegator:")) return null; // this is a template stored in the database
             URL locationUrl = null;
             try {
                 locationUrl = FlexibleLocation.resolveLocation(name);
@@ -520,8 +490,7 @@ public final class FreeMarkerWorker {
     }
 
     /**
-     * OFBiz specific TemplateExceptionHandler.  Sanitizes any error messages present in
-     * the stack trace prior to printing to the output writer.
+     * OFBiz specific TemplateExceptionHandler.
      */
     static class OFBizTemplateExceptionHandler implements TemplateExceptionHandler {
         public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException {
@@ -533,8 +502,4 @@ public final class FreeMarkerWorker {
             }
         }
     }
-
-    public static String encodeDoubleQuotes(String htmlString) {
-        return htmlString.replaceAll("\"", "\\\\\"");
-    }
 }

Added: ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java?rev=1762227&view=auto
==============================================================================
--- ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java (added)
+++ ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java Sun Sep 25 17:20:58 2016
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.apache.ofbiz.base.util.template;
+
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class FreeMarkerWorkerTests {
+    @Before
+    public void initialize() {
+        System.setProperty("ofbiz.home", System.getProperty("user.dir"));
+    }
+
+    @Test
+    public void renderTemplateFromString() throws Exception {
+        StringWriter out = new StringWriter();
+        Map<String, Object> context = new HashMap<>();
+        context.put("name", "World!");
+        FreeMarkerWorker.renderTemplateFromString("template1", "Hello ${name}", context, out, 0, false);
+        assertEquals("Hello World!", out.toString());
+    }
+}

Propchange: ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java (original)
+++ ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java Sun Sep 25 17:20:58 2016
@@ -190,7 +190,7 @@ public class JsLanguageFileMappingCreato
         // some magic to create a new java file: render it as FTL
         Writer writer = new StringWriter();
         try {
-            FreeMarkerWorker.renderTemplateAtLocation(template, mapWrapper, writer);
+            FreeMarkerWorker.renderTemplate(template, mapWrapper, writer);
             // write it as a Java file
             File file = new File(output);
             FileUtils.writeStringToFile(file, writer.toString(), encoding);

Modified: ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl (original)
+++ ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl Sun Sep 25 17:20:58 2016
@@ -17,8 +17,6 @@ specific language governing permissions
 under the License.
 -->
 
-<#include "component://widget/templates/HtmlFormMacroLibrary.ftl"/>
-
 <#macro lookupField className="" alert="" name="" value="" size="20" maxlength="20" id="" event="" action="" readonly="" autocomplete="" descriptionFieldName="" formName="" fieldFormName="" targetParameterIter="" imgSrc="" ajaxUrl="" ajaxEnabled="" presentation="layer" width="" height="" position="topleft" fadeBackground="true" clearText="" showDescription="" initiallyCollapsed="" tabindex="">
   <#if (!ajaxEnabled?has_content)>
     <#assign javascriptEnabled = Static["org.apache.ofbiz.base.util.UtilHttp"].isJavaScriptEnabled(request) />

Modified: ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java (original)
+++ ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java Sun Sep 25 17:20:58 2016
@@ -32,7 +32,7 @@ public class DelegatorUnitTests {
 
     @Before
     public void initialize() {
-        System.setProperty("ofbiz.home", ".");
+        System.setProperty("ofbiz.home", System.getProperty("user.dir"));
         System.setProperty("derby.system.home", "./runtime/data/derby");
     }
 

Modified: ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java (original)
+++ ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java Sun Sep 25 17:20:58 2016
@@ -64,7 +64,7 @@ public class FreeMarkerViewHandler exten
         // process the template & flush the output
         try {
             if (page.startsWith("component://")) {
-                FreeMarkerWorker.renderTemplateAtLocation(page, context, response.getWriter());
+                FreeMarkerWorker.renderTemplate(page, context, response.getWriter());
             } else {
                 // backwards compatibility
                 Template template = config.getTemplate(page);

Modified: ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java (original)
+++ ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java Sun Sep 25 17:20:58 2016
@@ -22,7 +22,6 @@ import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.io.FileReader;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
@@ -45,6 +44,8 @@ import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.TreeSet;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.ofbiz.base.location.FlexibleLocation;
@@ -88,14 +89,10 @@ import org.apache.ofbiz.service.LocalDis
 import org.apache.ofbiz.service.ServiceUtil;
 import org.apache.ofbiz.webtools.artifactinfo.ArtifactInfoFactory;
 import org.apache.ofbiz.webtools.artifactinfo.ServiceArtifactInfo;
+import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
-import freemarker.ext.dom.NodeModel;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateHashModel;
-
 /**
  * WebTools Services
  */
@@ -144,25 +141,16 @@ public class WebToolsServices {
         // FM Template
         // #############################
         if (UtilValidate.isNotEmpty(fmfilename) && (UtilValidate.isNotEmpty(fulltext) || url != null)) {
-            FileReader templateReader = null;
-            try {
-                templateReader = new FileReader(fmfilename);
-            } catch (FileNotFoundException e) {
-                return ServiceUtil.returnError(UtilProperties.getMessage(resource, "WebtoolsErrorReadingTemplateFile", UtilMisc.toMap("filename", fmfilename, "errorString", e.getMessage()), locale));
+            File fmFile = new File(fmfilename);
+            if (!fmFile.exists()) {
+                return ServiceUtil.returnError(UtilProperties.getMessage(resource, "WebtoolsErrorReadingTemplateFile", UtilMisc.toMap("filename", fmfilename, "errorString", "Template file not found."), locale));
             }
-
-            StringWriter outWriter = new StringWriter();
-
-            Template template = null;
             try {
-                Configuration conf = org.apache.ofbiz.base.util.template.FreeMarkerWorker.getDefaultOfbizConfig();
-                template = new Template("FMImportFilter", templateReader, conf);
-                Map<String, Object> fmcontext = new HashMap<String, Object>();
-
+                DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                 InputSource ins = url != null ? new InputSource(url.openStream()) : new InputSource(new StringReader(fulltext));
-                NodeModel nodeModel;
+                Document doc;
                 try {
-                    nodeModel = NodeModel.parse(ins);
+                    doc = documentBuilder.parse(ins);
                 } finally {
                     if (ins.getByteStream() != null) {
                         ins.getByteStream().close();
@@ -171,11 +159,10 @@ public class WebToolsServices {
                         ins.getCharacterStream().close();
                     }
                 }
-                fmcontext.put("doc", nodeModel);
-                TemplateHashModel staticModels = FreeMarkerWorker.getDefaultOfbizWrapper().getStaticModels();
-                fmcontext.put("Static", staticModels);
-
-                template.process(fmcontext, outWriter);
+                StringWriter outWriter = new StringWriter();
+                Map<String, Object> fmcontext = new HashMap<>();
+                fmcontext.put("doc", doc);
+                FreeMarkerWorker.renderTemplate(fmFile.toURI().toURL().toString(), fmcontext, outWriter);
                 fulltext = outWriter.toString();
             } catch (Exception ex) {
                 return ServiceUtil.returnError(UtilProperties.getMessage(resource, "WebtoolsErrorProcessingTemplateFile", UtilMisc.toMap("filename", fmfilename, "errorString", ex.getMessage()), locale));

Modified: ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java (original)
+++ ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java Sun Sep 25 17:20:58 2016
@@ -157,7 +157,6 @@ public class HtmlWidget extends ModelScr
                     writer.append(HtmlWidgetRenderer.formatBoundaryComment("Begin", "Template", location));
                 }
 
-                //FreeMarkerWorker.renderTemplateAtLocation(location, context, writer);
                 Template template = null;
                 if (location.endsWith(".fo.ftl")) { // FOP can't render correctly escaped characters
                     template = FreeMarkerWorker.getTemplate(location);

Modified: ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java?rev=1762227&r1=1762226&r2=1762227&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java Sun Sep 25 17:20:58 2016
@@ -173,6 +173,10 @@ public final class MacroFormRenderer imp
         return value;
     }
 
+    private static String encodeDoubleQuotes(String htmlString) {
+        return htmlString.replaceAll("\"", "\\\\\"");
+    }
+
     public void renderLabel(Appendable writer, Map<String, Object> context, ModelScreenWidget.Label label) throws IOException {
         String labelText = label.getText(context);
         if (UtilValidate.isEmpty(labelText)) {
@@ -218,7 +222,7 @@ public final class MacroFormRenderer imp
         sr.append("\" idName=\"");
         sr.append(idName);
         sr.append("\" description=\"");
-        sr.append(FreeMarkerWorker.encodeDoubleQuotes(description));
+        sr.append(encodeDoubleQuotes(description));
         sr.append("\" title=\"");
         sr.append(title);
         sr.append("\" class=\"");
@@ -1276,7 +1280,7 @@ public final class MacroFormRenderer imp
                     sr.append(" name=\"");
                     sr.append(modelFormField.getModelForm().getName());
                     sr.append("\" title=\"");
-                    sr.append(FreeMarkerWorker.encodeDoubleQuotes(title));
+                    sr.append(encodeDoubleQuotes(title));
                     sr.append("\" />");
                     executeMacro(writer, sr.toString());
                 } else if (modelFormField.isSortField()) {
@@ -1316,7 +1320,7 @@ public final class MacroFormRenderer imp
                 String helpText = UtilHelpText.getEntityFieldDescription(entityName, fieldName, delegator, locale);
 
                 sr.append("\" fieldHelpText=\"");
-                sr.append(FreeMarkerWorker.encodeDoubleQuotes(helpText));
+                sr.append(encodeDoubleQuotes(helpText));
             }
             sr.append("\" title=\"");
             sr.append(sb.toString());
@@ -3005,7 +3009,7 @@ public final class MacroFormRenderer imp
         StringWriter sr = new StringWriter();
         sr.append("<@renderTooltip ");
         sr.append("tooltip=\"");
-        sr.append(FreeMarkerWorker.encodeDoubleQuotes(tooltip));
+        sr.append(encodeDoubleQuotes(tooltip));
         sr.append("\" tooltipStyle=\"");
         sr.append(modelFormField.getTooltipStyle());
         sr.append("\" />");



Re: svn commit: r1762227 - in /ofbiz/trunk: applications/content/src/main/java/org/apache/ofbiz/content/data/ applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fed ex/ framework/base/config/ framework/base/src/main/java/org/apache/ofbi...

Posted by Jacques Le Roux <ja...@les7arts.com>.
Thanks Jacopo for all this good work and especially detailed report.

I only think about one thing which is not new but I never noticed before.

in build.gradle we load freemarker 2.3.24 with

compile 'org.freemarker:freemarker:2.3.24-incubating'

And in the FreeMarkerWorkerclass we have this line

public static final Version version = Configuration.VERSION_2_3_24;

So I suggest to add this comment

compile 'org.freemarker:freemarker:2.3.24-incubating' // Remember to change the version number in FreeMarkerWorker class when upgrading

Jacques


Le 25/09/2016 � 19:20, jacopoc@apache.org a �crit :
> Author: jacopoc
> Date: Sun Sep 25 17:20:58 2016
> New Revision: 1762227
>
> URL: http://svn.apache.org/viewvc?rev=1762227&view=rev
> Log:
> Improved: cleanups and enhancements in the FreeMarkerWorker class, and client
> code using it, that wraps most of the OFBiz integration with FreeMarker.
>
> This is the list of the main modifications:
> * simplified and cleaned up the public methods of FreeMarkerWorker, used to
> retrieve and render Freemarker templates and changed client code accordingly to
> use them
> * removed unused methods in FreeMarkerWorker and made some others private
> * improved the integration code in FreeMarkerWorker to better use the Freemarker
> API and specifically to leverage the various TemplateLoaders and the Freemarker
> caching mechanism; it is now possible to switch the OFBiz legacy template
> caching mechanism to use the Freemarker one instead
> * improved the implementation of Freemarker template rendering from strings
> (used by DataResourceWorker): it now leverages the Freemarker's
> StringTemplateLoader that provides the ability to cache the strings, retrieved
> from DataResources records, based on the timestamp of the last modification
> * moved freemarkerImports.properties from "widget" to "base" component, and
> changed its content (and the content of the associated templates
> AutoImportTemplate.ftl and HtmlTemplate.ftl) to remove the dependency from base
> to widget&common; some resources of "widget" and "common" are still referenced
> from AutoImportTemplate.ftl (that is in "base") but even if they are soft
> dependencies: if they are missing the system will load properly without any
> error or warning; before this change it was impossible to use, or unit test,
> FreeMarkerWorker before the "widget" and "common" components were loaded by the
> system, now it is possible
> * created a new class for unit tests for FreeMarkerWorker, named
> FreeMarkerWorkerTests: at the moment it contains just one simple unit test but
> more should be implemented
> * refactored WebToolsServices.entityImport(...) to leverage the
> FreeMarkerWorker.renderTemplate(...) method to run the Freemarker template,
> rather than dealing with the Freemarker API directly; this is now possible
> thanks to the cleanups and improvements done in the FreeMarkerWorker class; this
> same approach should be implemented for a few other similar integration points
> (mostly in the "content" component); this is a TODO item
> * moved the encodeDoubleQuotes(...) method from FreeMarkerWorker to
> MacroFormRenderer and made it private since this is the only calss using it and
> its logic is not related to FreeMarker
>
>
> Added:
>      ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl   (with props)
>      ofbiz/trunk/framework/base/config/freemarkerImports.properties
>        - copied, changed from r1762109, ofbiz/trunk/framework/widget/config/freemarkerImports.properties
>      ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/
>      ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java   (with props)
> Removed:
>      ofbiz/trunk/framework/widget/config/freemarkerImports.properties
> Modified:
>      ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java
>      ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java
>      ofbiz/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java
>      ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java
>      ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl
>      ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java
>      ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java
>      ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java
>      ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
>      ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
>
> Modified: ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java (original)
> +++ ofbiz/trunk/applications/content/src/main/java/org/apache/ofbiz/content/data/DataResourceWorker.java Sun Sep 25 17:20:58 2016
> @@ -29,6 +29,7 @@ import java.io.Writer;
>   import java.net.URL;
>   import java.net.URLConnection;
>   import java.nio.ByteBuffer;
> +import java.sql.Timestamp;
>   import java.util.Comparator;
>   import java.util.HashMap;
>   import java.util.LinkedList;
> @@ -578,7 +579,7 @@ public class DataResourceWorker  impleme
>           if (dataResource != null) {
>               String dataTemplateTypeId = dataResource.getString("dataTemplateTypeId");
>               if ("FTL".equals(dataTemplateTypeId)) {
> -                FreeMarkerWorker.clearTemplateFromCache(delegator.getDelegatorName() + ":DataResource:" + dataResourceId);
> +                FreeMarkerWorker.clearTemplateFromCache("delegator:" + delegator.getDelegatorName() + ":DataResource:" + dataResourceId);
>               }
>           }
>       }
> @@ -656,7 +657,8 @@ public class DataResourceWorker  impleme
>   
>                       // render the FTL template
>                       boolean useTemplateCache = cache && !UtilProperties.getPropertyAsBoolean("content", "disable.ftl.template.cache", false);
> -                    FreeMarkerWorker.renderTemplate(delegator.getDelegatorName() + ":DataResource:" + dataResourceId, templateText, templateContext, out, useTemplateCache);
> +                    Timestamp lastUpdatedStamp = dataResource.getTimestamp("lastUpdatedStamp");
> +                    FreeMarkerWorker.renderTemplateFromString("delegator:" + delegator.getDelegatorName() + ":DataResource:" + dataResourceId, templateText, templateContext, out, lastUpdatedStamp.getTime(), useTemplateCache);
>                   } catch (TemplateException e) {
>                       throw new GeneralException("Error rendering FTL template", e);
>                   }
> @@ -899,7 +901,7 @@ public class DataResourceWorker  impleme
>           String location = mimeTypeTemplate.getString("templateLocation");
>           StringWriter writer = new StringWriter();
>           try {
> -            FreeMarkerWorker.renderTemplateAtLocation(location, context, writer);
> +            FreeMarkerWorker.renderTemplate(location, context, writer);
>           } catch (TemplateException e) {
>               throw new GeneralException(e.getMessage(), e);
>           }
>
> Modified: ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java (original)
> +++ ofbiz/trunk/applications/product/src/main/java/org/apache/ofbiz/shipment/thirdparty/fedex/FedexServices.java Sun Sep 25 17:20:58 2016
> @@ -334,7 +334,7 @@ public class FedexServices {
>   
>               StringWriter outWriter = new StringWriter();
>               try {
> -                FreeMarkerWorker.renderTemplateAtLocation(templateLocation, subscriptionRequestContext, outWriter);
> +                FreeMarkerWorker.renderTemplate(templateLocation, subscriptionRequestContext, outWriter);
>               } catch (Exception e) {
>                   String errorMessage = "Cannot send Fedex subscription request: Failed to render Fedex XML Subscription Request Template [" + templateLocation + "].";
>                   Debug.logError(e, errorMessage, module);
> @@ -925,7 +925,7 @@ public class FedexServices {
>   
>               StringWriter outWriter = new StringWriter();
>               try {
> -                FreeMarkerWorker.renderTemplateAtLocation(templateLocation, shipRequestContext, outWriter);
> +                FreeMarkerWorker.renderTemplate(templateLocation, shipRequestContext, outWriter);
>               } catch (Exception e) {
>                   String errorMessage = "Cannot confirm Fedex shipment: Failed to render Fedex XML Ship Request Template [" + templateLocation + "].";
>                   Debug.logError(e, errorMessage, module);
>
> Added: ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl?rev=1762227&view=auto
> ==============================================================================
> --- ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl (added)
> +++ ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl Sun Sep 25 17:20:58 2016
> @@ -0,0 +1,21 @@
> +<#--
> +Licensed to the Apache Software Foundation (ASF) under one
> +or more contributor license agreements.  See the NOTICE file
> +distributed with this work for additional information
> +regarding copyright ownership.  The ASF licenses this file
> +to you under the Apache License, Version 2.0 (the
> +"License"); you may not use this file except in compliance
> +with the License.  You may obtain a copy of the License at
> +
> +http://www.apache.org/licenses/LICENSE-2.0
> +
> +Unless required by applicable law or agreed to in writing,
> +software distributed under the License is distributed on an
> +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> +KIND, either express or implied.  See the License for the
> +specific language governing permissions and limitations
> +under the License.
> +-->
> +
> +<#include "component://widget/templates/HtmlFormMacroLibrary.ftl" ignore_missing=true />
> +<#include "component://common/template/includes/HtmlTemplate.ftl" ignore_missing=true />
>
> Propchange: ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl
> ------------------------------------------------------------------------------
>      svn:eol-style = native
>
> Propchange: ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl
> ------------------------------------------------------------------------------
>      svn:keywords = Date Rev Author URL Id
>
> Propchange: ofbiz/trunk/framework/base/config/AutoImportTemplate.ftl
> ------------------------------------------------------------------------------
>      svn:mime-type = text/plain
>
> Copied: ofbiz/trunk/framework/base/config/freemarkerImports.properties (from r1762109, ofbiz/trunk/framework/widget/config/freemarkerImports.properties)
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/config/freemarkerImports.properties?p2=ofbiz/trunk/framework/base/config/freemarkerImports.properties&p1=ofbiz/trunk/framework/widget/config/freemarkerImports.properties&r1=1762109&r2=1762227&rev=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/widget/config/freemarkerImports.properties (original)
> +++ ofbiz/trunk/framework/base/config/freemarkerImports.properties Sun Sep 25 17:20:58 2016
> @@ -17,4 +17,4 @@
>   # under the License.
>   ###############################################################################
>   
> -htmlTemplate=component://common/template/includes/HtmlTemplate.ftl
> +htmlTemplate=ofbizhome://framework/base/config/AutoImportTemplate.ftl
>
> 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=1762227&r1=1762226&r2=1762227&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 Sun Sep 25 17:20:58 2016
> @@ -20,10 +20,7 @@ package org.apache.ofbiz.base.util.templ
>   
>   import java.io.File;
>   import java.io.IOException;
> -import java.io.Reader;
> -import java.io.StringReader;
>   import java.io.Writer;
> -import java.net.MalformedURLException;
>   import java.net.URL;
>   import java.util.ArrayList;
>   import java.util.Enumeration;
> @@ -39,6 +36,9 @@ import java.util.TimeZone;
>   import javax.servlet.ServletContext;
>   import javax.servlet.http.HttpServletRequest;
>   
> +import freemarker.cache.MultiTemplateLoader;
> +import freemarker.cache.StringTemplateLoader;
> +import freemarker.cache.TemplateLoader;
>   import org.apache.ofbiz.base.location.FlexibleLocation;
>   import org.apache.ofbiz.base.util.Debug;
>   import org.apache.ofbiz.base.util.StringUtil;
> @@ -101,8 +101,13 @@ public final class FreeMarkerWorker {
>           }
>           newConfig.setLocalizedLookup(false);
>           newConfig.setSharedVariable("StringUtil", new BeanModel(StringUtil.INSTANCE, wrapper));
> -        newConfig.setTemplateLoader(new FlexibleTemplateLoader());
> -        newConfig.setAutoImports(UtilProperties.getProperties("freemarkerImports"));
> +        TemplateLoader[] templateLoaders = {new FlexibleTemplateLoader(), new StringTemplateLoader()};
> +        MultiTemplateLoader multiTemplateLoader = new MultiTemplateLoader(templateLoaders);
> +        newConfig.setTemplateLoader(multiTemplateLoader);
> +        Map freemarkerImports = UtilProperties.getProperties("freemarkerImports");
> +        if (freemarkerImports != null) {
> +            newConfig.setAutoImports(freemarkerImports);
> +        }
>           newConfig.setLogTemplateExceptions(false);
>           newConfig.setTemplateExceptionHandler(new FreeMarkerWorker.OFBizTemplateExceptionHandler());
>           try {
> @@ -115,7 +120,7 @@ public final class FreeMarkerWorker {
>           ClassLoader loader = Thread.currentThread().getContextClassLoader();
>           Enumeration<URL> resources;
>           try {
> -            resources = loader.getResources("freemarkerTransforms.properties");
> +            resources = loader.getResources("freemarkerTransforms.properties");
>           } catch (IOException e) {
>               Debug.logError(e, "Could not load list of freemarkerTransforms.properties", module);
>               throw UtilMisc.initCause(new InternalError(e.getMessage()), e);
> @@ -134,10 +139,7 @@ public final class FreeMarkerWorker {
>           return newConfig;
>       }
>   
> -    /**
> -     * Public helper method.
> -     */
> -    public static void loadTransforms(ClassLoader loader, Properties props, Configuration config) {
> +    private static void loadTransforms(ClassLoader loader, Properties props, Configuration config) {
>           for (Iterator<Object> i = props.keySet().iterator(); i.hasNext();) {
>               String key = (String) i.next();
>               String className = props.getProperty(key);
> @@ -153,43 +155,6 @@ public final class FreeMarkerWorker {
>       }
>   
>       /**
> -     * Renders a template at the specified location.
> -     * @param templateLocation Location of the template - file path or URL
> -     * @param context The context Map
> -     * @param outWriter The Writer to render to
> -     */
> -    public static void renderTemplateAtLocation(String templateLocation, Map<String, Object> context, Appendable outWriter) throws MalformedURLException, TemplateException, IOException {
> -        renderTemplate(templateLocation, context, outWriter);
> -    }
> -
> -    /**
> -     * Renders a template contained in a String.
> -     * @param templateLocation A unique ID for this template - used for caching
> -     * @param templateString The String containing the template
> -     * @param context The context Map
> -     * @param outWriter The Writer to render to
> -     */
> -    public static void renderTemplate(String templateLocation, String templateString, Map<String, Object> context, Appendable outWriter) throws TemplateException, IOException {
> -        renderTemplate(templateLocation, templateString, context, outWriter, true);
> -    }
> -
> -    /**
> -     * Renders a template contained in a String.
> -     * @param templateLocation A unique ID for this template - used for caching
> -     * @param templateString The String containing the template
> -     * @param context The context Map
> -     * @param outWriter The Writer to render to
> -     * @param useCache try to get template from cache
> -     */
> -    public static void renderTemplate(String templateLocation, String templateString, Map<String, Object> context, Appendable outWriter, boolean useCache) throws TemplateException, IOException {
> -        if (templateString == null) {
> -            renderTemplate(templateLocation, context, outWriter);
> -        } else {
> -            renderTemplateFromString(templateString, templateLocation, context, outWriter, useCache);
> -        }
> -    }
> -
> -    /**
>        * Renders a template from a Reader.
>        * @param templateLocation A unique ID for this template - used for caching
>        * @param context The context Map
> @@ -200,26 +165,30 @@ public final class FreeMarkerWorker {
>           renderTemplate(template, context, outWriter);
>       }
>   
> -    public static Environment renderTemplateFromString(String templateString, String templateLocation, Map<String, Object> context, Appendable outWriter, boolean useCache) throws TemplateException, IOException {
> +    public static void renderTemplateFromString(String templateName, String templateString, Map<String, Object> context, Appendable outWriter, long lastModificationTime, boolean useCache) throws TemplateException, IOException {
>           Template template = null;
>           if (useCache) {
> -            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);
> -            }
> -        } else {
> -            Reader templateReader = new StringReader(templateString);
> -            template = new Template(templateLocation, templateReader, defaultOfbizConfig);
> -            templateReader.close();
> +            template = cachedTemplates.get(templateName);
>           }
> -        return renderTemplate(template, context, outWriter);
> +        if (template == null) {
> +            StringTemplateLoader stringTemplateLoader = (StringTemplateLoader)((MultiTemplateLoader)defaultOfbizConfig.getTemplateLoader()).getTemplateLoader(1);
> +            Object templateSource = stringTemplateLoader.findTemplateSource(templateName);
> +            if (templateSource == null || stringTemplateLoader.getLastModified(templateSource) < lastModificationTime) {
> +                stringTemplateLoader.putTemplate(templateName, templateString, lastModificationTime);
> +            }
> +        }
> +
> +        template = getTemplate(templateName);
> +        renderTemplate(template, context, outWriter);
>       }
>   
>       public static void clearTemplateFromCache(String templateLocation) {
>           cachedTemplates.remove(templateLocation);
> +        try {
> +            defaultOfbizConfig.removeTemplateFromCache(templateLocation);
> +        } catch(Exception e) {
> +            Debug.logInfo("Template not found in Fremarker cache with name: " + templateLocation, module);
> +        }
>       }
>   
>       /**
> @@ -249,7 +218,7 @@ public final class FreeMarkerWorker {
>        * @param env An Environment instance
>        * @param context The context Map containing the user settings
>        */
> -    public static void applyUserSettings(Environment env, Map<String, Object> context) throws TemplateException {
> +    private static void applyUserSettings(Environment env, Map<String, Object> context) throws TemplateException {
>           Locale locale = (Locale) context.get("locale");
>           if (locale == null) {
>               locale = Locale.getDefault();
> @@ -509,6 +478,7 @@ public final class FreeMarkerWorker {
>       static class FlexibleTemplateLoader extends URLTemplateLoader {
>           @Override
>           protected URL getURL(String name) {
> +            if (name != null && name.startsWith("delegator:")) return null; // this is a template stored in the database
>               URL locationUrl = null;
>               try {
>                   locationUrl = FlexibleLocation.resolveLocation(name);
> @@ -520,8 +490,7 @@ public final class FreeMarkerWorker {
>       }
>   
>       /**
> -     * OFBiz specific TemplateExceptionHandler.  Sanitizes any error messages present in
> -     * the stack trace prior to printing to the output writer.
> +     * OFBiz specific TemplateExceptionHandler.
>        */
>       static class OFBizTemplateExceptionHandler implements TemplateExceptionHandler {
>           public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException {
> @@ -533,8 +502,4 @@ public final class FreeMarkerWorker {
>               }
>           }
>       }
> -
> -    public static String encodeDoubleQuotes(String htmlString) {
> -        return htmlString.replaceAll("\"", "\\\\\"");
> -    }
>   }
>
> Added: ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java?rev=1762227&view=auto
> ==============================================================================
> --- ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java (added)
> +++ ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java Sun Sep 25 17:20:58 2016
> @@ -0,0 +1,43 @@
> +/*******************************************************************************
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + *******************************************************************************/
> +package org.apache.ofbiz.base.util.template;
> +
> +import java.io.StringWriter;
> +import java.util.HashMap;
> +import java.util.Map;
> +
> +import org.junit.Before;
> +import org.junit.Test;
> +import static org.junit.Assert.*;
> +
> +public class FreeMarkerWorkerTests {
> +    @Before
> +    public void initialize() {
> +        System.setProperty("ofbiz.home", System.getProperty("user.dir"));
> +    }
> +
> +    @Test
> +    public void renderTemplateFromString() throws Exception {
> +        StringWriter out = new StringWriter();
> +        Map<String, Object> context = new HashMap<>();
> +        context.put("name", "World!");
> +        FreeMarkerWorker.renderTemplateFromString("template1", "Hello ${name}", context, out, 0, false);
> +        assertEquals("Hello World!", out.toString());
> +    }
> +}
>
> Propchange: ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java
> ------------------------------------------------------------------------------
>      svn:eol-style = native
>
> Propchange: ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java
> ------------------------------------------------------------------------------
>      svn:keywords = Date Rev Author URL Id
>
> Propchange: ofbiz/trunk/framework/base/src/test/java/org/apache/ofbiz/base/util/template/FreeMarkerWorkerTests.java
> ------------------------------------------------------------------------------
>      svn:mime-type = text/plain
>
> Modified: ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java (original)
> +++ ofbiz/trunk/framework/common/src/main/java/org/apache/ofbiz/common/JsLanguageFileMappingCreator.java Sun Sep 25 17:20:58 2016
> @@ -190,7 +190,7 @@ public class JsLanguageFileMappingCreato
>           // some magic to create a new java file: render it as FTL
>           Writer writer = new StringWriter();
>           try {
> -            FreeMarkerWorker.renderTemplateAtLocation(template, mapWrapper, writer);
> +            FreeMarkerWorker.renderTemplate(template, mapWrapper, writer);
>               // write it as a Java file
>               File file = new File(output);
>               FileUtils.writeStringToFile(file, writer.toString(), encoding);
>
> Modified: ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl (original)
> +++ ofbiz/trunk/framework/common/template/includes/HtmlTemplate.ftl Sun Sep 25 17:20:58 2016
> @@ -17,8 +17,6 @@ specific language governing permissions
>   under the License.
>   -->
>   
> -<#include "component://widget/templates/HtmlFormMacroLibrary.ftl"/>
> -
>   <#macro lookupField className="" alert="" name="" value="" size="20" maxlength="20" id="" event="" action="" readonly="" autocomplete="" descriptionFieldName="" formName="" fieldFormName="" targetParameterIter="" imgSrc="" ajaxUrl="" ajaxEnabled="" presentation="layer" width="" height="" position="topleft" fadeBackground="true" clearText="" showDescription="" initiallyCollapsed="" tabindex="">
>     <#if (!ajaxEnabled?has_content)>
>       <#assign javascriptEnabled = Static["org.apache.ofbiz.base.util.UtilHttp"].isJavaScriptEnabled(request) />
>
> Modified: ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java (original)
> +++ ofbiz/trunk/framework/entity/src/test/java/org/apache/ofbiz/entity/DelegatorUnitTests.java Sun Sep 25 17:20:58 2016
> @@ -32,7 +32,7 @@ public class DelegatorUnitTests {
>   
>       @Before
>       public void initialize() {
> -        System.setProperty("ofbiz.home", ".");
> +        System.setProperty("ofbiz.home", System.getProperty("user.dir"));
>           System.setProperty("derby.system.home", "./runtime/data/derby");
>       }
>   
>
> Modified: ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java (original)
> +++ ofbiz/trunk/framework/webapp/src/main/java/org/apache/ofbiz/webapp/ftl/FreeMarkerViewHandler.java Sun Sep 25 17:20:58 2016
> @@ -64,7 +64,7 @@ public class FreeMarkerViewHandler exten
>           // process the template & flush the output
>           try {
>               if (page.startsWith("component://")) {
> -                FreeMarkerWorker.renderTemplateAtLocation(page, context, response.getWriter());
> +                FreeMarkerWorker.renderTemplate(page, context, response.getWriter());
>               } else {
>                   // backwards compatibility
>                   Template template = config.getTemplate(page);
>
> Modified: ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java (original)
> +++ ofbiz/trunk/framework/webtools/src/main/java/org/apache/ofbiz/webtools/WebToolsServices.java Sun Sep 25 17:20:58 2016
> @@ -22,7 +22,6 @@ import java.io.BufferedWriter;
>   import java.io.File;
>   import java.io.FileNotFoundException;
>   import java.io.FileOutputStream;
> -import java.io.FileReader;
>   import java.io.IOException;
>   import java.io.OutputStreamWriter;
>   import java.io.PrintWriter;
> @@ -45,6 +44,8 @@ import java.util.ResourceBundle;
>   import java.util.Set;
>   import java.util.TreeSet;
>   
> +import javax.xml.parsers.DocumentBuilder;
> +import javax.xml.parsers.DocumentBuilderFactory;
>   import javax.xml.parsers.ParserConfigurationException;
>   
>   import org.apache.ofbiz.base.location.FlexibleLocation;
> @@ -88,14 +89,10 @@ import org.apache.ofbiz.service.LocalDis
>   import org.apache.ofbiz.service.ServiceUtil;
>   import org.apache.ofbiz.webtools.artifactinfo.ArtifactInfoFactory;
>   import org.apache.ofbiz.webtools.artifactinfo.ServiceArtifactInfo;
> +import org.w3c.dom.Document;
>   import org.xml.sax.InputSource;
>   import org.xml.sax.SAXException;
>   
> -import freemarker.ext.dom.NodeModel;
> -import freemarker.template.Configuration;
> -import freemarker.template.Template;
> -import freemarker.template.TemplateHashModel;
> -
>   /**
>    * WebTools Services
>    */
> @@ -144,25 +141,16 @@ public class WebToolsServices {
>           // FM Template
>           // #############################
>           if (UtilValidate.isNotEmpty(fmfilename) && (UtilValidate.isNotEmpty(fulltext) || url != null)) {
> -            FileReader templateReader = null;
> -            try {
> -                templateReader = new FileReader(fmfilename);
> -            } catch (FileNotFoundException e) {
> -                return ServiceUtil.returnError(UtilProperties.getMessage(resource, "WebtoolsErrorReadingTemplateFile", UtilMisc.toMap("filename", fmfilename, "errorString", e.getMessage()), locale));
> +            File fmFile = new File(fmfilename);
> +            if (!fmFile.exists()) {
> +                return ServiceUtil.returnError(UtilProperties.getMessage(resource, "WebtoolsErrorReadingTemplateFile", UtilMisc.toMap("filename", fmfilename, "errorString", "Template file not found."), locale));
>               }
> -
> -            StringWriter outWriter = new StringWriter();
> -
> -            Template template = null;
>               try {
> -                Configuration conf = org.apache.ofbiz.base.util.template.FreeMarkerWorker.getDefaultOfbizConfig();
> -                template = new Template("FMImportFilter", templateReader, conf);
> -                Map<String, Object> fmcontext = new HashMap<String, Object>();
> -
> +                DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
>                   InputSource ins = url != null ? new InputSource(url.openStream()) : new InputSource(new StringReader(fulltext));
> -                NodeModel nodeModel;
> +                Document doc;
>                   try {
> -                    nodeModel = NodeModel.parse(ins);
> +                    doc = documentBuilder.parse(ins);
>                   } finally {
>                       if (ins.getByteStream() != null) {
>                           ins.getByteStream().close();
> @@ -171,11 +159,10 @@ public class WebToolsServices {
>                           ins.getCharacterStream().close();
>                       }
>                   }
> -                fmcontext.put("doc", nodeModel);
> -                TemplateHashModel staticModels = FreeMarkerWorker.getDefaultOfbizWrapper().getStaticModels();
> -                fmcontext.put("Static", staticModels);
> -
> -                template.process(fmcontext, outWriter);
> +                StringWriter outWriter = new StringWriter();
> +                Map<String, Object> fmcontext = new HashMap<>();
> +                fmcontext.put("doc", doc);
> +                FreeMarkerWorker.renderTemplate(fmFile.toURI().toURL().toString(), fmcontext, outWriter);
>                   fulltext = outWriter.toString();
>               } catch (Exception ex) {
>                   return ServiceUtil.returnError(UtilProperties.getMessage(resource, "WebtoolsErrorProcessingTemplateFile", UtilMisc.toMap("filename", fmfilename, "errorString", ex.getMessage()), locale));
>
> Modified: ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java (original)
> +++ ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java Sun Sep 25 17:20:58 2016
> @@ -157,7 +157,6 @@ public class HtmlWidget extends ModelScr
>                       writer.append(HtmlWidgetRenderer.formatBoundaryComment("Begin", "Template", location));
>                   }
>   
> -                //FreeMarkerWorker.renderTemplateAtLocation(location, context, writer);
>                   Template template = null;
>                   if (location.endsWith(".fo.ftl")) { // FOP can't render correctly escaped characters
>                       template = FreeMarkerWorker.getTemplate(location);
>
> Modified: ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java?rev=1762227&r1=1762226&r2=1762227&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java (original)
> +++ ofbiz/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java Sun Sep 25 17:20:58 2016
> @@ -173,6 +173,10 @@ public final class MacroFormRenderer imp
>           return value;
>       }
>   
> +    private static String encodeDoubleQuotes(String htmlString) {
> +        return htmlString.replaceAll("\"", "\\\\\"");
> +    }
> +
>       public void renderLabel(Appendable writer, Map<String, Object> context, ModelScreenWidget.Label label) throws IOException {
>           String labelText = label.getText(context);
>           if (UtilValidate.isEmpty(labelText)) {
> @@ -218,7 +222,7 @@ public final class MacroFormRenderer imp
>           sr.append("\" idName=\"");
>           sr.append(idName);
>           sr.append("\" description=\"");
> -        sr.append(FreeMarkerWorker.encodeDoubleQuotes(description));
> +        sr.append(encodeDoubleQuotes(description));
>           sr.append("\" title=\"");
>           sr.append(title);
>           sr.append("\" class=\"");
> @@ -1276,7 +1280,7 @@ public final class MacroFormRenderer imp
>                       sr.append(" name=\"");
>                       sr.append(modelFormField.getModelForm().getName());
>                       sr.append("\" title=\"");
> -                    sr.append(FreeMarkerWorker.encodeDoubleQuotes(title));
> +                    sr.append(encodeDoubleQuotes(title));
>                       sr.append("\" />");
>                       executeMacro(writer, sr.toString());
>                   } else if (modelFormField.isSortField()) {
> @@ -1316,7 +1320,7 @@ public final class MacroFormRenderer imp
>                   String helpText = UtilHelpText.getEntityFieldDescription(entityName, fieldName, delegator, locale);
>   
>                   sr.append("\" fieldHelpText=\"");
> -                sr.append(FreeMarkerWorker.encodeDoubleQuotes(helpText));
> +                sr.append(encodeDoubleQuotes(helpText));
>               }
>               sr.append("\" title=\"");
>               sr.append(sb.toString());
> @@ -3005,7 +3009,7 @@ public final class MacroFormRenderer imp
>           StringWriter sr = new StringWriter();
>           sr.append("<@renderTooltip ");
>           sr.append("tooltip=\"");
> -        sr.append(FreeMarkerWorker.encodeDoubleQuotes(tooltip));
> +        sr.append(encodeDoubleQuotes(tooltip));
>           sr.append("\" tooltipStyle=\"");
>           sr.append(modelFormField.getTooltipStyle());
>           sr.append("\" />");
>
>
>