You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2006/04/16 02:10:22 UTC

svn commit: r394405 - in /tapestry/tapestry4/trunk: ./ framework/src/descriptor/META-INF/ framework/src/java/org/apache/tapestry/ajax/ framework/src/java/org/apache/tapestry/asset/ framework/src/java/org/apache/tapestry/engine/ framework/src/java/org/a...

Author: jkuhnert
Date: Sat Apr 15 17:10:20 2006
New Revision: 394405

URL: http://svn.apache.org/viewcvs?rev=394405&view=rev
Log:
Fixes for relative path resolution of dojo resources. 

Added:
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetComparator.java
Modified:
    tapestry/tapestry4/trunk/.checkstyle
    tapestry/tapestry4/trunk/.project
    tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml
    tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.services.xml
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/ajax/AjaxShellDelegate.java
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/ResourceDigestSourceImpl.java
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/RequestCycle.java
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/PropertySelection.script
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/html/Shell.jwc
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/util/QueryParameterMap.java
    tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java
    tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/TestUnprotectedAsset.java

Modified: tapestry/tapestry4/trunk/.checkstyle
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/.checkstyle?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/.checkstyle (original)
+++ tapestry/tapestry4/trunk/.checkstyle Sat Apr 15 17:10:20 2006
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<fileset-config file-format-version="1.2.0" simple-config="true">
-    <fileset name="all" enabled="true" check-config-name="Sun Checks" local="false">
-        <file-match-pattern match-pattern="." include-pattern="true"/>
-    </fileset>
-    <filter name="FilesFromPackage" enabled="true">
-        <filter-data value="framework/src/test"/>
-        <filter-data value="contrib/src/test"/>
-        <filter-data value="portlet/src/test"/>
-        <filter-data value="annotations/src/test"/>
-        <filter-data value="examples/Vlib/src/test"/>
-    </filter>
-    <filter name="NonSrcDirs" enabled="true"/>
-</fileset-config>
+<?xml version="1.0" encoding="UTF-8"?>
+<fileset-config file-format-version="1.2.0" simple-config="true">
+    <fileset name="all" enabled="true" check-config-name="tapestry" local="false">
+        <file-match-pattern match-pattern="." include-pattern="true"/>
+    </fileset>
+    <filter name="FilesFromPackage" enabled="true">
+        <filter-data value="framework/src/test"/>
+        <filter-data value="contrib/src/test"/>
+        <filter-data value="portlet/src/test"/>
+        <filter-data value="annotations/src/test"/>
+        <filter-data value="examples/Vlib/src/test"/>
+    </filter>
+    <filter name="NonSrcDirs" enabled="true"/>
+</fileset-config>

Modified: tapestry/tapestry4/trunk/.project
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/.project?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
Binary files - no diff available.

Modified: tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml (original)
+++ tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.asset.xml Sat Apr 15 17:10:20 2006
@@ -157,6 +157,11 @@
         <attribute name="contains" required="true" unique="true">
           The regexp pattern to match against.
         </attribute>
+        
+        <rules>
+            <push-attribute attribute="contains"/>
+            <invoke-parent method="addElement"/>
+        </rules>
       </element>
     </schema>    
   </configuration-point>
@@ -164,14 +169,7 @@
   <contribution configuration-id="UnprotectedAssets">
    List of unprotected asset regexps for ResourceMatcher service.
    
-   <unprotected-resource contains="org/apache/tapestry/html/dojo/**/*.js" />
-   <unprotected-resource contains="org/apache/tapestry/html/dojo/**/*.css" />
-   <unprotected-resource contains="org/apache/tapestry/html/dojo/**/*.html" />
-   <unprotected-resource contains="org/apache/tapestry/html/dojo/**/*.htm" />
-   <unprotected-resource contains="org/apache/tapestry/html/dojo/**/*.gif" />
-   <unprotected-resource contains="org/apache/tapestry/html/dojo/**/*.jpg" />
-   <unprotected-resource contains="org/apache/tapestry/html/dojo/**/*.svg" />
-   <unprotected-resource contains="org/apache/tapestry/html/dojo/**/*.png" />
+   <unprotected-resource contains="org/apache/tapestry/html/dojo*" />
   </contribution>
   
   <service-point id="UnprotectedResourceMatcher" interface="ResourceMatcher" >

