Author: hlship
Date: Thu Sep 22 17:37:56 2005
New Revision: 291051

URL: http://svn.apache.org/viewcvs?rev=291051&view=rev
Log:
TAPESTRY-655: In some circumstances, using the classpath: or context: prefixes 
on paths fails to work

Added:
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ContextAssetFactoryTest.java
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/base-resource.txt
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/base-resource_fr.txt
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/relative-resource.txt
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/relative-resource_fr.txt
Modified:
    
jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/workbench.application
    jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetFactory.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetMessages.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetSourceImpl.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetStrings.properties
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ClasspathAssetFactory.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/DefaultAssetFactory.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/PrivateAsset.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/pageload/PageLoader.java
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/TestAssetSource.java
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/app/RelativeAssets.page
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/wml/Home.page
    jakarta/tapestry/trunk/status.xml

Modified: 
jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/workbench.application
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/workbench.application?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/workbench.application
 (original)
+++ 
jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/workbench.application
 Thu Sep 22 17:37:56 2005
@@ -27,6 +27,6 @@
   
   <extension name="org.apache.tapestry.request-decoder" 
class="org.apache.tapestry.workbench.RequestDecoder"/>
          
-  <library id="contrib" 
specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
+  <library id="contrib" 
specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>
   
 </application>

Modified: 
jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml 
(original)
+++ jakarta/tapestry/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml 
Thu Sep 22 17:37:56 2005
@@ -61,9 +61,9 @@
     
     <invoke-factory>
       <construct class="ContextAssetFactory">
-        <set-service property="context" 
service-id="tapestry.globals.WebContext"/>
+        <set-service property="classpathAssetFactory" 
service-id="ClasspathAssetFactory"/>
         <set-object property="contextPath" value="infrastructure:contextPath"/>
-        <set-object property="assetService" value="engine-service:asset"/>
+        <set-service property="webContext" 
service-id="tapestry.globals.WebContext"/>
       </construct>
     </invoke-factory>
     

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetFactory.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetFactory.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetFactory.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetFactory.java
 Thu Sep 22 17:37:56 2005
