You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2010/04/19 15:27:34 UTC

svn commit: r935558 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/ main/java/org/apache/tapestry5/services/ test/java/org/apache/tapestry5/internal/services/

Author: hlship
Date: Mon Apr 19 13:27:33 2010
New Revision: 935558

URL: http://svn.apache.org/viewvc?rev=935558&view=rev
Log:
Add a method to ClasspathAssetAliasManager to expose its mappings

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClasspathAssetAliasManager.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImpl.java?rev=935558&r1=935557&r2=935558&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImpl.java Mon Apr 19 13:27:33 2010
@@ -136,10 +136,16 @@ public class ClasspathAssetAliasManagerI
 
         for (String alias : sortedAliases)
         {
-            if (basePath.startsWith(alias)) { return aliasToPathPrefix.get(alias) + "/" + basePath.substring(alias.length() + 1); }
+            if (basePath.startsWith(alias)) { return aliasToPathPrefix.get(alias) + "/"
+                    + basePath.substring(alias.length() + 1); }
         }
 
         return basePath;
     }
 
+    public Map<String, String> getMappings()
+    {
+        return Collections.unmodifiableMap(aliasToPathPrefix);
+    }
+
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClasspathAssetAliasManager.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClasspathAssetAliasManager.java?rev=935558&r1=935557&r2=935558&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClasspathAssetAliasManager.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClasspathAssetAliasManager.java Mon Apr 19 13:27:33 2010
@@ -14,26 +14,30 @@
 
 package org.apache.tapestry5.services;
 
+import java.util.Map;
+
+import org.apache.tapestry5.internal.services.assets.ClasspathAssetRequestHandler;
 import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration;
 
 /**
  * Used as part of the support for classpath {@link org.apache.tapestry5.Asset}s, to convert the Asset's
  * {@link org.apache.tapestry5.ioc.Resource} to a URL that can be accessed by the client. The asset path, within the
- * classpath, is converted into a shorter virtual path (one that, typically, includes some kind of version number).
+ * classpath, is converted into a shorter virtual path.
  * <p/>
- * Service configuration is a map from aliases (short names) to complete names. Names should not start or end end with a
- * slash. Generally, an alias should be a single name (not contain a slash). Paths should also not start or end with a
- * slash. An example mapping would be <code>mylib</code> to <code>com/example/mylib</code>.
+ * Service configuration is a map from folder aliases (short names) to complete paths. Names should not start or end end
+ * with a slash. Generally, an alias should be a single name (not contain a slash). Paths should also not start or end
+ * with a slash. An example mapping would be <code>mylib</code> to <code>com/example/mylib</code>.
  * <p>
  * As originally envisioned, this service would simply <em>optimize</em> classpath assets, allowing the URL path for
  * such assets to be shortened (and have a version number added, important for caching); thus the word "alias" makes
  * sense ... it was responsible for creating an "alias" URL shorter than the default "classpath" URL.
  * <p>
  * Starting in Tapestry 5.2, this changed; all classpath assets <strong>must</strong> be "aliased" to a shorter URL
- * path. Any URL that can not be shortened is now rejected.
+ * path. Any URL that can not be shortened is now rejected. This simplifies creating new libraries, but also helps with
+ * security concerns, as it limits which portions of the classpath can <em>ever</em> be exposed to the user agent.
  * <p>
- * Tapestry automatically contributes a number of mappings: for the application itself (as alias "app") and for each
- * library (via {@link ComponentClassResolver#getFolderToPackageMapping()});
+ * Tapestry automatically contributes a number of mappings: for the application root package itself (as alias "app") and
+ * for each library (via {@link ComponentClassResolver#getFolderToPackageMapping()});
  */
 @UsesMappedConfiguration(String.class)
 public interface ClasspathAssetAliasManager
@@ -51,6 +55,18 @@ public interface ClasspathAssetAliasMana
     /**
      * Reverses {@link #toClientURL(String)}, stripping off the asset prefix, and re-expanding any aliased folders back
      * to complete folders.
+     * 
+     * @deprecated No longer used as of Tapestry 5.2, may be removed in a later release.
      */
     String toResourcePath(String clientURL);