Modified: tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.services.xml
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.services.xml?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.services.xml (original)
+++ tapestry/tapestry4/trunk/framework/src/descriptor/META-INF/tapestry.services.xml Sat Apr 15 17:10:20 2006
@@ -79,6 +79,7 @@
                 <set-object property="response" value="service:tapestry.globals.WebResponse" />
                 <set-service property="digestSource"
                     service-id="tapestry.asset.ResourceDigestSource" />
+                <set-service property="unprotectedMatcher" service-id="tapestry.asset.UnprotectedResourceMatcher" />
             </construct>
         </invoke-factory>
     </service-point>

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/ajax/AjaxShellDelegate.java
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/ajax/AjaxShellDelegate.java?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/ajax/AjaxShellDelegate.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/ajax/AjaxShellDelegate.java Sat Apr 15 17:10:20 2006
@@ -29,6 +29,8 @@
 {
     protected IAsset _dojoSource;
     
+    protected IAsset _dojoPath;
+    
     protected IEngineService _assetService;
     
     /**
@@ -36,17 +38,16 @@
      */
     public void render(IMarkupWriter writer, IRequestCycle cycle)
     {
-        // .append(" baseRelativePath:\"").append(_dojoSource.getResourceLocation().getRelativeResource("").getResourceURL())
         // first configure dojo, has to happen before package include
         StringBuffer str = new StringBuffer("<script type=\"text/javascript\">");
         str.append("djConfig = { isDebug: true,")
         .append(" baseRelativePath:\"")
-        .append(_dojoSource.getResourceLocation().getRelativeResource("").getResourceURL())
-        
+        .append(_assetService.getLink(true,
+                _dojoPath.getResourceLocation().getPath()).getAbsoluteURL())
         .append("\", preventBackButtonFix: false, parseWidgets: true };")
         .append(" </script>\n\n ");
         
-        //include the js package
+        // include the core dojo.js package
         str.append("<script type=\"text/javascript\" src=\"")
         .append(_assetService.getLink(true,
                 _dojoSource.getResourceLocation()
@@ -63,6 +64,15 @@
     public void setDojoSource(IAsset dojoSource)
     {
         _dojoSource = dojoSource;
+    }
+    
+    /**
+     * Sets the dojo baseRelativePath value.
+     * @param dojoPath
+     */
+    public void setDojoPath(IAsset dojoPath)
+    {
+        _dojoPath = dojoPath;
     }
     
     /**

Added: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetComparator.java
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetComparator.java?rev=394405&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetComparator.java (added)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetComparator.java Sat Apr 15 17:10:20 2006
@@ -0,0 +1,47 @@
+// Copyright Apr 15, 2006 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.Comparator;
+
+
+/**
+ * Used to guarantee that whenever present, the PATH key entry 
+ * of an asset service link is always appended last in that path
+ * string. This is required for certain relative url operations. (ie dojo baseRelativePath)
+ * 
+ * @author jkuhnert
+ */
+public class AssetComparator implements Comparator
+{
+
+    /** 
+     * {@inheritDoc}
+     */
+    public int compare(Object o1, Object o2)
+    {
+        if (!String.class.isInstance(o1) || !String.class.isInstance(o2))
+            return 1;
+        
+        String key1 = (String)o1;
+        String key2 = (String)o2;
+        
+        if (key1.toUpperCase().equals("PATH") && !key2.toUpperCase().equals("PATH"))
+            return 1;
+        else if (key2.toUpperCase().equals("PATH") && !key1.toUpperCase().equals("PATH"))
+            return -1;
+        else return key1.compareToIgnoreCase(key2);
+    }
+
+}

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/AssetService.java Sat Apr 15 17:10:20 2006
@@ -23,6 +23,7 @@
 import java.net.URLConnection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeMap;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -151,14 +152,14 @@
 
         String digest = _digestSource.getDigestForResource(path);
 
-        Map parameters = new HashMap();
-
+        Map parameters = new TreeMap(new AssetComparator());
+        
         parameters.put(ServiceConstants.SERVICE, getName());
         parameters.put(PATH, path);
         parameters.put(DIGEST, digest);
-
+        
         // Service is stateless, which is the exception to the rule.
-
+        
         return _linkFactory.constructLink(this, post, parameters, false);
     }
 
@@ -196,6 +197,7 @@
         String path = cycle.getParameter(PATH);
         String md5Digest = cycle.getParameter(DIGEST);
         boolean checkDigest = !_unprotectedMatcher.containsResource(path);
+        
         try
         {
             if (checkDigest
@@ -255,7 +257,12 @@
         //even if it doesn't exist in header the value will be -1, 
         //which means we need to write out the contents of the resource
         
-        long modify = Long.parseLong(_request.getHeader("If-Modified-Since"));
+        String header = _request.getHeader("If-Modified-Since");
+        long modify = -1;
+        
+        if (header != null)
+            modify = Long.parseLong(header);
+        
         if (resource.lastModified() > modify)
             return false;
         

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/ResourceDigestSourceImpl.java
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/ResourceDigestSourceImpl.java?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/ResourceDigestSourceImpl.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/asset/ResourceDigestSourceImpl.java Sat Apr 15 17:10:20 2006
@@ -55,6 +55,8 @@
 
     public synchronized String getDigestForResource(String resourcePath)
     {
+        if (resourcePath == null) return null;
+        
         String result = (String) _cache.get(resourcePath);
 
         if (result == null)

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/RequestCycle.java
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/RequestCycle.java?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/RequestCycle.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/RequestCycle.java Sat Apr 15 17:10:20 2006
@@ -292,8 +292,8 @@
 
     public void setResponseBuilder(ResponseBuilder builder)
     {
-        if (_responseBuilder != null)
-            throw new IllegalArgumentException("A ResponseBuilder has already been set on this response.");
+        //if (_responseBuilder != null)
+          //  throw new IllegalArgumentException("A ResponseBuilder has already been set on this response.");
         _responseBuilder = builder;
     }
     

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/PropertySelection.script
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/PropertySelection.script?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/PropertySelection.script (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/PropertySelection.script Sat Apr 15 17:10:20 2006
@@ -14,11 +14,51 @@
     </body>
     <initialization>
         dojo.event.connect(window, "onload", function() {
+            
+            var uriobj = new dojo.uri.Uri(dojo.hostenv.getBaseScriptUri().toString());
+            var relobj = new dojo.uri.Uri("src/widget/templates/HtmlComboBox.html");
+            dojo.debug("uri: " + uriobj);
+            dojo.debug("relobj: " + relobj);
+            dojo.debug("relobj.path is : " + relobj.path);
+            
+            dojo.debug("dojouri: " + dojo.uri.dojoUri("src/widget/templates/HtmlComboBox.html"));
+            
+            if (relobj.path == "" &amp;&amp; relobj.scheme == null &amp;&amp;
+                relobj.authority == null &amp;&amp; relobj.query == null) {
+                dojo.debug("hit null relobj stuff");
+                if (relobj.fragment != null) { uriobj.fragment = relobj.fragment; }
+                relobj = uriobj;
+            }
+            
+            if (relobj.path.charAt(0) != "/") {
+                        var path = uriobj.path.substring(0,
+                            uriobj.path.lastIndexOf("/") + 1) + relobj.path;
+
+                        var segs = path.split("/");
+                        for (var j = 0; j &lt; segs.length; j++) {
+                            if (segs[j] == ".") {
+                                if (j == segs.length - 1) { segs[j] = ""; }
+                                else { segs.splice(j, 1); j--; }
+                            } else if (j > 0 &amp;&amp; !(j == 1 &amp;&amp; segs[0] == "") &amp;&amp;
+                                segs[j] == ".." &amp;&amp; segs[j-1] != "..") {
+
+                                if (j == segs.length - 1) { segs.splice(j, 1); segs[j - 1] = ""; }
+                                else { segs.splice(j - 1, 2); j -= 2; }
+                            }
+                        }
+                        relobj.path = segs.join("/");
+            }
+            
+            dojo.debug("relobj.path is : " + relobj.path);
+            dojo.debug("relobj.scheme: " + relobj.scheme);
+            dojo.debug("relobj.authority: " + relobj.authority);
+            dojo.debug("relobj.query: " + relobj.query);
+            dojo.debug("relobj.fragment: " + relobj.fragment);
+            
             dojo.debug("Parsing combo box");
-            djConfig.searchIds.push("${select.getId()}");
-            dojo.debug("searchIds length:" + djConfig.searchIds.length);
-            djConfig.parseWidgets = true;
-            dojo.hostenv.makeWidgets();
+            // djConfig.searchIds.push("${select.getId()}");
+            // dojo.debug("searchIds length:" + djConfig.searchIds.length);
+            // dojo.hostenv.makeWidgets();
         });
     </initialization>
 </script>

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/html/Shell.jwc
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/html/Shell.jwc?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/html/Shell.jwc (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/html/Shell.jwc Sat Apr 15 17:10:20 2006
@@ -105,6 +105,14 @@
      </description>
   </parameter>
   
+  <parameter name="dojoPath" 
+             default-value="asset:defaultDojoPath" >
+     <description>
+     Specifies the default path to the root dojo folder, not the dojo.js file itself. This
+     is used by the djConfig.baseRelativePath javascript configuration variable in dojo.
+     </description>
+  </parameter>
+  
   <inject property="valueConverter" object="service:tapestry.coerce.ValueConverter"/>
   <inject property="pageService" object="engine-service:page"/>
   <inject property="applicationSpecification" object="infrastructure:applicationSpecification"/>
@@ -114,7 +122,9 @@
   <bean name="coreAjaxDelegate" class="org.apache.tapestry.ajax.AjaxShellDelegate">
    <set name="dojoSource" value="dojoSource" />
    <set name="assetService" value="assetService" />
+   <set name="dojoPath" value="dojoPath" />
   </bean>
   
   <asset name="defaultDojoSource" path="classpath:/org/apache/tapestry/html/dojo/dojo.js" />
+  <asset name="defaultDojoPath" path="classpath:/org/apache/tapestry/html/dojo/" />
 </component-specification>

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/util/QueryParameterMap.java
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/util/QueryParameterMap.java?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/util/QueryParameterMap.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/util/QueryParameterMap.java Sat Apr 15 17:10:20 2006
@@ -17,6 +17,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeMap;
 
 import org.apache.hivemind.util.Defense;
 
@@ -119,9 +120,10 @@
         int count = _parameters.size();
 
         String[] result = (String[]) _parameters.keySet().toArray(new String[count]);
-
-        Arrays.sort(result);
-
+        
+        if (!TreeMap.class.isInstance(_parameters))
+            Arrays.sort(result);
+        
         return result;
     }
 }

Modified: tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java (original)
+++ tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/ClasspathAssetFactoryTest.java Sat Apr 15 17:10:20 2006
@@ -19,6 +19,7 @@
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.Location;
 import org.apache.hivemind.Resource;
+import org.apache.hivemind.impl.LocationImpl;
 import org.apache.hivemind.test.HiveMindTestCase;
 import org.apache.hivemind.util.ClasspathResource;
 import org.apache.tapestry.IAsset;
@@ -142,6 +143,114 @@
         verifyControls();
     }
 
+    public void testCreateDirectoryAsset()
+    {
+        IEngineService assetService = newService();
+        Location l = newLocation();
+        
+        replayControls();
+        
+        ClasspathAssetFactory factory = new ClasspathAssetFactory();
+        factory.setClassResolver(getClassResolver());
+        factory.setAssetService(assetService);
+        factory.setLocalizer(new DefaultResourceLocalizer());
+        
+        String path = "/org/apache/tapestry/html/dojo";
+        
+        Resource subResource = new ClasspathResource(getClassResolver(), path);
+        IAsset asset = factory.createAsset(subResource, l);
+        
+        assertTrue(asset instanceof PrivateAsset);
+        assertEquals(path, asset
+                .getResourceLocation().getPath());
+        assertSame(l, asset.getLocation());
+        
+        verifyControls();
+    }
+    
+    public void testCreateRelativeDirectoryAsset()
+    {
+        IEngineService assetService = newService();
+        Resource shell = new ClasspathResource(getClassResolver(),
+            "/org/apache/tapestry/html/Shell.jwc");
+        Location l = new LocationImpl(shell);
+        
+        replayControls();
+        
+        ClasspathAssetFactory factory = new ClasspathAssetFactory();
+        factory.setClassResolver(getClassResolver());
+        factory.setAssetService(assetService);
+        factory.setLocalizer(new DefaultResourceLocalizer());
+        
+        String path = "/org/apache/tapestry/html/dojo/dojo.js";
+        
+        IAsset asset = factory.createAsset(shell, path, 
+                Locale.getDefault(),
+                l);
+        
+        assertTrue(asset instanceof PrivateAsset);
+        assertEquals(path, asset
+                .getResourceLocation().getPath());
+        assertSame(l, asset.getLocation());
+        
+        verifyControls();
+    }
+    
+    public void testCreateRelativeDirectoryMissingAsset()
+    {
+        IEngineService assetService = newService();
+        Resource shell = new ClasspathResource(getClassResolver(),
+            "/org/apache/tapestry/html/Shell.jwc");
+        Location l = new LocationImpl(shell);
+        
+        replayControls();
+        
+        ClasspathAssetFactory factory = new ClasspathAssetFactory();
+        factory.setClassResolver(getClassResolver());
+        factory.setAssetService(assetService);
+        factory.setLocalizer(new DefaultResourceLocalizer());
+        
+        String path = "/org/apache/tapestry/html/dojo/";
+        
+        IAsset asset = factory.createAsset(shell, path, 
+                Locale.getDefault(),
+                l);
+        
+        assertTrue(asset instanceof PrivateAsset);
+        assertEquals(path, asset
+                .getResourceLocation().getPath());
+        assertSame(l, asset.getLocation());
+        
+        verifyControls();
+    }
+    
+    /**
+     * Tests relative sub-directory paths.
+     */
+    public void testRelativeDirectoryPath()
+    {
+        IEngineService assetService = newService();
+        Location l = newLocation();
+        
+        replayControls();
+        
+        ClasspathAssetFactory factory = new ClasspathAssetFactory();
+        factory.setClassResolver(getClassResolver());
+        factory.setAssetService(assetService);
+        factory.setLocalizer(new DefaultResourceLocalizer());
+        
+        Resource subResource = new ClasspathResource(getClassResolver(),
+                "/org/apache/tapestry/asset/subresource/sub-resource.txt");
+        IAsset asset = factory.createAsset(subResource, l);
+        
+        assertTrue(asset instanceof PrivateAsset);
+        assertEquals("/org/apache/tapestry/asset/subresource/sub-resource.txt",
+                asset.getResourceLocation().getPath());
+        assertSame(l, asset.getLocation());
+        
+        verifyControls();
+    }
+    
     private ClasspathResource newBaseResource()
     {
         return new ClasspathResource(getClassResolver(),

Modified: tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/TestUnprotectedAsset.java
URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/TestUnprotectedAsset.java?rev=394405&r1=394404&r2=394405&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/TestUnprotectedAsset.java (original)
+++ tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/asset/TestUnprotectedAsset.java Sat Apr 15 17:10:20 2006
@@ -16,6 +16,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 import org.apache.hivemind.impl.DefaultClassResolver;
 import org.apache.hivemind.test.HiveMindTestCase;
@@ -25,6 +27,7 @@
 import org.apache.oro.text.regex.PatternMatcher;
 import org.apache.oro.text.regex.Perl5Compiler;
 import org.apache.oro.text.regex.Perl5Matcher;
+import org.apache.tapestry.services.ServiceConstants;
 
 /**
  * Tests for unprotected resource contributions.
@@ -43,7 +46,7 @@
     public void testUnProtectedMatch()
     {
         Pattern pr = newPattern("org/apache/tapestry/asset/.*.txt");
-
+        
         assertFalse(matcher.contains("org/apache/tapestry/foobar.png", pr));
         assertTrue(matcher.contains("org/apache/tapestry/asset/base-resource.txt", pr));
         assertFalse(matcher.contains("org/apache/tapestry/asset/foobar.png", pr));
@@ -95,7 +98,29 @@
 
         assertFalse("Urtime > drtime: " + urtime + " > " + drtime, urtime < drtime);
     }
-
+    
+    /**
+     * Tests new path ordering encoding.
+     */
+    public void testPathComparator()
+    {
+        Map parameters = new TreeMap(new AssetComparator());
+        
+        parameters.put(ServiceConstants.SERVICE, "test");
+        parameters.put("PATH", "value");
+        parameters.put("digest", "digvalue");
+        
+        assertEquals("test", parameters.get(ServiceConstants.SERVICE));
+        assertEquals("value", parameters.get("PATH"));
+        assertEquals("digvalue", parameters.get("digest"));
+        
+        int count = parameters.size();
+        String[] result = (String[]) parameters.keySet().toArray(new String[count]);
+        assertEquals(3, result.length);
+        
+        assertEquals("PATH", result[2]);
+    }
+    
     /**
      * Tests the implementation of {@link ResourceMatcher}.
      */
@@ -107,6 +132,8 @@
         patterns.add("/org/apache/tapestry/asset/.*.css");
         patterns.add("/org/apache/tapestry/asset/.*.js");
         patterns.add("/org/apache/tapestry/asset/[%$4]rew\\invalidpattern");
+        patterns.add("/org/apache/tapestry/html/dojo*");
+        patterns.add("org/apache/tapestry/html/dojo/*/*.png");
         rm.setContributions(patterns);
         rm.initializeService();
         
@@ -116,5 +143,10 @@
         assertTrue(rm.containsResource("/org/apache/tapestry/asset/foo.txt"));
         assertFalse(rm.containsResource("/org/apache/tapestry/asset/foo.TXT"));
         assertTrue(rm.containsResource("/org/apache/tapestry/asset/subdirectory/foo.css"));
+        assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/"));
+        assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/dojo.js"));
+        assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/src/json.js"));
+        assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/src/test.png"));
     }
+    
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org


Re: svn commit: r394405 - in /tapestry/tapestry4/trunk: ./ framework/src/descriptor/META-INF/ framework/src/java/org/apache/tapestry/ajax/ framework/src/java/org/apache/tapestry/asset/ framework/src/java/org/apache/tapestry/engine/ framework/src/java/org/a...

Posted by "Brian K. Wallace" <br...@transmorphix.com>.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

You mind if we control .project files (which I don't object to at all -
although not everyone uses Eclipse) as text vs. binary so we can get
diffs on those changes as well?

jkuhnert@apache.org wrote:
> Author: jkuhnert
> Date: Sat Apr 15 17:10:20 2006
> New Revision: 394405
> 
> URL: http://svn.apache.org/viewcvs?rev=394405&view=rev
> Log:
> Fixes for relative path resolution of dojo resources. 
> 
<snip/>
> 
> Modified: tapestry/tapestry4/trunk/.project
> URL: http://svn.apache.org/viewcvs/tapestry/tapestry4/trunk/.project?rev=394405&r1=394404&r2=394405&view=diff
> ==============================================================================
> Binary files - no diff available.
> 
</snap>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (MingW32)

iD8DBQFEQZuuaCoPKRow/gARArznAJ9g/mBMpKnQ29uRJRKShQ61A4ONWgCeLyMa
Qp3uWkmb8JcoQeD1FXH3ndQ=
=FLyI
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org