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 fb6b2939cd Improved: MacroMenuRenderer passes the macro parameters as
data (OFBIZ-13676)
fb6b2939cd is described below
commit fb6b2939cd7afbbc15ab83d92de9a0d9e2409f6c
Author: Mridul Pathak <[email protected]>
AuthorDate: Thu Oct 15 20:41:34 2026 +0530
Improved: MacroMenuRenderer passes the macro parameters as data
(OFBIZ-13676)
MacroMenuRenderer built the text of each macro call from a parameter map
and compiled it, and kept its own environments and template compilation. It now
passes the parameters to FtlWriter as data, with the parameterList of
renderLink as a list of name and value maps instead of a hash literal built as
text. The macro signatures and the output are unchanged, except that the
parameter names and values of hidden-form and layered-modal links are no longer
interpreted as FreeMarker, which u [...]
---
.../widget/renderer/macro/MacroMenuRenderer.java | 124 +++------------------
1 file changed, 18 insertions(+), 106 deletions(-)
diff --git
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
index 5aaf198709..4a58445355 100644
---
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
+++
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
@@ -19,10 +19,9 @@
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -30,7 +29,6 @@ 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.UtilCodec;
import org.apache.ofbiz.base.util.UtilMisc;
@@ -38,7 +36,6 @@ import org.apache.ofbiz.base.util.UtilProperties;
import org.apache.ofbiz.base.util.UtilRandom;
import org.apache.ofbiz.base.util.UtilValidate;
import org.apache.ofbiz.base.util.string.FlexibleStringExpander;
-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;
@@ -49,29 +46,21 @@ import org.apache.ofbiz.widget.model.ModelMenuItem.MenuLink;
import org.apache.ofbiz.widget.model.ModelWidget;
import org.apache.ofbiz.widget.model.ThemeFactory;
import org.apache.ofbiz.widget.renderer.MenuStringRenderer;
-import org.apache.ofbiz.widget.renderer.VisualTheme;
-import freemarker.core.Environment;
-import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.apache.ofbiz.widget.renderer.html.HtmlWidgetRenderer;
public class MacroMenuRenderer implements MenuStringRenderer {
- private static final String MODULE = MacroMenuRenderer.class.getName();
- private int macroCount = 999;
- private final Map<Appendable, Environment> environments = new HashMap<>();
- private final Template macroLibrary;
+ private final FtlWriter ftlWriter;
private final HttpServletRequest request;
private final HttpServletResponse response;
- private final VisualTheme visualTheme;
public MacroMenuRenderer(String macroLibraryPath, HttpServletRequest
request, HttpServletResponse response)
throws TemplateException, IOException {
- this.macroLibrary = FreeMarkerWorker.getTemplate(macroLibraryPath);
this.request = request;
this.response = response;
- this.visualTheme = ThemeFactory.resolveVisualTheme(request);
+ this.ftlWriter = new FtlWriter(macroLibraryPath,
ThemeFactory.resolveVisualTheme(request));
}
// Made this a separate method so it can be externalized and reused.
@@ -102,50 +91,12 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
return parameters;
}
- private void executeMacro(Appendable writer, String macro) throws
IOException, TemplateException {
- Environment environment = getEnvironment(writer);
- environment.setVariable("visualTheme",
FreeMarkerWorker.autoWrap(visualTheme, environment));
- Reader templateReader = new StringReader(macro);
- macroCount++;
- String templateName = toString().concat("_") + macroCount;
- Template template = new Template(templateName, templateReader,
FreeMarkerWorker.getDefaultOfbizConfig());
- templateReader.close();
- environment.include(template);
- }
-
- private void executeMacro(Appendable writer, String macroName, Map<String,
Object> macroParameters) throws IOException, TemplateException {
- StringBuilder sb = new StringBuilder("<@");
- sb.append(macroName);
+ private void executeMacro(Appendable writer, String macroName, Map<String,
Object> macroParameters) {
+ Map<String, Object> parameters = new HashMap<>();
if (macroParameters != null) {
- for (Map.Entry<String, Object> parameter :
macroParameters.entrySet()) {
- sb.append(' ');
- sb.append(parameter.getKey());
- sb.append("=");
- Object value = parameter.getValue();
- if (value instanceof String) {
- sb.append('"');
- sb.append(MacroCommonRenderer.escapeFtlString((String)
value));
- sb.append('"');
- } else {
- sb.append(value);
- }
- }
+ macroParameters.forEach((name, value) -> parameters.put(name,
value == null ? "" : value));
}
- sb.append(" />");
- if (Debug.verboseOn()) {
- Debug.logVerbose("Executing macro: " + sb, MODULE);
- }
- executeMacro(writer, sb.toString());
- }
-
- private Environment getEnvironment(Appendable writer) throws
TemplateException, IOException {
- Environment environment = environments.get(writer);
- if (environment == null) {
- Map<String, Object> input = UtilMisc.toMap("key", null);
- environment = FreeMarkerWorker.renderTemplate(macroLibrary, input,
writer);
- environments.put(writer, environment);
- }
- return environment;
+ ftlWriter.processMacroCall(writer, null, macroName, parameters);
}
private static boolean isDisableIfEmpty(ModelMenuItem menuItem,
Map<String, Object> context) {
@@ -193,11 +144,7 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
@Override
public void renderImage(Appendable writer, Map<String, Object> context,
Image image) throws IOException {
Map<String, Object> parameters = createImageParameters(context, image);
- try {
- executeMacro(writer, "renderImage", parameters);
- } catch (TemplateException e) {
- throw new IOException(e);
- }
+ executeMacro(writer, "renderImage", parameters);
}
@Override
@@ -230,7 +177,7 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
}
parameters.put("linkType", linkType);
String actionUrl = "";
- StringBuilder targetParameters = new StringBuilder();
+ List<Map<String, String>> targetParameters = new ArrayList<>();
String confirmationMessage =
link.getLink().getConfirmationMsg(context);
if (link.getLink().getRequestConfirmation() &&
UtilValidate.isEmpty(confirmationMessage)) {
@@ -247,30 +194,15 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
request, response);
actionUrl = actionUri.toString();
- targetParameters.append("[");
+ UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder)
context.get("simpleEncoder");
// Callback propagation only if displaying a modal
for (Map.Entry<String, String> parameter :
link.getParameterMap(context, isModal).entrySet()) {
- if (targetParameters.length() > 1) {
- targetParameters.append(",");
- }
- targetParameters.append("{'name':'");
- targetParameters.append(parameter.getKey());
- targetParameters.append("'");
- targetParameters.append(",'value':'");
- UtilCodec.SimpleEncoder simpleEncoder =
(UtilCodec.SimpleEncoder) context.get("simpleEncoder");
- if (simpleEncoder != null) {
-
targetParameters.append(simpleEncoder.encode(parameter.getValue()));
- } else {
- targetParameters.append(parameter.getValue());
- }
- targetParameters.append("'}");
+ String value = parameter.getValue() == null ? "" :
parameter.getValue();
+ targetParameters.add(UtilMisc.toMap("name", parameter.getKey(),
+ "value", simpleEncoder != null ?
simpleEncoder.encode(value) : value));
}
- targetParameters.append("]");
}
- if (targetParameters.isEmpty()) {
- targetParameters.append("\"\"");
- }
parameters.put("linkUrl",
MacroCommonRenderer.getLinkUrl(link.getLink(), linkType, context));
parameters.put("actionUrl", actionUrl);
parameters.put("parameterList", targetParameters);
@@ -282,11 +214,7 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
imgStr = sw.toString();
}
parameters.put("imgStr", imgStr);
- try {
- executeMacro(writer, "renderLink", parameters);
- } catch (TemplateException e) {
- throw new IOException(e);
- }
+ executeMacro(writer, "renderLink", parameters);
}
@Override
@@ -298,11 +226,7 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
sb.append(menu.getBoundaryCommentName());
parameters.put("boundaryComment", sb.toString());
}
- try {
- executeMacro(writer, "renderMenuEnd", parameters);
- } catch (TemplateException e) {
- throw new IOException(e);
- }
+ executeMacro(writer, "renderMenuEnd", parameters);
if (HtmlWidgetRenderer.NAMED_BORDER_TYPE !=
ModelWidget.NamedBorderType.NONE) {
writer.append(HtmlWidgetRenderer.endNamedBorder("Menu",
menu.getBoundaryCommentName()));
}
@@ -353,11 +277,7 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
parameters.put("linkStr", linkStr);
boolean containsNestedMenus = !menuItem.getMenuItemList().isEmpty();
parameters.put("containsNestedMenus", containsNestedMenus);
- try {
- executeMacro(writer, "renderMenuItemBegin", parameters);
- } catch (TemplateException e) {
- throw new IOException(e);
- }
+ executeMacro(writer, "renderMenuItemBegin", parameters);
if (containsNestedMenus) {
for (ModelMenuItem childMenuItem : menuItem.getMenuItemList()) {
childMenuItem.renderMenuItemString(writer, context, this);
@@ -365,11 +285,7 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
}
parameters.clear();
parameters.put("containsNestedMenus", containsNestedMenus);
- try {
- executeMacro(writer, "renderMenuItemEnd", parameters);
- } catch (TemplateException e) {
- throw new IOException(e);
- }
+ executeMacro(writer, "renderMenuItemEnd", parameters);
}
@Override
@@ -387,10 +303,6 @@ public class MacroMenuRenderer implements
MenuStringRenderer {
parameters.put("id", menu.getId());
parameters.put("style", menu.getMenuContainerStyle(context));
parameters.put("title", menu.getTitle(context));
- try {
- executeMacro(writer, "renderMenuBegin", parameters);
- } catch (TemplateException e) {
- throw new IOException(e);
- }
+ executeMacro(writer, "renderMenuBegin", parameters);
}
}