@@ -30,7 +30,7 @@
 public interface AssetFactory
 {
     /**
-     * Creates a new asset.
+     * Creates a new asset relative to an existing asset.
      * 
      * @param baseResource
      *            the base resource from which an asset path may be 
calculated. Each type of asset
@@ -49,6 +49,19 @@
      *             if no matching asset may be found.
      */
     public IAsset createAsset(Resource baseResource, String path, Locale 
locale, Location location);
+
+    /**
+     * Creates a new asset relative to the root of the domain defined by the 
type of asset.
+     * 
+     * @param path
+     *            the absolute path for the resource
+     * @param locale
+     *            the locale to localize the asset to, or null for no 
localization
+     * @param location
+     *            the location used to report any errors
+     * @return an [EMAIL PROTECTED] IAsset}
+     */
+    public IAsset createAbsoluteAsset(String path, Locale locale, Location 
location);
 
     /**
      * Creates a new asset based on a known resource.

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetMessages.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetMessages.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetMessages.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetMessages.java
 Thu Sep 22 17:37:56 2005
@@ -51,4 +51,14 @@
     {
         return _formatter.format("exception-report-title", path);
     }
+
+    static String missingClasspathResource(String path)
+    {
+        return _formatter.format("missing-classpath-resource", path);
+    }
+
+    static String missingContextResource(String path)
+    {
+        return _formatter.format("missing-context-resource", path);
+    }
 }

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetSourceImpl.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetSourceImpl.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetSourceImpl.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetSourceImpl.java
 Thu Sep 22 17:37:56 2005
@@ -20,6 +20,7 @@
 import java.util.Locale;
 import java.util.Map;
 
+import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.Location;
 import org.apache.hivemind.Resource;
 import org.apache.hivemind.util.Defense;
@@ -80,6 +81,11 @@
 
             truePath = path;
         }
+
+        if (truePath.startsWith("/"))
+            return factory.createAbsoluteAsset(truePath, locale, location);
+
+        // This can happen when a 3.0 DTD is read in
 
         return factory.createAsset(base, truePath, locale, location);
     }

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetStrings.properties
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetStrings.properties?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetStrings.properties
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/AssetStrings.properties
 Thu Sep 22 17:37:56 2005
@@ -12,8 +12,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-missing-asset=Unable to locate asset ''{0}'' relative to {1}.
+missing-classpath-resource=Missing classpath resource ''{0}''.
+missing-context-resource=Missing context resource ''{0}''.
+missing-asset=Unable to locate resource ''{0}'' relative to {1}.
 no-such-resource=Classpath resource ''{0}'' does not exist.
 unable-to-read-resource=Unable to read classpath resource ''{0}'': {1}
 exception-report-title=Failure to export classpath resource {0}.
-md5-mismatch=The MD5 digest provided in the request does not match the actual 
value for classpath resource ''{0}''.
\ No newline at end of file
+md5-mismatch=The MD5 digest provided in the request does not match the actual 
value for classpath resource ''{0}''.

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ClasspathAssetFactory.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ClasspathAssetFactory.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ClasspathAssetFactory.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ClasspathAssetFactory.java
 Thu Sep 22 17:37:56 2005
@@ -17,6 +17,7 @@
 import java.util.Locale;
 
 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;
@@ -32,6 +33,8 @@
  */
 public class ClasspathAssetFactory implements AssetFactory
 {
+    private ClassResolver _classResolver;
+
     private IEngineService _assetService;
 
     public IAsset createAsset(Resource baseResource, String path, Locale 
locale, Location location)
@@ -43,7 +46,19 @@
             throw new 
ApplicationRuntimeException(AssetMessages.missingAsset(path, baseResource),
                     location, null);
 
-        return new PrivateAsset((ClasspathResource) localized, _assetService, 
location);
+        return createAsset(localized, location);
+    }
+
+    public IAsset createAbsoluteAsset(String path, Locale locale, Location 
location)
+    {
+        Resource base = new ClasspathResource(_classResolver, path);
+        Resource localized = base.getLocalization(locale);
+
+        if (localized == null)
+            throw new 
ApplicationRuntimeException(AssetMessages.missingClasspathResource(path),
+                    location, null);
+
+        return createAsset(localized, location);
     }
 
     public IAsset createAsset(Resource resource, Location location)
@@ -56,5 +71,10 @@
     public void setAssetService(IEngineService assetService)
     {
         _assetService = assetService;
+    }
+
+    public void setClassResolver(ClassResolver classResolver)
+    {
+        _classResolver = classResolver;
     }
 }

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java
 Thu Sep 22 17:37:56 2005
@@ -17,42 +17,39 @@
 import java.util.Locale;
 
 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.IAsset;
