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 2011/03/04 20:00:05 UTC
svn commit: r1078103 - 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: Fri Mar 4 19:00:05 2011
New Revision: 1078103
URL: http://svn.apache.org/viewvc?rev=1078103&view=rev
Log:
TAP5-1469: Allow for multiple application roto packages by contributing additional LibraryMappings with empty virtual folder
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/LibraryMapping.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/ComponentClassResolverImplTest.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java?rev=1078103&r1=1078102&r2=1078103&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java Fri Mar 4 19:00:05 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2009, 2010 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -47,8 +47,6 @@ public class ComponentClassResolverImpl
private final ClassNameLocator classNameLocator;
- private final String appRootPackage;
-
private final String startPageName;
// Map from folder name to a list of root package names.
@@ -106,9 +104,6 @@ public class ComponentClassResolverImpl
ClassNameLocator classNameLocator,
- @Symbol(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM)
- String appRootPackage,
-
@Symbol(SymbolConstants.START_PAGE_NAME)
String startPageName,
@@ -118,11 +113,8 @@ public class ComponentClassResolverImpl
this.componentInstantiatorSource = componentInstantiatorSource;
this.classNameLocator = classNameLocator;
- this.appRootPackage = appRootPackage;
this.startPageName = startPageName;
- addPackagesToInstantiatorSource(this.appRootPackage);
-
for (LibraryMapping mapping : mappings)
{
String prefix = mapping.getPathPrefix();
@@ -210,8 +202,6 @@ public class ComponentClassResolverImpl
pageClassNameToLogicalName.clear();
pageNameToCanonicalPageName.clear();
- rebuild("", appRootPackage);
-
for (String prefix : mappings.keySet())
{
List<String> packages = mappings.get(prefix);
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/LibraryMapping.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/LibraryMapping.java?rev=1078103&r1=1078102&r2=1078103&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/LibraryMapping.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/LibraryMapping.java Fri Mar 4 19:00:05 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2010 The Apache Software Foundation
+// Copyright 2006, 2010, 2011 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.
@@ -37,23 +37,41 @@ import org.apache.tapestry5.ioc.internal
*/
public final class LibraryMapping
{
- private final String pathPrefix, rootPackage;
+ private final String virtualFolderName, rootPackage;
- public LibraryMapping(String pathPrefix, String rootPackage)
+ /**
+ * Maps a virtual folder to a package that contains sub-packages for components, pages, etc. The special pathPrefix
+ * "" (the empty string) identifies the application. Tapestry defines a special pathPrefix, "core", for the core
+ * components.
+ * <p>
+ * Note that it <em>is</em> allowed to contribute mutiple LibraryMappings with the same prefix to the
+ * {@link ComponentClassResolver}, and the results are merged (though conflicts, where the same simple name appears
+ * under multiple root packages, is not currently checked for).
+ *
+ * @param virtualFolderName
+ * identifies the virtual folder "containing" the pages and components of the library. Prior to Tapestry
+ * 5.2, the name could include a slash, but this is now expressly forbidden.
+ * @param rootPackage
+ * The root package to search.
+ */
+ public LibraryMapping(String virtualFolderName, String rootPackage)
{
- assert InternalUtils.isNonBlank(pathPrefix);
assert InternalUtils.isNonBlank(rootPackage);
- if (pathPrefix.contains("/"))
+
+ if (virtualFolderName.contains("/"))
throw new RuntimeException(
"LibraryMapping path prefixes may no longer contain slashes (as of Tapestry 5.2).");
- this.pathPrefix = pathPrefix;
+ this.virtualFolderName = virtualFolderName;
this.rootPackage = rootPackage;
}
+ /**
+ * Returns the virtual folder name (the odd name of this method reflects the evolution of the framework).
+ */
public String getPathPrefix()
{
- return pathPrefix;
+ return virtualFolderName;
}
public String getRootPackage()
@@ -64,6 +82,6 @@ public final class LibraryMapping
@Override
public String toString()
{
- return String.format("LibraryMapping[%s, %s]", pathPrefix, rootPackage);
+ return String.format("LibraryMapping[%s, %s]", virtualFolderName, rootPackage);
}
}
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=1078103&r1=1078102&r2=1078103&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 Fri Mar 4 19:00:05 2011
@@ -619,9 +619,13 @@ public final class TapestryModule
return packageName.replace('.', '/');
}
- public static void contributeComponentClassResolver(Configuration<LibraryMapping> configuration)
+ @Contribute(ComponentClassResolver.class)
+ public static void setupCoreAndAppLibraries(Configuration<LibraryMapping> configuration,
+ @Symbol(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM)
+ String appRootPackage)
{
configuration.add(new LibraryMapping("core", "org.apache.tapestry5.corelib"));
+ configuration.add(new LibraryMapping("", appRootPackage));
}
/**
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java?rev=1078103&r1=1078102&r2=1078103&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.java Fri Mar 4 19:00:05 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2010 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2010, 2011 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.
@@ -14,6 +14,7 @@
package org.apache.tapestry5.internal.services;
+import org.apache.tapestry5.func.F;
import org.apache.tapestry5.internal.test.InternalBaseTestCase;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.services.ClassNameLocator;
@@ -34,6 +35,9 @@ public class ComponentClassResolverImplT
{
private static final String APP_ROOT_PACKAGE = "org.example.app";
+ private static final List<LibraryMapping> APP_ROOT_PACKAGE_MAPPINGS = Arrays.asList(new LibraryMapping("",
+ APP_ROOT_PACKAGE));
+
private static final String CORE_PREFIX = "core";
private static final String CORE_ROOT_PACKAGE = "org.apache.tapestry5.corelib";
@@ -45,9 +49,9 @@ public class ComponentClassResolverImplT
private ComponentClassResolverImpl create(Logger logger, ComponentInstantiatorSource source,
ClassNameLocator locator, LibraryMapping... mappings)
{
- List<LibraryMapping> list = Arrays.asList(mappings);
+ List<LibraryMapping> full = F.flow(APP_ROOT_PACKAGE_MAPPINGS).concat(F.flow(mappings)).toList();
- return new ComponentClassResolverImpl(logger, source, locator, APP_ROOT_PACKAGE, "Start", list);
+ return new ComponentClassResolverImpl(logger, source, locator, "Start", full);
}
private Logger compliantLogger()
@@ -172,10 +176,8 @@ public class ComponentClassResolverImplT
replay();
- List<LibraryMapping> mappings = Arrays.asList();
-
- ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, source, locator, APP_ROOT_PACKAGE,
- "HomePage", mappings);
+ ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, source, locator, "HomePage",
+ APP_ROOT_PACKAGE_MAPPINGS);
assertEquals(resolver.canonicalizePageName("HomePage"), "HomePage");
assertEquals(resolver.canonicalizePageName(""), "HomePage");
@@ -183,7 +185,7 @@ public class ComponentClassResolverImplT
verify();
}
-
+
@Test
public void start_page_in_subfolder()
{
@@ -199,10 +201,8 @@ public class ComponentClassResolverImplT
replay();
- List<LibraryMapping> mappings = Arrays.asList();
-
- ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, source, locator, APP_ROOT_PACKAGE,
- "HomePage", mappings);
+ ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, source, locator, "HomePage",
+ APP_ROOT_PACKAGE_MAPPINGS);
assertEquals(resolver.canonicalizePageName("sub/HomePage"), "sub/HomePage");
assertEquals(resolver.canonicalizePageName("sub"), "sub/HomePage");
@@ -210,7 +210,7 @@ public class ComponentClassResolverImplT
verify();
}
-
+
/**
* TAP5-1444
*/
@@ -223,16 +223,16 @@ public class ComponentClassResolverImplT
train_for_app_packages(source);
- String[] classNames = { APP_ROOT_PACKAGE + ".pages.sub.HomePage", APP_ROOT_PACKAGE + ".pages.sub.SubIndex" };
+ String[] classNames =
+ { APP_ROOT_PACKAGE + ".pages.sub.HomePage", APP_ROOT_PACKAGE + ".pages.sub.SubIndex" };
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", classNames);
replay();
-
- List<LibraryMapping> mappings = Arrays.asList();
- ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, source, locator, APP_ROOT_PACKAGE,
- "HomePage", mappings);
+ List<LibraryMapping> mappings = APP_ROOT_PACKAGE_MAPPINGS;
+
+ ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, source, locator, "HomePage", mappings);
assertTrue(resolver.isPageName("sub/HomePage"));
assertTrue(resolver.isPageName("sub/subIndex"));
@@ -962,7 +962,7 @@ public class ComponentClassResolverImplT
}
}
-
+
@Test
public void ignore_start_page_outside_root()
{
@@ -972,7 +972,8 @@ public class ComponentClassResolverImplT
train_for_app_packages(source);
- String[] classNames = new String[] { APP_ROOT_PACKAGE + ".pages.exam.ExamIndex", APP_ROOT_PACKAGE + ".pages.exam.StartExam" };
+ String[] classNames = new String[]
+ { APP_ROOT_PACKAGE + ".pages.exam.ExamIndex", APP_ROOT_PACKAGE + ".pages.exam.StartExam" };
train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", classNames);