Author: hlship
Date: Fri Jan 22 16:30:24 2010
New Revision: 902150

URL: http://svn.apache.org/viewvc?rev=902150&view=rev
Log:
Change InjectContainerWorker to obtain (and validate) the container indirectly, 
via a ComponentValueProvider

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/TransformMessages.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java?rev=902150&r1=902149&r2=902150&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/InjectContainerWorker.java
 Fri Jan 22 16:30:24 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007, 2008 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 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,76 +14,67 @@
 
 package org.apache.tapestry5.internal.transform;
 
+import java.util.List;
+
+import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.annotations.InjectContainer;
-import org.apache.tapestry5.ioc.util.BodyBuilder;
+import org.apache.tapestry5.internal.services.ComponentClassCache;
 import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.runtime.Component;
 import org.apache.tapestry5.services.ClassTransformation;
 import org.apache.tapestry5.services.ComponentClassTransformWorker;
+import org.apache.tapestry5.services.ComponentValueProvider;
 import org.apache.tapestry5.services.TransformConstants;
 
-import java.util.List;
-
 /**
- * Identifies the {...@link org.apache.tapestry5.annotations.InjectContainer} 
annotation and adds code to initialize it to
+ * Identifies the {...@link org.apache.tapestry5.annotations.InjectContainer} 
annotation and adds code
+ * to initialize it to
  * the core component.
  */
 public class InjectContainerWorker implements ComponentClassTransformWorker
 {
+    private final ComponentClassCache cache;
+
+    public InjectContainerWorker(ComponentClassCache cache)
+    {
+        this.cache = cache;
+    }
 
     public void transform(ClassTransformation transformation, 
MutableComponentModel model)
     {
         List<String> names = 
transformation.findFieldsWithAnnotation(InjectContainer.class);
 
-        if (names.isEmpty())
-            return;
-
-        // I can't imagine a scenario where a component would have more than 
one
-        // field with InjectComponent, but that's the way these APIs work, 
lists of names.
-
-        BodyBuilder builder = new BodyBuilder();
-        builder.begin();
-
-        builder.addln("%s container = %s.getContainer();", 
Component.class.getName(), transformation
-                .getResourcesFieldName());
-
-        for (String fieldName : names)
+        for (final String fieldName : names)
         {
-            InjectContainer annotation = transformation.getFieldAnnotation(
-                    fieldName,
-                    InjectContainer.class);
-
-            transformation.claimField(fieldName, annotation);
-            
-            String fieldType = transformation.getFieldType(fieldName);
-
-            builder.addln("try");
-            builder.begin();
-            builder.addln("this.%s = (%s) container;", fieldName, fieldType);
-            builder.end();
-            builder.addln("catch (ClassCastException ex)");
-            builder.begin();
-            builder.addln(
-                    "String message = %s.buildCastExceptionMessage(container, 
\"%s.%s\", \"%s\");",
-                    InjectContainerWorker.class.getName(),
-                    model.getComponentClassName(),
-                    fieldName,
-                    fieldType);
-            builder.addln("throw new RuntimeException(message, ex);");
-            builder.end();
-
-            transformation.makeReadOnly(fieldName);
-        }
+            final String fieldTypeName = 
transformation.getFieldType(fieldName);
 
-        builder.end();
+            final String componentClassName = model.getComponentClassName();
 
-        
transformation.extendMethod(TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE,
 builder
-                .toString());
-    }
+            ComponentValueProvider<Object> provider = new 
ComponentValueProvider<Object>()
+            {
+                @Override
+                public Object get(ComponentResources resources)
+                {
+                    Component container = resources.getContainer();
+
+                    Class fieldType = cache.forName(fieldTypeName);
+
+                    if (!fieldType.isInstance(container))
+                    {
+                        String message = String.format(
+                                "Component %s is not assignable to field %s.%s 
(of type %s).",
+                                
container.getComponentResources().getCompleteId(),
+                                componentClassName, fieldName, fieldTypeName);
+
+                        throw new RuntimeException(message);
+                    }
+
+                    return container;
+                }
+            };
 
-    public static String buildCastExceptionMessage(Component component, String 
fieldName,
-                                                   String fieldType)
-    {
-        return TransformMessages.componentNotAssignableToField(component, 
fieldName, fieldType);
+            transformation.assignFieldIndirect(fieldName,
+                    TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE, 
provider);
+        }
     }
 }

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=902150&r1=902149&r2=902150&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 Jan 22 16:30:24 2010
@@ -1,4 +1,4 @@
-// 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.
@@ -16,12 +16,11 @@
 
 import java.util.List;
 
+import org.apache.tapestry5.annotations.MixinClasses;
 import org.apache.tapestry5.ioc.Messages;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.internal.util.MessagesImpl;
-import org.apache.tapestry5.runtime.Component;
 import org.apache.tapestry5.services.TransformMethodSignature;
-import org.apache.tapestry5.annotations.MixinClasses;
 
 class TransformMessages
 {
@@ -32,12 +31,6 @@
         return MESSAGES.format("field-injection-error", className, fieldName, 
cause);
     }
 
-    static String componentNotAssignableToField(Component component, String 
fieldName, String fieldType)
-    {
-        return MESSAGES.format("component-not-assignable-to-field", component
-                .getComponentResources().getCompleteId(), fieldName, 
fieldType);
-    }
-
     static String cachedMethodMustHaveReturnValue(TransformMethodSignature 
method)
     {
         return MESSAGES.format("cached-no-return-value", method);

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=902150&r1=902149&r2=902150&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
 Fri Jan 22 16:30:24 2010
@@ -538,7 +538,7 @@
         configuration.add("OnEvent", new OnEventWorker());
         configuration.add("SupportsInformalParameters", new 
SupportsInformalParametersWorker());
         configuration.addInstance("InjectPage", InjectPageWorker.class);
-        configuration.add("InjectContainer", new InjectContainerWorker());
+        configuration.addInstance("InjectContainer", 
InjectContainerWorker.class);
         configuration.add("InjectComponent", new InjectComponentWorker());
         configuration.add("RenderCommand", new RenderCommandWorker());
 
@@ -2318,8 +2318,8 @@
         configuration.add(SymbolConstants.START_PAGE_NAME, "start");
 
         configuration.add(SymbolConstants.DEFAULT_JAVASCRIPT,
-                       "classpath:/org/apache/tapestry5/tapestry.js");
-        
+                "classpath:/org/apache/tapestry5/tapestry.js");
+
         configuration.add(SymbolConstants.DEFAULT_STYLESHEET,
                 "classpath:/org/apache/tapestry5/default.css");
         configuration.add("tapestry.spacer-image", 
"classpath:/org/apache/tapestry5/spacer.gif");

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties?rev=902150&r1=902149&r2=902150&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/internal/transform/TransformStrings.properties
 Fri Jan 22 16:30:24 2010
@@ -13,7 +13,6 @@
 # limitations under the License.
 
 field-injection-error=Error obtaining injected value for field %s.%s: %s
-component-not-assignable-to-field=Component %s is not assignable to field %s 
(of type %s).
 cached-no-return-val...@cached may only be used with methods that return 
values: %s
 cached-no-paramete...@cached cannot be used with methods that accept 
parameters: %s
 illegal-number-of-page-activation-context-handlers=Illegal number of fields 
annotated with @PageActivationContext: %s. Only one field is allowed.


Reply via email to