-import org.apache.tapestry.engine.IEngineService;
 import org.apache.tapestry.web.WebContext;
 import org.apache.tapestry.web.WebContextResource;
 
 /**
- * For the moment, all "context:" prefixed asset paths are interpreted 
relative to the web context
- * (the web application's root folder).
+ * All "context:" prefixed asset paths are interpreted relative to the web 
context (the web
+ * application's root folder).
  * 
  * @author Howard M. Lewis Ship
  * @since 4.0
  */
 public class ContextAssetFactory implements AssetFactory
 {
-    private WebContext _context;
-
     private String _contextPath;
 
-    private Resource _servletRoot;
-
-    private ClassResolver _classResolver;
+    private AssetFactory _classpathAssetFactory;
 
-    private IEngineService _assetService;
+    private WebContext _webContext;
 
-    public void initializeService()
+    public void setWebContext(WebContext webContext)
     {
-        _servletRoot = new WebContextResource(_context, "/");
+        _webContext = webContext;
     }
 
     public IAsset createAsset(Resource baseResource, String path, Locale 
locale, Location location)
     {
-        Resource assetResource = _servletRoot.getRelativeResource(path);
+        // We always create a new asset relative to an existing resource; the 
type of resource
+        // will jive with the type of asset returned. Path may start with a 
leading slash, which
+        // yields an absolute, not relative, path to the resource.
+
+        Resource assetResource = baseResource.getRelativeResource(path);
 
         // Here's the thing; In Tapestry 3.0 and earlier, you could specify
         // library path like /org/apache/tapestry/contrib/Contrib.library. In 
the new scheme
@@ -60,28 +57,32 @@
         // But to keep a lot of things from breaking, we'll kludgely allow 
that here.
 
         if (assetResource.getResourceURL() == null && path.startsWith("/"))
-        {
-            ClasspathResource resource = new ClasspathResource(_classResolver, 
path);
-            return new PrivateAsset(resource, _assetService, location);
-        }
+            return _classpathAssetFactory.createAbsoluteAsset(path, locale, 
location);
 
         Resource localized = assetResource.getLocalization(locale);
 
         if (localized == null)
-            throw new 
ApplicationRuntimeException(AssetMessages.missingAsset(path, _servletRoot),
+            throw new 
ApplicationRuntimeException(AssetMessages.missingAsset(path, baseResource),
                     location, null);
 
-        return new ContextAsset(_contextPath, localized, location);
+        return createAsset(localized, location);
     }
 
-    public IAsset createAsset(Resource resource, Location location)
+    public IAsset createAbsoluteAsset(String path, Locale locale, Location 
location)
     {
-        return new ContextAsset(_contextPath, resource, location);
+        Resource base = new WebContextResource(_webContext, path);
+        Resource localized = base.getLocalization(locale);
+
+        if (localized == null)
+            throw new 
ApplicationRuntimeException(AssetMessages.missingContextResource(path),
+                    location, null);
+
+        return createAsset(localized, location);
     }
 
-    public void setContext(WebContext context)
+    public IAsset createAsset(Resource resource, Location location)
     {
-        _context = context;
+        return new ContextAsset(_contextPath, resource, location);
     }
 
     public void setContextPath(String contextPath)
@@ -89,13 +90,8 @@
         _contextPath = contextPath;
     }
 
-    public void setAssetService(IEngineService assetService)
-    {
-        _assetService = assetService;
-    }
-
-    public void setClassResolver(ClassResolver classResolver)
+    public void setClasspathAssetFactory(AssetFactory classpathAssetFactory)
     {
-        _classResolver = classResolver;
+        _classpathAssetFactory = classpathAssetFactory;
     }
 }

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/DefaultAssetFactory.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/DefaultAssetFactory.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/DefaultAssetFactory.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/DefaultAssetFactory.java
 Thu Sep 22 17:37:56 2005
@@ -40,4 +40,9 @@
         return new ExternalAsset(resource.getPath(), location);
     }
 
+    public IAsset createAbsoluteAsset(String path, Locale locale, Location 
location)
+    {
+        return new ExternalAsset(path, location);
+    }
+
 }

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/PrivateAsset.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/PrivateAsset.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/PrivateAsset.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/asset/PrivateAsset.java
 Thu Sep 22 17:37:56 2005
@@ -90,9 +90,7 @@
         }
         catch (Exception ex)
         {
-            throw new ApplicationRuntimeException(Tapestry.format(
-                    "PrivateAsset.resource-missing",
-                    location), ex);
+            throw new 
ApplicationRuntimeException(AssetMessages.noSuchResource(location.getPath()));
         }
     }
 

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/pageload/PageLoader.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/pageload/PageLoader.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/pageload/PageLoader.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/pageload/PageLoader.java
 Thu Sep 22 17:37:56 2005
