Author: hlship
Date: Tue Feb 17 19:12:54 2009
New Revision: 745195

URL: http://svn.apache.org/viewvc?rev=745195&view=rev
Log:
TAP5-95: Optimize page construction for repeated construction of the same page

Added:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/AssemblerContext.java
Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageAssembly.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSource.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSourceImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BadMixinIdDemo.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DupeMixinDemo.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/UnsupportedParameterBlockDemo.java

Added: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/AssemblerContext.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/AssemblerContext.java?rev=745195&view=auto
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/AssemblerContext.java
 (added)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/AssemblerContext.java
 Tue Feb 17 19:12:54 2009
@@ -0,0 +1,106 @@
+// Copyright 2009 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// 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.internal.parser.TemplateToken;
+import org.apache.tapestry5.internal.parser.TokenType;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.runtime.RenderCommand;
+
+import java.util.List;
+
+/**
+ * Used when constructing a {...@link 
org.apache.tapestry5.internal.pageload.AssemblerContext}, encapsulating the
+ * assembler, the {...@link 
org.apache.tapestry5.internal.pageload.TokenStream} for the component's 
template, and helping
+ * to consolidate composable render commands (that is, a series of render 
commands that are not components can be
+ * replaced with a single {...@link 
org.apache.tapestry5.internal.pageload.CompositeRenderCommand} which reduces 
the number
+ * of render operations for the page).
+ */
+class AssemblerContext implements TokenStream
+{
+    final ComponentAssembler assembler;
+
+    final TokenStream stream;
+
+    private final List<RenderCommand> composable = CollectionFactory.newList();
+
+    AssemblerContext(ComponentAssembler assembler, TokenStream stream)
+    {
+        this.assembler = assembler;
+        this.stream = stream;
+    }
+
+    public boolean more()
+    {
+        return stream.more();
+    }
+
+    public TemplateToken next()
+    {
+        return stream.next();
+    }
+
+    public <T extends TemplateToken> T next(Class<T> type)
+    {
+        return stream.next(type);
+    }
+
+    public TokenType peekType()
+    {
+        return stream.peekType();
+    }
+
+    void addComposable(RenderCommand command)
+    {
+        composable.add(command);
+    }
+
+    void flushComposable()
+    {
+        switch (composable.size())
+        {
+            case 0:
+                return;
+
+            case 1:
+                addRenderCommand(composable.get(0));
+                break;
+
+            default:
+                addRenderCommand(new 
CompositeRenderCommand(composable.toArray(new 
RenderCommand[composable.size()])));
+                break;
+        }
+
+        composable.clear();
+    }
+
+    void add(PageAssemblyAction action)
+    {
+        flushComposable();
+
+        assembler.add(action);
+    }
+
+    private void addRenderCommand(final RenderCommand command)
+    {
+        assembler.add(new PageAssemblyAction()
+        {
+            public void execute(PageAssembly pageAssembly)
+            {
+                pageAssembly.addRenderCommand(command);
+            }
+        });
+    }
+}

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageAssembly.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageAssembly.java?rev=745195&r1=745194&r2=745195&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageAssembly.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageAssembly.java
 Tue Feb 17 19:12:54 2009
@@ -46,8 +46,6 @@
 
     final List<PageAssemblyAction> deferred = CollectionFactory.newList();
 
-    private final List<RenderCommand> composableRenderCommands = 
CollectionFactory.newList();
-
     private final Set<String> flags = CollectionFactory.newSet();
 
     PageAssembly(Page page)
@@ -63,49 +61,9 @@
      */
     void addRenderCommand(RenderCommand command)
     {
-        flushComposableRenderCommands();
-
         bodyElement.peek().addToBody(command);
     }
 
