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.