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 2008/12/20 01:05:15 UTC

svn commit: r728189 - in /tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src: main/java/org/apache/tapestry5/internal/pageload/ main/java/org/apache/tapestry5/internal/services/ main/java/org/apache/tapestry5/internal/structure/ test/java/or...

Author: hlship
Date: Fri Dec 19 16:05:15 2008
New Revision: 728189

URL: http://svn.apache.org/viewvc?rev=728189&view=rev
Log:
TAP5-417: Tapestry 5.0 Performance Improvements
- Reduce render operations by collapsing consecutive static render commands into a single composite command

Added:
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommand.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/pageload/
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommandTest.java
Removed:
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/PageElement.java
Modified:
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactory.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactoryImpl.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BlockImpl.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BodyPageElement.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/CommentPageElement.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/DTDPageElement.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ExpansionPageElement.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/StartElementPageElement.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/TextPageElement.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageElementFactoryImplTest.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/BlockImplTest.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/ExpansionPageElementImplTest.java
    tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java

Added: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommand.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommand.java?rev=728189&view=auto
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommand.java (added)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommand.java Fri Dec 19 16:05:15 2008
@@ -0,0 +1,86 @@
+// Copyright 2008 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.tapestry5.internal.pageload;
+
+import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.runtime.RenderCommand;
+import org.apache.tapestry5.runtime.RenderQueue;
+
+/**
+ * A RenderCommand wrapper that renders internally a series of render commands. This is intended for static content
+ * (commands that may write content, but won't affect the render queue itself.
+ */
+public class CompositeRenderCommand implements RenderCommand
+{
+    private static final RenderQueue NOOP = new RenderQueue()
+    {
+        public void push(RenderCommand command)
+        {
+            nyi("push");
+        }
+
+        public void startComponent(ComponentResources resources)
+        {
+            nyi("startComponent");
+        }
+
+        public void endComponent()
+        {
+            nyi("endComponent");
+        }
+
+        private void nyi(String methodName)
+        {
+            throw new IllegalStateException(
+                    String.format("RenderQueue method %s() is not implemented for composited render commands.",
+                                  methodName));
+        }
+    };
+
+    private final RenderCommand[] commands;
+
+    public CompositeRenderCommand(RenderCommand[] commands)
+    {
+        this.commands = commands;
+    }
+
+    public void render(MarkupWriter writer, RenderQueue queue)
+    {
+        for (RenderCommand c : commands)
+        {
+            c.render(writer, NOOP);
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        StringBuilder builder = new StringBuilder("CompositeRenderCommand[");
+
+        boolean comma = false;
+
+        for (RenderCommand c : commands)
+        {
+            if (comma) builder.append(", ");
+
+            builder.append(c);
+
+            comma = true;
+        }
+
+        return builder.append("]").toString();
+    }
+}

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactory.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactory.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactory.java Fri Dec 19 16:05:15 2008
@@ -21,8 +21,8 @@
 import org.apache.tapestry5.internal.parser.ExpansionToken;
 import org.apache.tapestry5.internal.structure.ComponentPageElement;
 import org.apache.tapestry5.internal.structure.Page;
-import org.apache.tapestry5.internal.structure.PageElement;
 import org.apache.tapestry5.ioc.Location;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.services.BindingSource;
 
 import java.util.Locale;
@@ -32,9 +32,9 @@
  */
 public interface PageElementFactory
 {
-    PageElement newAttributeElement(ComponentResources componentResources, AttributeToken token);
+    RenderCommand newAttributeElement(ComponentResources componentResources, AttributeToken token);
 
-    PageElement newExpansionElement(ComponentResources componentResources, ExpansionToken token);
+    RenderCommand newExpansionElement(ComponentResources componentResources, ExpansionToken token);
 
     /**
      * Creates a new binding as with {@link BindingSource#newBinding(String, ComponentResources, ComponentResources,

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactoryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactoryImpl.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactoryImpl.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageElementFactoryImpl.java Fri Dec 19 16:05:15 2008
@@ -27,6 +27,7 @@
 import org.apache.tapestry5.ioc.internal.util.TapestryException;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
 import org.apache.tapestry5.model.ComponentModel;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.BindingSource;
 import org.apache.tapestry5.services.ComponentClassResolver;
@@ -74,7 +75,7 @@
         this.pageResourcesSource = pageResourcesSource;
     }
 
-    public PageElement newAttributeElement(ComponentResources componentResources, final AttributeToken token)
+    public RenderCommand newAttributeElement(ComponentResources componentResources, final AttributeToken token)
     {
         final StringProvider provider = parseAttributeExpansionExpression(token.getValue(), componentResources,
                                                                           token.getLocation());
@@ -82,14 +83,13 @@
         final String namespace = token.getNamespaceURI();
         final String name = token.getName();
 
-        return new PageElement()
+        return new RenderCommand()
         {
             public void render(MarkupWriter writer, RenderQueue queue)
             {
                 writer.attributeNS(namespace, name, provider.provideString());
             }
 
-            @Override
             public String toString()
             {
                 return String.format("AttributeNS[%s %s \"%s\"]", namespace, name, token.getValue());
@@ -176,7 +176,7 @@
         };
     }
 
-    public PageElement newExpansionElement(ComponentResources componentResources, ExpansionToken token)
+    public RenderCommand newExpansionElement(ComponentResources componentResources, ExpansionToken token)
     {
         Binding binding = bindingSource.newBinding("expansion", componentResources, componentResources,
                                                    BindingConstants.PROP, token.getExpression(), token.getLocation());

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageLoaderProcessor.java Fri Dec 19 16:05:15 2008
@@ -19,6 +19,7 @@
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.MarkupWriter;
 import org.apache.tapestry5.internal.bindings.LiteralBinding;
+import org.apache.tapestry5.internal.pageload.CompositeRenderCommand;
 import org.apache.tapestry5.internal.parser.*;
 import org.apache.tapestry5.internal.structure.*;
 import org.apache.tapestry5.ioc.Location;
@@ -26,6 +27,7 @@
 import org.apache.tapestry5.ioc.util.Stack;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.model.EmbeddedComponentModel;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.BindingSource;
 import org.apache.tapestry5.services.ComponentClassResolver;
@@ -78,6 +80,8 @@
      */
     private final List<Runnable> finalization = CollectionFactory.newList();
 
+    private final List<RenderCommand> compositedRenderCommands = CollectionFactory.newList();
+
     private final IdAllocator idAllocator = new IdAllocator();
 
     private final LinkFactory linkFactory;
@@ -102,7 +106,7 @@
 
     private final ComponentTemplateSource templateSource;
 
-    private static final PageElement END_ELEMENT = new PageElement()
+    private static final RenderCommand END_ELEMENT = new RenderCommand()
     {
         public void render(MarkupWriter writer, RenderQueue queue)
         {
@@ -116,7 +120,7 @@
         }
     };
 
-    private static class RenderBodyElement implements PageElement
+    private static class RenderBodyElement implements RenderCommand
     {
         private final ComponentPageElement component;
 
@@ -279,7 +283,7 @@
     }
 
 
-    private void addToBody(PageElement element)
+    private void addToBody(RenderCommand element)
     {
         bodyPageElementStack.peek().addToBody(element);
     }
@@ -297,14 +301,16 @@
             return;
         }
 
-        PageElement element = pageElementFactory.newAttributeElement(loadingElement
+        RenderCommand element = pageElementFactory.newAttributeElement(loadingElement
                 .getComponentResources(), token);
 
-        addToBody(element);
+        addComposableCommand(element);
     }
 
     private void body()
     {
+        flushComposedCommands();
+
         addToBody(new RenderBodyElement(loadingElement));
 
         // BODY tokens are *not* matched by END_ELEMENT tokens. Nor will there be
@@ -313,9 +319,9 @@
 
     private void comment(CommentToken token)
     {
-        PageElement commentElement = new CommentPageElement(token.getComment());
+        RenderCommand commentElement = new CommentPageElement(token.getComment());
 
-        addToBody(commentElement);
+        addComposableCommand(commentElement);
     }
 
     /**
@@ -338,7 +344,7 @@
 
         boolean discard = discardEndTagStack.pop();
 
-        if (!discard) addToBody(END_ELEMENT);
+        if (!discard) addComposableCommand(END_ELEMENT);
 
         Runnable command = endElementCommandStack.pop();
 
@@ -349,10 +355,10 @@
 
     private void expansion(ExpansionToken token)
     {
-        PageElement element = pageElementFactory.newExpansionElement(loadingElement
+        RenderCommand element = pageElementFactory.newExpansionElement(loadingElement
                 .getComponentResources(), token);
 
-        addToBody(element);
+        addComposableCommand(element);
     }
 
     private String generateEmbeddedId(String embeddedType, IdAllocator idAllocator)
@@ -467,7 +473,7 @@
 
         BodyPageElement shunt = new BodyPageElement()
         {
-            public void addToBody(PageElement element)
+            public void addToBody(RenderCommand element)
             {
                 loadingElement.addToTemplate(element);
             }
@@ -536,6 +542,9 @@
             }
         }
 
+
+        flushComposedCommands();
+
         // For neatness / symmetry:
 
         bodyPageElementStack.pop(); // the shunt
@@ -563,7 +572,7 @@
 
     private void cdata(final CDATAToken token)
     {
-        PageElement element = new PageElement()
+        RenderCommand element = new RenderCommand()
         {
             public void render(MarkupWriter writer, RenderQueue queue)
             {
@@ -577,12 +586,12 @@
             }
         };
 
-        addToBody(element);
+        addComposableCommand(element);
     }
 
     private void defineNamespacePrefix(final DefineNamespacePrefixToken token)
     {
-        PageElement element = new PageElement()
+        RenderCommand element = new RenderCommand()
         {
             public void render(MarkupWriter writer, RenderQueue queue)
             {
@@ -596,11 +605,13 @@
             }
         };
 
-        addToBody(element);
+        addComposableCommand(element);
     }
 
     private void parameter(ParameterToken token)
     {
+        flushComposedCommands();
+
         ComponentPageElement element = activeElementStack.peek();
         String name = token.getName();
 
@@ -624,6 +635,8 @@
         {
             public void run()
             {
+                flushComposedCommands();
+
                 bodyPageElementStack.pop();
             }
         };
@@ -633,6 +646,7 @@
 
     private void block(BlockToken token)
     {
+        flushComposedCommands();
 
         String id = token.getId();
         // Don't use the page element factory here becauses we need something that is both Block and
@@ -704,6 +718,8 @@
         if (embeddedModel != null)
             bindParametersFromModel(embeddedModel, loadingElement, newComponent, newComponentBindings);
 
+        flushComposedCommands();
+
         addToBody(newComponent);
 
         // Remember to load the template for this new component
@@ -753,8 +769,7 @@
         {
             public void run()
             {
-                // May need a separate queue for this, to execute at the very end of page loading.
-
+                flushComposedCommands();
 
                 activeElementStack.pop();
                 bodyPageElementStack.pop();
@@ -796,9 +811,9 @@
 
     private void startElement(StartElementToken token)
     {
-        PageElement element = new StartElementPageElement(token.getNamespaceURI(), token.getName());
+        RenderCommand element = new StartElementPageElement(token.getNamespaceURI(), token.getName());
 
-        addToBody(element);
+        addComposableCommand(element);
 
         // Controls how attributes are interpretted.
         addAttributesAsComponentBindings = false;
@@ -812,9 +827,9 @@
 
     private void text(TextToken token)
     {
-        PageElement element = new TextPageElement(token.getText());
+        RenderCommand element = new TextPageElement(token.getText());
 
-        addToBody(element);
+        addComposableCommand(element);
     }
 
     private void dtd(DTDToken token)
@@ -822,7 +837,7 @@
         // first DTD encountered wins.
         if (dtdAdded) return;
 
-        PageElement element = new DTDPageElement(token.getName(), token.getPublicId(), token.getSystemId());
+        RenderCommand element = new DTDPageElement(token.getName(), token.getPublicId(), token.getSystemId());
         // since rendering via the markup writer is to the document tree,
         // we don't really care where this gets placed in the tree; the
         // DTDPageElement will set the dtd of the document directly, rather than
@@ -844,4 +859,37 @@
             loadTemplateForComponent(componentElement);
         }
     }
+
+    private void addComposableCommand(RenderCommand command)
+    {
+        compositedRenderCommands.add(command);
+    }
+
+    private void flushComposedCommands()
+    {
+        int count = compositedRenderCommands.size();
+
+        switch (count)
+        {
+            case 0:
+
+                return;
+
+            case 1:
+
+                addToBody(compositedRenderCommands.get(0));
+
+                break;
+
+            default:
+
+                RenderCommand[] commands = compositedRenderCommands.toArray(new RenderCommand[count]);
+
+                addToBody(new CompositeRenderCommand(commands));
+
+                break;
+        }
+
+        compositedRenderCommands.clear();
+    }
 }

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BlockImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BlockImpl.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BlockImpl.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BlockImpl.java Fri Dec 19 16:05:15 2008
@@ -29,7 +29,7 @@
     // We could lazily create this, but for <t:block> and <t:parameter>, the case
     // for an empty block is extremely rare.
 
-    private final List<PageElement> elements = CollectionFactory.newList();
+    private final List<RenderCommand> elements = CollectionFactory.newList();
 
     private final String description;
 
@@ -40,7 +40,7 @@
         this.description = description;
     }
 
-    public void addToBody(PageElement element)
+    public void addToBody(RenderCommand element)
     {
         elements.add(element);
     }

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BodyPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BodyPageElement.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BodyPageElement.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/BodyPageElement.java Fri Dec 19 16:05:15 2008
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2008 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.
@@ -14,11 +14,11 @@
 
 package org.apache.tapestry5.internal.structure;
 
-import org.apache.tapestry5.internal.services.PageLoader;
+import org.apache.tapestry5.runtime.RenderCommand;
 
 /**
- * A type of {@link PageElement} that has a body that can be added to. This is part of the constuction phase that is
- * faciliated by the {@link PageLoader}.
+ * A type of page element that has a body that can be added to. This is part of the constuction phase that is faciliated
+ * by the {@link org.apache.tapestry5.internal.services.PageLoader}.
  */
 public interface BodyPageElement
 {
@@ -27,5 +27,5 @@
      * component is defined as the portion of the container's template directly enclosed by component's start and end
      * elements.
      */
-    void addToBody(PageElement element);
+    void addToBody(RenderCommand element);
 }

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/CommentPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/CommentPageElement.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/CommentPageElement.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/CommentPageElement.java Fri Dec 19 16:05:15 2008
@@ -16,6 +16,7 @@
 
 import org.apache.tapestry5.MarkupWriter;
 import org.apache.tapestry5.internal.parser.CommentToken;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 
 /**
@@ -23,7 +24,7 @@
  *
  * @see CommentToken
  */
-public class CommentPageElement implements PageElement
+public class CommentPageElement implements RenderCommand
 {
     private final String text;
 

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElement.java Fri Dec 19 16:05:15 2008
@@ -22,17 +22,14 @@
 import org.apache.tapestry5.internal.services.Instantiator;
 import org.apache.tapestry5.ioc.Location;
 import org.apache.tapestry5.model.ParameterModel;
-import org.apache.tapestry5.runtime.Component;
-import org.apache.tapestry5.runtime.ComponentEvent;
-import org.apache.tapestry5.runtime.PageLifecycleListener;
-import org.apache.tapestry5.runtime.RenderQueue;
+import org.apache.tapestry5.runtime.*;
 import org.slf4j.Logger;
 
 /**
- * Extended version of {@link org.apache.tapestry5.internal.structure.PageElement} for elements that are, in fact,
- * components (rather than just static markup).
+ * Defines an element of a page that is a component elements that are, in fact, components (rather than just static
+ * markup).
  */
-public interface ComponentPageElement extends ComponentResourcesCommon, InternalComponentResourcesCommon, PageElement, BodyPageElement, PageLifecycleListener
+public interface ComponentPageElement extends ComponentResourcesCommon, InternalComponentResourcesCommon, RenderCommand, BodyPageElement, PageLifecycleListener
 {
     /**
      * Returns the core component associated with this page element (as opposed to any mixins attached to the
@@ -61,7 +58,7 @@
      * the outermost portions of the component's template ... where a template contains elements that are all
      * components, those components will receive portions of the template as their body.
      */
-    void addToTemplate(PageElement element);
+    void addToTemplate(RenderCommand element);
 
     /**
      * Used during the contruction of a page to add a non-anonymous Block to the component.

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ComponentPageElementImpl.java Fri Dec 19 16:05:15 2008
@@ -39,9 +39,8 @@
 import java.util.*;
 
 /**
- * Implements {@link org.apache.tapestry5.internal.structure.PageElement} and represents a component within an overall
- * page. Much of a component page element's behavior is delegated to user code, via a {@link
- * org.apache.tapestry5.runtime.Component} instance.
+ * Implements {@link RenderCommand} and represents a component within an overall page. Much of a component page
+ * element's behavior is delegated to user code, via a {@link org.apache.tapestry5.runtime.Component} instance.
  * <p/>
  * Once instantiated, a ComponentPageElement should be registered as a {@linkplain
  * org.apache.tapestry5.internal.structure.Page#addLifecycleListener(org.apache.tapestry5.runtime.PageLifecycleListener)
@@ -105,7 +104,7 @@
     // For the moment, every component will have a template, even if it consists of
     // just a page element to queue up a BeforeRenderBody phase.
 
-    private static void pushElements(RenderQueue queue, List<PageElement> list)
+    private static void pushElements(RenderQueue queue, List<RenderCommand> list)
     {
         int count = size(list);
         for (int i = count - 1; i >= 0; i--)
@@ -487,7 +486,7 @@
     // We know that, at the very least, there will be an element to force the component to render
     // its body, so there's no reason to wait to initialize the list.
 
-    private final List<PageElement> template = CollectionFactory.newList();
+    private final List<RenderCommand> template = CollectionFactory.newList();
 
     private boolean renderPhasesInitalized;
 
@@ -745,14 +744,14 @@
         if (informalParameterResources != null) informalParameterResources.bindParameter(parameterName, binding);
     }
 
-    public void addToBody(PageElement element)
+    public void addToBody(RenderCommand element)
     {
         if (bodyBlock == null) bodyBlock = new BlockImpl(getLocation(), "Body of " + getCompleteId());
 
         bodyBlock.addToBody(element);
     }
 
-    public void addToTemplate(PageElement element)
+    public void addToTemplate(RenderCommand element)
     {
         template.add(element);
     }

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/DTDPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/DTDPageElement.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/DTDPageElement.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/DTDPageElement.java Fri Dec 19 16:05:15 2008
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2008 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.
@@ -20,9 +20,10 @@
 package org.apache.tapestry5.internal.structure;
 
 import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 
-public class DTDPageElement implements PageElement
+public class DTDPageElement implements RenderCommand
 {
     private final String name;
 
@@ -47,5 +48,4 @@
     {
         return String.format("DTD[name=%s; publicId=%s; systemId=%s]", name, publicId, systemId);
     }
-
 }

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ExpansionPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ExpansionPageElement.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ExpansionPageElement.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/ExpansionPageElement.java Fri Dec 19 16:05:15 2008
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2008 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.
@@ -17,12 +17,13 @@
 import org.apache.tapestry5.Binding;
 import org.apache.tapestry5.MarkupWriter;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 
 /**
  *
  */
-public class ExpansionPageElement implements PageElement
+public class ExpansionPageElement implements RenderCommand
 {
     private final Binding binding;
 

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/StartElementPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/StartElementPageElement.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/StartElementPageElement.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/StartElementPageElement.java Fri Dec 19 16:05:15 2008
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2008 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.
@@ -15,12 +15,13 @@
 package org.apache.tapestry5.internal.structure;
 
 import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 
 /**
  *
  */
-public class StartElementPageElement implements PageElement
+public class StartElementPageElement implements RenderCommand
 {
     private final String namespaceURI;
 

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/TextPageElement.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/TextPageElement.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/TextPageElement.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/TextPageElement.java Fri Dec 19 16:05:15 2008
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2008 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.
@@ -15,12 +15,13 @@
 package org.apache.tapestry5.internal.structure;
 
 import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 
 /**
  *
  */
-public class TextPageElement implements PageElement
+public class TextPageElement implements RenderCommand
 {
     private final String text;
 
@@ -39,5 +40,4 @@
     {
         return String.format("Text[%s]", text);
     }
-
 }

Added: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommandTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommandTest.java?rev=728189&view=auto
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommandTest.java (added)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/pageload/CompositeRenderCommandTest.java Fri Dec 19 16:05:15 2008
@@ -0,0 +1,86 @@
+// Copyright 2008 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.tapestry5.internal.pageload;
+
+import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.internal.test.InternalBaseTestCase;
+import org.apache.tapestry5.runtime.RenderCommand;
+import org.apache.tapestry5.runtime.RenderQueue;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class CompositeRenderCommandTest extends InternalBaseTestCase
+{
+    @DataProvider(name = "nyi")
+    public Object[][] nyi_data()
+    {
+        RenderCommand push = new RenderCommand()
+        {
+            public void render(MarkupWriter writer, RenderQueue queue)
+            {
+                queue.push(null);
+            }
+        };
+
+        RenderCommand startComponent = new RenderCommand()
+        {
+            public void render(MarkupWriter writer, RenderQueue queue)
+            {
+                queue.startComponent(null);
+            }
+        };
+
+        RenderCommand endComponent = new RenderCommand()
+        {
+            public void render(MarkupWriter writer, RenderQueue queue)
+            {
+                queue.endComponent();
+            }
+        };
+
+
+        return new Object[][] {
+                {
+                        push
+                },
+                {
+                        startComponent
+                },
+                {
+                        endComponent
+                }
+        };
+    }
+
+    @Test(dataProvider = "nyi")
+    public void render_queue_commands_nyi
+            (RenderCommand
+                    rc)
+    {
+        MarkupWriter writer = mockMarkupWriter();
+        RenderQueue queue = mockRenderQueue();
+
+        try
+        {
+            new CompositeRenderCommand(new RenderCommand[] {rc}).render(writer, queue);
+
+            unreachable();
+        }
+        catch (IllegalStateException ex)
+        {
+            // Don't care about the message.
+        }
+    }
+}

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageElementFactoryImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageElementFactoryImplTest.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageElementFactoryImplTest.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageElementFactoryImplTest.java Fri Dec 19 16:05:15 2008
@@ -19,11 +19,11 @@
 import org.apache.tapestry5.dom.MarkupModel;
 import org.apache.tapestry5.dom.XMLMarkupModel;
 import org.apache.tapestry5.internal.parser.AttributeToken;
-import org.apache.tapestry5.internal.structure.PageElement;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.ioc.Location;
 import org.apache.tapestry5.ioc.internal.util.TapestryException;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.BindingSource;
 import org.apache.tapestry5.services.ComponentClassResolver;
@@ -47,7 +47,7 @@
         PageElementFactory factory = new PageElementFactoryImpl(source, resolver, null, null, null);
         AttributeToken token = new AttributeToken(null, "name", "value", l);
 
-        PageElement element = factory.newAttributeElement(null, token);
+        RenderCommand element = factory.newAttributeElement(null, token);
 
         writer.element("root");
 

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/BlockImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/BlockImplTest.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/BlockImplTest.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/BlockImplTest.java Fri Dec 19 16:05:15 2008
@@ -20,6 +20,7 @@
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
 import org.apache.tapestry5.ioc.internal.util.LocationImpl;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 import org.testng.annotations.Test;
 
@@ -45,8 +46,8 @@
         BlockImpl block = new BlockImpl(null, null);
         RenderQueue queue = mockRenderQueue();
         MarkupWriter writer = mockMarkupWriter();
-        PageElement element1 = mockPageElement();
-        PageElement element2 = mockPageElement();
+        RenderCommand element1 = mockRenderCommand();
+        RenderCommand element2 = mockRenderCommand();
 
         getMocksControl().checkOrder(true);
 

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/ExpansionPageElementImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/ExpansionPageElementImplTest.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/ExpansionPageElementImplTest.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/structure/ExpansionPageElementImplTest.java Fri Dec 19 16:05:15 2008
@@ -1,25 +1,26 @@
-// 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, 2008 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.tapestry5.internal.structure;
 
-import org.apache.tapestry5.Binding;
-import org.apache.tapestry5.MarkupWriter;
-import org.apache.tapestry5.internal.test.InternalBaseTestCase;
-import org.apache.tapestry5.ioc.services.TypeCoercer;
-import org.apache.tapestry5.runtime.RenderQueue;
-import org.testng.annotations.Test;
+import org.apache.tapestry5.Binding;
+import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.internal.test.InternalBaseTestCase;
+import org.apache.tapestry5.ioc.services.TypeCoercer;
+import org.apache.tapestry5.runtime.RenderCommand;
+import org.apache.tapestry5.runtime.RenderQueue;
+import org.testng.annotations.Test;
 
 public class ExpansionPageElementImplTest extends InternalBaseTestCase
 {
@@ -37,7 +38,7 @@
 
         replay();
 
-        PageElement element = new ExpansionPageElement(binding, coercer);
+        RenderCommand element = new ExpansionPageElement(binding, coercer);
 
         verify();
 
@@ -76,7 +77,7 @@
 
         replay();
 
-        PageElement element = new ExpansionPageElement(binding, coercer);
+        RenderCommand element = new ExpansionPageElement(binding, coercer);
 
         verify();
 

Modified: tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java?rev=728189&r1=728188&r2=728189&view=diff
==============================================================================
--- tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java (original)
+++ tapestry/tapestry5/branches/hlship-5.0-perf/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java Fri Dec 19 16:05:15 2008
@@ -22,7 +22,6 @@
 import org.apache.tapestry5.internal.services.*;
 import org.apache.tapestry5.internal.structure.ComponentPageElement;
 import org.apache.tapestry5.internal.structure.Page;
-import org.apache.tapestry5.internal.structure.PageElement;
 import org.apache.tapestry5.internal.structure.PageResources;
 import org.apache.tapestry5.ioc.*;
 import org.apache.tapestry5.ioc.def.ContributionDef;
@@ -37,6 +36,7 @@
 import org.apache.tapestry5.model.EmbeddedComponentModel;
 import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.runtime.Component;
+import org.apache.tapestry5.runtime.RenderCommand;
 import org.apache.tapestry5.runtime.RenderQueue;
 import org.apache.tapestry5.services.ComponentClassResolver;
 import org.apache.tapestry5.services.Request;
@@ -239,9 +239,9 @@
         expect(model.getComponentClassName()).andReturn(className).atLeastOnce();
     }
 
-    protected final PageElement mockPageElement()
+    protected final RenderCommand mockRenderCommand()
     {
-        return newMock(PageElement.class);
+        return newMock(RenderCommand.class);
     }
 
     protected final void train_getParameterNames(EmbeddedComponentModel model, String... names)