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/04 01:46:00 UTC

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

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);
                 }
             };