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)
{