You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2010/03/02 13:18:05 UTC

svn commit: r917990 - in /myfaces/tobago/trunk: core/src/main/java/org/apache/myfaces/tobago/internal/context/ core/src/test/java/org/apache/myfaces/tobago/internal/context/ theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarb...

Author: lofwyr
Date: Tue Mar  2 12:18:04 2010
New Revision: 917990

URL: http://svn.apache.org/viewvc?rev=917990&view=rev
Log:
TOBAGO-846: ResponseWriterDivider
 - Is is also required to have more than one ResponseWriterDivider on a single page, because the Menu and the TreeListbox uses it. For that the name of the ResponseWriterDivider in the request map must be configurable.

Modified:
    myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDivider.java
    myfaces/tobago/trunk/core/src/test/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDividerUnitTest.java
    myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxRenderer.java
    myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java

Modified: myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDivider.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDivider.java?rev=917990&r1=917989&r2=917990&view=diff
==============================================================================
--- myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDivider.java (original)
+++ myfaces/tobago/trunk/core/src/main/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDivider.java Tue Mar  2 12:18:04 2010
@@ -29,28 +29,30 @@
 import java.util.Map;
 
 /**
- * Sometimes the rendered output must be places in the Response in a different order than it was rendered.
+ * In some cases the rendered output must be places in the Response in a different order than it was rendered.
  * The <code>ResponseWriterDivider</code> helps to manage a list of buffers which holds the temporary output.
  */
 public class ResponseWriterDivider {
 
   private static final Log LOG = LogFactory.getLog(ResponseWriterDivider.class);
 
-  private static final String NAME_IN_REQUEST = ResponseWriterDivider.class.getName();
-
   private List<ResponseWriter> writers;
   private List<FastStringWriter> buffers;
   
   private ResponseWriter original;
   
   private int current;
+  
+  private String nameInRequest;
 
-  public static ResponseWriterDivider getInstance(FacesContext facesContext) {
+  public static ResponseWriterDivider getInstance(FacesContext facesContext, String nameInRequest) {
     final Map<String,Object> map = facesContext.getExternalContext().getRequestMap();
-    ResponseWriterDivider divider = (ResponseWriterDivider) map.get(NAME_IN_REQUEST);
+    ResponseWriterDivider divider = (ResponseWriterDivider) map.get(nameInRequest);
     if (divider == null) {
       divider = new ResponseWriterDivider(facesContext);
-      map.put(NAME_IN_REQUEST, divider);
+      map.put(nameInRequest, divider);
+      divider.nameInRequest = nameInRequest;
+      
     }
     return divider;
   }
@@ -65,6 +67,8 @@
   /**
    * Create (if needed) and activate a new branch. 
    * After this call, all output will be stored in this new branch. 
+   * <p>
+   * It is usually needed to get the response writer again with HtmlRendererUtils.getTobagoResponseWriter();
    * @return true if the branch was not created new. So the branch was already existent.
    */
   public boolean activateBranch(FacesContext facesContext) {
@@ -90,6 +94,8 @@
   /**
    * Passivate the current branch. 
    * After this call, all output will be written in the former branch (if any) or into the original writer.
+   * <p>
+   * It is usually needed to get the response writer again with HtmlRendererUtils.getTobagoResponseWriter();
    * @return true, if the current writer is not the original writer. So the "stack" is at the bottom. 
    */
   public boolean passivateBranch(FacesContext facesContext) {
@@ -116,14 +122,14 @@
    * Write the collected stuff in the original writer.
    * This is always the last call on this object.
    */
-  public void writeOut(FacesContext facesContext) throws IOException {
+  public void writeOutAndCleanUp(FacesContext facesContext) throws IOException {
     facesContext.setResponseWriter(original);
     for (FastStringWriter buffer : buffers) {
       original.write(buffer.toString());
     }
     // clean up.
-    writers = null;
-    buffers = null;
+    final Map<String,Object> map = facesContext.getExternalContext().getRequestMap();
+    map.remove(nameInRequest);
   }
 
   @Override

Modified: myfaces/tobago/trunk/core/src/test/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDividerUnitTest.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/core/src/test/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDividerUnitTest.java?rev=917990&r1=917989&r2=917990&view=diff
==============================================================================
--- myfaces/tobago/trunk/core/src/test/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDividerUnitTest.java (original)
+++ myfaces/tobago/trunk/core/src/test/java/org/apache/myfaces/tobago/internal/context/ResponseWriterDividerUnitTest.java Tue Mar  2 12:18:04 2010
@@ -57,8 +57,8 @@
 
     render(facesContext, root);
 
-    ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext);
-    divider.writeOut(facesContext);
+    ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext, "unit test");
+    divider.writeOutAndCleanUp(facesContext);
 
     String expected 
         = "(Root)\n"
@@ -82,7 +82,7 @@
   }
 
   private void render(FacesContext facesContext, DefaultMutableTreeNode node) throws IOException {
-    ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext);
+    ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext, "unit test");
 
     String label = (String) node.getUserObject();
 

Modified: myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxRenderer.java?rev=917990&r1=917989&r2=917990&view=diff
==============================================================================
--- myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxRenderer.java (original)
+++ myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxRenderer.java Tue Mar  2 12:18:04 2010
@@ -40,6 +40,8 @@
 public class TreeListboxRenderer extends LayoutComponentRendererBase {
 
   private static final String SCRIPT = "script/tobago-tree.js";
+  
+  public static final String DIVIDER = TreeListboxRenderer.class.getName() + "DIVIDER";
 
   public void prepareRender(FacesContext facesContext, UIComponent component) throws IOException {
     super.prepareRender(facesContext, component);
@@ -118,7 +120,7 @@
     scrollDivStyle.setPosition(Position.ABSOLUTE);
     writer.writeStyleAttribute(scrollDivStyle);
     
-    ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext);
+    ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext, DIVIDER);
     // write in all open branches the end tag.
     while (divider.activateBranch(facesContext)) {
       writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
@@ -127,7 +129,7 @@
     while (divider.passivateBranch(facesContext)) {
     }  
       
-    divider.writeOut(facesContext);
+    divider.writeOutAndCleanUp(facesContext);
 
     writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
 

Modified: myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java?rev=917990&r1=917989&r2=917990&view=diff
==============================================================================
--- myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java (original)
+++ myfaces/tobago/trunk/theme/scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java Tue Mar  2 12:18:04 2010
@@ -140,8 +140,8 @@
 
     if (folder) {
       boolean siblingMode = "siblingLeafOnly".equals(tree.getAttributes().get(Attributes.SELECTABLE));
-
-      boolean alreadyExists = ResponseWriterDivider.getInstance(facesContext).activateBranch(facesContext);
+      ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext, TreeListboxRenderer.DIVIDER);
+      boolean alreadyExists = divider.activateBranch(facesContext);
       writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
       if (!alreadyExists) {
         writer.startElement(HtmlConstants.DIV, null);
@@ -484,10 +484,11 @@
   protected void encodeEndListbox(FacesContext facesContext, UITreeNode node) throws IOException {
     boolean folder = node.isFolder();
     if (folder) {
-      TobagoResponseWriterImpl writer = (TobagoResponseWriterImpl) HtmlRendererUtils.getTobagoResponseWriter(facesContext);
+      TobagoResponseWriterImpl writer 
+          = (TobagoResponseWriterImpl) HtmlRendererUtils.getTobagoResponseWriter(facesContext);
       writer.endElement(HtmlConstants.SELECT);
-
-      ResponseWriterDivider.getInstance(facesContext).passivateBranch(facesContext);
+      ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext, TreeListboxRenderer.DIVIDER);
+      divider.passivateBranch(facesContext);
     }
   }