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 2007/11/18 22:42:59 UTC

svn commit: r596141 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry/internal/services/ main/java/org/apache/tapestry/services/ test/java/org/apache/tapestry/integration/ test/java/org/apache/tapestry/internal/services/ t...

Author: hlship
Date: Sun Nov 18 13:42:58 2007
New Revision: 596141

URL: http://svn.apache.org/viewvc?rev=596141&view=rev
Log:
TAPESTRY-1917: Tapestry should list available pages, components and mixins at startup, and when classes change

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/RunJetty.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java?rev=596141&r1=596140&r2=596141&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java Sun Nov 18 13:42:58 2007
@@ -18,16 +18,16 @@
 import org.apache.tapestry.internal.events.InvalidationListener;
 import org.apache.tapestry.ioc.annotations.Inject;
 import org.apache.tapestry.ioc.annotations.Symbol;
+import org.apache.tapestry.ioc.internal.util.CollectionFactory;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.*;
 import org.apache.tapestry.ioc.internal.util.ConcurrentBarrier;
+import org.apache.tapestry.ioc.internal.util.InternalUtils;
 import org.apache.tapestry.ioc.internal.util.Invokable;
 import org.apache.tapestry.services.ComponentClassResolver;
 import org.apache.tapestry.services.LibraryMapping;
+import org.slf4j.Logger;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 public class ComponentClassResolverImpl implements ComponentClassResolver, InvalidationListener
 {
@@ -39,6 +39,8 @@
 
     private static final String PAGES_SUBPACKAGE = "pages";
 
+    private final Logger _logger;
+
     private final ComponentInstantiatorSource _componentInstantiatorSource;
 
     private final ClassNameLocator _classNameLocator;
@@ -59,30 +61,47 @@
 
     private boolean _needsRebuild = true;
 
+    /**
+     * Logical page name to class name.
+     */
     private final Map<String, String> _pageToClassName = newCaseInsensitiveMap();
 
+    /**
+     * Component type to class name.
+     */
     private final Map<String, String> _componentToClassName = newCaseInsensitiveMap();
 
+    /**
+     * Mixing type to class name.
+     */
     private final Map<String, String> _mixinToClassName = newCaseInsensitiveMap();
 
     /**
-     * This one is case sensitive, since class names do always have a particular case.
+     * Page class name to logical name (needed to build URLs). This one is case sensitive, since class names do always have a particular case.
      */
     private final Map<String, String> _pageClassNameToLogicalName = newMap();
 
+
+    /**
+     * Used to convert an logical page name to the canonical form of the page name; this ensures that uniform case for page
+     * names is used.
+     */
     private final Map<String, String> _pageNameToCanonicalPageName = newCaseInsensitiveMap();
 
     private final ConcurrentBarrier _barrier = new ConcurrentBarrier();
 
-    public ComponentClassResolverImpl(ComponentInstantiatorSource componentInstantiatorSource,
+    public ComponentClassResolverImpl(Logger logger,
+
+                                      ComponentInstantiatorSource componentInstantiatorSource,
+
                                       ClassNameLocator classNameLocator,
 
-                                      @Inject
-                                      @Symbol(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM)
+                                      @Inject @Symbol(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM)
                                       String appRootPackage,
 
                                       Collection<LibraryMapping> mappings)
     {
+        _logger = logger;
         _componentInstantiatorSource = componentInstantiatorSource;
         _classNameLocator = classNameLocator;
 
@@ -135,17 +154,15 @@
             public void run()
             {
                 _needsRebuild = true;
-
-                _pageToClassName.clear();
-                _componentToClassName.clear();
-                _mixinToClassName.clear();
-                _pageClassNameToLogicalName.clear();
-                _pageNameToCanonicalPageName.clear();
             }
         });
 
     }
 
