You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2007/12/21 03:16:09 UTC

svn commit: r606088 - in /tapestry/tapestry5/trunk: tapestry-core/src/main/java/org/apache/tapestry/internal/services/ tapestry-core/src/main/java/org/apache/tapestry/services/ tapestry-core/src/test/java/org/apache/tapestry/internal/services/ tapestry...

Author: hlship
Date: Thu Dec 20 18:16:03 2007
New Revision: 606088

URL: http://svn.apache.org/viewvc?rev=606088&view=rev
Log:
TAPESTRY-1650: Create an extensible filter pipeline for partial page renders (passing the markup write and the JSONObject reply).  Add the basic set of services (PageRenderSupport, Heartbeat, ZoneSetup, DefaultValidationDecorator) for use when rendering a partial.

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRenderer.java
      - copied, changed from r598484, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRenderer.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRendererImpl.java
      - copied, changed from r598484, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupRendererPipelineImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererPipelineImpl.java
      - copied, changed from r598484, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupport.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRenderer.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRendererFilter.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupportTest.java
Removed:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderInitializerImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRenderer.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PageRenderInitializer.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentActionRequestHandler.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessor.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueue.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueueImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/RenderCommandComponentEventResultProcessor.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRenderer.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRendererFilter.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/Traditional.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessorTest.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/PipelineBuilderImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/services/PipelineBuilder.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentActionRequestHandler.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentActionRequestHandler.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentActionRequestHandler.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentActionRequestHandler.java Thu Dec 20 18:16:03 2007
@@ -35,7 +35,7 @@
 
     private final MarkupWriterFactory _factory;
 
-    private final PartialMarkupRenderer _renderer;
+    private final AjaxPartialResponseRenderer _renderer;
 
     private final Response _response;
 