-    /**
-     * Adds the command to the list of composable commands. Composable 
commands are added to the top element of the body
-     * element stack when {...@linkplain #flushComposableRenderCommands() 
flushed}.
-     *
-     * @param command
-     */
-    void addComposableRenderCommand(RenderCommand command)
-    {
-        composableRenderCommands.add(command);
-    }
-
-    /**
-     * Adds any composed render commands to the top element of the bodyElement 
stack. Render commands may be combined as
-     * a {...@link 
org.apache.tapestry5.internal.pageload.CompositeRenderCommand}.
-     */
-    void flushComposableRenderCommands()
-    {
-        int count = composableRenderCommands.size();
-
-        switch (count)
-        {
-            case 0:
-                break;
-
-            case 1:
-                bodyElement.peek().addToBody(composableRenderCommands.get(0));
-                break;
-
-            default:
-                RenderCommand[] commands = 
composableRenderCommands.toArray(new RenderCommand[count]);
-
-                bodyElement.peek().addToBody(new 
CompositeRenderCommand(commands));
-                break;
-        }
-
-        composableRenderCommands.clear();
-    }
-
     boolean checkAndSetFlag(String flagName)
     {
         boolean result = flags.contains(flagName);

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java?rev=745195&r1=745194&r2=745195&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
 Tue Feb 17 19:12:54 2009
@@ -89,8 +89,6 @@
     {
         public void execute(PageAssembly pageAssembly)
         {
-            pageAssembly.flushComposableRenderCommands();
-
             pageAssembly.createdElement.pop();
             pageAssembly.bodyElement.pop();
             pageAssembly.embeddedAssembler.pop();
@@ -111,22 +109,6 @@
         }
     };
 
-    private static final PageAssemblyAction END_ELEMENT_ACTION = new 
PageAssemblyAction()
-    {
-        public void execute(PageAssembly pageAssembly)
-        {
-            pageAssembly.addRenderCommand(END_ELEMENT);
-        }
-    };
-
-    private static final PageAssemblyAction 
FLUSH_COMPOSABLE_RENDER_COMMANDS_ACTION = new PageAssemblyAction()
-    {
-        public void execute(PageAssembly pageAssembly)
-        {
-            pageAssembly.flushComposableRenderCommands();
-        }
-    };
-
     private final Map<Key, ComponentAssembler> cache = 
CollectionFactory.newConcurrentMap();
 
     private final ComponentInstantiatorSource instantiatorSource;
@@ -234,94 +216,99 @@
 
     private void processTemplate(ComponentAssembler assembler, 
ComponentTemplate template)
     {
+        TokenStream stream = new TokenStreamImpl(template);
+
+        AssemblerContext context = new AssemblerContext(assembler, stream);
+
         if (template.isMissing())
         {
             // Pretend the template has a single <t:body> element.
 
-            body(assembler);
+            body(context);
 
             return;
         }
 
-        TokenStream stream = new TokenStreamImpl(template);
 
-        while (stream.more())
+        while (context.more())
         {
-            processTemplateToken(assembler, stream);
+            processTemplateToken(context);
         }
 
-        addFlushAction(assembler);
+        context.flushComposable();
     }
 
-    private void processTemplateToken(ComponentAssembler assembler, 
TokenStream stream)
+    private void processTemplateToken(AssemblerContext context)
     {
         // These tokens can appear at the top level, or at lower levels (this 
method is invoked
         // from token-processing loops inside element(), component(), etc.
 
-        switch (stream.peekType())
+        switch (context.peekType())
         {
             case TEXT:
 
-                text(assembler, stream.next(TextToken.class));
+                text(context);
                 break;
 
             case EXPANSION:
-                expansion(assembler, stream.next(ExpansionToken.class));
+                expansion(context);
                 break;
 
             case BODY:
-                stream.next();
+                context.next();
 
-                body(assembler);
+                body(context);
                 break;
 
             case START_ELEMENT:
                 // Will consume past matching end token
-                element(assembler, stream);
+                element(context);
                 break;
 
             case START_COMPONENT:
                 // Will consume past matching end token
-                component(assembler, stream);
+                component(context);
                 break;
 
             // ATTRIBUTE and END_ELEMENT can't happen at the top level, they're
             // handled at a lower level. (inside element(), component(), etc.)
 
             case COMMENT:
-                comment(assembler, stream.next(CommentToken.class));
+                comment(context);
                 break;
 
             case BLOCK:
                 // Will consume past matching end token
-                block(assembler, stream);
+                block(context);
                 break;
 
             case PARAMETER:
                 // Will consume past the matching end token
-                parameter(assembler, stream);
+                parameter(context);
                 break;
 
             case DTD:
-                dtd(assembler, stream.next(DTDToken.class));
+                dtd(context);
                 break;
 
             case DEFINE_NAMESPACE_PREFIX:
 
-                defineNamespacePrefix(assembler, 
stream.next(DefineNamespacePrefixToken.class));
+                defineNamespacePrefix(context);
                 break;
 
             case CDATA:
-                cdata(assembler, stream.next(CDATAToken.class));
+                cdata(context);
                 break;
 
             default:
-                throw new IllegalStateException("Not yet implemented: " + 
stream.peekType());
+                throw new IllegalStateException("Not yet implemented: " + 
context.peekType());
         }
     }
 
-    private void cdata(ComponentAssembler assembler, final CDATAToken token)
+    private void cdata(AssemblerContext context)
     {
+        final CDATAToken token = context.next(CDATAToken.class);
+
         RenderCommand command = new RenderCommand()
         {
             public void render(MarkupWriter writer, RenderQueue queue)
@@ -336,12 +323,14 @@
             }
         };
 
-        addComposableCommand(assembler, command);
+        context.addComposable(command);
 
     }
 
