Author: hlship
Date: Sun Jul 24 02:18:03 2011
New Revision: 1150253
URL: http://svn.apache.org/viewvc?rev=1150253&view=rev
Log:
TAP5-1508: Record ActivationRequestParameterWorker to implement CCTW2
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java?rev=1150253&r1=1150252&r2=1150253&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java
Sun Jul 24 02:18:03 2011
@@ -21,9 +21,16 @@ import org.apache.tapestry5.annotations.
import org.apache.tapestry5.internal.services.ComponentClassCache;
import org.apache.tapestry5.ioc.util.IdAllocator;
import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.plastic.FieldHandle;
+import org.apache.tapestry5.plastic.PlasticClass;
+import org.apache.tapestry5.plastic.PlasticField;
import org.apache.tapestry5.runtime.Component;
import org.apache.tapestry5.runtime.ComponentEvent;
-import org.apache.tapestry5.services.*;
+import org.apache.tapestry5.services.ComponentEventHandler;
+import org.apache.tapestry5.services.Request;
+import org.apache.tapestry5.services.ValueEncoderSource;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
+import org.apache.tapestry5.services.transform.TransformationSupport;
/**
* Hooks the activate event handler on the component (presumably, a page) to
@@ -34,7 +41,7 @@ import org.apache.tapestry5.services.*;
* @since 5.2.0
*/
@SuppressWarnings("all")
-public class ActivationRequestParameterWorker implements
ComponentClassTransformWorker
+public class ActivationRequestParameterWorker implements
ComponentClassTransformWorker2
{
private final Request request;
@@ -50,16 +57,15 @@ public class ActivationRequestParameterW
this.valueEncoderSource = valueEncoderSource;
}
- public void transform(ClassTransformation transformation,
MutableComponentModel model)
+ public void transform(PlasticClass plasticClass, TransformationSupport
support, MutableComponentModel model)
{
- for (TransformField field :
transformation.matchFieldsWithAnnotation(ActivationRequestParameter.class))
+ for (PlasticField field :
plasticClass.getFieldsWithAnnotation(ActivationRequestParameter.class))
{
- mapFieldToQueryParameter(field, transformation, model);
+ mapFieldToQueryParameter(field, support);
}
}
- private void mapFieldToQueryParameter(TransformField field,
ClassTransformation transformation,
- MutableComponentModel model)
+ private void mapFieldToQueryParameter(PlasticField field,
TransformationSupport support)
{
ActivationRequestParameter annotation =
field.getAnnotation(ActivationRequestParameter.class);
@@ -68,20 +74,23 @@ public class ActivationRequestParameterW
// Assumption: the field type is not one that's loaded by the
component class loader, so it's safe
// to convert to a hard type during class transformation.
- Class fieldType = classCache.forName(field.getType());
+ Class fieldType = classCache.forName(field.getTypeName());
ValueEncoder encoder = valueEncoderSource.getValueEncoder(fieldType);
- FieldAccess access = field.getAccess();
+ FieldHandle handle = field.getHandle();
- setValueFromInitializeEventHandler(transformation, access,
parameterName, encoder);
- decorateLinks(transformation, access, parameterName, encoder);
- preallocateName(transformation, parameterName);
+ String fieldName = String.format("%s.%s",
field.getPlasticClass().getClassName(), field.getName());
- model.addEventHandler(EventConstants.ACTIVATE);
+ setValueFromInitializeEventHandler(support, fieldName, handle,
parameterName, encoder);
+
+ decorateLinks(support, fieldName, handle, parameterName, encoder);
+
+ preallocateName(support, parameterName);
}
- private static void preallocateName(ClassTransformation transformation,
final String parameterName)
+
+ private static void preallocateName(TransformationSupport support, final
String parameterName)
{
ComponentEventHandler handler = new ComponentEventHandler()
{
@@ -93,13 +102,13 @@ public class ActivationRequestParameterW
}
};
-
transformation.addComponentEventHandler(EventConstants.PREALLOCATE_FORM_CONTROL_NAMES,
1,
+ support.addEventHandler(EventConstants.PREALLOCATE_FORM_CONTROL_NAMES,
1,
"ActivationRequestParameterWorker preallocate form control
name '" + parameterName + "' event handler",
handler);
}
@SuppressWarnings("all")
- private void setValueFromInitializeEventHandler(ClassTransformation
transformation, final FieldAccess access,
+ private void setValueFromInitializeEventHandler(TransformationSupport
support, String fieldName, final FieldHandle handle,
final String
parameterName, final ValueEncoder encoder)
{
ComponentEventHandler handler = new ComponentEventHandler()
@@ -113,51 +122,29 @@ public class ActivationRequestParameterW
Object value = encoder.toValue(clientValue);
- access.write(instance, value);
+ handle.set(instance, value);
}
};
- ComponentMethodAdvice advice = new ComponentMethodAdvice()
- {
- public void advise(ComponentMethodInvocation invocation)
- {
- // Handle this synthetic event FIRST, before any super-class
or event handler method calls. It's especially important that this execute
before
- // any onActivate() event handler method.
-
- ComponentEvent event = (ComponentEvent)
invocation.getParameter(0);
-
- if (event.matches(EventConstants.ACTIVATE, "", 0))
- {
- String clientValue = request.getParameter(parameterName);
-
- if (clientValue != null)
- {
+ support.addEventHandler(EventConstants.ACTIVATE, 0,
+ String.format("Restoring field %s from query parameter '%s'",
fieldName, parameterName), handler);
- Object value = encoder.toValue(clientValue);
-
- access.write(invocation.getInstance(), value);
- }
- }
-
- invocation.proceed();
- }
- };
-
-
transformation.getOrCreateMethod(TransformConstants.DISPATCH_COMPONENT_EVENT).addAdvice(advice);
}
@SuppressWarnings("all")
- private static void decorateLinks(ClassTransformation transformation,
final FieldAccess access,
+ private static void decorateLinks(TransformationSupport support, String
fieldName, final FieldHandle handle,
final String parameterName, final
ValueEncoder encoder)
{
ComponentEventHandler handler = new ComponentEventHandler()
{
public void handleEvent(Component instance, ComponentEvent event)
{
- Object value = access.read(instance);
+ Object value = handle.get(instance);
if (value == null)
+ {
return;
+ }
Link link = event.getEventContext().get(Link.class, 0);
@@ -167,14 +154,14 @@ public class ActivationRequestParameterW
}
};
-
transformation.addComponentEventHandler(EventConstants.DECORATE_COMPONENT_EVENT_LINK,
0,
- "ActivationRequestParameterWorker decorate component event
link event handler", handler);
+ support.addEventHandler(EventConstants.DECORATE_COMPONENT_EVENT_LINK,
0,
+ String.format("ActivationRequestParameterWorker decorate
component event link event handler for field %s as query parameter '%s'",
fieldName, parameterName), handler);
-
transformation.addComponentEventHandler(EventConstants.DECORATE_PAGE_RENDER_LINK,
0,
- "ActivationRequestParameterWorker decorate page render link
event handler", handler);
+ support.addEventHandler(EventConstants.DECORATE_PAGE_RENDER_LINK, 0,
String.format(
+ "ActivationRequestParameterWorker decorate page render link
event handler for field %s as query parameter '%s'", fieldName, parameterName),
handler);
}
- private String getParameterName(TransformField field,
ActivationRequestParameter annotation)
+ private String getParameterName(PlasticField field,
ActivationRequestParameter annotation)
{
if (annotation.value().equals(""))
return field.getName();
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=1150253&r1=1150252&r2=1150253&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 02:18:03 2011
@@ -523,6 +523,8 @@ public final class TapestryModule
* <p/>
* <dt>Cached</dt>
* <dd>Checks for the {@link org.apache.tapestry5.annotations.Cached}
annotation</dd>
+ * <dt>ActivationRequestParameter</dt>
+ * <dd>Support for the {@link ActivationRequestParameter} annotation</dd>
* </dl>
*/
@Contribute(ComponentClassTransformWorker2.class)
@@ -573,6 +575,8 @@ public final class TapestryModule
configuration.add("Retain", new RetainWorker());
configuration.add("PageActivationContext", new
PageActivationContextWorker(), "after:OnEvent");
+ configuration
+ .addInstance("ActivationRequestParameter",
ActivationRequestParameterWorker.class, "after:OnEvent");
configuration.addInstance("Cached", CachedWorker.class);
@@ -613,8 +617,6 @@ public final class TapestryModule
* <dd>Checks for the {@link org.apache.tapestry5.annotations.Log}
annotation</dd>
* <dt>HeartbeatDeferred
* <dd>Support for the {@link HeartbeatDeferred} annotation
- * <dt>ActivationRequestParameter
- * <dd>Support for the {@link ActivationRequestParameter} annotation
* </dl>
*/
@Contribute(ComponentClassTransformWorker2.class)
@@ -622,14 +624,10 @@ public final class TapestryModule
public static void provideOldStyleClassTransformWorkers(
OrderedConfiguration<ComponentClassTransformWorker> configuration)
{
-
-
configuration.addInstance("Inject", InjectWorker.class);
configuration.addInstance("InjectService", InjectServiceWorker.class);
configuration.addInstance("InjectNamed", InjectNamedWorker.class);
- configuration
- .addInstance("ActivationRequestParameter",
ActivationRequestParameterWorker.class, "after:OnEvent");
// Ideally, these should be ordered pretty late in the process to make
// sure there are no