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