-    private void defineNamespacePrefix(ComponentAssembler assembler, final 
DefineNamespacePrefixToken token)
+    private void defineNamespacePrefix(AssemblerContext context)
     {
+        final DefineNamespacePrefixToken token = 
context.next(DefineNamespacePrefixToken.class);
+
         RenderCommand command = new RenderCommand()
         {
             public void render(MarkupWriter writer, RenderQueue queue)
@@ -357,12 +346,14 @@
         };
 
 
-        addComposableCommand(assembler, command);
+        context.addComposable(command);
     }
 
-    private void dtd(ComponentAssembler assembler, final DTDToken token)
+    private void dtd(AssemblerContext context)
     {
-        assembler.add(new PageAssemblyAction()
+        final DTDToken token = context.next(DTDToken.class);
+
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
@@ -374,24 +365,22 @@
                     // It doesn't really matter where this ends up in the tree 
as long as its inside
                     // a portion that always renders.
 
-                    pageAssembly.addComposableRenderCommand(command);
+                    pageAssembly.addRenderCommand(command);
                 }
             }
         });
     }
 
-    private void parameter(ComponentAssembler assembler, TokenStream stream)
+    private void parameter(AssemblerContext context)
     {
-        final ParameterToken token = stream.next(ParameterToken.class);
+        final ParameterToken token = context.next(ParameterToken.class);
 
-        assembler.add(new PageAssemblyAction()
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
                 String parameterName = token.getName();
 
-                pageAssembly.flushComposableRenderCommands();
-
                 ComponentPageElement element = 
pageAssembly.createdElement.peek();
 
                 BlockImpl block = new BlockImpl(token.getLocation(),
@@ -421,14 +410,14 @@
             }
         });
 
-        consumeToEndElementAndPopBodyElement(assembler, stream);
+        consumeToEndElementAndPopBodyElement(context);
     }
 
-    private void block(ComponentAssembler assembler, TokenStream stream)
+    private void block(AssemblerContext context)
     {
-        final BlockToken token = stream.next(BlockToken.class);
+        final BlockToken token = context.next(BlockToken.class);
 
-        assembler.add(new PageAssemblyAction()
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
@@ -446,29 +435,27 @@
                     element.addBlock(blockId, block);
 
                 // Start directing template content into the Block
-                pageAssembly.flushComposableRenderCommands();
                 pageAssembly.bodyElement.push(block);
             }
         });
 
-        consumeToEndElementAndPopBodyElement(assembler, stream);
+        consumeToEndElementAndPopBodyElement(context);
     }
 
