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 2010/02/19 19:53:23 UTC

svn commit: r911912 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/transform/ test/java/org/apache/tapestry5/internal/transform/

Author: hlship
Date: Fri Feb 19 18:53:23 2010
New Revision: 911912

URL: http://svn.apache.org/viewvc?rev=911912&view=rev
Log:
Rewrite PageActivationContextWorker in terms of the updated ClassTransformation APIs

Removed:
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/PageActivationContextWorkerTest.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java?rev=911912&r1=911911&r2=911912&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/PageActivationContextWorker.java Fri Feb 19 18:53:23 2010
@@ -1,10 +1,10 @@
-// Copyright 2008, 2009 The Apache Software Foundation
+// Copyright 2008, 2009, 2010 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
+// 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,
@@ -14,56 +14,114 @@
 
 package org.apache.tapestry5.internal.transform;
 
+import java.util.List;
+
+import org.apache.tapestry5.EventConstants;
 import org.apache.tapestry5.annotations.PageActivationContext;
 import org.apache.tapestry5.model.MutableComponentModel;
+import org.apache.tapestry5.runtime.ComponentEvent;
 import org.apache.tapestry5.services.ClassTransformation;
 import org.apache.tapestry5.services.ComponentClassTransformWorker;
-import org.apache.tapestry5.services.TransformMethodSignature;
-
-import java.lang.reflect.Modifier;
-import java.util.List;
+import org.apache.tapestry5.services.ComponentMethodAdvice;
+import org.apache.tapestry5.services.ComponentMethodInvocation;
+import org.apache.tapestry5.services.FieldAccess;
+import org.apache.tapestry5.services.TransformConstants;
+import org.apache.tapestry5.services.TransformField;
 
 /**
- * Provides the page activation context handlers.  This worker must be scheduled before {@link
- * org.apache.tapestry5.internal.transform.OnEventWorker} in order for the added event handler methods to be properly
- * picked up and processed.
- *
+ * Provides the page activation context handlers. This worker must be scheduled before
+ * {@link org.apache.tapestry5.internal.transform.OnEventWorker} in order for the added event handler methods to be
+ * properly picked up and processed.
+ * 
  * @see org.apache.tapestry5.annotations.PageActivationContext
  */
 public class PageActivationContextWorker implements ComponentClassTransformWorker
 {
     public void transform(ClassTransformation transformation, MutableComponentModel model)
     {
-        List<String> fields = transformation.findFieldsWithAnnotation(PageActivationContext.class);
+
+        List<TransformField> fields = transformation.matchFieldsWithAnnotation(PageActivationContext.class);
+
+        // In the future we may add rules for ordering the fields (new attribute on annotation?)
 
         if (fields.size() > 1)
             throw new RuntimeException(TransformMessages.illegalNumberOfPageActivationContextHandlers(fields));
 
-        for (String fieldName : fields)
+        // So there's 0 or 1 of these
+
+        for (TransformField field : fields)
         {
-            PageActivationContext annotation = transformation.getFieldAnnotation(fieldName,
-                                                                                 PageActivationContext.class);
+            transformField(transformation, model, field);
+        }
+    }
 
-            String fieldType = transformation.getFieldType(fieldName);
+    private void transformField(ClassTransformation transformation, MutableComponentModel model,
+            final TransformField field)
+    {
+        final PageActivationContext annotation = field.getAnnotation(PageActivationContext.class);
+
+        ComponentMethodAdvice advice = createAdvice(field, annotation);
+
+        transformation.getMethod(TransformConstants.DISPATCH_COMPONENT_EVENT).addAdvice(advice);
+
+        if (annotation.activate())
+            model.addEventHandler(EventConstants.ACTIVATE);
 
-            if (annotation.activate())
+        if (annotation.passivate())
+            model.addEventHandler(EventConstants.PASSIVATE);
+
+        // We don't claim the field, and other workers may even replace it with a FieldValueConduit.
+    }
+
+    private ComponentMethodAdvice createAdvice(TransformField field, final PageActivationContext annotation)
+    {
+        final String fieldType = field.getType();
+        final FieldAccess access = field.getAccess();
+
+        return new ComponentMethodAdvice()
+        {
+            public void advise(ComponentMethodInvocation invocation)
             {
-                TransformMethodSignature activate
-                        = new TransformMethodSignature(Modifier.PROTECTED | Modifier.FINAL, "void",
-                                                       "onActivate",
-                                                       new String[] { fieldType }, null);
-                transformation.addTransformedMethod(activate, fieldName + " = $1;");
+                invocation.proceed();
+
+                ComponentEvent event = (ComponentEvent) invocation.getParameter(0);
+
+                if (event.isAborted())
+                    return;
+
+                handleActivateEvent(event, invocation);
+
+                handlePassivateEvent(event, invocation);
             }
 
-            if (annotation.passivate())
+            private void handleActivateEvent(ComponentEvent event, ComponentMethodInvocation invocation)
             {
-                TransformMethodSignature passivate
-                        = new TransformMethodSignature(Modifier.PROTECTED | Modifier.FINAL, "java.lang.Object",
-                                                       "onPassivate",
-                                                       null, null);
-                transformation.addTransformedMethod(passivate, "return ($w) " + fieldName + ";");
+                if (annotation.activate() && event.matches(EventConstants.ACTIVATE, "", 1))
+                {
+                    event.setMethodDescription(access.toString());
+
+                    Object value = event.coerceContext(0, fieldType);
+
+                    access.write(invocation.getInstance(), value);
+
+                    invocation.overrideResult(true);
+                }
             }
-        }
 
+            private void handlePassivateEvent(ComponentEvent event, ComponentMethodInvocation invocation)
+            {
+
+                if (annotation.passivate() && event.matches(EventConstants.PASSIVATE, "", 0))
+                {
+                    event.setMethodDescription(access.toString());
+
+                    Object value = access.read(invocation.getInstance());
+
+                    event.storeResult(value);
+
+                    invocation.overrideResult(true);
+                }
+            }
+        };
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java?rev=911912&r1=911911&r2=911912&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java Fri Feb 19 18:53:23 2010
@@ -20,8 +20,10 @@
 import org.apache.tapestry5.annotations.MixinClasses;
 import org.apache.tapestry5.internal.structure.InternalComponentResourcesImpl;
 import org.apache.tapestry5.ioc.Messages;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.internal.util.MessagesImpl;
+import org.apache.tapestry5.services.TransformField;
 import org.apache.tapestry5.services.TransformMethodSignature;
 
 class TransformMessages
@@ -43,24 +45,28 @@
         return MESSAGES.format("cached-no-parameters", method);
     }
 