@@ -24,7 +24,9 @@
 import org.apache.hivemind.ClassResolver;
 import org.apache.hivemind.HiveMind;
 import org.apache.hivemind.Location;
+import org.apache.hivemind.Resource;
 import org.apache.hivemind.service.ThreadLocale;
+import org.apache.hivemind.util.ContextResource;
 import org.apache.tapestry.AbstractComponent;
 import org.apache.tapestry.BaseComponent;
 import org.apache.tapestry.IAsset;
@@ -56,6 +58,7 @@
 import org.apache.tapestry.spec.IContainedComponent;
 import org.apache.tapestry.spec.IListenerBindingSpecification;
 import org.apache.tapestry.spec.IParameterSpecification;
+import org.apache.tapestry.web.WebContextResource;
 
 /**
  * Runs the process of building the component hierarchy for an entire page.
@@ -705,7 +708,7 @@
     }
 
     /**
-     * Builds an instance of [EMAIL PROTECTED] IAsset}from the specification.
+     * Builds an instance of [EMAIL PROTECTED] IAsset} from the specification.
      */
 
     private IAsset convertAsset(IAssetSpecification spec)
@@ -714,7 +717,21 @@
         String path = spec.getPath();
         Location location = spec.getLocation();
 
-        return _assetSource.findAsset(location.getResource(), path, _locale, 
location);
+        Resource specResource = location.getResource();
+
+        // And ugly, ugly kludge. For page and component specifications in the
+        // context (typically, somewhere under WEB-INF), we evaluate them
+        // relative the web application root.
+
+        if (isContextResource(specResource))
+            specResource = specResource.getRelativeResource("/");
+
+        return _assetSource.findAsset(specResource, path, _locale, location);
+    }
+
+    private boolean isContextResource(Resource resource)
+    {
+        return (resource instanceof WebContextResource) || (resource 
instanceof ContextResource);
     }
 
     /** @since 4.0 */

Added: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java?rev=291051&view=auto
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java
 (added)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java
 Thu Sep 22 17:37:56 2005
@@ -0,0 +1,150 @@
+// Copyright 2005 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

+//

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+

+package org.apache.tapestry.asset;

+

+import java.util.Locale;

+

+import org.apache.hivemind.ApplicationRuntimeException;

+import org.apache.hivemind.Location;

+import org.apache.hivemind.Resource;

+import org.apache.hivemind.test.HiveMindTestCase;

+import org.apache.hivemind.util.ClasspathResource;

+import org.apache.tapestry.IAsset;

+import org.apache.tapestry.engine.IEngineService;

+

+/**

+ * Tests for [EMAIL PROTECTED] 
org.apache.tapestry.asset.ClasspathAssetFactory}.

+ * 

+ * @author Howard M. Lewis Ship

+ */

+public class ClasspathAssetFactoryTest extends HiveMindTestCase

