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 2011/07/24 04:18:04 UTC

svn commit: r1150253 - in /tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5: internal/transform/ActivationRequestParameterWorker.java services/TapestryModule.java

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