@@ -44,8 +44,8 @@
     private final ComponentEventResultProcessor _resultProcessor;
 
     public AjaxComponentActionRequestHandler(RequestPageCache cache, MarkupWriterFactory factory,
-                                             PartialMarkupRenderer renderer, Response response, PageRenderQueue queue,
-                                             @Ajax ComponentEventResultProcessor resultProcessor)
+                                             AjaxPartialResponseRenderer renderer, Response response,
+                                             PageRenderQueue queue, @Ajax ComponentEventResultProcessor resultProcessor)
     {
         _cache = cache;
         _factory = factory;

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessor.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessor.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessor.java Thu Dec 20 18:16:03 2007
@@ -23,14 +23,14 @@
 import java.io.IOException;
 
 /**
- * Performs a partial page render based on a
+ * Performs a partial page render based on a root component.
  */
 public class AjaxComponentInstanceEventResultProcessor implements ComponentEventResultProcessor<Component>
 {
     private final RequestPageCache _cache;
-    private final PartialMarkupRenderer _renderer;
+    private final AjaxPartialResponseRenderer _renderer;
 
-    public AjaxComponentInstanceEventResultProcessor(PartialMarkupRenderer renderer, RequestPageCache cache)
+    public AjaxComponentInstanceEventResultProcessor(AjaxPartialResponseRenderer renderer, RequestPageCache cache)
     {
         _renderer = renderer;
         _cache = cache;

Copied: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRenderer.java (from r598484, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRenderer.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRenderer.java?p2=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRenderer.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRenderer.java&r1=598484&r2=606088&rev=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRenderer.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRenderer.java Thu Dec 20 18:16:03 2007
@@ -22,8 +22,11 @@
  * Used to render portions of a page as part of an
  * {@linkplain AjaxComponentActionRequestHandler Ajax request}.    This encapsulates
  * rendering of the partial response and then the construction of a {@linkplain org.apache.tapestry.json.JSONObject JSON reply}.
+ * Works with the pipeline defined by the {@link org.apache.tapestry.services.PartialMarkupRenderer} service.
+ *
+ * @see org.apache.tapestry.internal.services.PageRenderQueue
  */
-public interface PartialMarkupRenderer
+public interface AjaxPartialResponseRenderer
 {
     /**
      * Used to render a partial response as part of an Ajax action request.

Copied: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRendererImpl.java (from r598484, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRendererImpl.java?p2=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRendererImpl.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java&r1=598484&r2=606088&rev=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/AjaxPartialResponseRendererImpl.java Thu Dec 20 18:16:03 2007
@@ -15,40 +15,50 @@
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.MarkupWriter;
-import org.apache.tapestry.dom.Element;
 import org.apache.tapestry.internal.util.ContentType;
 import org.apache.tapestry.json.JSONObject;
 import org.apache.tapestry.runtime.RenderCommand;
 import org.apache.tapestry.services.Environment;
 import org.apache.tapestry.services.MarkupWriterFactory;
+import org.apache.tapestry.services.PartialMarkupRenderer;
 import org.apache.tapestry.services.Response;
 
 import java.io.IOException;
 import java.io.PrintWriter;
 
-public class PartialMarkupRendererImpl implements PartialMarkupRenderer
+public class AjaxPartialResponseRendererImpl implements AjaxPartialResponseRenderer
 {
     private final Environment _environment;
 
-    private final PageRenderQueue _pageRenderQueue;
-
     private final MarkupWriterFactory _factory;
 
     private final Response _response;
 
-    public PartialMarkupRendererImpl(Environment environment, PageRenderQueue pageRenderQueue,
-                                     MarkupWriterFactory factory, Response response)
+    private final PartialMarkupRenderer _partialMarkupRenderer;
+
+    private final PageRenderQueue _pageRenderQueue;
+
+
+    public AjaxPartialResponseRendererImpl(Environment environment, MarkupWriterFactory factory, Response response,
+                                           PartialMarkupRenderer partialMarkupRenderer, PageRenderQueue pageRenderQueue)
     {
         _environment = environment;
-        _pageRenderQueue = pageRenderQueue;
         _factory = factory;
         _response = response;
+        _partialMarkupRenderer = partialMarkupRenderer;
+        _pageRenderQueue = pageRenderQueue;
     }
 
     public void renderPartialPageMarkup(RenderCommand rootRenderCommand) throws IOException
     {
         _environment.clear();
 
+        // This is a complex area as we are trying to keep public and private services properly
+        // seperated, and trying to keep stateless and stateful (i.e., perthread scope) services
+        // seperated. So we inform the stateful queue service what it needs to do here ...
+
+        _pageRenderQueue.initializeForPartialPageRender(rootRenderCommand);
+
         // This may be problematic as the charset of the response is not
         // going to be set properly I think.  We'll loop back to that.
 
@@ -56,25 +66,11 @@
 
         MarkupWriter writer = _factory.newMarkupWriter();
 
-        // 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");
-
-        _pageRenderQueue.initializeForPartialPageRender(rootRenderCommand);
-
-        // TODO: This is where we will set up a pipeline to provide environmentals and,
-        // perhaps, to catch errors and inform the client.
-
-        _pageRenderQueue.render(writer);
-
-        writer.end();
-
-        String content = root.getChildMarkup().trim();
-
         JSONObject reply = new JSONObject();
 
-        reply.put("content", content);
+        // ... and here, the pipeline eventually reaches the PRQ to let it render the root render command.
+
+        _partialMarkupRenderer.renderMarkup(writer, reply);
 
         PrintWriter pw = _response.getPrintWriter(contentType.toString());
 

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupRendererPipelineImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupRendererPipelineImpl.java?rev=606088&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupRendererPipelineImpl.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/MarkupRendererPipelineImpl.java Thu Dec 20 18:16:03 2007
@@ -0,0 +1,50 @@
+// Copyright 2007 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.ioc.annotations.Marker;
+import org.apache.tapestry.ioc.annotations.Primary;
+import org.apache.tapestry.ioc.services.PipelineBuilder;
+import org.apache.tapestry.services.MarkupRenderer;
+import org.apache.tapestry.services.MarkupRendererFilter;
+import org.slf4j.Logger;
+
+import java.util.List;
+
+@Marker(Primary.class)
+public class MarkupRendererPipelineImpl implements MarkupRenderer
+{
+    private final MarkupRenderer _pipeline;
+
+    public MarkupRendererPipelineImpl(final PageRenderQueue pageRenderQueue, Logger logger, PipelineBuilder builder,
+                                      List<MarkupRendererFilter> configuration)
+    {
+        MarkupRenderer terminator = new MarkupRenderer()
+        {
+            public void renderMarkup(MarkupWriter writer)
+            {
+                pageRenderQueue.render(writer);
+            }
+        };
+
+        _pipeline = builder.build(logger, MarkupRenderer.class, MarkupRendererFilter.class, configuration, terminator);
+    }
+
+    public void renderMarkup(MarkupWriter writer)
+    {
+        _pipeline.renderMarkup(writer);
+    }
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageMarkupRendererImpl.java Thu Dec 20 18:16:03 2007
@@ -18,7 +18,6 @@
 import org.apache.tapestry.internal.structure.Page;
 import org.apache.tapestry.services.Environment;
 import org.apache.tapestry.services.MarkupRenderer;
-import org.apache.tapestry.services.PageRenderInitializer;
 
 public class PageMarkupRendererImpl implements PageMarkupRenderer
 {
@@ -28,7 +27,7 @@
 
     private final MarkupRenderer _markupRendererPipeline;
 
-    public PageMarkupRendererImpl(PageRenderInitializer pageRenderInitializer, PageRenderQueue pageRenderQueue,
+    public PageMarkupRendererImpl(MarkupRenderer markupRendererPipeline, PageRenderQueue pageRenderQueue,
                                   Environment environment)
     {
         // We have to go through some awkward tricks here:
@@ -40,15 +39,7 @@
         _pageRenderQueue = pageRenderQueue;
         _environment = environment;
 
-        MarkupRenderer renderer = new MarkupRenderer()
-        {
-            public void renderMarkup(MarkupWriter writer)
-            {
-                _pageRenderQueue.render(writer);
-            }
-        };
-
-        _markupRendererPipeline = pageRenderInitializer.addFilters(renderer);
+        _markupRendererPipeline = markupRendererPipeline;
     }
 
     public void renderPageMarkup(Page page, MarkupWriter writer)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueue.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueue.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueue.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueue.java Thu Dec 20 18:16:03 2007
@@ -16,6 +16,7 @@
 
 import org.apache.tapestry.MarkupWriter;
 import org.apache.tapestry.internal.structure.Page;
+import org.apache.tapestry.json.JSONObject;
 import org.apache.tapestry.runtime.RenderCommand;
 
 
@@ -43,4 +44,12 @@
      * @param writer to write markup to
      */
     void render(MarkupWriter writer);
+
+    /**
+     * Performs a partial markup render, as configured via {@link #initializeForPartialPageRender(org.apache.tapestry.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);
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueueImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueueImpl.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueueImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PageRenderQueueImpl.java Thu Dec 20 18:16:03 2007
@@ -15,11 +15,18 @@
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.dom.Element;
 import org.apache.tapestry.internal.structure.Page;
 import static org.apache.tapestry.ioc.IOCConstants.PERTHREAD_SCOPE;
 import org.apache.tapestry.ioc.annotations.Scope;
+import org.apache.tapestry.json.JSONObject;
 import org.apache.tapestry.runtime.RenderCommand;
 
+/**
+ * This services keeps track of the page being rendered and the root command for the partial render, it is therefore
+ * request/thread scoped.  There's a filter pipeline around the rendering, and that gets to be stateless because this service,
+ * at the end of the pipeline, is stateful.
+ */
 @Scope(PERTHREAD_SCOPE)
 public class PageRenderQueueImpl implements PageRenderQueue
 {
@@ -49,5 +56,23 @@
         // Run the queue until empty.
 
         queue.run(writer);
+    }
+
+    public void renderPartial(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.
+
+        Element root = writer.element("ajax-partial");
+
+        // The initialize methods will already have been invoked.
+
+        render(writer);
+
+        writer.end();
+
+        String content = root.getChildMarkup().trim();
+
+        reply.put("content", content);
     }
 }

Copied: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererPipelineImpl.java (from r598484, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererPipelineImpl.java?p2=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererPipelineImpl.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java&r1=598484&r2=606088&rev=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialMarkupRendererPipelineImpl.java Thu Dec 20 18:16:03 2007
@@ -15,71 +15,44 @@
 package org.apache.tapestry.internal.services;
 
 import org.apache.tapestry.MarkupWriter;
-import org.apache.tapestry.dom.Element;
-import org.apache.tapestry.internal.util.ContentType;
+import org.apache.tapestry.ioc.annotations.Marker;
+import org.apache.tapestry.ioc.annotations.Primary;
+import org.apache.tapestry.ioc.services.PipelineBuilder;
 import org.apache.tapestry.json.JSONObject;
-import org.apache.tapestry.runtime.RenderCommand;
-import org.apache.tapestry.services.Environment;
-import org.apache.tapestry.services.MarkupWriterFactory;
-import org.apache.tapestry.services.Response;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-
-public class PartialMarkupRendererImpl implements PartialMarkupRenderer
+import org.apache.tapestry.services.PartialMarkupRenderer;
+import org.apache.tapestry.services.PartialMarkupRendererFilter;
+import org.slf4j.Logger;
+
+import java.util.List;
+
+/**
+ * Represents a pipeline of {@link org.apache.tapestry.services.PartialMarkupRendererFilter}s that
+ * terminates with {@link org.apache.tapestry.internal.services.PageRenderQueue#renderPartial(org.apache.tapestry.MarkupWriter, org.apache.tapestry.json.JSONObject)}.
+ */
+@Marker(Primary.class)
+public class PartialMarkupRendererPipelineImpl implements PartialMarkupRenderer
 {
-    private final Environment _environment;
-
-    private final PageRenderQueue _pageRenderQueue;
+    private final PartialMarkupRenderer _pipeline;
 
-    private final MarkupWriterFactory _factory;
-
-    private final Response _response;
-
-    public PartialMarkupRendererImpl(Environment environment, PageRenderQueue pageRenderQueue,
-                                     MarkupWriterFactory factory, Response response)
+    public PartialMarkupRendererPipelineImpl(Logger logger, List<PartialMarkupRendererFilter> configuration,
+                                             PipelineBuilder builder, final PageRenderQueue renderQueue)
     {
-        _environment = environment;
-        _pageRenderQueue = pageRenderQueue;
-        _factory = factory;
-        _response = response;
-    }
-
-    public void renderPartialPageMarkup(RenderCommand rootRenderCommand) throws IOException
-    {
-        _environment.clear();
-
-        // This may be problematic as the charset of the response is not
-        // going to be set properly I think.  We'll loop back to that.
-
-        ContentType contentType = new ContentType("text/javascript");
-
-        MarkupWriter writer = _factory.newMarkupWriter();
 
-        // The partial will quite often contain multiple elements (or just a block of plain text),
-        // so those must be enclosed in a root element.
+        PartialMarkupRenderer terminator = new PartialMarkupRenderer()
+        {
+            public void renderMarkup(MarkupWriter writer, JSONObject reply)
+            {
+                renderQueue.renderPartial(writer, reply);
+            }
+        };
 
-        Element root = writer.element("ajax-partial");
-
-        _pageRenderQueue.initializeForPartialPageRender(rootRenderCommand);
-
-        // TODO: This is where we will set up a pipeline to provide environmentals and,
-        // perhaps, to catch errors and inform the client.
-
-        _pageRenderQueue.render(writer);
-
-        writer.end();
-
-        String content = root.getChildMarkup().trim();
-
-        JSONObject reply = new JSONObject();
-
-        reply.put("content", content);
-
-        PrintWriter pw = _response.getPrintWriter(contentType.toString());
+        _pipeline = builder.build(logger, PartialMarkupRenderer.class, PartialMarkupRendererFilter.class, configuration,
+                                  terminator);
+    }
 
-        pw.print(reply);
 
-        pw.flush();
+    public void renderMarkup(MarkupWriter writer, JSONObject reply)
+    {
+        _pipeline.renderMarkup(writer, reply);
     }
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupport.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupport.java?rev=606088&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupport.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupport.java Thu Dec 20 18:16:03 2007
@@ -0,0 +1,80 @@
+// Copyright 2007 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import org.apache.tapestry.Asset;
+import org.apache.tapestry.PageRenderSupport;
+import org.apache.tapestry.ioc.internal.util.IdAllocator;
+import org.apache.tapestry.json.JSONObject;
+
+import java.util.Formatter;
+
+/**
+ * Used during partial page renders to allocate ids and collect JavaScript initialization.
+ */
+public class PartialRenderPageRenderSupport implements PageRenderSupport
+{
+    private final StringBuilder _builder = new StringBuilder();
+    private final Formatter _formatter = new Formatter(_builder);
+    private boolean _dirty;
+
+    // TODO: A namespace for the id allocator to ensure uniquely allocated ids on the client.
+
+    private final IdAllocator _idAllocator = new IdAllocator();
+
+    public String allocateClientId(String id)
+    {
+        return _idAllocator.allocateId(id);
+    }
+
+    /**
+     * Does nothing.  Script links are only supported during full page renders, not partials (at this time).
+     */
+    public void addScriptLink(Asset... scriptAssets)
+    {
+    }
+
+    /**
+     * Does nothing.  Script links are only supported during full page renders, not partials (at this time).
+     */
+    public void addClasspathScriptLink(String... classpaths)
+    {
+    }
+
+    /**
+     * Does nothing.  Stylesheet links are only supported during full page renders, not partials (at this time).
+     */
+    public void addStylesheetLink(Asset stylesheet, String media)
+    {
+    }
+
+    public void addScript(String format, Object... arguments)
+    {
+        _formatter.format(format, arguments);
+
+        _dirty = true;
+    }
+
+    /**
+     * Updates the reply with a "script" key, if any scripting has been collected via {@link #addScript(String, Object[])} }.
+     *
+     * @param reply
+     */
+    public void update(JSONObject reply)
+    {
+        if (_dirty) reply.put("script", _builder.toString());
+    }
+
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/RenderCommandComponentEventResultProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/RenderCommandComponentEventResultProcessor.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/RenderCommandComponentEventResultProcessor.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/RenderCommandComponentEventResultProcessor.java Thu Dec 20 18:16:03 2007
@@ -23,13 +23,13 @@
 /**
  * Processor for objects that implement {@link RenderCommand} (such as {@link org.apache.tapestry.internal.structure.BlockImpl}).
  *
- * @see org.apache.tapestry.internal.services.PartialMarkupRenderer#renderPartialPageMarkup(org.apache.tapestry.runtime.RenderCommand)
+ * @see AjaxPartialResponseRenderer#renderPartialPageMarkup(org.apache.tapestry.runtime.RenderCommand)
  */
 public class RenderCommandComponentEventResultProcessor implements ComponentEventResultProcessor<RenderCommand>
 {
-    private final PartialMarkupRenderer _renderer;
+    private final AjaxPartialResponseRenderer _renderer;
 
-    public RenderCommandComponentEventResultProcessor(PartialMarkupRenderer renderer)
+    public RenderCommandComponentEventResultProcessor(AjaxPartialResponseRenderer renderer)
     {
         _renderer = renderer;
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRenderer.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRenderer.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRenderer.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRenderer.java Thu Dec 20 18:16:03 2007
@@ -19,6 +19,10 @@
 /**
  * An object which will perform rendering of a page (or portion of a page).  This interface
  * exists to be filtered via {@link org.apache.tapestry.services.MarkupRendererFilter}.
+ * <p/>
+ * The MarkupRenderer service takes an ordered configuration of {@link org.apache.tapestry.services.MarkupRendererFilter}s, which
+ * are used for ordinary page rendering (as opposed to {@linkplain org.apache.tapestry.services.PartialMarkupRenderer partial page rendering} for Ajax requests).
+ * The MarkupRenderer service may be selected using the {@link org.apache.tapestry.ioc.annotations.Primary} marker annotation.
  */
 public interface MarkupRenderer
 {

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRendererFilter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRendererFilter.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRendererFilter.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/MarkupRendererFilter.java Thu Dec 20 18:16:03 2007
@@ -27,7 +27,7 @@
      * Implementations should perform work before or after passing the writer
      * to the renderer.
      *
-     * @param writer   to which markup sholuld be written
+     * @param writer   to which markup should be written
      * @param renderer delegate to which the writer should be passed.
      */
     void renderMarkup(MarkupWriter writer, MarkupRenderer renderer);

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRenderer.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRenderer.java?rev=606088&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRenderer.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRenderer.java Thu Dec 20 18:16:03 2007
@@ -0,0 +1,37 @@
+// Copyright 2007 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.services;
+
+import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.json.JSONObject;
+
+/**
+ * Defines an Ajax-oriented partial page render, wherein a render of a portion of a page occurs, and the content is stored into a key ("content") of a {@link org.apache.tapestry.json.JSONObject}, which is
+ * sent to the client side as the final response.  Client-side JavaScript receives this reply and uses it to update a portion of the page.
+ * <p/>
+ * <p/>
+ * The PartialMarkupRenderer service takes an ordered configuration of {@link PartialMarkupRendererFilter}s.  It can be selected using the {@link org.apache.tapestry.ioc.annotations.Primary} marker annotation.
+ */
+public interface PartialMarkupRenderer
+{
+    /**
+     * Implementations should perform work before or after passing the writer
+     * to the renderer.
+     *
+     * @param writer to which markup should be written
+     * @param reply  JSONObject which will contain the partial response
+     */
+    void renderMarkup(MarkupWriter writer, JSONObject reply);
+}

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRendererFilter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRendererFilter.java?rev=606088&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRendererFilter.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/PartialMarkupRendererFilter.java Thu Dec 20 18:16:03 2007
@@ -0,0 +1,36 @@
+// Copyright 2007 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.services;
+
+import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.json.JSONObject;
+
+/**
+ * A filter (the main interface being {@link PartialMarkupRenderer}) applied when performing a partial page render as part of an Ajax-oriented request.  This is similar
+ * to {@link org.apache.tapestry.services.MarkupRendererFilter} and filters are often in place so as
+ * to contribute {@link org.apache.tapestry.annotations.Environmental} services to the pages and components that render.
+ */
+public interface PartialMarkupRendererFilter
+{
+    /**
+     * Implementations should perform work before or after passing the writer
+     * to the renderer.
+     *
+     * @param writer   to which markup should be written
+     * @param reply    JSONObject which will contain the partial response
+     * @param renderer delegate to which the writer should be passed
+     */
+    void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer);
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java Thu Dec 20 18:16:03 2007
@@ -112,8 +112,9 @@
         binder.bind(ComponentEventResultProcessor.class, ComponentInstanceResultProcessor.class).withId(
                 "ComponentInstanceResultProcessor");
         binder.bind(PageRenderQueue.class, PageRenderQueueImpl.class);
-        binder.bind(PageRenderInitializer.class, PageRenderInitializerImpl.class);
-        binder.bind(PartialMarkupRenderer.class, PartialMarkupRendererImpl.class);
+        binder.bind(MarkupRenderer.class, MarkupRendererPipelineImpl.class);
+        binder.bind(AjaxPartialResponseRenderer.class, AjaxPartialResponseRendererImpl.class);
+        binder.bind(PartialMarkupRenderer.class, PartialMarkupRendererPipelineImpl.class);
     }
 
     public static Alias build(Logger logger,
@@ -1280,7 +1281,7 @@
     }
 
     /**
-     * Adds basic render initializers, each of which provides an {@link org.apache.tapestry.annotations.Environmental} service:
+     * Adds page render filters, each of which provides an {@link org.apache.tapestry.annotations.Environmental} service:
      * <dl>
      * <dt>PageRenderSupport</dt>  <dd>Provides {@link PageRenderSupport}</dd>
      * <dt>ZoneSetup</dt> <dd>Provides {@link ZoneSetup}</dd>
@@ -1289,19 +1290,19 @@
      * <dd>Provides {@link org.apache.tapestry.ValidationDecorator} (as an instance of {@link org.apache.tapestry.internal.DefaultValidationDecorator})</dd>
      * </dl>
      */
-    public void contributePageRenderInitializer(OrderedConfiguration<MarkupRendererFilter> configuration,
+    public void contributeMarkupRenderer(OrderedConfiguration<MarkupRendererFilter> configuration,
 
-                                                @Path("${tapestry.default-stylesheet}")
-                                                final Asset stylesheetAsset,
+                                         @Path("${tapestry.default-stylesheet}")
+                                         final Asset stylesheetAsset,
 
-                                                @Path("org/apache/tapestry/field-error-marker.png")
-                                                final Asset fieldErrorIcon,
+                                         @Path("org/apache/tapestry/field-error-marker.png")
+                                         final Asset fieldErrorIcon,
 
-                                                final ValidationMessagesSource validationMessagesSource,
+                                         final ValidationMessagesSource validationMessagesSource,
 
-                                                final SymbolSource symbolSource,
+                                         final SymbolSource symbolSource,
 
-                                                final AssetSource assetSource)
+                                         final AssetSource assetSource)
     {
         MarkupRendererFilter pageRenderSupport = new MarkupRendererFilter()
         {
@@ -1389,8 +1390,109 @@
 
         configuration.add("PageRenderSupport", pageRenderSupport);
         configuration.add("ZoneSetup", zoneSetup, "after:PageRenderSupport");
-        configuration.add("Heartbeat", heartbeat);
-        configuration.add("DefaultValidationDecorator", defaultValidationDecorator);
+        configuration.add("Heartbeat", heartbeat, "after:PageRenderSupport");
+        configuration.add("DefaultValidationDecorator", defaultValidationDecorator, "after:Heartbeat");
+    }
+
+
+    /**
+     * Contributes {@link PartialMarkupRendererFilter}s used when rendering a partial Ajax response.  This
+     * is an analog to {@link #contributeMarkupRenderer(org.apache.tapestry.ioc.OrderedConfiguration, org.apache.tapestry.Asset, org.apache.tapestry.Asset, ValidationMessagesSource, org.apache.tapestry.ioc.services.SymbolSource, AssetSource)} }
+     * and overlaps it to some degree.
+     * <dl>
+     * <dt>   PageRenderSupport     </dt>
+     * <dd>Provides {@link org.apache.tapestry.PageRenderSupport}</dd>
+     * <dt>ZoneSetup</dt> <dd>Provides {@link ZoneSetup}</dd>
+     * <dt>Heartbeat</dt> <dd>Provides {@link org.apache.tapestry.services.Heartbeat}</dd>
+     * <dt>DefaultValidationDecorator</dt>
+     * <dd>Provides {@link org.apache.tapestry.ValidationDecorator} (as an instance of {@link org.apache.tapestry.internal.DefaultValidationDecorator})</dd>
+     * </dl>
+     */
+    public void contributePartialMarkupRenderer(OrderedConfiguration<PartialMarkupRendererFilter> configuration,
+
+                                                @Path("org/apache/tapestry/field-error-marker.png")
+                                                final Asset fieldErrorIcon,
+
+                                                final ValidationMessagesSource validationMessagesSource,
+
+                                                final SymbolSource symbolSource,
+
+                                                final AssetSource assetSource)
+    {
+        PartialMarkupRendererFilter pageRenderSupport = new PartialMarkupRendererFilter()
+        {
+            public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer)
+            {
+                PartialRenderPageRenderSupport support = new PartialRenderPageRenderSupport();
+
+                _environment.push(PageRenderSupport.class, support);
+
+                renderer.renderMarkup(writer, reply);
+
+                support.update(reply);
+
+                _environment.pop(PageRenderSupport.class);
+            }
+        };
+
+        PartialMarkupRendererFilter zoneSupport = new PartialMarkupRendererFilter()
+        {
+            public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer)
+            {
+                PageRenderSupport pageRenderSupport = _environment.peekRequired(PageRenderSupport.class);
+
+                ZoneSetupImpl setup = new ZoneSetupImpl(pageRenderSupport);
+
+                _environment.push(ZoneSetup.class, setup);
+
+                renderer.renderMarkup(writer, reply);
+
+                _environment.pop(ZoneSetup.class);
+
+                setup.writeInitializationScript();
+            }
+        };
+
+        PartialMarkupRendererFilter heartbeat = new PartialMarkupRendererFilter()
+        {
+            public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer)
+            {
+                Heartbeat heartbeat = new HeartbeatImpl();
+
+                heartbeat.begin();
+
+                _environment.push(Heartbeat.class, heartbeat);
+
+                renderer.renderMarkup(writer, reply);
+
+                _environment.pop(Heartbeat.class);
+
+                heartbeat.end();
+            }
+        };
+
+        PartialMarkupRendererFilter defaultValidationDecorator = new PartialMarkupRendererFilter()
+        {
+            public void renderMarkup(MarkupWriter writer, JSONObject reply, PartialMarkupRenderer renderer)
+            {
+                Messages messages = validationMessagesSource.getValidationMessages(_threadLocale.getLocale());
+
+                ValidationDecorator decorator = new DefaultValidationDecorator(_environment, messages, fieldErrorIcon,
+                                                                               writer);
+
+                _environment.push(ValidationDecorator.class, decorator);
+
+                renderer.renderMarkup(writer, reply);
+
+                _environment.pop(ValidationDecorator.class);
+            }
+        };
+
+
+        configuration.add("PageRenderSupport", pageRenderSupport);
+        configuration.add("ZoneSupport", zoneSupport, "after:PageRenderSupport");
+        configuration.add("Heatbeat", heartbeat, "after:PageRenderSupport");
+        configuration.add("DefaultValidationDecorator", defaultValidationDecorator, "after:Heartbeat");
     }
 
     /**
@@ -1929,4 +2031,5 @@
 
         configuration.add("Ajax", new AjaxFilter(_request, ajaxHandler));
     }
+
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/Traditional.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/Traditional.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/Traditional.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/Traditional.java Thu Dec 20 18:16:03 2007
@@ -18,7 +18,8 @@
 
 
 /**
- * Marker annotation for a service that should be used for traditional (non-Ajax) requests.
+ * Marker annotation for a service that should be used for traditional page oriented requests, as opposed to Ajax requests
+ * (that send ad-hoc or {@linkplain PartialMarkupRenderer partial page markup} responses.
  *
  * @see org.apache.tapestry.services.ComponentActionRequestHandler
  */

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessorTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessorTest.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessorTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/AjaxComponentInstanceEventResultProcessorTest.java Thu Dec 20 18:16:03 2007
@@ -33,7 +33,7 @@
         String pageName = "Biff";
 
         RequestPageCache cache = mockRequestPageCache();
-        PartialMarkupRenderer renderer = newMock(PartialMarkupRenderer.class);
+        AjaxPartialResponseRenderer renderer = newMock(AjaxPartialResponseRenderer.class);
         Page page = mockPage();
         ComponentResources resources = mockComponentResources();
         Component component = mockComponent();
@@ -64,7 +64,7 @@
         String pageName = "Biff";
 
         RequestPageCache cache = mockRequestPageCache();
-        PartialMarkupRenderer renderer = newMock(PartialMarkupRenderer.class);
+        AjaxPartialResponseRenderer renderer = newMock(AjaxPartialResponseRenderer.class);
         Page page = mockPage();
         ComponentResources resources = mockComponentResources();
         Component component = mockComponent();

Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupportTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupportTest.java?rev=606088&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupportTest.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/PartialRenderPageRenderSupportTest.java Thu Dec 20 18:16:03 2007
@@ -0,0 +1,70 @@
+// Copyright 2007 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.services;
+
+import org.apache.tapestry.Asset;
+import org.apache.tapestry.PageRenderSupport;
+import org.apache.tapestry.json.JSONObject;
+import org.apache.tapestry.test.TapestryTestCase;
+import org.testng.annotations.Test;
+
+public class PartialRenderPageRenderSupportTest extends TapestryTestCase
+{
+    @Test
+    public void allocate_ids()
+    {
+        PageRenderSupport prs = new PartialRenderPageRenderSupport();
+
+        assertEquals(prs.allocateClientId("foo"), "foo");
+        assertEquals(prs.allocateClientId("foo"), "foo_0");
+    }
+
+    @Test
+    public void add_links_do_nothing()
+    {
+        PageRenderSupport prs = new PartialRenderPageRenderSupport();
+
+        Asset asset = mockAsset();
+
+        replay();
+
+        prs.addScriptLink(asset);
+        prs.addClasspathScriptLink("foo/bar.js");
+        prs.addStylesheetLink(asset, null);
+
+        verify();
+    }
+
+    @Test
+    public void add_script_and_update()
+    {
+        PartialRenderPageRenderSupport prs = new PartialRenderPageRenderSupport();
+
+        JSONObject reply = new JSONObject();
+
+
+        prs.update(reply);
+
+
+        assertEquals(reply.toString(), "{}");
+
+
+        prs.addScript("x = %d;", 10);
+
+        prs.update(reply);
+
+        assertEquals(reply.getString("script"), "x = 10;");
+    }
+}

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/PipelineBuilderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/PipelineBuilderImpl.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/PipelineBuilderImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/PipelineBuilderImpl.java Thu Dec 20 18:16:03 2007
@@ -28,8 +28,7 @@
 
     private final DefaultImplementationBuilder _defaultImplementationBuilder;
 
-    public PipelineBuilderImpl(@Builtin
-    ClassFactory classFactory,
+    public PipelineBuilderImpl(@Builtin ClassFactory classFactory,
 
                                DefaultImplementationBuilder defaultImplementationBuilder)
     {
@@ -37,21 +36,19 @@
         _defaultImplementationBuilder = defaultImplementationBuilder;
     }
 
-    public <S, F> S build(Logger log, Class<S> serviceInterface, Class<F> filterInterface,
-                          List<F> filters)
+    public <S, F> S build(Logger logger, Class<S> serviceInterface, Class<F> filterInterface, List<F> filters)
     {
         S terminator = _defaultImplementationBuilder.createDefaultImplementation(serviceInterface);
 
-        return build(log, serviceInterface, filterInterface, filters, terminator);
+        return build(logger, serviceInterface, filterInterface, filters, terminator);
     }
 
-    public <S, F> S build(Logger log, Class<S> serviceInterface, Class<F> filterInterface,
-                          List<F> filters, S terminator)
+    public <S, F> S build(Logger logger, Class<S> serviceInterface, Class<F> filterInterface, List<F> filters,
+                          S terminator)
     {
         if (filters.isEmpty()) return terminator;
 
-        BridgeBuilder<S, F> bb = new BridgeBuilder<S, F>(log, serviceInterface, filterInterface,
-                                                         _classFactory);
+        BridgeBuilder<S, F> bb = new BridgeBuilder<S, F>(logger, serviceInterface, filterInterface, _classFactory);
 
         // The first bridge will point to the terminator.
         // Like service decorators, we work deepest (last)

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/services/PipelineBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/services/PipelineBuilder.java?rev=606088&r1=606087&r2=606088&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/services/PipelineBuilder.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/services/PipelineBuilder.java Thu Dec 20 18:16:03 2007
@@ -1,17 +1,17 @@
-// Copyright 2006, 2007 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
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
+// Copyright 2006, 2007 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package org.apache.tapestry.ioc.services;
 
 import org.slf4j.Logger;
@@ -44,14 +44,14 @@
      *
      * @param <S>              service type
      * @param <F>              filter type
-     * @param log              logs any warnings generated when constructing the pipeline
+     * @param logger           logs any warnings generated when constructing the pipeline
      * @param serviceInterface
      * @param filterInterface
      * @param filters          sorted list of filters
      * @param terminator       end of the pipeline
      * @return an object that encapsulates the filters and the terminator
      */
-    <S, F> S build(Logger log, Class<S> serviceInterface, Class<F> filterInterface, List<F> filters, S terminator);
+    <S, F> S build(Logger logger, Class<S> serviceInterface, Class<F> filterInterface, List<F> filters, S terminator);
 
     /**
      * Creates a pipeline from just the filters. A
@@ -59,12 +59,12 @@
      *
      * @param <S>
      * @param <F>
-     * @param log
+     * @param logger
      * @param serviceInterface
      * @param filterInterface
      * @param filters
      * @return
      */
-    <S, F> S build(Logger log, Class<S> serviceInterface, Class<F> filterInterface, List<F> filters);
+    <S, F> S build(Logger logger, Class<S> serviceInterface, Class<F> filterInterface, List<F> filters);
 
 }