+    /**
+     * Invoked from within a withRead() block, checks to see if a rebuild is needed,
+     * and then performs the rebuild within a withWrite() block.
+     */
     private void rebuild()
     {
         if (!_needsRebuild) return;
@@ -154,31 +171,105 @@
         {
             public void run()
             {
-                rebuild("", _appRootPackage);
+                performRebuild();
+            }
+        });
+    }
+
+    private void performRebuild()
+    {
 
-                for (String prefix : _mappings.keySet())
-                {
-                    List<String> packages = _mappings.get(prefix);
+        Map<String, String> savedPages = CollectionFactory.newMap(_pageToClassName);
+        Map<String, String> savedComponents = CollectionFactory.newMap(_componentToClassName);
+        Map<String, String> savedMixins = CollectionFactory.newMap(_mixinToClassName);
 
-                    String folder = prefix + "/";
+        _pageToClassName.clear();
+        _componentToClassName.clear();
+        _mixinToClassName.clear();
+        _pageClassNameToLogicalName.clear();
+        _pageNameToCanonicalPageName.clear();
+
+        rebuild("", _appRootPackage);
+
+        for (String prefix : _mappings.keySet())
+        {
+            List<String> packages = _mappings.get(prefix);
 
-                    for (String packageName : packages)
-                        rebuild(folder, packageName);
-                }
+            String folder = prefix + "/";
 
-                _needsRebuild = false;
+            for (String packageName : packages)
+                rebuild(folder, packageName);
+        }
+
+
+        showChanges("pages", savedPages, _pageToClassName);
+        showChanges("components", savedComponents, _componentToClassName);
+        showChanges("mixins", savedMixins, _mixinToClassName);
+
+        _needsRebuild = false;
+    }
+
+    private void showChanges(String title, Map<String, String> savedMap, Map<String, String> newMap)
+    {
+        if (savedMap.equals(newMap)) return;
+
+        Map<String, String> fixed = CollectionFactory.newMap();
+
+        int maxLength = 0;
+
+        // Pass # 1: Get all the stuff in the core library
+
+        for (String name : newMap.keySet())
+        {
+            if (name.startsWith(CORE_LIBRARY_PREFIX))
+            {
+
+                // Strip of the "core/" prefix.
+
+                String key = name.substring(CORE_LIBRARY_PREFIX.length());
+
+                maxLength = Math.max(maxLength, key.length());
+
+                fixed.put(key, newMap.get(name));
             }
-        });
+        }
+
+        // Pass #2: Get everything else (may overwrite some of  pass #1).
+
+        for (String name : newMap.keySet())
+        {
+            if (name.startsWith(CORE_LIBRARY_PREFIX)) continue;
+
+            maxLength = Math.max(maxLength, name.length());
+
+            fixed.put(name, newMap.get(name));
+        }
+
+
+        StringBuilder builder = new StringBuilder(2000);
+        Formatter f = new Formatter(builder);
+
+        f.format("Available %s:\n", title);
+
+        String formatString = "%" + maxLength + "s: %s\n";
+
+        List<String> sorted = InternalUtils.sortedKeys(fixed);
+
+        for (String name : sorted)
+        {
+            String className = fixed.get(name);
+
+            f.format(formatString, name, className);
+        }
+
+        _logger.info(builder.toString());
+
     }
 
     private void rebuild(String pathPrefix, String rootPackage)
     {
         fillNameToClassNameMap(pathPrefix, rootPackage, PAGES_SUBPACKAGE, _pageToClassName);
-        fillNameToClassNameMap(
-                pathPrefix,
-                rootPackage,
-                COMPONENTS_SUBPACKAGE,
-                _componentToClassName);
+        fillNameToClassNameMap(pathPrefix, rootPackage, COMPONENTS_SUBPACKAGE, _componentToClassName);
         fillNameToClassNameMap(pathPrefix, rootPackage, MIXINS_SUBPACKAGE, _mixinToClassName);
     }
 
@@ -281,10 +372,8 @@
             {
                 String result = locate(pageName, _pageToClassName);
 
-                if (result == null)
-                    throw new IllegalArgumentException(ServicesMessages.couldNotResolvePageName(
-                            pageName,
-                            presentableNames(_pageToClassName)));
+                if (result == null) throw new IllegalArgumentException(
+                        ServicesMessages.couldNotResolvePageName(pageName, presentableNames(_pageToClassName)));
 
                 return result;
             }
