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)