You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2006/12/15 05:46:14 UTC
svn commit: r487444 - in /tapestry/tapestry4/trunk/tapestry-annotations/src:
descriptor/META-INF/ java/org/apache/tapestry/annotations/
test/org/apache/tapestry/annotations/
Author: jkuhnert
Date: Thu Dec 14 20:46:13 2006
New Revision: 487444
URL: http://svn.apache.org/viewvc?view=rev&rev=487444
Log:
Fixes TAPESTRY-1181.
InjectAssetWorker was being lazy and not checking the IComponentSpecification for a valid asset. Changed the
worker to run after the normal InjectAsset worker from core lib.
Modified:
tapestry/tapestry4/trunk/tapestry-annotations/src/descriptor/META-INF/hivemodule.xml
tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationMessages.java
tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationStrings.properties
tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/ComponentHousekeepingWorker.java
tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/InjectAssetAnnotationWorker.java
tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/AnnotatedPage.java
tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/TestInjectAssetAnnotationWorker.java
Modified: tapestry/tapestry4/trunk/tapestry-annotations/src/descriptor/META-INF/hivemodule.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-annotations/src/descriptor/META-INF/hivemodule.xml?view=diff&rev=487444&r1=487443&r2=487444
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-annotations/src/descriptor/META-INF/hivemodule.xml (original)
+++ tapestry/tapestry4/trunk/tapestry-annotations/src/descriptor/META-INF/hivemodule.xml Thu Dec 14 20:46:13 2006
@@ -48,10 +48,11 @@
<!-- Only contribute when in JDK 1.5 and java.lang.Annotation exists -->
<contribution configuration-id="tapestry.enhance.EnhancementWorkers" if="class java.lang.annotation.Annotation">
- <!-- Needs to come very much first, because some enhancements modify
+ <!-- Needs to come first because some enhancements modify
the component specification, affecting what occurs in later commands. -->
<command id="annotation-worker" object="service:AnnotationEnhancementWorker" before="*"/>
<command id="component-housekeeping-worker" object="service:ComponentHousekeepingWorker" after="annotation-worker"/>
+ <command id="inject-asset-annotation" object="service:InjectAssetAnnotationWorker" after="tapestry.enhance.inject-asset"/>
</contribution>
<configuration-point id="ClassWorkers">
@@ -125,7 +126,6 @@
<worker annotation="InjectState" object="instance:InjectStateAnnotationWorker"/>
<worker annotation="InjectStateFlag" object="instance:InjectStateFlagAnnotationWorker"/>
- <worker annotation="InjectAsset" object="instance:InjectAssetAnnotationWorker"/>
<worker annotation="Persist" object="instance:PersistAnnotationWorker"/>
<worker annotation="Bean" object="instance:BeanAnnotationWorker"/>
<worker annotation="Asset" object="instance:AssetAnnotationWorker"/>
@@ -135,6 +135,16 @@
<worker annotation="InjectMeta" object="instance:InjectMetaAnnotationWorker"/>
<worker annotation="InjectScript" object="instance:InjectScriptAnnotationWorker"/>
</contribution>
+
+ <service-point id="InjectAssetAnnotationWorker" interface="org.apache.tapestry.enhance.EnhancementWorker">
+
+ Injects IAsset assets based on previously defined asset alias names. (such as in a .page or .jwc spec )
+
+ <invoke-factory>
+ <construct class="InjectAssetAnnotationWorker"/>
+ </invoke-factory>
+
+ </service-point>
<service-point id="InjectObjectAnnotationWorker" interface="MethodAnnotationEnhancementWorker">
Modified: tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationMessages.java?view=diff&rev=487444&r1=487443&r2=487444
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationMessages.java (original)
+++ tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationMessages.java Thu Dec 14 20:46:13 2006
@@ -17,6 +17,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
+import org.apache.hivemind.Location;
import org.apache.hivemind.impl.MessageFormatter;
import org.apache.hivemind.service.ClassFabUtils;
@@ -122,4 +123,9 @@
{
return _formatter.format("both-type-and-copy-of", id);
}
+
+ static String unknownAsset(String name, Location l)
+ {
+ return _formatter.format("missing-asset-property", name, l);
+ }
}
Modified: tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationStrings.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationStrings.properties?view=diff&rev=487444&r1=487443&r2=487444
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationStrings.properties (original)
+++ tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/AnnotationStrings.properties Thu Dec 14 20:46:13 2006
@@ -31,3 +31,4 @@
invalid-annotation-in-class=Annotation {0} is not allowed in a class (''{1}'') that implements the IPage interface.
unable-to-copy=Unable to copy component {0}, which does not exist.
both-type-and-copy-of=Annotation for component {0} contains both type and copy-of attributes.
+missing-asset-property=No asset has been mapped with a name of ''{0}'': {1}
Modified: tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/ComponentHousekeepingWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/ComponentHousekeepingWorker.java?view=diff&rev=487444&r1=487443&r2=487444
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/ComponentHousekeepingWorker.java (original)
+++ tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/ComponentHousekeepingWorker.java Thu Dec 14 20:46:13 2006
@@ -42,11 +42,13 @@
IContainedComponent cc = spec.getComponent(id);
String copyOf = cc.getCopyOf();
Collection bindingNames = cc.getBindingNames();
+
if (HiveMind.isNonBlank(copyOf) && bindingNames.size() == 0)
{
IContainedComponent source = spec.getComponent(copyOf);
if (source == null)
throw new ApplicationRuntimeException(AnnotationMessages.unableToCopy(copyOf));
+
AnnotationUtils.copyBindings(source, cc);
}
}
Modified: tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/InjectAssetAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/InjectAssetAnnotationWorker.java?view=diff&rev=487444&r1=487443&r2=487444
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/InjectAssetAnnotationWorker.java (original)
+++ tapestry/tapestry4/trunk/tapestry-annotations/src/java/org/apache/tapestry/annotations/InjectAssetAnnotationWorker.java Thu Dec 14 20:46:13 2006
@@ -16,9 +16,15 @@
import java.lang.reflect.Method;
+import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.ClassResolver;
import org.apache.hivemind.Location;
+import org.apache.hivemind.Resource;
+import org.apache.hivemind.util.ClasspathResource;
import org.apache.tapestry.enhance.EnhancementOperation;
+import org.apache.tapestry.enhance.EnhancementWorker;
import org.apache.tapestry.enhance.InjectAssetWorker;
+import org.apache.tapestry.spec.IAssetSpecification;
import org.apache.tapestry.spec.IComponentSpecification;
/**
@@ -29,10 +35,12 @@
* @see org.apache.tapestry.annotations.InjectAsset
* @see org.apache.tapestry.enhance.InjectAssetWorker
*/
-public class InjectAssetAnnotationWorker implements MethodAnnotationEnhancementWorker
+public class InjectAssetAnnotationWorker implements EnhancementWorker
{
InjectAssetWorker _delegate;
-
+
+ private ClassResolver _classResolver;
+
InjectAssetAnnotationWorker(InjectAssetWorker delegate)
{
_delegate = delegate;
@@ -42,15 +50,48 @@
{
this(new InjectAssetWorker());
}
-
- public void performEnhancement(EnhancementOperation op, IComponentSpecification spec,
- Method method, Location location)
+
+ public void performEnhancement(EnhancementOperation op, IComponentSpecification spec)
+ {
+ Class clazz = op.getBaseClass();
+
+ Resource classResource = newClassResource(clazz);
+
+ for (Method m : clazz.getMethods())
+ {
+ if (m.getAnnotation(InjectAsset.class) != null) {
+
+ performEnhancement(op, spec, m,
+ AnnotationUtils.buildLocationForAnnotation(
+ m,
+ m.getAnnotation(InjectAsset.class),
+ classResource));
+ }
+ }
+ }
+
+ private ClasspathResource newClassResource(Class clazz)
+ {
+ return new ClasspathResource(_classResolver, clazz.getName().replace('.', '/'));
+ }
+
+ public void performEnhancement(EnhancementOperation op, IComponentSpecification spec, Method method, Location location)
{
InjectAsset as = method.getAnnotation(InjectAsset.class);
-
+
+ IAssetSpecification asset = spec.getAsset(as.value());
+ if (asset == null) {
+
+ throw new ApplicationRuntimeException(AnnotationMessages.unknownAsset(as.value(), location));
+ }
+
String propertyName = AnnotationUtils.getPropertyName(method);
-
+
_delegate.injectAsset(op, as.value(), propertyName, location);
}
+ public void setClassResolver(ClassResolver classResolver)
+ {
+ _classResolver = classResolver;
+ }
}
Modified: tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/AnnotatedPage.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/AnnotatedPage.java?view=diff&rev=487444&r1=487443&r2=487444
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/AnnotatedPage.java (original)
+++ tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/AnnotatedPage.java Thu Dec 14 20:46:13 2006
@@ -66,7 +66,10 @@
@InjectAsset("stylesheet")
public abstract IAsset getStylesheetAsset();
-
+
+ @InjectAsset("homageDeFred")
+ public abstract IAsset getUnknownAsset();
+
@InjectComponent("fred")
public abstract TextField getFredField();
Modified: tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/TestInjectAssetAnnotationWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/TestInjectAssetAnnotationWorker.java?view=diff&rev=487444&r1=487443&r2=487444
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/TestInjectAssetAnnotationWorker.java (original)
+++ tapestry/tapestry4/trunk/tapestry-annotations/src/test/org/apache/tapestry/annotations/TestInjectAssetAnnotationWorker.java Thu Dec 14 20:46:13 2006
@@ -21,11 +21,14 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.Location;
+import org.apache.hivemind.impl.DefaultClassResolver;
import org.apache.hivemind.service.MethodSignature;
import org.apache.tapestry.IAsset;
import org.apache.tapestry.enhance.EnhancementOperation;
import org.apache.tapestry.enhance.InjectAssetWorker;
+import org.apache.tapestry.spec.IAssetSpecification;
import org.apache.tapestry.spec.IComponentSpecification;
import org.testng.annotations.Test;
@@ -38,25 +41,25 @@
@Test
public class TestInjectAssetAnnotationWorker extends BaseAnnotationTestCase
{
- public void testDefault()
+ public void test_Default()
{
InjectAssetAnnotationWorker worker = new InjectAssetAnnotationWorker();
assertNotNull(worker._delegate);
}
- public void testDelegation()
+ public void test_Delegation()
{
Location l = newLocation();
-
EnhancementOperation op = newOp();
-
IComponentSpecification spec = newSpec();
-
InjectAssetWorker delegate = new InjectAssetWorker();
+ IAssetSpecification asset = newMock(IAssetSpecification.class);
Method m = findMethod(AnnotatedPage.class, "getStylesheetAsset");
+ expect(spec.getAsset("stylesheet")).andReturn(asset);
+
expect(op.getPropertyType("stylesheetAsset")).andReturn(IAsset.class);
op.claimReadonlyProperty("stylesheetAsset");
@@ -67,10 +70,40 @@
eq("return getAsset(\"stylesheet\");"), eq(l));
InjectAssetAnnotationWorker worker = new InjectAssetAnnotationWorker(delegate);
+ worker.setClassResolver(new DefaultClassResolver());
replay();
worker.performEnhancement(op, spec, m, l);
+
+ verify();
+ }
+
+ public void test_Unknown_Asset()
+ {
+ Location l = newLocation();
+ EnhancementOperation op = newOp();
+ IComponentSpecification spec = newSpec();
+ InjectAssetWorker delegate = new InjectAssetWorker();
+
+ Method m = findMethod(AnnotatedPage.class, "getUnknownAsset");
+
+ expect(spec.getAsset("homageDeFred")).andReturn(null);
+
+ InjectAssetAnnotationWorker worker = new InjectAssetAnnotationWorker(delegate);
+ worker.setClassResolver(new DefaultClassResolver());
+
+ replay();
+
+ try
+ {
+ worker.performEnhancement(op, spec, m, l);
+ unreachable();
+ }
+ catch (ApplicationRuntimeException ex)
+ {
+ assertTrue(ex.getMessage().startsWith("No asset has been mapped with a name of 'homageDeFred': "));
+ }
verify();
}