@@ -311,11 +400,8 @@
             {
                 String result = locate(componentType, _componentToClassName);
 
-                if (result == null)
-                    throw new IllegalArgumentException(ServicesMessages
-                            .couldNotResolveComponentType(
-                            componentType,
-                            presentableNames(_componentToClassName)));
+                if (result == null) throw new IllegalArgumentException(ServicesMessages
+                        .couldNotResolveComponentType(componentType, presentableNames(_componentToClassName)));
 
                 return result;
             }
@@ -349,10 +435,8 @@
             {
                 String result = locate(mixinType, _mixinToClassName);
 
-                if (result == null)
-                    throw new IllegalArgumentException(ServicesMessages.couldNotResolveMixinType(
-                            mixinType,
-                            presentableNames(_mixinToClassName)));
+                if (result == null) throw new IllegalArgumentException(
+                        ServicesMessages.couldNotResolveMixinType(mixinType, presentableNames(_mixinToClassName)));
 
                 return result;
             }
@@ -391,9 +475,8 @@
 
                 String result = _pageClassNameToLogicalName.get(pageClassName);
 
-                if (result == null)
-                    throw new IllegalArgumentException(ServicesMessages
-                            .pageNameUnresolved(pageClassName));
+                if (result == null) throw new IllegalArgumentException(ServicesMessages
+                        .pageNameUnresolved(pageClassName));
 
                 return result;
             }
@@ -408,11 +491,8 @@
             {
                 String result = locate(pageName, _pageNameToCanonicalPageName);
 
-                if (result == null)
-                    throw new IllegalArgumentException(ServicesMessages
-                            .couldNotCanonicalizePageName(
-                            pageName,
-                            presentableNames(_pageNameToCanonicalPageName)));
+                if (result == null) throw new IllegalArgumentException(ServicesMessages
+                        .couldNotCanonicalizePageName(pageName, presentableNames(_pageNameToCanonicalPageName)));
 
                 return result;
             }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java?rev=596141&r1=596140&r2=596141&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java Sun Nov 18 13:42:58 2007
