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

jamesyong 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 4dbdf72  Fixed: Apply multi-block attr to each application 
(OFBIZ-11706)
4dbdf72 is described below

commit 4dbdf720c5bfc349e8efd9aea2e9102548388b46
Author: James Yong <jamesy...@apache.org>
AuthorDate: Fri Jun 19 23:09:17 2020 +0800

    Fixed: Apply multi-block attr to each application (OFBIZ-11706)
    
    Rendering screen within freemarker template not done correctly when 
multi-block=true
    
    Thanks: Jacques for reporting
---
 .../java/org/apache/ofbiz/widget/model/HtmlWidget.java    | 15 +++++++++++++--
 .../org/apache/ofbiz/widget/renderer/ScreenRenderer.java  |  5 +++--
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
index 902cf8e..10a6ca1 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
@@ -28,6 +28,7 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.GeneralException;
@@ -191,9 +192,19 @@ public class HtmlWidget extends ModelScreenWidget {
         String location = locationExdr.expandString(context);
 
         StringWriter stringWriter = new StringWriter();
-        context.put(MultiBlockHtmlTemplateUtil.MULTI_BLOCK_WRITER, 
stringWriter);
+        Stack<StringWriter> stringWriterStack = 
UtilGenerics.cast(context.get(MultiBlockHtmlTemplateUtil.MULTI_BLOCK_WRITER));
+        if (stringWriterStack == null) {
+            stringWriterStack = new Stack<>();
+        }
+        stringWriterStack.push(stringWriter);
+        // we use stack because a freemarker template may render a sub screen 
widget
+        context.put(MultiBlockHtmlTemplateUtil.MULTI_BLOCK_WRITER, 
stringWriterStack);
         renderHtmlTemplate(stringWriter, locationExdr, context);
-        context.remove(MultiBlockHtmlTemplateUtil.MULTI_BLOCK_WRITER);
+        stringWriterStack.pop();
+        // check if no more parent freemarker template before removing from 
context
+        if (stringWriterStack.empty()) {
+            context.remove(MultiBlockHtmlTemplateUtil.MULTI_BLOCK_WRITER);
+        }
         String data = stringWriter.toString();
         stringWriter.close();
 
diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/ScreenRenderer.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/ScreenRenderer.java
index 6724ad7..6551667 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/ScreenRenderer.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/ScreenRenderer.java
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -139,8 +140,8 @@ public class ScreenRenderer {
         } else {
             context.put("renderFormSeqNumber", 
String.valueOf(renderFormSeqNumber));
             if (context.get(MultiBlockHtmlTemplateUtil.MULTI_BLOCK_WRITER) != 
null) {
-                StringWriter stringWriter = (StringWriter) 
context.get(MultiBlockHtmlTemplateUtil.MULTI_BLOCK_WRITER);
-                modelScreen.renderScreenString(stringWriter, context, 
screenStringRenderer);
+                Stack<StringWriter> stringWriterStack = 
UtilGenerics.cast(context.get(MultiBlockHtmlTemplateUtil.MULTI_BLOCK_WRITER));
+                modelScreen.renderScreenString(stringWriterStack.peek(), 
context, screenStringRenderer);
             } else {
                 modelScreen.renderScreenString(writer, context, 
screenStringRenderer);
             }

Reply via email to