Revision: 1241
          http://stripes.svn.sourceforge.net/stripes/?rev=1241&view=rev
Author:   bengunter
Date:     2010-05-21 18:26:06 +0000 (Fri, 21 May 2010)

Log Message:
-----------
STS-391: Use the layout writer's silent mode more effectively. This eliminates 
all the superfluous junk that would otherwise be generated and sent to output 
by the multiple tag evaluations involved in the layout rendering process.

Modified Paths:
--------------
    
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutComponentTag.java
    
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutContext.java
    
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutDefinitionTag.java
    
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutRenderTag.java

Modified: 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutComponentTag.java
===================================================================
--- 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutComponentTag.java
       2010-05-21 15:59:32 UTC (rev 1240)
+++ 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutComponentTag.java
       2010-05-21 18:26:06 UTC (rev 1241)
@@ -40,7 +40,7 @@
 
     private String name;
     private LayoutContext context;
-    private Boolean silent;
+    private boolean silent;
 
     /** Gets the name of the component. */
     public String getName() { return name; }
@@ -102,12 +102,12 @@
     public int doStartTag() throws JspException {
         try {
             LayoutContext context = getContext();
+            silent = context.getOut().isSilent();
 
             if (isChildOfRender()) {
                 if (context.isComponentRenderPhase()) {
                     if (isCurrentComponent()) {
                         log.debug("Render ", getName(), " in ", 
context.getRenderPage());
-                        silent = context.getOut().isSilent();
                         context.getOut().setSilent(false, pageContext);
                         return EVAL_BODY_INCLUDE;
                     }
@@ -144,7 +144,10 @@
                             String renderPage = renderer.getRenderPage();
                             log.debug("Execute component ", getName(), " in ", 
context
                                     .getDefinitionPage(), " with include of ", 
renderPage);
+                            boolean silent = context.getOut().isSilent();
+                            context.getOut().setSilent(true, pageContext);
                             pageContext.include(renderPage, false);
+                            context.getOut().setSilent(silent, pageContext);
                         }
                     }
                     context.setComponentRenderPhase(false);
@@ -156,7 +159,6 @@
                         log.debug("Component was not present in ", 
context.getRenderPage(),
                                 " so using default content from ", 
context.getDefinitionPage());
 
-                        silent = context.getOut().isSilent();
                         context.getOut().setSilent(false, pageContext);
                         context.setComponent(null);
                         return EVAL_BODY_INCLUDE;
@@ -167,6 +169,7 @@
                 }
             }
 
+            context.getOut().setSilent(true, pageContext);
             return SKIP_BODY;
         }
         catch (ServletException e) {
@@ -194,14 +197,14 @@
             if (isCurrentComponent())
                 context.setComponent(null);
 
-            if (silent != null)
-                context.getOut().setSilent(silent, pageContext);
+            // Restore output's silent flag
+            context.getOut().setSilent(silent, pageContext);
 
             return EVAL_PAGE;
         }
         finally {
             this.context = null;
-            this.silent = null;
+            this.silent = false;
         }
     }
 }

Modified: 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutContext.java
===================================================================
--- 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutContext.java
    2010-05-21 15:59:32 UTC (rev 1240)
+++ 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutContext.java
    2010-05-21 18:26:06 UTC (rev 1241)
@@ -14,7 +14,6 @@
  */
 package net.sourceforge.stripes.tag.layout;
 
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
@@ -67,14 +66,6 @@
         PageContext pageContext = renderTag.getPageContext();
         LinkedList<LayoutContext> stack = getStack(pageContext, true);
         if (stack.isEmpty()) {
-            // Clear the output buffer before beginning a layout render
-            try {
-                pageContext.getOut().clearBuffer();
-            }
-            catch (IOException e) {
-                log.warn("Failed to clear output buffer before rendering a 
layout");
-            }
-
             // Create a new layout writer and push a new body
             context.out = new LayoutWriter(pageContext.getOut());
             pageContext.pushBody(context.out);

Modified: 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutDefinitionTag.java
===================================================================
--- 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutDefinitionTag.java
      2010-05-21 15:59:32 UTC (rev 1240)
+++ 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutDefinitionTag.java
      2010-05-21 18:26:06 UTC (rev 1241)
@@ -66,6 +66,7 @@
     public int doStartTag() throws JspException {
         LayoutContext context = getContext(); // Initialize context
         renderPhase = context.isComponentRenderPhase(); // Initialize phase 
flag
+        silent = context.getOut().isSilent();
 
         if (!renderPhase) {
             // Put any additional parameters into page context for the 
definition to use
@@ -81,8 +82,7 @@
             context.setRendered(true);
         }
 
-        // Save output's current silent flag to be restored later
-        silent = context.getOut().isSilent();
+        // Enable output only if this is the definition execution, not a 
component render
         context.getOut().setSilent(renderPhase, pageContext);
 
         return EVAL_BODY_INCLUDE;

Modified: 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutRenderTag.java
===================================================================
--- 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutRenderTag.java
  2010-05-21 15:59:32 UTC (rev 1240)
+++ 
branches/1.5.x/stripes/src/net/sourceforge/stripes/tag/layout/LayoutRenderTag.java
  2010-05-21 18:26:06 UTC (rev 1241)
@@ -14,6 +14,7 @@
  */
 package net.sourceforge.stripes.tag.layout;
 
+import java.io.IOException;
 import java.util.LinkedList;
 
 import javax.servlet.jsp.JspException;
@@ -99,6 +100,7 @@
     @Override
     public int doStartTag() throws JspException {
         LayoutContext context = getContext();
+        silent = context.getOut().isSilent();
 
         if (isNewContext()) {
             log.debug("Start layout init in ", context.getRenderPage());
@@ -113,9 +115,8 @@
             pushPageContextAttributes(context.getParameters());
         }
 
-        // Save output's current silent flag to be restored later
-        silent = context.getOut().isSilent();
-        context.getOut().setSilent(false, pageContext);
+        // Render tags never output their contents directly
+        context.getOut().setSilent(true, pageContext);
 
         log.debug("Start component render phase for ", context.getComponent(), 
" in ", context
                 .getRenderPage());
@@ -138,17 +139,26 @@
         try {
             LayoutContext context = getContext();
             if (isNewContext()) {
+                // Substitution of the layout writer for the regular JSP 
writer does not work for
+                // the initial render tag. Its body evaluation still uses the 
original JSP writer
+                // for output. Clear the output buffer before executing the 
definition page.
+                if (isOuterTag()) {
+                    try {
+                        context.getOut().clear();
+                    }
+                    catch (IOException e) {
+                        log.debug("Could not clear output buffer: ", 
e.getMessage());
+                    }
+                }
+
                 log.debug("End layout init in ", context.getRenderPage());
 
                 try {
                     log.debug("Start layout exec in ", 
context.getDefinitionPage());
-                    boolean outer = isOuterTag();
                     boolean silent = context.getOut().isSilent();
-                    if (!outer)
-                        context.getOut().setSilent(true, pageContext);
+                    context.getOut().setSilent(true, pageContext);
                     pageContext.include(this.name, false);
-                    if (!outer)
-                        context.getOut().setSilent(silent, pageContext);
+                    context.getOut().setSilent(silent, pageContext);
                     log.debug("End layout exec in ", 
context.getDefinitionPage());
                 }
                 catch (Exception e) {


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------

_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development

Reply via email to