+{

+    public void testCreateAsset()

+    {

+        IEngineService assetService = newService();

+        Location l = newLocation();

+

+        replayControls();

+

+        ClasspathAssetFactory factory = new ClasspathAssetFactory();

+        factory.setClassResolver(getClassResolver());

+        factory.setAssetService(assetService);

+

+        Resource base = newBaseResource();

+

+        IAsset asset = factory.createAsset(base, "relative-resource.txt", 
Locale.FRENCH, l);

+

+        assertTrue(asset instanceof PrivateAsset);

+        assertEquals("/org/apache/tapestry/asset/relative-resource_fr.txt", 
asset

+                .getResourceLocation().getPath());

+        assertSame(l, asset.getLocation());

+

+        verifyControls();

+    }

+

+    public void testCreateAssetMissing()

+    {

+        IEngineService assetService = newService();

+        Location l = newLocation();

+

+        replayControls();

+

+        ClasspathAssetFactory factory = new ClasspathAssetFactory();

+        factory.setClassResolver(getClassResolver());

+        factory.setAssetService(assetService);

+

+        Resource base = newBaseResource();

+

+        try

+        {

+            factory.createAsset(base, "does-not-exist.txt", Locale.ENGLISH, l);

+            unreachable();

+        }

+        catch (ApplicationRuntimeException ex)

+        {

+            assertEquals(

+                    "Unable to locate resource 'does-not-exist.txt' relative 
to classpath:/org/apache/tapestry/asset/base-resource.txt.",

+                    ex.getMessage());

+            assertSame(l, ex.getLocation());

+        }

+

+        verifyControls();

+    }

+

+    public void testCreateAbsoluteAsset()

+    {

+        IEngineService assetService = newService();

+        Location l = newLocation();

+

+        replayControls();

+

+        ClasspathAssetFactory factory = new ClasspathAssetFactory();

+        factory.setClassResolver(getClassResolver());

+        factory.setAssetService(assetService);

+

+        IAsset asset = factory.createAbsoluteAsset(

+                "/org/apache/tapestry/asset/relative-resource.txt",

+                Locale.FRENCH,

+                l);

+

+        assertTrue(asset instanceof PrivateAsset);

+        assertEquals("/org/apache/tapestry/asset/relative-resource_fr.txt", 
asset

+                .getResourceLocation().getPath());

+        assertSame(l, asset.getLocation());

+

+        verifyControls();

+    }

+

+    public void testCreateAbsoluteAssetMissing()

+    {

+        IEngineService assetService = newService();

+        Location l = newLocation();

+

+        replayControls();

+

+        ClasspathAssetFactory factory = new ClasspathAssetFactory();

+        factory.setClassResolver(getClassResolver());

+        factory.setAssetService(assetService);

+

+        try

+        {

+            factory.createAbsoluteAsset(

+                    "/org/apache/tapestry/asset/does-not-exist.txt",

+                    Locale.ENGLISH,

+                    l);

+            unreachable();

+        }

+        catch (ApplicationRuntimeException ex)

+        {

+            assertEquals(

+                    "Missing classpath resource 
'/org/apache/tapestry/asset/does-not-exist.txt'.",

+                    ex.getMessage());

+            assertSame(l, ex.getLocation());

+        }

+

+        verifyControls();

+    }

+

+    private ClasspathResource newBaseResource()

+    {

+        return new ClasspathResource(getClassResolver(),

+                "/org/apache/tapestry/asset/base-resource.txt");

+    }

+

+    private IEngineService newService()

+    {

+        return (IEngineService) newMock(IEngineService.class);

+    }

+}


Added: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ContextAssetFactoryTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ContextAssetFactoryTest.java?rev=291051&view=auto
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ContextAssetFactoryTest.java
 (added)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/ContextAssetFactoryTest.java
 Thu Sep 22 17:37:56 2005
@@ -0,0 +1,198 @@
+// Copyright 2005 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

+//

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+

+package org.apache.tapestry.asset;

+

+import java.net.URL;

+import java.util.Locale;

+

+import org.apache.hivemind.ApplicationRuntimeException;

+import org.apache.hivemind.Location;

+import org.apache.hivemind.Resource;

+import org.apache.hivemind.test.HiveMindTestCase;

+import org.apache.tapestry.IAsset;

+import org.apache.tapestry.web.WebContext;

+

+public class ContextAssetFactoryTest extends HiveMindTestCase

