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 2014/09/01 19:38:51 UTC

[2/2] git commit: TAP5-1572: Component cannot receive any event in a case when transformer added event handler before OnEventWorker

TAP5-1572: Component cannot receive any event in a case when transformer added event handler before OnEventWorker


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/42b0486e
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/42b0486e
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/42b0486e

Branch: refs/heads/master
Commit: 42b0486e2cf41bfd42b7e11832ffda76f8e5ff5e
Parents: 0998b92
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Mon Sep 1 10:38:58 2014 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Mon Sep 1 10:38:58 2014 -0700

----------------------------------------------------------------------
 .../ComponentInstantiatorSourceImpl.java        | 30 +++++++++++++++++---
 1 file changed, 26 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/42b0486e/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
index c460557..4bc3610 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
@@ -1,5 +1,3 @@
-// Copyright 2006-2013 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
@@ -50,6 +48,7 @@ import org.apache.tapestry5.services.transform.ControlledPackageType;
 import org.apache.tapestry5.services.transform.TransformationSupport;
 import org.slf4j.Logger;
 
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -312,7 +311,11 @@ public final class ComponentInstantiatorSourceImpl implements ComponentInstantia
                         final MutableComponentModel model = new MutableComponentModelImpl(className, logger, baseResource,
                                 parentModel, isPage, libraryName);
 
-                        transformerChain.transform(plasticClass, new TransformationSupportImpl(plasticClass, isRoot, model), model);
+                        TransformationSupportImpl transformationSupport = new TransformationSupportImpl(plasticClass, isRoot, model);
+
+                        transformerChain.transform(plasticClass, transformationSupport, model);
+
+                        transformationSupport.commit();
 
                         if (!superClassImplementsPageLifecycle && plasticClass.isInterfaceImplemented(PageLifecycleListener.class))
                         {
@@ -381,6 +384,8 @@ public final class ComponentInstantiatorSourceImpl implements ComponentInstantia
 
         private final MutableComponentModel model;
 
+        private final List<MethodAdvice> eventHandlerAdvice = CollectionFactory.newList();
+
         public TransformationSupportImpl(PlasticClass plasticClass, boolean root, MutableComponentModel model)
         {
             this.plasticClass = plasticClass;
@@ -388,6 +393,21 @@ public final class ComponentInstantiatorSourceImpl implements ComponentInstantia
             this.model = model;
         }
 
+        /**
+         * Commits any stored changes to the PlasticClass; this is used to defer adding advice to the dispatch method.
+         */
+        public void commit()
+        {
+            if (!eventHandlerAdvice.isEmpty())
+            {
+                PlasticMethod dispatchMethod = plasticClass.introduceMethod(TransformConstants.DISPATCH_COMPONENT_EVENT_DESCRIPTION);
+                for (MethodAdvice advice : eventHandlerAdvice)
+                {
+                    dispatchMethod.addAdvice(advice);
+                }
+            }
+        }
+
         public Class toClass(String typeName)
         {
             try
@@ -416,7 +436,9 @@ public final class ComponentInstantiatorSourceImpl implements ComponentInstantia
 
             MethodAdvice advice = new EventMethodAdvice(tracker, eventType, minContextValues, operationDescription, handler);
 
-            plasticClass.introduceMethod(TransformConstants.DISPATCH_COMPONENT_EVENT_DESCRIPTION).addAdvice(advice);
+            // The advice is added at the very end, after the logic provided by the OnEventWorker
+
+            eventHandlerAdvice.add(advice);
         }
     }