-    private void consumeToEndElementAndPopBodyElement(ComponentAssembler 
assembler, TokenStream stream)
+    private void consumeToEndElementAndPopBodyElement(AssemblerContext context)
     {
         while (true)
         {
-            switch (stream.peekType())
+            switch (context.peekType())
             {
                 case END_ELEMENT:
 
-                    stream.next();
+                    context.next();
 
-                    assembler.add(new PageAssemblyAction()
+                    context.add(new PageAssemblyAction()
                     {
                         public void execute(PageAssembly pageAssembly)
                         {
-                            pageAssembly.flushComposableRenderCommands();
                             pageAssembly.bodyElement.pop();
                         }
                     });
@@ -476,90 +463,93 @@
                     return;
 
                 default:
-                    processTemplateToken(assembler, stream);
+                    processTemplateToken(context);
             }
         }
     }
 
-    private void comment(ComponentAssembler assembler, CommentToken token)
+    private void comment(AssemblerContext context)
     {
+        CommentToken token = context.next(CommentToken.class);
+
         RenderCommand commentElement = new 
CommentPageElement(token.getComment());
 
-        addComposableCommand(assembler, commentElement);
+        context.addComposable(commentElement);
     }
 
-    private void component(ComponentAssembler assembler, TokenStream stream)
+    private void component(AssemblerContext context)
     {
-        StartComponentToken token = stream.next(StartComponentToken.class);
-
-        EmbeddedComponentAssembler embeddedAssembler = 
startComponent(assembler, token);
+        EmbeddedComponentAssembler embeddedAssembler = startComponent(context);
 
         while (true)
         {
-            switch (stream.peekType())
+            switch (context.peekType())
             {
                 case ATTRIBUTE:
 
-                    bindAttributeAsParameter(assembler, embeddedAssembler, 
stream.next(AttributeToken.class));
+                    bindAttributeAsParameter(context, embeddedAssembler);
 
                     break;
 
                 case END_ELEMENT:
 
-                    stream.next();
+                    context.next();
 
-                    assembler.add(POP_EMBEDDED_COMPONENT_ACTION);
+                    context.add(POP_EMBEDDED_COMPONENT_ACTION);
 
                     return;
 
                 default:
-                    processTemplateToken(assembler, stream);
+                    processTemplateToken(context);
             }
         }
-
     }
 
-    private void bindAttributeAsParameter(ComponentAssembler assembler, 
EmbeddedComponentAssembler embeddedAssembler,
-                                          AttributeToken token)
+    private void bindAttributeAsParameter(AssemblerContext context, 
EmbeddedComponentAssembler embeddedAssembler)
     {
-        addParameterBindingAction(assembler, embeddedAssembler, 
token.getName(), token.getValue(),
+        AttributeToken token = context.next(AttributeToken.class);
+
+        addParameterBindingAction(context, embeddedAssembler, token.getName(), 
token.getValue(),
                                   BindingConstants.LITERAL, 
token.getLocation());
     }
 
-    private void element(ComponentAssembler assembler, TokenStream stream)
+    private void element(AssemblerContext context)
     {
-        StartElementToken token = stream.next(StartElementToken.class);
+        StartElementToken token = context.next(StartElementToken.class);
 
         RenderCommand element = new 
StartElementPageElement(token.getNamespaceURI(), token.getName());
 
-        addComposableCommand(assembler, element);
+        context.addComposable(element);
 
         while (true)
         {
-            switch (stream.peekType())
+            switch (context.peekType())
             {
                 case ATTRIBUTE:
-                    attribute(assembler, stream.next(AttributeToken.class));
+                    attribute(context);
                     break;
 
                 case END_ELEMENT:
 
-                    assembler.add(END_ELEMENT_ACTION);
+                    context.next();
 
-                    stream.next();
+                    context.addComposable(END_ELEMENT);
 
                     // Pop out a level.
                     return;
 
                 default:
-                    processTemplateToken(assembler, stream);
+                    processTemplateToken(context);
             }
         }
 
     }
 
-    private EmbeddedComponentAssembler startComponent(ComponentAssembler 
assembler, StartComponentToken token)
+    private EmbeddedComponentAssembler startComponent(AssemblerContext context)
     {
+        StartComponentToken token = context.next(StartComponentToken.class);
+
+        ComponentAssembler assembler = context.assembler;
         String elementName = token.getElementName();
 
         // Initial guess: the type from the token (but this may be null in 
many cases).
@@ -631,9 +621,9 @@
                                                   token.getMixins(),
                                                   token.getLocation());
 
-        addActionForEmbeddedComponent(assembler, embeddedAssembler, 
embeddedId, elementName, componentClassName);
+        addActionForEmbeddedComponent(context, embeddedAssembler, embeddedId, 
elementName, componentClassName);
 
-        addParameterBindingActions(assembler, embeddedAssembler, 
embeddedModel);
+        addParameterBindingActions(context, embeddedAssembler, embeddedModel);
 
         if (embeddedModel != null && 
embeddedModel.getInheritInformalParameters())
         {
@@ -683,7 +673,7 @@
         }
     }
 
