Author: hlship
Date: Thu Feb  4 00:46:00 2010
New Revision: 906308

URL: http://svn.apache.org/viewvc?rev=906308&view=rev
Log:
Remove the lifecycle listener after the page load notification is sent

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java?rev=906308&r1=906307&r2=906308&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectComponentWorker.java
 Thu Feb  4 00:46:00 2010
@@ -34,6 +34,55 @@
  */
 public class InjectComponentWorker implements ComponentClassTransformWorker
 {
+    private final class InjectedComponentFieldValueConduit extends 
ReadOnlyFieldValueConduit
+    {
+        private final ComponentResources resources;
+        private final String fieldName, componentId, type;
+
+        private Component embedded;
+
+        private InjectedComponentFieldValueConduit(final ComponentResources 
resources, String fieldName, String type,
+                String componentId)
+        {
+            super(resources, fieldName);
+
+            this.resources = resources;
+            this.fieldName = fieldName;
+            this.componentId = componentId;
+            this.type = type;
+
+            resources.addPageLifecycleListener(new PageLifecycleAdapter()
+            {
+                public void containingPageDidLoad()
+                {
+                    load();
+
+                    resources.removePageLifecycleListener(this);
+                };
+            });
+        }
+
+        private void load()
+        {
+            embedded = resources.getEmbeddedComponent(componentId);
+
+            Class fieldType = classCache.forName(type);
+
+            if (!fieldType.isInstance(embedded))
+                throw new RuntimeException(
+                        String
+                                .format(
+                                        "Unable to inject component '%s' into 
field %s of component %s.  Class %s is not assignable to a field of type %s.",
+                                        componentId, fieldName, 
resources.getCompleteId(), embedded.getClass()
+                                                .getName(), 
fieldType.getName()));
+        }
+
+        public Object get()
+        {
+            return embedded;
+        }
+    }
+
     private final ComponentClassCache classCache;
 
     public InjectComponentWorker(ComponentClassCache classCache)
@@ -59,35 +108,7 @@
             {
                 public FieldValueConduit get(final ComponentResources 
resources)
                 {
-                    return new ReadOnlyFieldValueConduit(resources, fieldName)
-                    {
-                        private Component embedded;
-
-                        {
-                            resources.addPageLifecycleListener(new 
PageLifecycleAdapter()
-                            {
-                                public void containingPageDidLoad()
-                                {
-                                    embedded = 
resources.getEmbeddedComponent(componentId);
-
-                                    Class fieldType = classCache.forName(type);
-
-                                    if (!fieldType.isInstance(embedded))
-                                        throw new RuntimeException(
-                                                String
-                                                        .format(
-                                                                "Unable to 
inject component '%s' into field %s of component %s.  Class %s is not 
assignable to a field of type %s.",
-                                                                componentId, 
fieldName, resources.getCompleteId(),
-                                                                
embedded.getClass().getName(), fieldType.getName()));
-                                };
-                            });
-                        }
-
-                        public Object get()
-                        {
-                            return embedded;
-                        }
-                    };
+                    return new InjectedComponentFieldValueConduit(resources, 
fieldName, type, componentId);
                 }
             };
 


Reply via email to