@@ -1617,12 +1617,13 @@
     }
 
     /**
-     * Adds a filter that sets the application package (for class loading purposes). The filter is
-     * ordered before:*.*".
+     * Adds a listener to the {@link org.apache.tapestry.internal.services.ComponentInstantiatorSource} that clears
+     * the {@link PropertyAccess} and {@link TypeCoercer} caches on a class loader invalidation.  In addition, forces
+     * the realization of {@link ComponentClassResolver} at startup.
      */
     public void contributeApplicationInitializer(OrderedConfiguration<ApplicationInitializerFilter> configuration,
-                                                 final ApplicationGlobals applicationGlobals,
-                                                 final PropertyAccess propertyAccess, final TypeCoercer typeCoercer)
+                                                 final PropertyAccess propertyAccess, final TypeCoercer typeCoercer,
+                                                 final ComponentClassResolver componentClassResolver)
     {
         final InvalidationListener listener = new InvalidationListener()
         {
@@ -1643,6 +1644,11 @@
                 _componentInstantiatorSource.addInvalidationListener(listener);
 
                 initializer.initializeApplication(context);
+
+                // We don't care about the result, but this forces a load of the service
+                // at application startup, rather than on first request.
+
+                componentClassResolver.isPageName("ForceLoadAtStartup");
             }
         };
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/RunJetty.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/RunJetty.java?rev=596141&r1=596140&r2=596141&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/RunJetty.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/RunJetty.java Sun Nov 18 13:42:58 2007
@@ -17,17 +17,13 @@
 import org.apache.tapestry.test.JettyRunner;
 
 /**
- * Temporary "shim" to run Demo App #1 inside IntelliJ.  Eventually, we should write a "Jetty InPlace Integration Plugin"
- * that works like JettyLauncher for Eclipse.
+ * A "shim" to run Demo App #1 inside IntelliJ.  I still haven't found a way to get IntelliJ to
+ * export test classes and resources into a web facet.
  */
 public class RunJetty
 {
     public static void main(String[] args) throws InterruptedException
     {
-        JettyRunner runner = new JettyRunner("/", 8080, "src/test/app1");
-
-        Thread.sleep(Long.MAX_VALUE);
-
-        runner.stop();
+        new JettyRunner("/", 8080, "src/test/app1");
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java?rev=596141&r1=596140&r2=596141&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ComponentClassResolverImplTest.java Sun Nov 18 13:42:58 2007
@@ -17,7 +17,9 @@
 import org.apache.tapestry.internal.test.InternalBaseTestCase;
 import org.apache.tapestry.services.ComponentClassResolver;
 import org.apache.tapestry.services.LibraryMapping;
+import org.easymock.EasyMock;
 import static org.easymock.EasyMock.isA;
+import org.slf4j.Logger;
 import org.testng.annotations.Test;
 
 import java.util.Arrays;
@@ -37,12 +39,23 @@
 
     private static final String LIB_ROOT_PACKAGE = "org.example.lib";
 
-    private ComponentClassResolverImpl create(ComponentInstantiatorSource source,
+    private ComponentClassResolverImpl create(Logger logger, ComponentInstantiatorSource source,
                                               ClassNameLocator locator, LibraryMapping... mappings)
     {
         List<LibraryMapping> list = Arrays.asList(mappings);
 
-        return new ComponentClassResolverImpl(source, locator, APP_ROOT_PACKAGE, list);
+        return new ComponentClassResolverImpl(logger, source, locator, APP_ROOT_PACKAGE, list);
+    }
+
+    private Logger compliantLogger()
+    {
+        Logger logger = mockLogger();
+
+        logger.info(EasyMock.isA(String.class));
+
+        getMocksControl().atLeastOnce();
+
+        return logger;
     }
 
     @Test
@@ -50,6 +63,7 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -59,7 +73,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolvePageNameToClassName("SimplePage"), className);
 
@@ -71,6 +85,7 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -80,7 +95,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.canonicalizePageName("simplepage"), "SimplePage");
 
@@ -93,6 +108,7 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -102,7 +118,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolvePageNameToClassName("subfolder/NestedPage"), className);
 
@@ -114,6 +130,7 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -123,7 +140,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolvePageNameToClassName("admin/edit/User"), className);
 
@@ -135,6 +152,7 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -144,7 +162,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolvePageNameToClassName("subfolder/NestedPage"), className);
 
@@ -157,6 +175,7 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -166,7 +185,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolvePageNameToClassName("foo/Bar"), className);
 
@@ -178,19 +197,20 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_packages(source, CORE_ROOT_PACKAGE);
         train_for_app_packages(source);
 
-        train_locateComponentClassNames(locator, CORE_ROOT_PACKAGE + ".pages", CORE_ROOT_PACKAGE
-                + ".pages.Fred", CORE_ROOT_PACKAGE + ".pages.Barney");
-        train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", APP_ROOT_PACKAGE
-                + ".pages.Wilma", APP_ROOT_PACKAGE + ".pages.Betty");
+        train_locateComponentClassNames(locator, CORE_ROOT_PACKAGE + ".pages", CORE_ROOT_PACKAGE + ".pages.Fred",
+                                        CORE_ROOT_PACKAGE + ".pages.Barney");
+        train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", APP_ROOT_PACKAGE + ".pages.Wilma",
+                                        APP_ROOT_PACKAGE + ".pages.Betty");
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         try
         {
@@ -199,9 +219,8 @@
         }
         catch (RuntimeException ex)
         {
-            assertEquals(
-                    ex.getMessage(),
-                    "Unable to resolve \'Unknown\' to a page class name.  Available page names: Barney, Betty, Fred, Wilma.");
+            assertEquals(ex.getMessage(),
+                         "Unable to resolve \'Unknown\' to a page class name.  Available page names: Barney, Betty, Fred, Wilma.");
         }
 
         verify();
