This is an automated email from the ASF dual-hosted git repository.

mridulpathak pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 52cd10d0f0 Improved: MacroTreeRenderer passes the macro parameters as 
data and writes to the given writer (OFBIZ-13678)
52cd10d0f0 is described below

commit 52cd10d0f0637c7a1e013cd2ece219ee625547b3
Author: Mridul Pathak <[email protected]>
AuthorDate: Fri Oct 16 10:02:14 2026 +0530

    Improved: MacroTreeRenderer passes the macro parameters as data and writes 
to the given writer (OFBIZ-13678)
    
    MacroTreeRenderer built the text of every macro call by hand and compiled 
it in one environment bound to the writer of its constructor, so it ignored the 
writer it was given. It now passes the parameters to FtlWriter as data and 
renders into the writer of each call, which also puts the image of a link 
inside the link instead of before it, and the replacement of the pipe for 
OFBIZ-9191 is applied to the link url only instead of to the whole macro text. 
The macro signatures and the outp [...]
---
 .../widget/renderer/macro/MacroTreeRenderer.java   | 162 +++++++--------------
 1 file changed, 49 insertions(+), 113 deletions(-)

diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java
index 4dd3bb23a3..118a21332c 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroTreeRenderer.java
@@ -19,22 +19,19 @@
 package org.apache.ofbiz.widget.renderer.macro;
 
 import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
 import java.io.StringWriter;
 import java.net.URI;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
-import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.StringUtil;
 import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.base.util.UtilMisc;
 import org.apache.ofbiz.base.util.UtilValidate;
-import org.apache.ofbiz.base.util.template.FreeMarkerWorker;
 import org.apache.ofbiz.webapp.control.RequestHandler;
 import org.apache.ofbiz.webapp.taglib.ContentUrlTag;
 import org.apache.ofbiz.widget.WidgetWorker;
@@ -47,8 +44,6 @@ import org.apache.ofbiz.widget.renderer.TreeStringRenderer;
 
 import com.google.common.collect.ImmutableList;
 
