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 2010/01/22 17:30:24 UTC

svn commit: r902150 - in /tapestry/tapestry5/trunk/tapestry-core/src/main: java/org/apache/tapestry5/internal/transform/ java/org/apache/tapestry5/services/ resources/org/apache/tapestry5/internal/transform/

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-value=@Cached may only be used with methods that return values: %s
 cached-no-parameters=@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.