@@ -212,6 +231,7 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -221,7 +241,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertTrue(resolver.isPageName("SimplePage"));
         assertTrue(resolver.isPageName("simplepage"));
@@ -235,6 +255,7 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
         train_for_packages(source, CORE_ROOT_PACKAGE);
@@ -245,8 +266,8 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         // Can look like an application page, but still resolves to the core library class name.
 
@@ -277,8 +298,8 @@
         expect(locator.locateClassNames(isA(String.class))).andStubReturn(noMatches);
     }
 
-    protected final void train_locateComponentClassNames(ClassNameLocator locator,
-                                                         String packageName, String... classNames)
+    protected final void train_locateComponentClassNames(ClassNameLocator locator, String packageName,
+                                                         String... classNames)
     {
         expect(locator.locateClassNames(packageName)).andReturn(Arrays.asList(classNames));
     }
@@ -290,6 +311,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -297,7 +319,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolvePageClassNameToPageName(className), "SimplePage");
 
@@ -310,11 +332,11 @@
     @Test
     public void resolved_page_names_are_cached()
     {
-
         String pageClassName = APP_ROOT_PACKAGE + ".pages.SimplePage";
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -322,7 +344,7 @@
 
         replay();
 
-        ComponentClassResolverImpl resolver = create(source, locator);
+        ComponentClassResolverImpl resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolvePageNameToClassName("SimplePage"), pageClassName);
 
@@ -357,6 +379,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_packages(source, CORE_ROOT_PACKAGE);
         train_for_app_packages(source);
@@ -365,8 +388,8 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         assertEquals(resolver.resolvePageNameToClassName("CorePage"), className);
 
@@ -380,6 +403,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_packages(source, CORE_ROOT_PACKAGE);
         train_for_app_packages(source);
@@ -388,8 +412,8 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         assertEquals(resolver.resolvePageClassNameToPageName(className), "core/CorePage");
 
@@ -403,6 +427,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_packages(source, LIB_ROOT_PACKAGE);
         train_for_packages(source, CORE_ROOT_PACKAGE);
@@ -412,8 +437,8 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(LIB_PREFIX,
-                                                                                     LIB_ROOT_PACKAGE),
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
                                                  new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         assertEquals(resolver.resolvePageNameToClassName("lib/LibPage"), className);
@@ -428,6 +453,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_packages(source, LIB_ROOT_PACKAGE);
         train_for_packages(source, CORE_ROOT_PACKAGE);
@@ -437,8 +463,8 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(LIB_PREFIX,
-                                                                                     LIB_ROOT_PACKAGE),
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
                                                  new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         assertEquals(resolver.resolvePageNameToClassName("lib/libpage"), className);
@@ -452,14 +478,15 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = mockLogger();
 
         train_for_packages(source, CORE_ROOT_PACKAGE);
         train_for_app_packages(source);
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         String className = LIB_ROOT_PACKAGE + ".pages.LibPage";
 
@@ -470,8 +497,7 @@
         }
         catch (IllegalArgumentException ex)
         {
-            assertEquals(ex.getMessage(), "Unable to resolve class name " + className
-                    + " to a logical page name.");
+            assertEquals(ex.getMessage(), "Unable to resolve class name " + className + " to a logical page name.");
         }
 
         verify();
@@ -483,17 +509,17 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_packages(source, CORE_ROOT_PACKAGE);
         train_for_app_packages(source);
 
-        train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", APP_ROOT_PACKAGE
-                + ".pages.Start");
+        train_locateComponentClassNames(locator, APP_ROOT_PACKAGE + ".pages", APP_ROOT_PACKAGE + ".pages.Start");
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         try
         {
@@ -502,9 +528,8 @@
         }
         catch (IllegalArgumentException ex)
         {
-            assertEquals(
-                    ex.getMessage(),
-                    "Unable to resolve \'MissingPage\' to a known page name. Available page names: Start.");
+            assertEquals(ex.getMessage(),
+                         "Unable to resolve \'MissingPage\' to a known page name. Available page names: Start.");
         }
 
         verify();