-import freemarker.core.Environment;
-import freemarker.template.Template;
 import freemarker.template.TemplateException;
 
 /**
@@ -57,28 +52,18 @@ import freemarker.template.TemplateException;
  */
 public class MacroTreeRenderer implements TreeStringRenderer {
 
-    private static final String MODULE = MacroTreeRenderer.class.getName();
-    private Template macroLibrary;
-    private Environment environment;
-
+    private final FtlWriter ftlWriter;
 
     public MacroTreeRenderer(String macroLibraryPath, Appendable writer) 
throws TemplateException, IOException {
-        this.macroLibrary = FreeMarkerWorker.getTemplate(macroLibraryPath);
-        Map<String, Object> input = UtilMisc.toMap("key", null);
-        this.environment = FreeMarkerWorker.renderTemplate(this.macroLibrary, 
input, writer);
+        this.ftlWriter = new FtlWriter(macroLibraryPath);
     }
 
-    private void executeMacro(String macro) {
-        try {
-            Reader templateReader = new StringReader(macro);
-            // FIXME: I am using a Date as an hack to provide a unique name 
for the template...
-            Template template = new Template((new 
java.util.Date()).toString(), templateReader,
-                    FreeMarkerWorker.getDefaultOfbizConfig());
-            templateReader.close();
-            this.environment.include(template);
-        } catch (TemplateException | IOException e) {
-            Debug.logError(e, "Error rendering tree thru ftl", MODULE);
+    private void executeMacro(Appendable writer, String macroName, Map<String, 
Object> macroParameters) {
+        Map<String, Object> parameters = new HashMap<>();
+        if (macroParameters != null) {
+            macroParameters.forEach((name, value) -> parameters.put(name, 
value == null ? "" : value));
         }
+        ftlWriter.processMacroCall(writer, null, macroName, parameters);
     }
 
     /**
@@ -88,16 +73,11 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
      * @param modelWidget The widget
      */
     public void renderBeginningBoundaryComment(Appendable writer, String 
widgetType, ModelWidget modelWidget) {
-        StringWriter sr = new StringWriter();
-        sr.append("<@formatBoundaryComment ");
-        sr.append(" boundaryType=\"");
-        sr.append("Begin");
-        sr.append("\" widgetType=\"");
-        sr.append(widgetType);
-        sr.append("\" widgetName=\"");
-        sr.append(modelWidget.getBoundaryCommentName());
-        sr.append("\" />");
-        executeMacro(sr.toString());
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("boundaryType", "Begin");
+        parameters.put("widgetType", widgetType);
+        parameters.put("widgetName", modelWidget.getBoundaryCommentName());
+        executeMacro(writer, "formatBoundaryComment", parameters);
     }
 
     /**
@@ -107,16 +87,11 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
      * @param modelWidget The widget
      */
     public void renderEndingBoundaryComment(Appendable writer, String 
widgetType, ModelWidget modelWidget) {
-        StringWriter sr = new StringWriter();
-        sr.append("<@formatBoundaryComment ");
-        sr.append(" boundaryType=\"");
-        sr.append("End");
-        sr.append("\" widgetType=\"");
-        sr.append(widgetType);
-        sr.append("\" widgetName=\"");
-        sr.append(modelWidget.getBoundaryCommentName());
-        sr.append("\" />");
-        executeMacro(sr.toString());
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("boundaryType", "End");
+        parameters.put("widgetType", widgetType);
+        parameters.put("widgetName", modelWidget.getBoundaryCommentName());
+        executeMacro(writer, "formatBoundaryComment", parameters);
     }
 
     @Override
@@ -133,12 +108,7 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
             style = "basic-tree";
         }
 
-        StringWriter sr = new StringWriter();
-        sr.append("<@renderNodeBegin ");
-        sr.append(" style=\"");
-        sr.append(style);
-        sr.append("\" />");
-        executeMacro(sr.toString());
+        executeMacro(writer, "renderNodeBegin", UtilMisc.toMap("style", 
style));
 
         String pkName = node.getPkName(context);
         String entityId = null;
@@ -200,14 +170,10 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
     @Override
     public void renderNodeEnd(Appendable writer, Map<String, Object> context, 
ModelTree.ModelNode node) throws IOException {
         Boolean processChildren = (Boolean) context.get("processChildren");
-        StringWriter sr = new StringWriter();
-        sr.append("<@renderNodeEnd ");
-        sr.append(" processChildren=");
-        sr.append(Boolean.toString(processChildren));
-        sr.append(" isRootNode=");
-        sr.append(Boolean.toString(node.isRootNode()));
-        sr.append(" />");
-        executeMacro(sr.toString());
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("processChildren", processChildren);
+        parameters.put("isRootNode", node.isRootNode());
+        executeMacro(writer, "renderNodeEnd", parameters);
         if (node.isRootNode()) {
             if (ModelWidget.widgetBoundaryCommentsEnabled(context)) {
                 renderEndingBoundaryComment(writer, "Tree Widget", 
node.getModelTree());
@@ -219,12 +185,7 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
     public void renderLastElement(Appendable writer, Map<String, Object> 
context, ModelTree.ModelNode node) throws IOException {
         Boolean processChildren = (Boolean) context.get("processChildren");
         if (processChildren) {
-            StringWriter sr = new StringWriter();
-            sr.append("<@renderLastElement ");
-            sr.append("style=\"");
-            sr.append("basic-tree");
-            sr.append("\" />");
-            executeMacro(sr.toString());
+            executeMacro(writer, "renderLastElement", UtilMisc.toMap("style", 
"basic-tree"));
         }
     }
 
@@ -234,16 +195,11 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
         String style = label.getStyle(context);
         String labelText = label.getText(context);
 
-        StringWriter sr = new StringWriter();
-        sr.append("<@renderLabel ");
-        sr.append("id=\"");
-        sr.append(id);
-        sr.append("\" style=\"");
-        sr.append(style);
-        sr.append("\" labelText=\"");
-        sr.append(labelText);
-        sr.append("\" />");
-        executeMacro(sr.toString());
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("id", id);
+        parameters.put("style", style);
+        parameters.put("labelText", labelText);
+        executeMacro(writer, "renderLabel", parameters);
     }
 
     @Override
@@ -275,26 +231,16 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
             imgStr = sw.toString();
         }
 
-        StringWriter sr = new StringWriter();
-        sr.append("<@renderLink ");
-        sr.append("id=\"");
-        sr.append(id);
-        sr.append("\" style=\"");
-        sr.append(style);
-        sr.append("\" name=\"");
-        sr.append(name);
-        sr.append("\" title=\"");
-        sr.append(title);
-        sr.append("\" targetWindow=\"");
-        sr.append(targetWindow);
-        sr.append("\" linkUrl=\"");
-        sr.append(linkUrl);
-        sr.append("\" linkText=\"");
-        sr.append(linkText);
-        sr.append("\" imgStr=\"");
-        sr.append(MacroCommonRenderer.escapeFtlString(imgStr));
-        sr.append("\" />");
-        executeMacro(sr.toString().replace("|", "%7C")); // Fix for OFBIZ-9191
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("id", id);
+        parameters.put("style", style);
+        parameters.put("name", name);
+        parameters.put("title", title);
+        parameters.put("targetWindow", targetWindow);
+        parameters.put("linkUrl", linkUrl.toString().replace("|", "%7C")); // 
Fix for OFBIZ-9191
+        parameters.put("linkText", linkText);
+        parameters.put("imgStr", imgStr);
+        executeMacro(writer, "renderLink", parameters);
     }
 
     @Override
@@ -336,26 +282,16 @@ public class MacroTreeRenderer implements 
TreeStringRenderer {
         } else {
             urlString = src;
         }
-        StringWriter sr = new StringWriter();
-        sr.append("<@renderImage ");
-        sr.append("src=\"");
-        sr.append(src);
-        sr.append("\" id=\"");
-        sr.append(id);
-        sr.append("\" style=\"");
-        sr.append(style);
-        sr.append("\" wid=\"");
-        sr.append(wid);
-        sr.append("\" hgt=\"");
-        sr.append(hgt);
-        sr.append("\" border=\"");
-        sr.append(border);
-        sr.append("\" alt=\"");
-        sr.append(alt);
-        sr.append("\" urlString=\"");
-        sr.append(urlString);
-        sr.append("\" />");
-        executeMacro(sr.toString());
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("src", src);
+        parameters.put("id", id);
+        parameters.put("style", style);
+        parameters.put("wid", wid);
+        parameters.put("hgt", hgt);
+        parameters.put("border", border);
+        parameters.put("alt", alt);
+        parameters.put("urlString", urlString);
+        executeMacro(writer, "renderImage", parameters);
     }
 
     @Override

Reply via email to