+{

+    protected Resource newResource()

+    {

+        return (Resource) newMock(Resource.class);

+    }

+

+    protected URL newURL()

+    {

+        return getClass().getResource("base-resource.txt");

+    }

+

+    public void testCreateAsset()

+    {

+        Resource base = newResource();

+        Resource relative = newResource();

+        Resource localized = newResource();

+        Location l = newLocation();

+        URL url = newURL();

+

+        trainGetRelativeResource(base, "asset.png", relative);

+        trainGetResourceURL(relative, url);

+        trainGetLocalization(relative, Locale.FRENCH, localized);

+

+        replayControls();

+

+        ContextAssetFactory factory = new ContextAssetFactory();

+

+        factory.setContextPath("/context");

+

+        IAsset asset = factory.createAsset(base, "asset.png", Locale.FRENCH, 
l);

+

+        assertTrue(asset instanceof ContextAsset);

+        assertSame(localized, asset.getResourceLocation());

+        assertSame(l, asset.getLocation());

+

+        verifyControls();

+    }

+

+    public void testCreateAssetMissing()

+    {

+        Resource base = newResource();

+        Resource relative = newResource();

+        Location l = newLocation();

+        trainGetRelativeResource(base, "asset.png", relative);

+        trainGetResourceURL(relative, null);

+        trainGetLocalization(relative, Locale.FRENCH, null);

+

+        replayControls();

+

+        ContextAssetFactory factory = new ContextAssetFactory();

+

+        factory.setContextPath("/context");

+

+        try

+        {

+            factory.createAsset(base, "asset.png", Locale.FRENCH, l);

+            unreachable();

+        }

+        catch (ApplicationRuntimeException ex)

+        {

+            assertEquals(

+                    "Unable to locate resource 'asset.png' relative to 
EasyMock for interface org.apache.hivemind.Resource.",

+                    ex.getMessage());

+            assertSame(l, ex.getLocation());

+        }

+

+        verifyControls();

+    }

+

+    public void testCreateAssetForClasspath()

+    {

+        Resource base = newResource();

+        Resource relative = newResource();

+        Location l = newLocation();

+        AssetFactory classpathFactory = (AssetFactory) 
newMock(AssetFactory.class);

+        IAsset asset = (IAsset) newMock(IAsset.class);

+

+        trainGetRelativeResource(base, "/asset.png", relative);

+        trainGetResourceURL(relative, null);

+

+        classpathFactory.createAbsoluteAsset("/asset.png", Locale.FRENCH, l);

+        getControl(classpathFactory).setReturnValue(asset);

+

+        replayControls();

+

+        ContextAssetFactory factory = new ContextAssetFactory();

+

+        factory.setContextPath("/context");

+        factory.setClasspathAssetFactory(classpathFactory);

+

+        assertSame(asset, factory.createAsset(base, "/asset.png", 
Locale.FRENCH, l));

+

+        verifyControls();

+    }

+

+    public void testCreateAbsoluteAsset()

+    {

+        Location l = newLocation();

+        URL url = newURL();

+        WebContext context = (WebContext) newMock(WebContext.class);

+

+        trainGetResource(context, "/asset_fr.png", url);

+

+        replayControls();

+

+        ContextAssetFactory factory = new ContextAssetFactory();

+

+        factory.setContextPath("/context");

+        factory.setWebContext(context);

+

+        IAsset asset = factory.createAbsoluteAsset("/asset.png", 
Locale.FRENCH, l);

+

+        assertTrue(asset instanceof ContextAsset);

+        assertEquals("/asset_fr.png", asset.getResourceLocation().getPath());

+        assertSame(l, asset.getLocation());

+

+        verifyControls();

+    }

+

+    public void testCreateAbsoluteAssetMissing()

+    {

+        Location l = newLocation();

+        WebContext context = (WebContext) newMock(WebContext.class);

+

+        trainGetResource(context, "/asset_fr.png", null);

+        trainGetResource(context, "/asset.png", null);

+

+        replayControls();

+

+        ContextAssetFactory factory = new ContextAssetFactory();

+

+        factory.setContextPath("/context");

+        factory.setWebContext(context);

+

+        try

+        {

+            factory.createAbsoluteAsset("/asset.png", Locale.FRENCH, l);

+            unreachable();

+        }

+        catch (ApplicationRuntimeException ex)

+        {

+            assertEquals("Missing context resource '/asset.png'.", 
ex.getMessage());

+            assertSame(l, ex.getLocation());

+        }

+        verifyControls();

+    }

+

+    private void trainGetLocalization(Resource resource, Locale locale, 
Resource localized)

+    {

+        resource.getLocalization(locale);

+        getControl(resource).setReturnValue(localized);

+    }

+

+    protected void trainGetResourceURL(Resource resource, URL url)

+    {

+        resource.getResourceURL();

+        getControl(resource).setReturnValue(url);

+    }

+

+    protected void trainGetResource(WebContext context, String path, URL url)

+    {

+        context.getResource(path);

+        getControl(context).setReturnValue(url);

+    }

+

+    protected void trainGetRelativeResource(Resource base, String path, 
Resource relative)

+    {

+        base.getRelativeResource(path);

+        getControl(base).setReturnValue(relative);

+    }

+}


