Author: hlship
Date: Sun Jul 24 03:45:30 2011
New Revision: 1150273
URL: http://svn.apache.org/viewvc?rev=1150273&view=rev
Log:
TAP5-1508: Record PageLifecycleAnnotationWorker to CCTW2
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformConstants.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java?rev=1150273&r1=1150272&r2=1150273&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageLifecycleAnnotationWorker.java
Sun Jul 24 03:45:30 2011
@@ -1,4 +1,4 @@
-// Copyright 2007, 2010 The Apache Software Foundation
+// Copyright 2007, 2010, 2011 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,97 +14,93 @@
package org.apache.tapestry5.internal.transform;
-import java.lang.annotation.Annotation;
-import java.util.List;
-
+import org.apache.tapestry5.func.F;
+import org.apache.tapestry5.func.Flow;
import org.apache.tapestry5.func.Predicate;
+import org.apache.tapestry5.func.Worker;
import org.apache.tapestry5.model.MutableComponentModel;
-import org.apache.tapestry5.services.ClassTransformation;
-import org.apache.tapestry5.services.ComponentClassTransformWorker;
-import org.apache.tapestry5.services.ComponentMethodAdvice;
-import org.apache.tapestry5.services.ComponentMethodInvocation;
-import org.apache.tapestry5.services.MethodAccess;
-import org.apache.tapestry5.services.MethodInvocationResult;
-import org.apache.tapestry5.services.TransformMethod;
-import org.apache.tapestry5.services.TransformMethodSignature;
+import org.apache.tapestry5.plastic.*;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
+import org.apache.tapestry5.services.transform.TransformationSupport;
+
+import java.lang.annotation.Annotation;
/**
* Similar to {@link
org.apache.tapestry5.internal.transform.RenderPhaseMethodWorker} but applies to
annotations/methods
* related to the overall page lifecycle. Page lifecycle methods are always
void and take no parameters.
*/
-public class PageLifecycleAnnotationWorker implements
ComponentClassTransformWorker
+public class PageLifecycleAnnotationWorker implements
ComponentClassTransformWorker2
{
private final Class<? extends Annotation> methodAnnotationClass;
- private final TransformMethodSignature lifecycleMethodSignature;
+ private final MethodDescription lifecycleMethodDescription;
private final String methodAlias;
+ private final Predicate<PlasticMethod> MATCHER = new
Predicate<PlasticMethod>()
+ {
+ public boolean accept(PlasticMethod method)
+ {
+ return
method.getDescription().methodName.equalsIgnoreCase(methodAlias)
+ || method.hasAnnotation(methodAnnotationClass);
+ }
+ };
+
+ private final Worker<PlasticMethod> VALIDATE = new Worker<PlasticMethod>()
+ {
+ public void work(PlasticMethod method)
+ {
+ if (!method.isVoid())
+ throw new RuntimeException(String.format("Method %s is a
lifecycle method and should return void.", method
+ .getMethodIdentifier()));
+
+ if (!method.getParameters().isEmpty())
+ throw new RuntimeException(String.format("Method %s is a
lifecycle method and should take no parameters.",
+ method.getMethodIdentifier()));
+
+ }
+ };
+
public PageLifecycleAnnotationWorker(Class<? extends Annotation>
methodAnnotationClass,
- TransformMethodSignature lifecycleMethodSignature, String
methodAlias)
+ MethodDescription
lifecycleMethodDescription, String methodAlias)
{
this.methodAnnotationClass = methodAnnotationClass;
- this.lifecycleMethodSignature = lifecycleMethodSignature;
+ this.lifecycleMethodDescription = lifecycleMethodDescription;
this.methodAlias = methodAlias;
}
- public void transform(final ClassTransformation transformation,
MutableComponentModel model)
+ public void transform(PlasticClass plasticClass, TransformationSupport
support, MutableComponentModel model)
{
- for (TransformMethod method : matchLifecycleMethods(transformation))
+ for (PlasticMethod method : matchLifecycleMethods(plasticClass))
{
- invokeMethodWithinLifecycle(transformation, method);
+ invokeMethodWithinLifecycle(plasticClass, method);
}
}
- private void invokeMethodWithinLifecycle(final ClassTransformation
transformation, TransformMethod method)
- {
- validateMethodSignature(method);
-
- final MethodAccess access = method.getAccess();
- ComponentMethodAdvice advice = createAdviceToInvokeMethod(access);
+ private void invokeMethodWithinLifecycle(PlasticClass plasticClass,
PlasticMethod method)
+ {
+ MethodHandle handle = method.getHandle();
-
transformation.getOrCreateMethod(lifecycleMethodSignature).addAdvice(advice);
+
plasticClass.introduceMethod(lifecycleMethodDescription).addAdvice(createAdvice(handle));
}
- private ComponentMethodAdvice createAdviceToInvokeMethod(final
MethodAccess access)
+ private MethodAdvice createAdvice(final MethodHandle handle)
{
- return new ComponentMethodAdvice()
+ return new MethodAdvice()
{
- public void advise(ComponentMethodInvocation invocation)
+ public void advise(MethodInvocation invocation)
{
invocation.proceed();
- MethodInvocationResult result =
access.invoke(invocation.getInstance());
-
- result.rethrow();
+ handle.invoke(invocation.getInstance()).rethrow();
}
};
}
- private void validateMethodSignature(TransformMethod method)
- {
- TransformMethodSignature signature = method.getSignature();
-
- if (!signature.getReturnType().equals("void"))
- throw new RuntimeException(String.format("Method %s is a lifecycle
method and should return void.", method
- .getMethodIdentifier()));
- if (signature.getParameterTypes().length > 0)
- throw new RuntimeException(String.format("Method %s is a lifecycle
method and should take no parameters.",
- method.getMethodIdentifier()));
- }
-
- private List<TransformMethod> matchLifecycleMethods(final
ClassTransformation transformation)
+ private Flow<PlasticMethod> matchLifecycleMethods(PlasticClass
plasticClass)
{
- return transformation.matchMethods(new Predicate<TransformMethod>()
- {
-
- public boolean accept(TransformMethod method)
- {
- return method.getName().equalsIgnoreCase(methodAlias)
- || method.getAnnotation(methodAnnotationClass) != null;
- }
- });
+ return
F.flow(plasticClass.getMethods()).filter(MATCHER).each(VALIDATE);
}
}
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=1150273&r1=1150272&r2=1150273&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
Sun Jul 24 03:45:30 2011
@@ -70,6 +70,7 @@ import org.apache.tapestry5.ioc.util.IdA
import org.apache.tapestry5.ioc.util.StrategyRegistry;
import org.apache.tapestry5.json.JSONArray;
import org.apache.tapestry5.json.JSONObject;
+import org.apache.tapestry5.plastic.MethodDescription;
import org.apache.tapestry5.runtime.Component;
import org.apache.tapestry5.runtime.ComponentResourcesAware;
import org.apache.tapestry5.runtime.RenderCommand;
@@ -525,6 +526,8 @@ public final class TapestryModule
* <dd>Checks for the {@link org.apache.tapestry5.annotations.Cached}
annotation</dd>
* <dt>ActivationRequestParameter</dt>
* <dd>Support for the {@link ActivationRequestParameter} annotation</dd>
+ * <dt>PageLoaded, PageAttached, PageDetached</dt>
+ * <dd>Support for annotations {@link PageLoaded}, {@link PageAttached},
{@link PageDetached}</dd>
* </dl>
*/
@Contribute(ComponentClassTransformWorker2.class)
@@ -582,8 +585,13 @@ public final class TapestryModule
configuration.addInstance("DiscardAfter", DiscardAfterWorker.class);
+ add(configuration, PageLoaded.class,
TransformConstants.CONTAINING_PAGE_DID_LOAD_DESCRIPTION);
+ add(configuration, PageAttached.class,
TransformConstants.CONTAINING_PAGE_DID_ATTACH_DESCRIPTION);
+ add(configuration, PageDetached.class,
TransformConstants.CONTAINING_PAGE_DID_DETACH_DESCRIPTION);
+
configuration.addInstance("PageReset",
PageResetAnnotationWorker.class);
+
// This one is always last. Any additional private fields that aren't
// annotated will
// be converted to clear out at the end of the request.
@@ -629,15 +637,6 @@ public final class TapestryModule
configuration.addInstance("InjectNamed", InjectNamedWorker.class);
- // Ideally, these should be ordered pretty late in the process to make
- // sure there are no
- // side effects with other workers that do work inside the page
- // lifecycle methods.
-
- add(configuration, PageLoaded.class,
TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE, "pageLoaded");
- add(configuration, PageAttached.class,
TransformConstants.CONTAINING_PAGE_DID_ATTACH_SIGNATURE, "pageAttached");
- add(configuration, PageDetached.class,
TransformConstants.CONTAINING_PAGE_DID_DETACH_SIGNATURE, "pageDetached");
-
configuration.addInstance("Persist", PersistWorker.class);
configuration.addInstance("Log", LogWorker.class);
@@ -1200,15 +1199,14 @@ public final class TapestryModule
configuration.addInstance("Messages",
MessagesConstraintGenerator.class);
}
- private static void
add(OrderedConfiguration<ComponentClassTransformWorker> configuration,
- Class<? extends Annotation> annotationClass,
TransformMethodSignature lifecycleMethodSignature,
- String methodAlias)
+ private static void
add(OrderedConfiguration<ComponentClassTransformWorker2> configuration,
+ Class<? extends Annotation> annotationClass,
MethodDescription description)
{
- ComponentClassTransformWorker worker = new
PageLifecycleAnnotationWorker(annotationClass,
- lifecycleMethodSignature, methodAlias);
-
String name =
TapestryInternalUtils.lastTerm(annotationClass.getName());
+ ComponentClassTransformWorker2 worker = new
PageLifecycleAnnotationWorker(annotationClass,
+ description, name);
+
configuration.add(name, worker);
}
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformConstants.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformConstants.java?rev=1150273&r1=1150272&r2=1150273&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformConstants.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformConstants.java
Sun Jul 24 03:45:30 2011
@@ -109,17 +109,35 @@ public final class TransformConstants
/**
* Signature for {@link
org.apache.tapestry5.runtime.PageLifecycleListener#containingPageDidDetach()}.
+ *
+ * @deprecated Deprecated in Tapestry 5.3, use {@link
#CONTAINING_PAGE_DID_DETACH_DESCRIPTION}
*/
public static final TransformMethodSignature
CONTAINING_PAGE_DID_DETACH_SIGNATURE = new TransformMethodSignature(
"containingPageDidDetach");
/**
+ * Description for {@link
org.apache.tapestry5.runtime.PageLifecycleListener#containingPageDidDetach()}.
+ *
+ * @since 5.3
+ */
+ public static final MethodDescription
CONTAINING_PAGE_DID_DETACH_DESCRIPTION =
PlasticUtils.getMethodDescription(PageLifecycleListener.class,
"containingPageDidDetach");
+
+ /**
* Signature for {@link
org.apache.tapestry5.runtime.PageLifecycleListener#containingPageDidAttach()}.
+ *
+ * @deprecated Deprecated in Tapestry 5.3, use {@link
#CONTAINING_PAGE_DID_ATTACH_DESCRIPTION}
*/
public static final TransformMethodSignature
CONTAINING_PAGE_DID_ATTACH_SIGNATURE = new TransformMethodSignature(
"containingPageDidAttach");
/**
+ * Description for {@link
org.apache.tapestry5.runtime.PageLifecycleListener#containingPageDidAttach()}.
+ *
+ * @since 5.3
+ */
+ public static final MethodDescription
CONTAINING_PAGE_DID_ATTACH_DESCRIPTION =
PlasticUtils.getMethodDescription(PageLifecycleListener.class,
"containingPageDidAttach");
+
+ /**
* Signature for {@link
org.apache.tapestry5.runtime.PageLifecycleListener#restoreStateBeforePageAttach()}
*
* @since 5.1.0.1