Author: hlship
Date: Fri Oct 15 18:38:51 2010
New Revision: 1023065

URL: http://svn.apache.org/viewvc?rev=1023065&view=rev
Log:
TAP5-1309: When using a MultiZoneUpdate, Tapestry will clear the referenced zone

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentInstanceEventResultProcessor.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxLinkComponentEventResultProcessor.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageClassComponentEventResultProcessor.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageNameComponentEventResultProcessor.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueue.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueueImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupRendererTerminator.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderCommandComponentEventResultProcessor.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/MultiZoneUpdateEventResultProcessor.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/SingleZonePartialRendererFilter.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentInstanceEventResultProcessor.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentInstanceEventResultProcessor.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentInstanceEventResultProcessor.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentInstanceEventResultProcessor.java
 Fri Oct 15 18:38:51 2010
@@ -1,10 +1,10 @@
-// Copyright 2007, 2008 The Apache Software Foundation
+// Copyright 2007, 2008, 2010 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -24,16 +24,18 @@ import org.apache.tapestry5.services.Com
 import java.io.IOException;
 
 /**
- * Performs a partial page render based on a root component.
+ * Performs a partial page render based on a root component. If the component 
is actually a page,
+ * it will send an JSON reponse to rediret to the page.
  */
+...@suppresswarnings("all")
 public class AjaxComponentInstanceEventResultProcessor implements 
ComponentEventResultProcessor<Component>
 {
     private final RequestPageCache cache;
 
     private final ComponentEventResultProcessor masterProcessor;
 
-    public AjaxComponentInstanceEventResultProcessor(RequestPageCache cache,
-                                                     @Ajax 
ComponentEventResultProcessor masterProcessor)
+    public AjaxComponentInstanceEventResultProcessor(RequestPageCache cache, 
@Ajax
+    ComponentEventResultProcessor masterProcessor)
     {
         this.cache = cache;
         this.masterProcessor = masterProcessor;
@@ -55,7 +57,9 @@ public class AjaxComponentInstanceEventR
             return;
         }
 
-        // Otherwise, a component within a page.
+        // Otherwise, a component within a page. Components are transformed to 
implement RenderCommand, but if we just
+        // pass the component itself to the master processor, we'll get in a 
loop, so we instead
+        // pass the ComponentPageElement (which implements RenderCommand as 
well).
 
         Page page = cache.get(pageName);
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxLinkComponentEventResultProcessor.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxLinkComponentEventResultProcessor.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxLinkComponentEventResultProcessor.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxLinkComponentEventResultProcessor.java
 Fri Oct 15 18:38:51 2010
@@ -1,4 +1,4 @@
-//  Copyright 2008 The Apache Software Foundation
+//  Copyright 2008, 2010 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@ import java.io.IOException;
 /**
  * Handles {...@link org.apache.tapestry5.Link} result types by building a 
JSON response with key "redirectURL".
  */
+...@suppresswarnings("all")
 public class AjaxLinkComponentEventResultProcessor implements 