Modified: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/TestAssetSource.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/TestAssetSource.java?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/TestAssetSource.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/TestAssetSource.java
 Thu Sep 22 17:37:56 2005
@@ -70,7 +70,7 @@
 
     public void testKnownPrefix()
     {
-        Location l = fabricateLocation(17);
+        Location l = newLocation();
 
         Resource r = newResource();
         IAsset asset = newAsset();

Added: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/base-resource.txt
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/base-resource.txt?rev=291051&view=auto
==============================================================================
    (empty)

Added: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/base-resource_fr.txt
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/base-resource_fr.txt?rev=291051&view=auto
==============================================================================
    (empty)

Added: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/relative-resource.txt
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/relative-resource.txt?rev=291051&view=auto
==============================================================================
    (empty)

Added: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/relative-resource_fr.txt
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/asset/relative-resource_fr.txt?rev=291051&view=auto
==============================================================================
    (empty)

Modified: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/app/RelativeAssets.page
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/app/RelativeAssets.page?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/app/RelativeAssets.page
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/app/RelativeAssets.page
 Thu Sep 22 17:37:56 2005
@@ -22,6 +22,6 @@
 <page-specification class="org.apache.tapestry.html.BasePage">
 
   <private-asset name="private" resource-path="images/PrivateAsset.gif"/>
-  <context-asset name="context" path="images/ContextAsset.gif"/>
+  <context-asset name="context" path="/images/ContextAsset.gif"/>
     
 </page-specification>

Modified: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/wml/Home.page
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/wml/Home.page?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/wml/Home.page
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/junit/mock/wml/Home.page
 Thu Sep 22 17:37:56 2005
@@ -21,7 +21,7 @@
 
 <page-specification class="org.apache.tapestry.junit.mock.wml.Home">
 
-    <context-asset name="image" path="images/image.wbmp"/>
+    <context-asset name="image" path="/images/image.wbmp"/>
 
     <property-specification name="u" type="java.lang.String" persistent="yes" 
initial-value='"newbie"'/>
     <property-specification name="l" type="java.lang.String" persistent="yes" 
initial-value='"option_one"'/>

Modified: jakarta/tapestry/trunk/status.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=291051&r1=291050&r2=291051&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Thu Sep 22 17:37:56 2005
@@ -65,7 +65,8 @@
       <action type="fix" dev="DS" fixes-bug="TAPESTRY-485" due-to="Pierre-Yves 
Nicolas">Document Upload component</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-660">Injecting meta 
data generates incorrect code for boolean properties</action>
       <action type="update" dev="HLS">Improve exception reporting of certain 
objects, including object arrays</action>
-      <action type="update" dev="HLS" fixes-bug="TAPESTRY-639">Expose the 
ServletContext as service tapestry.globals.ServletContext</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-639">Expose the 
ServletContext as service tapestry.globals.ServletContext</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-655">In some 
circumstances, using the classpath: or context: prefixes on paths fails to 
work</action>
     </release>
     <release version="4.0-beta-7" date="Sep 17 2005">
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-341">Need better 
line-precise reporting for listener method</action>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to