-    static String illegalNumberOfPageActivationContextHandlers(List<String> fields)
+    static String illegalNumberOfPageActivationContextHandlers(List<TransformField> fields)
     {
-        return MESSAGES.format("illegal-number-of-page-activation-context-handlers", InternalUtils
-                .joinSorted(fields));
+        List<String> names = CollectionFactory.newList();
+
+        for (TransformField field : fields)
+        {
+            names.add(field.getName());
+        }
+
+        return MESSAGES.format("illegal-number-of-page-activation-context-handlers", InternalUtils.joinSorted(names));
     }
 
     public static String badMixinConstraintLength(MixinClasses mixin, String fieldName)
     {
-        return MESSAGES.format("bad-mixin-constraint-length", mixin.value().length, fieldName,
-                mixin.order().length);
+        return MESSAGES.format("bad-mixin-constraint-length", mixin.value().length, fieldName, mixin.order().length);
     }
 
     /** @since 5.2.0 */
-    public static String bindParameterOnlyOnMixin(String boundParameterName,
-            ComponentResources resources)
+    public static String bindParameterOnlyOnMixin(String boundParameterName, ComponentResources resources)
     {
-        return MESSAGES.format("bind-parameter-only-on-mixin", boundParameterName,
-                resources.getComponentModel().getComponentClassName());
+        return MESSAGES.format("bind-parameter-only-on-mixin", boundParameterName, resources.getComponentModel()
+                .getComponentClassName());
     }
 
 }