ComponentEventResultProcessor<Link>
 {
     private final ComponentEventResultProcessor masterProcessor;

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageClassComponentEventResultProcessor.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageClassComponentEventResultProcessor.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageClassComponentEventResultProcessor.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageClassComponentEventResultProcessor.java
 Fri Oct 15 18:38:51 2010
@@ -1,4 +1,4 @@
-//  Copyright 2008 The Apache Software Foundation
+//  Copyright 2008, 2010 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@ import java.io.IOException;
  * @see org.apache.tapestry5.services.ComponentSource
  * @see 
org.apache.tapestry5.internal.services.AjaxPageNameComponentEventResultProcessor
  */
+...@suppresswarnings("all")
 public class AjaxPageClassComponentEventResultProcessor implements 
ComponentEventResultProcessor<Class>
 {
     private final ComponentSource componentSource;

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageNameComponentEventResultProcessor.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageNameComponentEventResultProcessor.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageNameComponentEventResultProcessor.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxPageNameComponentEventResultProcessor.java
 Fri Oct 15 18:38:51 2010
@@ -1,10 +1,10 @@
-//  Copyright 2008, 2009 The Apache Software Foundation
+// Copyright 2008, 2009 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -23,27 +23,29 @@ import java.io.IOException;
 /**
  * A {...@link org.apache.tapestry5.services.ComponentEventResultProcessor}, 
used for Ajax requests, for a String value
  * that is interpreted as a logical page name.
- *
+ * 
  * @see 
org.apache.tapestry5.internal.services.PageNameComponentEventResultProcessor
  */
+...@suppresswarnings("all")
 public class AjaxPageNameComponentEventResultProcessor implements 
ComponentEventResultProcessor<String>
 {
     private final ComponentEventResultProcessor masterProcessor;
 
     private final LinkSource linkSource;
 
-    public AjaxPageNameComponentEventResultProcessor(@Ajax 
ComponentEventResultProcessor masterProcessor,
-                                                     LinkSource linkSource)
+    public AjaxPageNameComponentEventResultProcessor(@Ajax
+    ComponentEventResultProcessor masterProcessor, LinkSource linkSource)
     {
         this.masterProcessor = masterProcessor;
         this.linkSource = linkSource;
     }
 
     /**
-     * Obtains a page render {...@link org.apache.tapestry5.Link} for the 
named, then builds a JSON reponse for the
+     * Obtains a page render {...@link org.apache.tapestry5.Link} for the 
named, then builds a JSON response for the
      * client.
-     *
-     * @param value page name
+     * 
+     * @param value
+     *            page name
      * @throws IOException
      */
     public void processResultValue(String value) throws IOException

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueue.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueue.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueue.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueue.java
 Fri Oct 15 18:38:51 2010
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -19,7 +19,7 @@ import org.apache.tapestry5.internal.str
 import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.services.PartialMarkupRendererFilter;
-
+import org.apache.tapestry5.services.ajax.MultiZoneUpdateEventResultProcessor;
 
 /**
  * A wrapper around {...@link org.apache.tapestry5.runtime.RenderQueue}, but 
referencable as a (per-thread) service. This
@@ -49,9 +49,10 @@ public interface PageRenderQueue
     void initializeForPartialPageRender(RenderCommand rootCommand);
 
     /**
-     * Obtains the value previously supplied to {...@link 
#initializeForPartialPageRender(org.apache.tapestry5.runtime.RenderCommand)}.
+     * Obtains the value previously supplied to
+     * {...@link 
#initializeForPartialPageRender(org.apache.tapestry5.runtime.RenderCommand)}.
      * This allows the "natural" renderer to be substituted or otherwise 
manipulated.
-     *
+     * 
      * @return the root renderer
      */
     RenderCommand getRootRenderCommand();
@@ -63,30 +64,44 @@ public interface PageRenderQueue
     boolean isPartialRenderInitialized();
 
     /**
+     * Forces the partialRenderInitialized flag to true, even if there isn't a 
root render command.
+     * This is used by the {...@link MultiZoneUpdateEventResultProcessor} 
which doesn't add a render command
+     * until after rendering starts (care-of a stack of filters).
+     * 
+     * @since 5.2.2
+     */
+    void forcePartialRenderInitialized();
+
+    /**
      * Render to the write, as setup by the initialize method.
-     *
-     * @param writer to write markup to
+     * 
+     * @param writer
+     *            to write markup to
      */
     void render(MarkupWriter writer);
 
     /**
-     * Performs a partial markup render, as configured via {...@link 
#initializeForPartialPageRender(org.apache.tapestry5.runtime.RenderCommand)}.
-     *
-     * @param writer to which markup should be written
-     * @param reply  JSONObject which will contain the partial response
+     * Performs a partial markup render, as configured via
+     * {...@link 
#initializeForPartialPageRender(org.apache.tapestry5.runtime.RenderCommand)}.
+     * 
+     * @param writer
+     *            to which markup should be written
+     * @param reply
+     *            JSONObject which will contain the partial response
      */
     void renderPartial(MarkupWriter writer, JSONObject reply);
 
     /**
-     * Adds an optional filter to the rendering.  Optional filters are 
<em>temporary</em>, used just during the current
-     * partial render (as opposed to filters contributed to the {...@link 
org.apache.tapestry5.services.PartialMarkupRenderer}
-     * service which are permanent, shared and stateless.
+     * Adds an optional filter to the rendering. Optional filters are 
<em>temporary</em>, used just during the current
+     * partial render (as opposed to filters contributed to the
+     * {...@link org.apache.tapestry5.services.PartialMarkupRenderer} service 
which are permanent, shared and stateless.
      * <p/>
      * Filters are added to the <em>end</em> of the pipeline (after all 
permanent contributions).
      * <p/>
      * Filters will be executed in the order in which they are added.
-     *
-     * @param filter to add to the pipeline
+     * 
+     * @param filter
+     *            to add to the pipeline
      */
     void addPartialMarkupRendererFilter(PartialMarkupRendererFilter filter);
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueueImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueueImpl.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueueImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderQueueImpl.java
 Fri Oct 15 18:38:51 2010
@@ -41,6 +41,8 @@ public class PageRenderQueueImpl impleme
 
     private RenderCommand rootCommand;
 
+    private boolean partialRenderInitialized;
+
     private final Stack<PartialMarkupRendererFilter> filters = 
CollectionFactory.newStack();
 
     private static class Bridge implements PartialMarkupRenderer
@@ -80,16 +82,24 @@ public class PageRenderQueueImpl impleme
 
     public boolean isPartialRenderInitialized()
     {
-        return rootCommand != null;
+        return partialRenderInitialized;
+    }
+
+    public void forcePartialRenderInitialized()
+    {
+        partialRenderInitialized = true;
     }
 
     public void initializeForPartialPageRender(RenderCommand rootCommand)
     {
         assert rootCommand != null;
+
         if (page == null)
             throw new IllegalStateException("Page must be specified before 
root render command.");
 
         this.rootCommand = rootCommand;
+
+        partialRenderInitialized = true;
     }
 
     public RenderCommand getRootRenderCommand()
@@ -120,6 +130,7 @@ public class PageRenderQueueImpl impleme
     public void addPartialMarkupRendererFilter(PartialMarkupRendererFilter 
filter)
     {
         assert filter != null;
+
         filters.push(filter);
     }
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupRendererTerminator.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupRendererTerminator.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupRendererTerminator.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupRendererTerminator.java
 Fri Oct 15 18:38:51 2010
@@ -1,4 +1,4 @@
-// Copyright 2009 Apache Software Foundation
+// Copyright 2009, 2010 Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -15,7 +15,6 @@
 package org.apache.tapestry5.internal.services;
 
 import org.apache.tapestry5.MarkupWriter;
-import org.apache.tapestry5.dom.Element;
 import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.services.PartialMarkupRenderer;
 
@@ -37,17 +36,14 @@ public class PartialMarkupRendererTermin
 
     public void renderMarkup(MarkupWriter writer, JSONObject reply)
     {
-        // The partial will quite often contain multiple elements (or just a 
block of plain text),
-        // so those must be enclosed in a root element.
+        // Ensure that whatever renders will do so inside a root element.
+        // Omitting this causes NPEs when rendering individual zones
+        // of a MultiZoneUpdate
 
-        Element root = writer.element("ajax-partial");
+        writer.element("partial-render-root-element");
 
         renderQueue.renderPartial(writer, reply);
 
         writer.end();
-
-        String content = root.getChildMarkup().trim();
-
-        reply.put("content", content);
     }
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderCommandComponentEventResultProcessor.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderCommandComponentEventResultProcessor.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderCommandComponentEventResultProcessor.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RenderCommandComponentEventResultProcessor.java
 Fri Oct 15 18:38:51 2010
@@ -14,13 +14,16 @@
 
 package org.apache.tapestry5.internal.services;
 
+import java.io.IOException;
+
 import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.dom.Element;
 import org.apache.tapestry5.internal.services.ajax.AjaxFormUpdateController;
+import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.runtime.RenderCommand;
-import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.ComponentEventResultProcessor;
-
-import java.io.IOException;
+import org.apache.tapestry5.services.PartialMarkupRenderer;
+import org.apache.tapestry5.services.PartialMarkupRendererFilter;
 
 /**
  * Processor for objects that implement {...@link RenderCommand} (such as
@@ -28,28 +31,13 @@ import java.io.IOException;
  * 
  * @see AjaxPartialResponseRenderer#renderPartialPageMarkup()
  */
-public class RenderCommandComponentEventResultProcessor implements 
ComponentEventResultProcessor<RenderCommand>
+public class RenderCommandComponentEventResultProcessor implements 
ComponentEventResultProcessor<RenderCommand>,
+        PartialMarkupRendererFilter
 {
     private final PageRenderQueue pageRenderQueue;
 
     private final AjaxFormUpdateController ajaxFormUpdateController;
 
-    private final RenderCommand setup = new RenderCommand()
-    {
-        public void render(MarkupWriter writer, RenderQueue queue)
-        {
-            ajaxFormUpdateController.setupBeforePartialZoneRender(writer);
-        }
-    };
-
-    private final RenderCommand cleanup = new RenderCommand()
-    {
-        public void render(MarkupWriter writer, RenderQueue queue)
-        {
-            ajaxFormUpdateController.cleanupAfterPartialZoneRender();
-        }
-    };
-
     public RenderCommandComponentEventResultProcessor(PageRenderQueue 
pageRenderQueue,
             AjaxFormUpdateController ajaxFormUpdateController)
     {
@@ -59,16 +47,35 @@ public class RenderCommandComponentEvent
 
     public void processResultValue(final RenderCommand value) throws 
IOException
     {
-        RenderCommand wrapper = new RenderCommand()
-        {
-            public void render(MarkupWriter writer, RenderQueue queue)
-            {
-                queue.push(cleanup);
-                queue.push(value);
-                queue.push(setup);
-            }
-        };
+        pageRenderQueue.addPartialMarkupRendererFilter(this);
+        pageRenderQueue.initializeForPartialPageRender(value);
+    }
+
+    /**
+     * As a filter, this class does three things:
+     * <ul>
+     * <li>It creates an outer element to capture the partial page content 
that will be rendered</li>
+     * <li>It does setup and cleanup with the {...@link 
AjaxFormUpdateController}</li>
+     * <li>It extracts the child markup and stuff it into the reply's 
"content" property.</li>
+     * </ul>
+     */
+    public void renderMarkup(MarkupWriter writer, JSONObject reply, 
PartialMarkupRenderer renderer)
+    {
+        // The partial will quite often contain multiple elements (or just a 
block of plain text),
+        // so those must be enclosed in a root element.
+
+        Element root = writer.element("ajax-partial");
+
+        ajaxFormUpdateController.setupBeforePartialZoneRender(writer);
+
+        renderer.renderMarkup(writer, reply);
+
+        ajaxFormUpdateController.cleanupAfterPartialZoneRender();
+
+        writer.end();
+
+        String content = root.getChildMarkup().trim();
 
-        pageRenderQueue.initializeForPartialPageRender(wrapper);
+        reply.put("content", content);
     }
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
 Fri Oct 15 18:38:51 2010
@@ -1818,8 +1818,14 @@ public final class TapestryModule
      * <dt>{...@link org.apache.tapestry5.ajax.MultiZoneUpdate}</dt>
      * <dd>Sends a single JSON response to update the content of multiple zones
      * </dl>
-     */
-    public static void contributeAjaxComponentEventResultProcessor(
+     * <p>
+     * In most cases, when you want to support a new type, you should convert 
it to one of the built-in supported types
+     * (such as {...@link RenderCommand}. You can then inject the master 
AjaxComponentEventResultProcessor (use the
+     * {...@link Ajax} marker annotation) and delegate to it.
+     */
+    @Contribute(ComponentEventResultProcessor.class)
+    @Ajax
+    public static void provideBaseAjaxComponentEventResultProcessors(
             MappedConfiguration<Class, ComponentEventResultProcessor> 
configuration)
     {
         configuration.addInstance(RenderCommand.class, 
RenderCommandComponentEventResultProcessor.class);

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/MultiZoneUpdateEventResultProcessor.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/MultiZoneUpdateEventResultProcessor.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/MultiZoneUpdateEventResultProcessor.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/MultiZoneUpdateEventResultProcessor.java
 Fri Oct 15 18:38:51 2010
@@ -14,19 +14,17 @@
 
 package org.apache.tapestry5.services.ajax;
 
-import org.apache.tapestry5.MarkupWriter;
+import java.io.IOException;
+import java.util.Map;
+
 import org.apache.tapestry5.ajax.MultiZoneUpdate;
 import org.apache.tapestry5.internal.services.PageRenderQueue;
 import org.apache.tapestry5.internal.services.ajax.AjaxFormUpdateController;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
 import org.apache.tapestry5.runtime.RenderCommand;
-import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.ComponentEventResultProcessor;
 
-import java.io.IOException;
-import java.util.Map;
-
 /**
  * Handler for {...@link org.apache.tapestry5.ajax.MultiZoneUpdate} responses 
from a component event handler method. Works
  * by adding {...@link 
org.apache.tapestry5.services.ajax.SingleZonePartialRendererFilter}s for each 
zone to the
@@ -56,14 +54,7 @@ public class MultiZoneUpdateEventResultP
 
     public void processResultValue(final MultiZoneUpdate value) throws 
IOException
     {
-        // There has to be at least a single command in the queue to force a 
render.
-        queue.initializeForPartialPageRender(new RenderCommand()
-        {
-            public void render(MarkupWriter writer, RenderQueue queue)
-            {
-            }
-        });
-
+        queue.forcePartialRenderInitialized();
         queue.addPartialMarkupRendererFilter(new SetupZonesFilter());
 
         Map<String, Object> map = value.getZoneToRenderMap();

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/SingleZonePartialRendererFilter.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/SingleZonePartialRendererFilter.java?rev=1023065&r1=1023064&r2=1023065&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/SingleZonePartialRendererFilter.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ajax/SingleZonePartialRendererFilter.java
 Fri Oct 15 18:38:51 2010
@@ -89,8 +89,13 @@ public class SingleZonePartialRendererFi
 
         RenderCommand existing = queue.getRootRenderCommand();
 
-        queue.initializeForPartialPageRender(new 
CombinedRenderCommand(existing, forZone));
+        queue.initializeForPartialPageRender(mergeRenderCommands(existing, 
forZone));
 
         renderer.renderMarkup(writer, reply);
     }
+
+    private RenderCommand mergeRenderCommands(RenderCommand existingCommand, 
RenderCommand newCommand)
+    {
+        return existingCommand == null ? newCommand : new 
CombinedRenderCommand(existingCommand, newCommand);
+    }
 }


Reply via email to