+
+    /**
+     * Returns the mappings used by the service: the keys are the folder aliases (i.e, "corelib")
+     * and the values are the corresponding paths (i.e., "org/apache/tapestry5/corelib"). This
+     * exists primarily so that {@link ClasspathAssetRequestHandler}s can be created automatically
+     * for each mapping.
+     * 
+     * @since 5.2.0
+     **/
+    Map<String, String> getMappings();
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=935558&r1=935557&r2=935558&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Mon Apr 19 13:27:33 2010
@@ -433,42 +433,32 @@ public final class TapestryModule
 
     public static void contributeClasspathAssetAliasManager(MappedConfiguration<String, String> configuration,
 
-    @Symbol(SymbolConstants.TAPESTRY_VERSION)
-    String tapestryVersion,
-
     @Symbol(SymbolConstants.APPLICATION_VERSION)
     String applicationVersion,
 
     @Symbol(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM)
     String appPackage,
 
-    // @Inject not needed, because this isn't a service builder method
-            @Symbol("tapestry.scriptaculous.path")
-            String scriptaculousPath,
-
-            @Symbol("tapestry.datepicker.path")
-            String datepickerPath,
-
-            @Symbol("tapestry.blackbird.path")
-            String blackbirdPath)
+    ComponentClassResolver resolver)
     {
-        // TAPESTRY-2159: All the classpath assets are inside a version numbered
-        // folder (i.e., 5.0.12).
-        // For scriptaculous, etc., this version is not the version of the
-        // library, but the version
-        // of Tapestry.
+        configuration.add("tapestry", "org/apache/tapestry5");
 
-        configuration.add("tapestry/" + tapestryVersion, "org/apache/tapestry5");
+        configuration.add("app", toPackagePath(appPackage));
 
-        configuration.add("scriptaculous/" + tapestryVersion, scriptaculousPath);
+        // Each library gets a mapping or its folder automatically
 
-        configuration.add("datepicker/" + tapestryVersion, datepickerPath);
+        Map<String, String> folderToPackageMapping = resolver.getFolderToPackageMapping();
 
-        configuration.add("blackbird/" + tapestryVersion, blackbirdPath);
+        for (String folder : folderToPackageMapping.keySet())
+        {
+            configuration.add(folder, toPackagePath(folderToPackageMapping.get(folder)));
+        }
 
-        configuration.add("app/" + applicationVersion, appPackage.replace('.', '/'));
+    }
 
-        configuration.add("classpath/" + applicationVersion, "");
+    private static String toPackagePath(String packageName)
+    {
+        return packageName.replace('.', '/');
     }
 
     public static void contributeComponentClassResolver(Configuration<LibraryMapping> configuration)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImplTest.java?rev=935558&r1=935557&r2=935558&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClasspathAssetAliasManagerImplTest.java Mon Apr 19 13:27:33 2010
@@ -15,9 +15,9 @@
 package org.apache.tapestry5.internal.services;
 
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.util.UnknownValueException;
 
-import static org.apache.tapestry5.ioc.internal.util.CollectionFactory.newMap;
 import org.apache.tapestry5.services.ClasspathAssetAliasManager;
 import org.apache.tapestry5.services.Request;
 import org.testng.annotations.DataProvider;
@@ -31,7 +31,7 @@ public class ClasspathAssetAliasManagerI
 
     public Map<String, String> configuration()
     {
-        Map<String, String> configuration = newMap();
+        Map<String, String> configuration = CollectionFactory.newMap();
 
         configuration.put("tapestry/4.0", "org/apache/tapestry5/");
         configuration.put("tapestry-internal/3.0", "org/apache/tapestry5/internal/");
@@ -40,6 +40,23 @@ public class ClasspathAssetAliasManagerI
         return configuration;
     }
 
+    @Test
+    public void get_mappings()
+    {
+        // Notice how all the trailing slashes (which are tolerated but not wanted)
+        // have been removed.
+        
+        Map<String, String> expected = CollectionFactory.newCaseInsensitiveMap();
+
+        expected.put("tapestry/4.0", "org/apache/tapestry5");
+        expected.put("tapestry-internal/3.0", "org/apache/tapestry5/internal");
+        expected.put("mylib/2.0", "com/example/mylib");
+
+        ClasspathAssetAliasManager manager = new ClasspathAssetAliasManagerImpl(null, APP_VERSION, configuration());
+
+        assertEquals(manager.getMappings(), expected);
+    }
+
     @Test(dataProvider = "to_client_url_data")
     public void to_client_url(String resourcePath, String expectedClientURL)
     {