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