@@ -515,14 +540,15 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = mockLogger();
 
         train_for_packages(source, CORE_ROOT_PACKAGE);
         train_for_app_packages(source);
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         String className = CORE_ROOT_PACKAGE + ".foo.CorePage";
 
@@ -533,8 +559,7 @@
         }
         catch (IllegalArgumentException ex)
         {
-            assertEquals(ex.getMessage(), "Unable to resolve class name " + className
-                    + " to a logical page name.");
+            assertEquals(ex.getMessage(), "Unable to resolve class name " + className + " to a logical page name.");
         }
 
         verify();
@@ -548,6 +573,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_packages(source, LIB_ROOT_PACKAGE);
         train_for_packages(source, secondaryLibPackage);
@@ -558,12 +584,10 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(
-                source,
-                locator,
-                new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
-                new LibraryMapping(LIB_PREFIX, secondaryLibPackage),
-                new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
+                                                 new LibraryMapping(LIB_PREFIX, secondaryLibPackage),
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         assertEquals(resolver.resolvePageNameToClassName("lib/LibPage"), className);
 
@@ -577,6 +601,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = mockLogger();
 
         train_for_packages(source, deepPackage);
         train_for_packages(source, LIB_ROOT_PACKAGE);
@@ -587,10 +612,9 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping("lib/deep",
-                                                                                     deepPackage),
-                                                 new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE), new LibraryMapping(
-                CORE_PREFIX, CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator, new LibraryMapping("lib/deep", deepPackage),
+                                                 new LibraryMapping(LIB_PREFIX, LIB_ROOT_PACKAGE),
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         try
         {
@@ -624,6 +648,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -631,7 +656,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolveComponentTypeToClassName("SimpleComponent"), className);
 
@@ -649,6 +674,7 @@
 
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = compliantLogger();
 
         train_for_app_packages(source);
 
@@ -656,7 +682,7 @@
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator);
+        ComponentClassResolver resolver = create(logger, source, locator);
 
         assertEquals(resolver.resolveMixinTypeToClassName("SimpleMixin"), expectedClassName);
 
@@ -668,14 +694,15 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = mockLogger();
 
         train_for_packages(source, CORE_ROOT_PACKAGE);
         train_for_app_packages(source);
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         try
         {
@@ -696,14 +723,15 @@
     {
         ComponentInstantiatorSource source = mockComponentInstantiatorSource();
         ClassNameLocator locator = newClassNameLocator();
+        Logger logger = mockLogger();
 
         train_for_packages(source, CORE_ROOT_PACKAGE);
         train_for_app_packages(source);
 
         replay();
 
-        ComponentClassResolver resolver = create(source, locator, new LibraryMapping(CORE_PREFIX,
-                                                                                     CORE_ROOT_PACKAGE));
+        ComponentClassResolver resolver = create(logger, source, locator,
+                                                 new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE));
 
         try
         {
@@ -712,8 +740,7 @@
         }
         catch (IllegalArgumentException ex)
         {
-            assertTrue(ex.getMessage().contains(
-                    "Unable to resolve 'SimpleComponent' to a component class name."));
+            assertTrue(ex.getMessage().contains("Unable to resolve 'SimpleComponent' to a component class name."));
         }
 
         verify();

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties?rev=596141&r1=596140&r2=596141&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties Sun Nov 18 13:42:58 2007
@@ -12,19 +12,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-log4j.rootCategory=WARN, A1
-
-# A1 is set to be a ConsoleAppender. 
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
-
-# A1 uses PatternLayout.
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-log4j.appender.A1.layout.ConversionPattern=[%p] %c{1} %m%n
-
-log4j.category.org.apache.tapestry.TapestryFilter=info
-log4j.category.org.apache.tapestry=error
-
-log4j.category.app=info
-log4j.category.org.apache.tapestry.integration.app1=error
-log4j.category.org.apache.tapestry.corelib=error
+log4j.rootCategory=INFO, A1
+
+# A1 is set to be a ConsoleAppender. 
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=[%p] %c{1} %m%n
+
+log4j.category.app=info
+