You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@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);