You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2006/11/15 22:54:35 UTC
svn commit: r475445 - in /tapestry/tapestry5/tapestry-core/trunk/src:
main/java/org/apache/tapestry/annotations/
main/java/org/apache/tapestry/internal/structure/
main/java/org/apache/tapestry/runtime/
main/java/org/apache/tapestry/services/ test/java/...
Author: hlship
Date: Wed Nov 15 13:54:34 2006
New Revision: 475445
URL: http://svn.apache.org/viewvc?view=rev&rev=475445
Log:
Add support for render phase PreBeginRender and PostBeginRender
Added:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PostBeginRender.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PreBeginRender.java
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/BeginRender.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/Component.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TransformConstants.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/DefaultComponentLifecyle.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/BeginRender.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/BeginRender.java?view=diff&rev=475445&r1=475444&r2=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/BeginRender.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/BeginRender.java Wed Nov 15 13:54:34 2006
@@ -38,6 +38,10 @@
* <p>
* Returning false will skip rendering of the template and/or body, and jump directly to the
* {@link org.apache.tapestry.annotations.CleanupRender} phase.
+ * <p>
+ * Execution of this phase is broken up into three steps: {@link PreBeginRender}, BeginRender,
+ * {@link PostBeginRender}. Returning false from any of these phases will jump directly to
+ * {@link CleanupRender}.
*/
@Target(ElementType.METHOD)
@Retention(RUNTIME)
Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PostBeginRender.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PostBeginRender.java?view=auto&rev=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PostBeginRender.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PostBeginRender.java Wed Nov 15 13:54:34 2006
@@ -0,0 +1,20 @@
+package org.apache.tapestry.annotations;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Phase that occurs just after the {@link BeginRender} phase, but before template or body, etc.
+ * This is often used to write additional attributes into the element started by the BeginRender
+ * phase.
+ */
+@Target(ElementType.METHOD)
+@Retention(RUNTIME)
+@Documented
+public @interface PostBeginRender {
+
+}
Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PreBeginRender.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PreBeginRender.java?view=auto&rev=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PreBeginRender.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/annotations/PreBeginRender.java Wed Nov 15 13:54:34 2006
@@ -0,0 +1,18 @@
+package org.apache.tapestry.annotations;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Phase the occurs just before {@link BeginRender}.
+ */
+@Target(ElementType.METHOD)
+@Retention(RUNTIME)
+@Documented
+public @interface PreBeginRender {
+
+}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?view=diff&rev=475445&r1=475444&r2=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java Wed Nov 15 13:54:34 2006
@@ -51,7 +51,6 @@
* via a {@link org.apache.tapestry.runtime.Component} instance.
* <p>
* Once instantiated, a ComponentPageElementImpl should be registered as a
- * {@link org.apache.tapestry.runtime.PageLifecycleListener} with the containing
* {@link org.apache.tapestry.internal.structure.Page}. This could be done inside the constructors,
* but that tends to complicate unit tests, so its done by
* {@link org.apache.tapestry.internal.services.PageElementFactoryImpl}.
@@ -112,13 +111,7 @@
invoke(true, callback);
if (event.getResult())
- queue.push(_beginRender);
- }
-
- @Override
- public String toString()
- {
- return String.format("AfterRender[%s]", _completeId);
+ queue.push(_preBeginRender);
}
};
@@ -141,12 +134,6 @@
if (event.getResult())
queue.push(_beforeRenderBody);
}
-
- @Override
- public String toString()
- {
- return String.format("AfterRenderBody[%s]", _completeId);
- }
};
private final RenderCommand _afterRenderTemplate = new RenderCommand()
@@ -168,12 +155,6 @@
if (event.getResult())
queue.push(_beforeRenderTemplate);
}
-
- @Override
- public String toString()
- {
- return String.format("BeforeRenderTemplate[%s]", _completeId);
- }
};
private final RenderCommand _beforeRenderBody = new RenderCommand()
@@ -197,12 +178,6 @@
if (event.getResult())
pushElements(queue, _body);
}
-
- @Override
- public String toString()
- {
- return String.format("BeforeRenderBody[%s]", _completeId);
- }
};
private final RenderCommand _beforeRenderTemplate = new RenderCommand()
@@ -226,11 +201,26 @@
if (event.getResult())
pushElements(queue, _template);
}
+ };
- @Override
- public String toString()
+ private final RenderCommand _preBeginRender = new RenderCommand()
+ {
+ public void render(final MarkupWriter writer, final RenderQueue queue)
{
- return String.format("BeforeRenderTemplate[%s]", _completeId);
+ final LifecycleEvent<Boolean> event = newEvent(true);
+
+ ComponentCallback callback = new ComponentCallback()
+ {
+ public void run(Component component)
+ {
+ component.preBeginRender(writer, event);
+ }
+ };
+
+ invoke(false, callback);
+
+ if (event.getResult())
+ queue.push(_beginRender);
}
};
@@ -250,6 +240,27 @@
invoke(false, callback);
+ if (event.getResult())
+ queue.push(_postBeginRender);
+ }
+ };
+
+ private final RenderCommand _postBeginRender = new RenderCommand()
+ {
+ public void render(final MarkupWriter writer, final RenderQueue queue)
+ {
+ final LifecycleEvent<Boolean> event = newEvent(true);
+
+ ComponentCallback callback = new ComponentCallback()
+ {
+ public void run(Component component)
+ {
+ component.postBeginRender(writer, event);
+ }
+ };
+
+ invoke(false, callback);
+
// If the component has no template whatsoever, then a
// renderBody element is added as the lone element of the component's template.
// So every component will have a non-empty template.
@@ -260,12 +271,6 @@
queue.push(_beforeRenderTemplate);
}
}
-
- @Override
- public String toString()
- {
- return String.format("BeginRender[%s]", _completeId);
- }
};
private List<PageElement> _body;
@@ -306,12 +311,6 @@
}
}
-
- @Override
- public String toString()
- {
- return String.format("CleanupRender[%s]", _completeId);
- }
};
private final String _completeId;
@@ -366,7 +365,7 @@
queue.push(_cleanupRender);
if (event.getResult())
- queue.push(_beginRender);
+ queue.push(_preBeginRender);
}
@Override
@@ -507,9 +506,14 @@
String simpleName = parameterName.substring(dotx + 1);
+ // TODO: If its informal? Ignore it unless the mixin supports informals? Warn otherwise?
+ // We'll have to see.
+
mixinResources.addParameter(simpleName, binding);
}
+ InternalComponentResources informalParameterResources = null;
+
// Does it match a formal parameter name of the core component? That takes precedence
if (_coreResources.getComponentModel().getParameterModel(parameterName) != null)
@@ -526,12 +530,23 @@
resources.addParameter(parameterName, binding);
return;
}
+
+ if (informalParameterResources == null
+ && resources.getComponentModel().getSupportsInformalParameters())
+ informalParameterResources = resources;
}
+ // An informal parameter
+
+ if (informalParameterResources == null
+ && _coreResources.getComponentModel().getSupportsInformalParameters())
+ informalParameterResources = _coreResources;
+
// For the moment, informal parameters accumulate in the core component's resources, but
// that will likely change.
- _coreResources.addParameter(parameterName, binding);
+ if (informalParameterResources != null)
+ informalParameterResources.addParameter(parameterName, binding);
}
public void addToBody(PageElement element)
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/Component.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/Component.java?view=diff&rev=475445&r1=475444&r2=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/Component.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/Component.java Wed Nov 15 13:54:34 2006
@@ -45,9 +45,21 @@
void setupRender(MarkupWriter writer, LifecycleEvent<Boolean> event);
/**
+ * Invoked just before {@link #beginRender(MarkupWriter, LifecycleEvent)
+ */
+
+ void preBeginRender(MarkupWriter writer, LifecycleEvent<Boolean> event);
+
+ /**
* Invoked to allow a component to render its tag (start tag and attributes).
*/
void beginRender(MarkupWriter writer, LifecycleEvent<Boolean> event);
+
+ /**
+ * Invoked just after {@link #beginRender(MarkupWriter, LifecycleEvent)}, typically to allow a
+ * mixin to write additional attributes into the component's tag.
+ */
+ void postBeginRender(MarkupWriter writer, LifecycleEvent<Boolean> event);
/**
* This phase is only invoked for components with templates.
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=475445&r1=475444&r2=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java Wed Nov 15 13:54:34 2006
@@ -33,6 +33,8 @@
import org.apache.tapestry.annotations.BeforeRenderTemplate;
import org.apache.tapestry.annotations.BeginRender;
import org.apache.tapestry.annotations.CleanupRender;
+import org.apache.tapestry.annotations.PostBeginRender;
+import org.apache.tapestry.annotations.PreBeginRender;
import org.apache.tapestry.annotations.SetupRender;
import org.apache.tapestry.internal.InternalConstants;
import org.apache.tapestry.internal.bindings.LiteralBindingFactory;
@@ -524,7 +526,17 @@
// execution order.
add(configuration, TransformConstants.SETUP_RENDER_SIGNATURE, SetupRender.class, false);
+ add(
+ configuration,
+ TransformConstants.PRE_BEGIN_RENDER_SIGNATURE,
+ PreBeginRender.class,
+ false);
add(configuration, TransformConstants.BEGIN_RENDER_SIGNATURE, BeginRender.class, false);
+ add(
+ configuration,
+ TransformConstants.POST_BEGIN_RENDER_SIGNATURE,
+ PostBeginRender.class,
+ false);
add(
configuration,
TransformConstants.BEFORE_RENDER_TEMPLATE_SIGNATURE,
Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TransformConstants.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TransformConstants.java?view=diff&rev=475445&r1=475444&r2=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TransformConstants.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TransformConstants.java Wed Nov 15 13:54:34 2006
@@ -17,6 +17,9 @@
import java.lang.reflect.Modifier;
import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.annotations.PostBeginRender;
+import org.apache.tapestry.annotations.PreBeginRender;
+import org.apache.tapestry.runtime.Component;
import org.apache.tapestry.runtime.ComponentEvent;
import org.apache.tapestry.runtime.LifecycleEvent;
@@ -28,7 +31,7 @@
{
// Shared parameters of a whole bunch of lifecycle methods, representing the different
// component render states.
- private static final String[] LIFECYCLE_METHOD_PARAMETER_TYPES =
+ private static final String[] RENDER_PHASE_METHOD_PARAMETERS =
{ MarkupWriter.class.getName(), LifecycleEvent.class.getName() };
/**
@@ -72,7 +75,7 @@
*
* @see org.apache.tapestry.annotations.SetupRender
*/
- public static final MethodSignature SETUP_RENDER_SIGNATURE = newLifecycleMethodSignature("setupRender");
+ public static final MethodSignature SETUP_RENDER_SIGNATURE = renderPhaseSignature("setupRender");
/**
* Signature for
@@ -80,15 +83,29 @@
*
* @see org.apache.tapestry.annotations.BeginRender
*/
- public static final MethodSignature BEGIN_RENDER_SIGNATURE = newLifecycleMethodSignature("beginRender");
+ public static final MethodSignature BEGIN_RENDER_SIGNATURE = renderPhaseSignature("beginRender");
/**
+ * Signature for {@link Component#preBeginRender(MarkupWriter, LifecycleEvent)}.
+ *
+ * @see PreBeginRender
+ */
+ public static final MethodSignature PRE_BEGIN_RENDER_SIGNATURE = renderPhaseSignature("preBeginRender");
+
+
+ /** Signature for {@link Component#postBeginRender(MarkupWriter, LifecycleEvent)}.
+ *
+ * @see PostBeginRender
+ */
+ public static final MethodSignature POST_BEGIN_RENDER_SIGNATURE = renderPhaseSignature("postBeginRender");
+
+ /**
* Signature for
* {@link org.apache.tapestry.runtime.Component#beforeRenderTemplate(MarkupWriter, LifecycleEvent)}.
*
* @see org.apache.tapestry.annotations.BeforeRenderTemplate
*/
- public static MethodSignature BEFORE_RENDER_TEMPLATE_SIGNATURE = newLifecycleMethodSignature("beforeRenderTemplate");
+ public static MethodSignature BEFORE_RENDER_TEMPLATE_SIGNATURE = renderPhaseSignature("beforeRenderTemplate");
/**
* Signature for
@@ -96,7 +113,7 @@
*
* @see org.apache.tapestry.annotations.BeforeRenderTemplate
*/
- public static MethodSignature AFTER_RENDER_TEMPLATE_SIGNATURE = newLifecycleMethodSignature("afterRenderTemplate");
+ public static MethodSignature AFTER_RENDER_TEMPLATE_SIGNATURE = renderPhaseSignature("afterRenderTemplate");
/**
* Signature for
@@ -104,7 +121,7 @@
*
* @see org.apache.tapestry.annotations.BeforeRenderBody
*/
- public static final MethodSignature BEFORE_RENDER_BODY_SIGNATURE = newLifecycleMethodSignature("beforeRenderBody");
+ public static final MethodSignature BEFORE_RENDER_BODY_SIGNATURE = renderPhaseSignature("beforeRenderBody");
/**
* Signature for
@@ -112,7 +129,7 @@
*
* @see org.apache.tapestry.annotations.AfterRenderBody
*/
- public static final MethodSignature AFTER_RENDER_BODY_SIGNATURE = newLifecycleMethodSignature("afterRenderBody");
+ public static final MethodSignature AFTER_RENDER_BODY_SIGNATURE = renderPhaseSignature("afterRenderBody");
/**
* Signature for
@@ -120,7 +137,7 @@
*
* @see org.apache.tapestry.annotations.AfterRender
*/
- public static final MethodSignature AFTER_RENDER_SIGNATURE = newLifecycleMethodSignature("afterRender");
+ public static final MethodSignature AFTER_RENDER_SIGNATURE = renderPhaseSignature("afterRender");
/**
* Signature for
@@ -128,15 +145,15 @@
*
* @see org.apache.tapestry.annotations.CleanupRender
*/
- public static final MethodSignature CLEANUP_RENDER_SIGNATURE = newLifecycleMethodSignature("cleanupRender");
+ public static final MethodSignature CLEANUP_RENDER_SIGNATURE = renderPhaseSignature("cleanupRender");
private TransformConstants()
{
}
- private static MethodSignature newLifecycleMethodSignature(String name)
+ private static MethodSignature renderPhaseSignature(String name)
{
- return new MethodSignature(Modifier.PUBLIC, "void", name, LIFECYCLE_METHOD_PARAMETER_TYPES,
+ return new MethodSignature(Modifier.PUBLIC, "void", name, RENDER_PHASE_METHOD_PARAMETERS,
null);
}
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/DefaultComponentLifecyle.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/DefaultComponentLifecyle.java?view=diff&rev=475445&r1=475444&r2=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/DefaultComponentLifecyle.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/bindings/DefaultComponentLifecyle.java Wed Nov 15 13:54:34 2006
@@ -87,6 +87,18 @@
public void beforeRenderTemplate(MarkupWriter writer, LifecycleEvent<Boolean> event)
{
// TODO Auto-generated method stub
+ }
+
+ public void postBeginRender(MarkupWriter writer, LifecycleEvent<Boolean> event)
+ {
+ // TODO Auto-generated method stub
+
+ }
+ public void preBeginRender(MarkupWriter writer, LifecycleEvent<Boolean> event)
+ {
+ // TODO Auto-generated method stub
}
+
+
}
Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java?view=diff&rev=475445&r1=475444&r2=475445
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java Wed Nov 15 13:54:34 2006
@@ -45,6 +45,8 @@
train_getLog(model, newLog());
train_getParameterModel(model, "barney", null);
+
+ train_getSupportsInformalParameters(model, true);
replay();
@@ -213,6 +215,8 @@
TypeCoercer coercer = newTypeCoercer();
Binding binding = newBinding();
+ train_getSupportsInformalParameters(model, true);
+
Long boundValue = new Long(23);
Instantiator ins = newInstantiator(component, model);
@@ -237,6 +241,12 @@
verify();
}
+ protected final void train_getSupportsInformalParameters(ComponentModel model, boolean supports)
+ {
+ model.getSupportsInformalParameters();
+ setReturnValue(supports);
+ }
+
@Test
public void write_binding()
{
@@ -251,6 +261,8 @@
train_getParameterModel(model, "barney", null);
+ train_getSupportsInformalParameters(model, true);
+
train_getLog(model, log);
binding.getBindingType();