-    private void addParameterBindingActions(ComponentAssembler assembler,
+    private void addParameterBindingActions(AssemblerContext context,
                                             EmbeddedComponentAssembler 
embeddedAssembler,
                                             EmbeddedComponentModel 
embeddedModel)
     {
@@ -693,7 +683,7 @@
         {
             String parameterValue = 
embeddedModel.getParameterValue(parameterName);
 
-            addParameterBindingAction(assembler,
+            addParameterBindingAction(context,
                                       embeddedAssembler,
                                       parameterName,
                                       parameterValue,
@@ -702,7 +692,7 @@
         }
     }
 
-    private void addParameterBindingAction(ComponentAssembler assembler,
+    private void addParameterBindingAction(AssemblerContext context,
                                            final EmbeddedComponentAssembler 
embeddedAssembler,
                                            final String parameterName,
                                            final String parameterValue,
@@ -717,12 +707,12 @@
         {
             String containerParameterName = 
parameterValue.substring(InternalConstants.INHERIT_BINDING_PREFIX.length());
 
-            addInheritedBindingAction(assembler, parameterName, 
containerParameterName);
+            addInheritedBindingAction(context, parameterName, 
containerParameterName);
             return;
         }
 
 
-        assembler.add(new PageAssemblyAction()
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
@@ -764,11 +754,11 @@
      * @param parameterName
      * @param containerParameterName
      */
-    private void addInheritedBindingAction(ComponentAssembler assembler,
+    private void addInheritedBindingAction(AssemblerContext context,
                                            final String parameterName,
                                            final String containerParameterName)
     {
-        assembler.add(new PageAssemblyAction()
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
@@ -790,7 +780,8 @@
         });
     }
 
-    private void connectInheritedParameter(ComponentPageElement container, 
ComponentPageElement embedded,
+    private void connectInheritedParameter(ComponentPageElement container,
+                                           ComponentPageElement embedded,
                                            String parameterName,
                                            String containerParameterName)
     {
@@ -810,20 +801,18 @@
         embedded.bindParameter(parameterName, containerBinding);
     }
 
-    private void addActionForEmbeddedComponent(ComponentAssembler assembler,
+    private void addActionForEmbeddedComponent(AssemblerContext context,
                                                final 
EmbeddedComponentAssembler embeddedAssembler,
                                                final String embeddedId,
                                                final String elementName,
                                                final String componentClassName)
     {
-        assembler.add(new PageAssemblyAction()
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
                 pageAssembly.checkForRecursion(componentClassName, 
embeddedAssembler.getLocation());
 
-                pageAssembly.flushComposableRenderCommands();
-
                 Locale locale = pageAssembly.page.getLocale();
 
                 ComponentAssembler assemblerForSubcomponent = 
getAssembler(componentClassName, locale);
@@ -855,8 +844,10 @@
     }
 
 
-    private void attribute(ComponentAssembler assembler, final AttributeToken 
token)
+    private void attribute(AssemblerContext context)
     {
+        final AttributeToken token = context.next(AttributeToken.class);
+
         String value = token.getValue();
 
         // No expansion makes this easier, more efficient.
@@ -864,12 +855,12 @@
         {
             RenderCommand command = new RenderAttribute(token);
 
-            addComposableCommand(assembler, command);
+            context.addComposable(command);
 
             return;
         }
 
-        assembler.add(new PageAssemblyAction()
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
@@ -877,16 +868,14 @@
 
                 RenderCommand command = 
elementFactory.newAttributeElement(resources, token);
 
-                // Still composable, BTW.
-
                 pageAssembly.addRenderCommand(command);
             }
         });
     }
 
-    private void body(ComponentAssembler assembler)
+    private void body(AssemblerContext context)
     {
-        assembler.add(new PageAssemblyAction()
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
@@ -897,16 +886,16 @@
         });
     }
 
-    private void expansion(ComponentAssembler assembler, final ExpansionToken 
token)
+    private void expansion(AssemblerContext context)
     {
-        assembler.add(new PageAssemblyAction()
+        final ExpansionToken token = context.next(ExpansionToken.class);
+
+        context.add(new PageAssemblyAction()
         {
             public void execute(PageAssembly pageAssembly)
             {
                 ComponentResources resources = 
pageAssembly.activeElement.peek().getComponentResources();
 
-                // TODO: Add composability
-
                 RenderCommand command = 
elementFactory.newExpansionElement(resources, token);
 
                 pageAssembly.addRenderCommand(command);
@@ -914,25 +903,11 @@
         });
     }
 
-    private void text(ComponentAssembler assembler, TextToken textToken)
+    private void text(AssemblerContext context)
     {
-        addComposableCommand(assembler, new 
TextPageElement(textToken.getText()));
-    }
-
-    private void addComposableCommand(ComponentAssembler assembler, final 
RenderCommand command)
-    {
-        assembler.add(new PageAssemblyAction()
-        {
-            public void execute(PageAssembly pageAssembly)
-            {
-                pageAssembly.addComposableRenderCommand(command);
-            }
-        });
-    }
+        TextToken textToken = context.next(TextToken.class);
 
-    private void addFlushAction(ComponentAssembler assembler)
-    {
-        assembler.add(FLUSH_COMPOSABLE_RENDER_COMMANDS_ACTION);
+        context.addComposable(new TextPageElement(textToken.getText()));
     }
 
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSource.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSource.java?rev=745195&r1=745194&r2=745195&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSource.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSource.java
 Tue Feb 17 19:12:54 2009
@@ -1,4 +1,4 @@
-// Copyright 2009 ${ORG}
+// Copyright 2009 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
 /**
  * Access to component models (as provided via {...@link 
org.apache.tapestry5.internal.services.ComponentInstantiatorSource}).
  * <p/>
- * <p>This is a good candidate to move into the public services package.
+ * This is a good candidate to move into the public services package.
  *
  * @since 5.1.0.0
  */

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSourceImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSourceImpl.java?rev=745195&r1=745194&r2=745195&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSourceImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentModelSourceImpl.java
 Tue Feb 17 19:12:54 2009
@@ -1,4 +1,4 @@
-// Copyright 2009 ${ORG}
+// Copyright 2009 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BadMixinIdDemo.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BadMixinIdDemo.java?rev=745195&r1=745194&r2=745195&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BadMixinIdDemo.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BadMixinIdDemo.java
 Tue Feb 17 19:12:54 2009
@@ -1,4 +1,4 @@
-// Copyright 2009 ${ORG}
+// Copyright 2009 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DupeMixinDemo.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DupeMixinDemo.java?rev=745195&r1=745194&r2=745195&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DupeMixinDemo.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/DupeMixinDemo.java
 Tue Feb 17 19:12:54 2009
@@ -1,4 +1,4 @@
-// Copyright 2009 ${ORG}
+// Copyright 2009 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/UnsupportedParameterBlockDemo.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/UnsupportedParameterBlockDemo.java?rev=745195&r1=745194&r2=745195&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/UnsupportedParameterBlockDemo.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/UnsupportedParameterBlockDemo.java
 Tue Feb 17 19:12:54 2009
@@ -1,4 +1,4 @@
-// Copyright 2009 ${ORG}
+// Copyright 2009 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.


Reply via email to