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/05/20 02:19:05 UTC

svn commit: r946492 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/ main/java/org/apache/tapestry5/internal/services/templates/ main/java/org/apache/tapestry5/services/ main/java/org/apache/tapestry5/...

Author: hlship
Date: Thu May 20 00:19:04 2010
New Revision: 946492

URL: http://svn.apache.org/viewvc?rev=946492&view=rev
Log:
TAP5-1159: Easy way to customize search locations for page and component templates

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/DefaultTemplateLocator.java   (with props)
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java   (contents, props changed)
      - copied, changed from r946491, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageTemplateLocatorImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/templates/
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/templates/ComponentTemplateLocator.java   (with props)
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/
    tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
Removed:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageTemplateLocator.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageTemplateLocatorImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageTemplateLocatorImplTest.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImplTest.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java?rev=946492&r1=946491&r2=946492&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java Thu May 20 00:19:04 2010
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,11 +22,13 @@ import org.apache.tapestry5.internal.uti
 import org.apache.tapestry5.internal.util.URLChangeTracker;
 import org.apache.tapestry5.ioc.Location;
 import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.ioc.annotations.Primary;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.services.InvalidationEventHub;
 import org.apache.tapestry5.services.UpdateListener;
+import org.apache.tapestry5.services.templates.ComponentTemplateLocator;
 
 import java.util.Collections;
 import java.util.List;
@@ -36,12 +38,12 @@ import java.util.Map;
 /**
  * Service implementation that manages a cache of parsed component templates.
  */
-public final class ComponentTemplateSourceImpl extends InvalidationEventHubImpl implements ComponentTemplateSource, UpdateListener
+public final class ComponentTemplateSourceImpl extends InvalidationEventHubImpl implements ComponentTemplateSource,
+        UpdateListener
 {
-
     private final TemplateParser parser;
 
-    private final PageTemplateLocator locator;
+    private final ComponentTemplateLocator locator;
 
     private final URLChangeTracker tracker;
 
@@ -90,13 +92,13 @@ public final class ComponentTemplateSour
         }
     };
 
-    public ComponentTemplateSourceImpl(TemplateParser parser, PageTemplateLocator locator,
-                                       ClasspathURLConverter classpathURLConverter)
+    public ComponentTemplateSourceImpl(TemplateParser parser, @Primary
+    ComponentTemplateLocator templateLocator, ClasspathURLConverter classpathURLConverter)
     {
-        this(parser, locator, new URLChangeTracker(classpathURLConverter));
+        this(parser, templateLocator, new URLChangeTracker(classpathURLConverter));
     }
 
-    ComponentTemplateSourceImpl(TemplateParser parser, PageTemplateLocator locator, URLChangeTracker tracker)
+    ComponentTemplateSourceImpl(TemplateParser parser, ComponentTemplateLocator locator, URLChangeTracker tracker)
     {
         this.parser = parser;
         this.locator = locator;
@@ -104,9 +106,8 @@ public final class ComponentTemplateSour
     }
 
     /**
-     * Resolves the component name to a {@link Resource} and finds the localization of that resource (the combination of
-     * component name and locale is resolved to a resource). The localized resource is used as the key to a cache of
-     * {@link ComponentTemplate}s.
+     * Resolves the component name to a localized {@link Resource} (using the {@link ComponentTemplateLocator} chain of
+     * command service). The localized resource is used as the key to a cache of {@link ComponentTemplate}s.
      * <p/>
      * If a template doesn't exist, then the missing ComponentTemplate is returned.
      */
@@ -144,7 +145,8 @@ public final class ComponentTemplateSour
         // In a race condition, we may parse the same template more than once. This will likely add
         // the resource to the tracker multiple times. Not likely this will cause a big issue.
 
-        if (!r.exists()) return missingTemplate;
+        if (!r.exists())
+            return missingTemplate;
 
         tracker.add(r.toURL());
 
@@ -156,25 +158,10 @@ public final class ComponentTemplateSour
         ComponentModel model = initialModel;
         while (model != null)
         {
+            Resource localized = locator.locateTemplate(model, locale);
 
-            Resource baseResource = baseResourceForModel(model);
-            Resource localized = baseResource.forLocale(locale);
-
-            // In a race condition, we may hit this method a couple of times, and overwrite previous
-            // results with identical new results.
-
-            // If found a properly localized version of the base resource for the model,
-            // then we've found a match (even if we had to ascend a couple of levels
-            // to reach it).
-
-            if (localized != null) return localized;
-
-            // Not on the classpath, the the locator see if its a) a page and b) a resource inside
-            // the context
-
-            localized = locator.findPageTemplateResource(model, locale);
-
-            if (localized != null) return localized;
+            if (localized != null)
+                return localized;
 
             // Otherwise, this component doesn't have its own template ... lets work up to its
             // base class and check there.
@@ -185,12 +172,7 @@ public final class ComponentTemplateSour
         // This will be a Resource whose URL is null, which will be picked up later and force the
         // return of the empty template.
 
-        return baseResourceForModel(initialModel);
-    }
-
-    private Resource baseResourceForModel(ComponentModel model)
-    {
-        return model.getBaseResource().withExtension(TapestryConstants.TEMPLATE_EXTENSION);
+        return initialModel.getBaseResource().withExtension(TapestryConstants.TEMPLATE_EXTENSION);
     }
 
     /**

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java?rev=946492&r1=946491&r2=946492&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalModule.java Thu May 20 00:19:04 2010
@@ -27,6 +27,7 @@ import org.apache.tapestry5.ioc.ScopeCon
 import org.apache.tapestry5.ioc.ServiceBinder;
 import org.apache.tapestry5.ioc.annotations.Autobuild;
 import org.apache.tapestry5.ioc.annotations.Marker;
+import org.apache.tapestry5.ioc.annotations.Primary;
 import org.apache.tapestry5.ioc.annotations.Scope;
 import org.apache.tapestry5.ioc.annotations.Symbol;
 import org.apache.tapestry5.ioc.internal.services.CtClassSource;
@@ -36,6 +37,7 @@ import org.apache.tapestry5.ioc.services
 import org.apache.tapestry5.ioc.services.PerthreadManager;
 import org.apache.tapestry5.ioc.services.PropertyShadowBuilder;
 import org.apache.tapestry5.services.*;
+import org.apache.tapestry5.services.templates.ComponentTemplateLocator;
 import org.slf4j.Logger;
 
 /**
@@ -115,14 +117,6 @@ public class InternalModule
         return service;
     }
 
-    public static PageTemplateLocator buildPageTemplateLocator(@ContextProvider
-    AssetFactory contextAssetFactory,
-
-    ComponentClassResolver componentClassResolver)
-    {
-        return new PageTemplateLocatorImpl(contextAssetFactory.getRootResource(), componentClassResolver);
-    }
-
     public ComponentInstantiatorSource buildComponentInstantiatorSource(@Builtin
     ClassFactory classFactory,
 
@@ -237,8 +231,8 @@ public class InternalModule
         return service;
     }
 
-    public ComponentTemplateSource buildComponentTemplateSource(TemplateParser parser, PageTemplateLocator locator,
-            ClasspathURLConverter classpathURLConverter)
+    public ComponentTemplateSource buildComponentTemplateSource(TemplateParser parser, @Primary
+    ComponentTemplateLocator locator, ClasspathURLConverter classpathURLConverter)
     {
         ComponentTemplateSourceImpl service = new ComponentTemplateSourceImpl(parser, locator, classpathURLConverter);
 

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/DefaultTemplateLocator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/DefaultTemplateLocator.java?rev=946492&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/DefaultTemplateLocator.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/DefaultTemplateLocator.java Thu May 20 00:19:04 2010
@@ -0,0 +1,31 @@
+// Copyright 2010 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.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal.services.templates;
+
+import java.util.Locale;
+
+import org.apache.tapestry5.TapestryConstants;
+import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.model.ComponentModel;
+import org.apache.tapestry5.services.templates.ComponentTemplateLocator;
+
+public class DefaultTemplateLocator implements ComponentTemplateLocator
+{
+    public Resource locateTemplate(ComponentModel model, Locale locale)
+    {
+        return model.getBaseResource().withExtension(TapestryConstants.TEMPLATE_EXTENSION).forLocale(locale);
+    }
+
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/DefaultTemplateLocator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java (from r946491, tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageTemplateLocatorImpl.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java?p2=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java&p1=tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageTemplateLocatorImpl.java&r1=946491&r2=946492&rev=946492&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageTemplateLocatorImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java Thu May 20 00:19:04 2010
@@ -1,10 +1,10 @@
-// Copyright 2007, 2010 The Apache Software Foundation
+// Copyright 2010 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.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -12,36 +12,44 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.services;
+package org.apache.tapestry5.internal.services.templates;
+
+import static java.lang.String.format;
+
+import java.util.Locale;
 
 import org.apache.tapestry5.TapestryConstants;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.services.ComponentClassResolver;
+import org.apache.tapestry5.services.templates.ComponentTemplateLocator;
 
-import static java.lang.String.format;
-import java.util.Locale;
-
-public class PageTemplateLocatorImpl implements PageTemplateLocator
+/**
+ * The special case for pages, where the template is searched for in the web application context.
+ * 
+ * @since 5.2.0
+ */
+public class PageTemplateLocator implements ComponentTemplateLocator
 {
     private final Resource contextRoot;
 
     private final ComponentClassResolver resolver;
 
-    public PageTemplateLocatorImpl(Resource contextRoot, ComponentClassResolver resolver)
+    public PageTemplateLocator(Resource contextRoot, ComponentClassResolver resolver)
     {
         this.contextRoot = contextRoot;
         this.resolver = resolver;
     }
 
-    public Resource findPageTemplateResource(ComponentModel model, Locale locale)
+    public Resource locateTemplate(ComponentModel model, Locale locale)
     {
         String className = model.getComponentClassName();
 
         // A bit of a hack, but should work.
 
-        if (!className.contains(".pages.")) return null;
+        if (!className.contains(".pages."))
+            return null;
 
         String logicalName = resolver.resolvePageClassNameToPageName(className);
 

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=946492&r1=946491&r2=946492&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 Thu May 20 00:19:04 2010
@@ -83,6 +83,8 @@ import org.apache.tapestry5.internal.ser
 import org.apache.tapestry5.internal.services.meta.ContentTypeExtractor;
 import org.apache.tapestry5.internal.services.meta.MetaAnnotationExtractor;
 import org.apache.tapestry5.internal.services.meta.MetaWorkerImpl;
+import org.apache.tapestry5.internal.services.templates.DefaultTemplateLocator;
+import org.apache.tapestry5.internal.services.templates.PageTemplateLocator;
 import org.apache.tapestry5.internal.transform.*;
 import org.apache.tapestry5.internal.translator.NumericTranslator;
 import org.apache.tapestry5.internal.translator.NumericTranslatorSupport;
@@ -116,6 +118,7 @@ import org.apache.tapestry5.services.mes
 import org.apache.tapestry5.services.meta.FixedExtractor;
 import org.apache.tapestry5.services.meta.MetaDataExtractor;
 import org.apache.tapestry5.services.meta.MetaWorker;
+import org.apache.tapestry5.services.templates.ComponentTemplateLocator;
 import org.apache.tapestry5.util.StringToEnumCoercion;
 import org.apache.tapestry5.validator.Email;
 import org.apache.tapestry5.validator.Max;
@@ -2905,4 +2908,36 @@ public final class TapestryModule
         configuration.add(Secure.class, new FixedExtractor(MetaDataConstants.SECURE_PAGE));
         configuration.addInstance(ContentType.class, ContentTypeExtractor.class);
     }
+
+    /**
+     * Builds the {@link ComponentTemplateLocator} as a chain of command.
+     * 
+     * @since 5.2.0
+     */
+    @Marker(Primary.class)
+    public ComponentTemplateLocator buildComponentTemplateLocator(List<ComponentTemplateLocator> configuration)
+    {
+        return chainBuilder.build(ComponentTemplateLocator.class, configuration);
+    }
+
+    /**
+     * Contributes two template locators:
+     * <dl>
+     * <dt>Default</dt>
+     * <dd>Searches for the template on the classpath ({@link DefaultTemplateLocator}</dd>
+     * <dt>Page (after:Default)</dt>
+     * <dd>Searches for <em>page</em> templates in the context ({@link PageTemplateLocator})</dd>
+     * </dl>
+     * 
+     * @since 5.2.0
+     */
+    public static void contributeComponentTemplateLocator(OrderedConfiguration<ComponentTemplateLocator> configuration,
+            @ContextProvider
+            AssetFactory contextAssetFactory, ComponentClassResolver componentClassResolver)
+    {
+        configuration.add("Default", new DefaultTemplateLocator());
+        configuration
+                .add("Page", new PageTemplateLocator(contextAssetFactory.getRootResource(), componentClassResolver),
+                        "after:Default");
+    }
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/templates/ComponentTemplateLocator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/templates/ComponentTemplateLocator.java?rev=946492&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/templates/ComponentTemplateLocator.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/templates/ComponentTemplateLocator.java Thu May 20 00:19:04 2010
@@ -0,0 +1,44 @@
+// Copyright 2010 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.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.services.templates;
+
+import java.util.Locale;
+
+import org.apache.tapestry5.TapestryConstants;
+import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.ioc.annotations.UsesOrderedConfiguration;
+import org.apache.tapestry5.model.ComponentModel;
+
+/**
+ * Chain-of-command interface used to locate page and component templates. Contributions to this service support
+ * alternate naming schemes for template files, or alternate locations in which to search for template files.
+ * 
+ * @see TapestryConstants#TEMPLATE_EXTENSION
+ * @since 5.2.0
+ */
+@UsesOrderedConfiguration(ComponentTemplateLocator.class)
+public interface ComponentTemplateLocator
+{
+    /**
+     * Locates the template for the given model as a {@link Resource}.
+     * 
+     * @param model
+     *            defines the component, especially its {@linkplain ComponentModel#getBaseResource() base resource}
+     * @param locale
+     *            to which the
+     * @return localized template resource if found, or null if not found
+     */
+    Resource locateTemplate(ComponentModel model, Locale locale);
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/templates/ComponentTemplateLocator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml?rev=946492&r1=946491&r2=946492&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/conf/testng.xml Thu May 20 00:19:04 2010
@@ -42,6 +42,7 @@
       <package name="org.apache.tapestry5.internal.services.assets"/>
       <package name="org.apache.tapestry5.internal.services.messages"/>
       <package name="org.apache.tapestry5.internal.services.meta"/>
+      <package name="org.apache.tapestry5.internal.services.templates"/>
       <package name="org.apache.tapestry5.internal.structure"/>
       <package name="org.apache.tapestry5.internal.test"/>
       <package name="org.apache.tapestry5.internal.transform"/>

Added: tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy?rev=946492&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy Thu May 20 00:19:04 2010
@@ -0,0 +1,119 @@
+// Copyright 2010 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.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal.services.templates;
+
+import java.util.Locale;
+
+import org.apache.tapestry5.internal.test.InternalBaseTestCase;
+import org.testng.annotations.Test 
+
+class PageTemplateLocatorTest extends InternalBaseTestCase
+{
+    void execute(root, resolver, closure) {
+        
+        replay()
+        
+        closure.call(new PageTemplateLocator(root, resolver))
+        
+        verify()
+    }
+    
+    @Test
+    void not_a_page_class() {
+        def model = mockComponentModel()
+        def root = mockResource()
+        def resolver = mockComponentClassResolver()
+        
+        train_getComponentClassName(model, "foo.bar.Baz")
+        
+        execute (root, resolver) { 
+            
+            assert it.locateTemplate (model, Locale.FRENCH) == null
+        }        
+    }
+    
+    @Test
+    void template_found() {
+        def model = mockComponentModel()
+        def root = mockResource()
+        def withExtension = mockResource()
+        def forLocale = mockResource()
+        def resolver = mockComponentClassResolver()
+        def locale = Locale.FRENCH
+        def className = "myapp.pages.Foo"
+        
+        train_getComponentClassName(model, className)
+        
+        train_resolvePageClassNameToPageName(resolver, className, "Foo")
+        
+        train_forFile(root, "Foo.tml", withExtension)
+        train_forLocale(withExtension, locale, forLocale)
+        
+        execute (root, resolver) {
+            
+            assertSame it.locateTemplate(model, locale), forLocale
+        }
+    }
+    
+    /**
+     * Because of how Tapestry maps class names to logical page names, part of the name may be have been stripped off
+     * and we want to make sure we get it back.
+     */
+    @Test
+    void uses_simple_class_name_in_folders() {
+        
+        def model = mockComponentModel()
+        def root = mockResource()
+        def withExtension = mockResource()
+        def forLocale = mockResource()
+        def resolver = mockComponentClassResolver()
+        
+        def locale = Locale.FRENCH
+        def className = "myapp.pages.foo.CreateFoo"
+        
+        
+        train_getComponentClassName(model, className)
+        train_resolvePageClassNameToPageName (resolver, className, "foo/Create")
+        
+        train_forFile(root, "foo/CreateFoo.tml", withExtension)
+        train_forLocale(withExtension, locale, forLocale)
+        
+        execute (root, resolver){
+            
+            assertSame it.locateTemplate (model, locale), forLocale
+        }
+    }
+    
+    @Test
+    void template_not_found() {
+        def model = mockComponentModel()
+        def root = mockResource()
+        def withExtension = mockResource()
+        def resolver = mockComponentClassResolver()
+        def locale= Locale.GERMAN;
+        def className = "myapp.pages.bar.Baz"
+        
+        train_getComponentClassName (model, className)
+        train_resolvePageClassNameToPageName (resolver, className, "bar/Baz")
+        
+        train_forFile(root, "bar/Baz.tml", withExtension)
+        train_forLocale(withExtension, locale, null)
+        
+        execute (root, resolver)  {
+            
+            assertNull it.locateTemplate(model, locale)
+        }
+    }
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImplTest.java?rev=946492&r1=946491&r2=946492&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImplTest.java Thu May 20 00:19:04 2010
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,6 +14,13 @@
 
 package org.apache.tapestry5.internal.services;
 
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Locale;
+import java.util.UUID;
+
 import org.apache.tapestry5.TapestryConstants;
 import org.apache.tapestry5.internal.parser.ComponentTemplate;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
@@ -23,15 +30,9 @@ import org.apache.tapestry5.ioc.internal
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.services.InvalidationListener;
+import org.apache.tapestry5.services.templates.ComponentTemplateLocator;
 import org.testng.annotations.Test;
 
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Locale;
-import java.util.UUID;
-
 public class ComponentTemplateSourceImplTest extends InternalBaseTestCase
 {
     private static final String PACKAGE = "org.apache.tapestry5.internal.pageload";
@@ -39,29 +40,28 @@ public class ComponentTemplateSourceImpl
     static public final String PATH = "org/apache/tapestry5/internal/pageload";
 
     private final ClassLoader loader = Thread.currentThread().getContextClassLoader();
-    
+
     private final ClasspathURLConverter converter = new ClasspathURLConverterImpl();
 
     /**
      * Creates a new class loader, whose parent is the thread's context class loader, but adds a single classpath root
      * from the filesystem.
-     *
+     * 
      * @see #createClasspathRoot()
      */
-    protected final URLClassLoader newLoaderWithClasspathRoot(File rootDir)
-            throws MalformedURLException
+    protected final URLClassLoader newLoaderWithClasspathRoot(File rootDir) throws MalformedURLException
     {
         String urlPath = rootDir.toURL().toString();
         // URLs for folders must end with a slash to make URLClassLoader happy.
         URL url = new URL(urlPath + "/");
 
         return new URLClassLoader(new URL[]
-                {url}, loader);
+        { url }, loader);
     }
 
     /**
      * Creates a new temporary directory which can act as a classpath root.
-     *
+     * 
      * @see #newLoaderWithClasspathRoot(File)
      */
     protected final File createClasspathRoot()
@@ -75,22 +75,24 @@ public class ComponentTemplateSourceImpl
     @Test
     public void caching()
     {
-        Resource baseResource = newResource("Fred.class");
-
         TemplateParser parser = mockTemplateParser();
         ComponentTemplate template = mockComponentTemplate();
         ComponentModel model = mockComponentModel();
+        Resource resource = mockResource();
+        ComponentTemplateLocator locator = mockComponentTemplateLocator();
 
         train_getComponentClassName(model, PACKAGE + ".Fred");
 
-        train_getBaseResource(model, baseResource);
+        expect(locator.locateTemplate(model, Locale.ENGLISH)).andReturn(resource);
+
+        expect(resource.exists()).andReturn(true);
+        expect(resource.toURL()).andReturn(null);
 
-        train_parseTemplate(parser, baseResource
-                .withExtension(TapestryConstants.TEMPLATE_EXTENSION), template);
+        train_parseTemplate(parser, resource, template);
 
         replay();
 
-        ComponentTemplateSource source = new ComponentTemplateSourceImpl(parser, null, converter);
+        ComponentTemplateSource source = new ComponentTemplateSourceImpl(parser, locator, converter);
 
         assertSame(source.getTemplate(model, Locale.ENGLISH), template);
 
@@ -102,6 +104,11 @@ public class ComponentTemplateSourceImpl
         verify();
     }
 
+    protected final ComponentTemplateLocator mockComponentTemplateLocator()
+    {
+        return newMock(ComponentTemplateLocator.class);
+    }
+
     /**
      * Tests resource invalidation.
      */
@@ -125,16 +132,17 @@ public class ComponentTemplateSourceImpl
         TemplateParser parser = mockTemplateParser();
         ComponentTemplate template = mockComponentTemplate();
         InvalidationListener listener = mockInvalidationListener();
+        ComponentTemplateLocator locator = mockComponentTemplateLocator();
 
         train_getComponentClassName(model, "baz.Biff");
 
-        train_getBaseResource(model, baseResource);
+        expect(locator.locateTemplate(model, Locale.ENGLISH)).andReturn(localized);
 
         train_parseTemplate(parser, localized, template);
 
         replay();
 
-        ComponentTemplateSourceImpl source = new ComponentTemplateSourceImpl(parser, null, converter);
+        ComponentTemplateSourceImpl source = new ComponentTemplateSourceImpl(parser, locator, converter);
         source.addInvalidationListener(listener);
 
         assertSame(source.getTemplate(model, Locale.ENGLISH), template);
@@ -166,7 +174,7 @@ public class ComponentTemplateSourceImpl
 
         train_getComponentClassName(model, "baz.Biff");
 
-        train_getBaseResource(model, baseResource);
+        expect(locator.locateTemplate(model, Locale.ENGLISH)).andReturn(localized);
 
         train_parseTemplate(parser, localized, template);
 
@@ -183,22 +191,26 @@ public class ComponentTemplateSourceImpl
     @Test
     public void localization_to_same()
     {
-        Resource baseResource = newResource("Fred.class");
-
+        Resource resource = mockResource();
         TemplateParser parser = mockTemplateParser();
         ComponentTemplate template = mockComponentTemplate();
         ComponentModel model = mockComponentModel();
+        ComponentTemplateLocator locator = mockComponentTemplateLocator();
 
         train_getComponentClassName(model, PACKAGE + ".Fred");
 
-        train_getBaseResource(model, baseResource);
+        expect(locator.locateTemplate(model, Locale.ENGLISH)).andReturn(resource);
+
+        expect(resource.exists()).andReturn(true).anyTimes();
+        expect(resource.toURL()).andReturn(null).anyTimes();
 
-        train_parseTemplate(parser, baseResource
-                .withExtension(TapestryConstants.TEMPLATE_EXTENSION), template);
+        expect(locator.locateTemplate(model, Locale.FRENCH)).andReturn(resource);
+
+        train_parseTemplate(parser, resource, template);
 
         replay();
 
-        ComponentTemplateSourceImpl source = new ComponentTemplateSourceImpl(parser, null, converter);
+        ComponentTemplateSourceImpl source = new ComponentTemplateSourceImpl(parser, locator, converter);
 
         assertSame(source.getTemplate(model, Locale.ENGLISH), template);
 
@@ -215,53 +227,25 @@ public class ComponentTemplateSourceImpl
     }
 
     @Test
-    public void page_template_found_in_context()
-    {
-        Resource baseResource = newResource("NotInClasspath.class");
-
-        // Simpler to do it this way ...
-
-        Resource contextTemplateResource = newResource("Fred.tml");
-
-        TemplateParser parser = mockTemplateParser();
-        ComponentTemplate template = mockComponentTemplate();
-        ComponentModel model = mockComponentModel();
-        PageTemplateLocator locator = mockPageTemplateLocator();
-        Locale locale = Locale.FRENCH;
-
-        train_getComponentClassName(model, PACKAGE + ".NotInClasspath");
-
-        train_getBaseResource(model, baseResource);
-
-        train_findPageTemplateResource(locator, model, locale, contextTemplateResource);
-
-        train_parseTemplate(parser, contextTemplateResource, template);
-
-        replay();
-
-        ComponentTemplateSourceImpl source = new ComponentTemplateSourceImpl(parser, locator, converter);
-
-        assertSame(source.getTemplate(model, locale), template);
-
-        verify();
-    }
-
-    @Test
     public void no_template_found()
     {
         TemplateParser parser = mockTemplateParser();
         ComponentModel model = mockComponentModel();
-        PageTemplateLocator locator = mockPageTemplateLocator();
-
-        Resource baseResource = newResource("Barney.class");
+        ComponentTemplateLocator locator = mockComponentTemplateLocator();
+        Resource baseResource = mockResource();
+        Resource missingResource = mockResource();
 
         train_getComponentClassName(model, PACKAGE + ".Barney");
 
+        expect(locator.locateTemplate(model, Locale.ENGLISH)).andReturn(null);
+
+        train_getParentModel(model, null);
+
         train_getBaseResource(model, baseResource);
 
-        train_findPageTemplateResource(locator, model, Locale.ENGLISH, null);
+        expect(baseResource.withExtension(TapestryConstants.TEMPLATE_EXTENSION)).andReturn(missingResource);
 
-        train_getParentModel(model, null);
+        expect(missingResource.exists()).andReturn(false);
 
         replay();
 
@@ -277,29 +261,25 @@ public class ComponentTemplateSourceImpl
     @Test
     public void child_component_inherits_parent_template()
     {
-        Resource baseFred = newResource("Fred.class");
-        Resource baseBarney = baseFred.forFile("Barney.class");
-        PageTemplateLocator locator = mockPageTemplateLocator();
-
         TemplateParser parser = mockTemplateParser();
         ComponentTemplate template = mockComponentTemplate();
         ComponentModel model = mockComponentModel();
         ComponentModel parentModel = mockComponentModel();
+        Resource resource = mockResource();
+        ComponentTemplateLocator locator = mockComponentTemplateLocator();
 
-        train_getComponentClassName(model, PACKAGE + ".Barney");
-
-        train_getBaseResource(model, baseBarney);
+        train_getComponentClassName(model, "foo.Bar");
 
-        train_findPageTemplateResource(locator, model, Locale.ENGLISH, null);
+        expect(locator.locateTemplate(model, Locale.ENGLISH)).andReturn(null);
 
         train_getParentModel(model, parentModel);
 
-        train_getBaseResource(parentModel, baseFred);
+        expect(locator.locateTemplate(parentModel, Locale.ENGLISH)).andReturn(resource);
+
+        expect(resource.exists()).andReturn(true);
+        expect(resource.toURL()).andReturn(null);
 
-        train_parseTemplate(
-                parser,
-                baseFred.withExtension(TapestryConstants.TEMPLATE_EXTENSION),
-                template);
+        train_parseTemplate(parser, resource, template);
 
         replay();
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java?rev=946492&r1=946491&r2=946492&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/test/InternalBaseTestCase.java Thu May 20 00:19:04 2010
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -37,27 +37,7 @@ import org.apache.tapestry5.internal.Syn
 import org.apache.tapestry5.internal.SyntheticSymbolSourceContributionDef;
 import org.apache.tapestry5.internal.parser.ComponentTemplate;
 import org.apache.tapestry5.internal.parser.TemplateToken;
-import org.apache.tapestry5.internal.services.ActionRenderResponseGenerator;
-import org.apache.tapestry5.internal.services.ComponentClassCache;
-import org.apache.tapestry5.internal.services.ComponentInstantiatorSource;
-import org.apache.tapestry5.internal.services.ComponentModelSource;
-import org.apache.tapestry5.internal.services.ComponentTemplateSource;
-import org.apache.tapestry5.internal.services.DocumentLinker;
-import org.apache.tapestry5.internal.services.Instantiator;
-import org.apache.tapestry5.internal.services.LinkSource;
-import org.apache.tapestry5.internal.services.PageContentTypeAnalyzer;
-import org.apache.tapestry5.internal.services.PageElementFactory;
-import org.apache.tapestry5.internal.services.PageLoader;
-import org.apache.tapestry5.internal.services.PagePool;
-import org.apache.tapestry5.internal.services.PageRenderQueue;
-import org.apache.tapestry5.internal.services.PageResponseRenderer;
-import org.apache.tapestry5.internal.services.PageTemplateLocator;
-import org.apache.tapestry5.internal.services.RequestPageCache;
-import org.apache.tapestry5.internal.services.RequestPathOptimizer;
-import org.apache.tapestry5.internal.services.RequestSecurityManager;
-import org.apache.tapestry5.internal.services.ResourceCache;
-import org.apache.tapestry5.internal.services.ResourceStreamer;
-import org.apache.tapestry5.internal.services.TemplateParser;
+import org.apache.tapestry5.internal.services.*;
 import org.apache.tapestry5.internal.structure.ComponentPageElement;
 import org.apache.tapestry5.internal.structure.ComponentPageElementResources;
 import org.apache.tapestry5.internal.structure.Page;
@@ -114,8 +94,8 @@ public class InternalBaseTestCase extend
         // A synthetic module to ensure that the tapestry.alias-mode is set correctly.
 
         SymbolProvider provider = new SingleKeySymbolProvider(InternalSymbols.ALIAS_MODE, "servlet");
-        ContributionDef contribution = new SyntheticSymbolSourceContributionDef("AliasMode",
-                provider, "before:ApplicationDefaults");
+        ContributionDef contribution = new SyntheticSymbolSourceContributionDef("AliasMode", provider,
+                "before:ApplicationDefaults");
 
         ModuleDef module = new SyntheticModuleDef(contribution);
 
@@ -192,8 +172,8 @@ public class InternalBaseTestCase extend
         return newMock(ComponentTemplate.class);
     }
 
-    protected final <T> void train_getService(InternalRegistry registry, String serviceId,
-            Class<T> serviceInterface, T service)
+    protected final <T> void train_getService(InternalRegistry registry, String serviceId, Class<T> serviceInterface,
+            T service)
     {
         expect(registry.getService(serviceId, serviceInterface)).andReturn(service);
     }
@@ -228,8 +208,7 @@ public class InternalBaseTestCase extend
         return newMock(RenderQueue.class);
     }
 
-    protected final void train_parseTemplate(TemplateParser parser, Resource resource,
-            ComponentTemplate template)
+    protected final void train_parseTemplate(TemplateParser parser, Resource resource, ComponentTemplate template)
     {
         expect(parser.parseTemplate(resource)).andReturn(template);
     }
@@ -264,8 +243,8 @@ public class InternalBaseTestCase extend
         expect(request.getContextPath()).andReturn(contextPath).atLeastOnce();
     }
 
-    protected final void train_resolvePageClassNameToPageName(ComponentClassResolver resolver,
-            String pageClassName, String pageName)
+    protected final void train_resolvePageClassNameToPageName(ComponentClassResolver resolver, String pageClassName,
+            String pageName)
     {
         expect(resolver.resolvePageClassNameToPageName(pageClassName)).andReturn(pageName);
     }
@@ -275,8 +254,7 @@ public class InternalBaseTestCase extend
         expect(element.getContainingPage()).andReturn(page).atLeastOnce();
     }
 
-    protected final void train_getComponentResources(ComponentPageElement element,
-            InternalComponentResources resources)
+    protected final void train_getComponentResources(ComponentPageElement element, InternalComponentResources resources)
     {
         expect(element.getComponentResources()).andReturn(resources).atLeastOnce();
     }
@@ -337,8 +315,8 @@ public class InternalBaseTestCase extend
         expect(model.getEmbeddedComponentIds()).andReturn(Arrays.asList(ids));
     }
 
-    protected void train_getTemplate(ComponentTemplateSource templateSource, ComponentModel model,
-            Locale locale, ComponentTemplate template)
+    protected void train_getTemplate(ComponentTemplateSource templateSource, ComponentModel model, Locale locale,
+            ComponentTemplate template)
     {
         expect(templateSource.getTemplate(model, locale)).andReturn(template);
     }
@@ -357,8 +335,7 @@ public class InternalBaseTestCase extend
     {
         Instantiator ins = newMock(Instantiator.class);
 
-        expect(ins.newInstance(EasyMock.isA(InternalComponentResources.class)))
-                .andReturn(component);
+        expect(ins.newInstance(EasyMock.isA(InternalComponentResources.class))).andReturn(component);
 
         return ins;
     }
@@ -368,8 +345,7 @@ public class InternalBaseTestCase extend
         return newMock(RequestPageCache.class);
     }
 
-    protected final void train_getComponentElementByNestedId(Page page, String nestedId,
-            ComponentPageElement element)
+    protected final void train_getComponentElementByNestedId(Page page, String nestedId, ComponentPageElement element)
     {
         expect(page.getComponentElementByNestedId(nestedId)).andReturn(element).atLeastOnce();
     }
@@ -399,8 +375,7 @@ public class InternalBaseTestCase extend
         return newMock(ResourceCache.class);
     }
 
-    protected final void train_requiresDigest(ResourceCache cache, Resource resource,
-            boolean requiresChecksum)
+    protected final void train_requiresDigest(ResourceCache cache, Resource resource, boolean requiresChecksum)
     {
         expect(cache.requiresDigest(resource)).andReturn(requiresChecksum);
     }
@@ -410,8 +385,7 @@ public class InternalBaseTestCase extend
         return newMock(InvalidationListener.class);
     }
 
-    protected final void train_getTimeModified(ResourceCache cache, Resource resource,
-            long timeModified)
+    protected final void train_getTimeModified(ResourceCache cache, Resource resource, long timeModified)
     {
         expect(cache.getTimeModified(resource)).andReturn(timeModified).atLeastOnce();
     }
@@ -426,17 +400,6 @@ public class InternalBaseTestCase extend
         expect(cache.get(pageName)).andReturn(page).atLeastOnce();
     }
 
-    protected final void train_findPageTemplateResource(PageTemplateLocator locator,
-            ComponentModel model, Locale locale, Resource resource)
-    {
-        expect(locator.findPageTemplateResource(model, locale)).andReturn(resource).atLeastOnce();
-    }
-
-    protected final PageTemplateLocator mockPageTemplateLocator()
-    {
-        return newMock(PageTemplateLocator.class);
-    }
-
     /**
      * Returns the default validator messages.
      */
@@ -444,8 +407,7 @@ public class InternalBaseTestCase extend
     {
         if (validationMessages == null)
         {
-            ResourceBundle bundle = ResourceBundle
-                    .getBundle("org.apache.tapestry5.internal.ValidationMessages");
+            ResourceBundle bundle = ResourceBundle.getBundle("org.apache.tapestry5.internal.ValidationMessages");
 
             validationMessages = new MessagesImpl(Locale.ENGLISH, bundle);
         }
@@ -473,8 +435,7 @@ public class InternalBaseTestCase extend
         expect(resolver.isPageName(isA(String.class))).andStubReturn(result);
     }
 
-    protected final void train_isPageName(ComponentClassResolver resolver, String pageName,
-            boolean result)
+    protected final void train_isPageName(ComponentClassResolver resolver, String pageName, boolean result)
     {
         expect(resolver.isPageName(pageName)).andReturn(result);
     }
@@ -523,8 +484,8 @@ public class InternalBaseTestCase extend
         return newMock(DocumentLinker.class);
     }
 
-    protected final void train_canonicalizePageName(ComponentClassResolver resolver,
-            String pageName, String canonicalized)
+    protected final void train_canonicalizePageName(ComponentClassResolver resolver, String pageName,
+            String canonicalized)
     {
         expect(resolver.canonicalizePageName(pageName)).andReturn(canonicalized);
     }
@@ -534,11 +495,10 @@ public class InternalBaseTestCase extend
         expect(page.getName()).andReturn(pageName).atLeastOnce();
     }
 
-    protected final void train_resolvePageNameToClassName(ComponentClassResolver resolver,
-            String pageName, String pageClassName)
+    protected final void train_resolvePageNameToClassName(ComponentClassResolver resolver, String pageName,
+            String pageClassName)
     {
-        expect(resolver.resolvePageNameToClassName(pageName)).andReturn(pageClassName)
-                .atLeastOnce();
+        expect(resolver.resolvePageNameToClassName(pageName)).andReturn(pageClassName).atLeastOnce();
     }
 
     protected final void train_getLocale(Page page, Locale locale)
@@ -566,8 +526,7 @@ public class InternalBaseTestCase extend
         return newMock(ComponentClassCache.class);
     }
 
-    protected void train_findContentType(PageContentTypeAnalyzer analyzer, Page page,
-            ContentType contentType)
+    protected void train_findContentType(PageContentTypeAnalyzer analyzer, Page page, ContentType contentType)
     {
         expect(analyzer.findContentType(page)).andReturn(contentType).atLeastOnce();
     }
@@ -582,8 +541,7 @@ public class InternalBaseTestCase extend
         return newMock(RequestPathOptimizer.class);
     }
 
-    protected final void train_optimizePath(RequestPathOptimizer optimizer, String path,
-            String optimizedPath)
+    protected final void train_optimizePath(RequestPathOptimizer optimizer, String path, String optimizedPath)
     {
         expect(optimizer.optimizePath(path)).andReturn(optimizedPath);
     }
@@ -608,14 +566,12 @@ public class InternalBaseTestCase extend
         return newMock(ComponentPageElementResources.class);
     }
 
-    protected final void train_toClass(ComponentPageElementResources resources, String className,
-            Class toClass)
+    protected final void train_toClass(ComponentPageElementResources resources, String className, Class toClass)
     {
         expect(resources.toClass(className)).andReturn(toClass).atLeastOnce();
     }
 
-    protected final <S, T> void train_coerce(
-            ComponentPageElementResources componentPageElementResources, S input,
+    protected final <S, T> void train_coerce(ComponentPageElementResources componentPageElementResources, S input,
             Class<T> expectedType, T coercedValue)
     {
         expect(componentPageElementResources.coerce(input, expectedType)).andReturn(coercedValue);
@@ -636,11 +592,10 @@ public class InternalBaseTestCase extend
         expect(context.getCount()).andReturn(count).atLeastOnce();
     }
 
-    protected final void train_getPropertyAdapter(ClassPropertyAdapter classPropertyAdapter,
-            String propertyName, PropertyAdapter propertyAdapter)
+    protected final void train_getPropertyAdapter(ClassPropertyAdapter classPropertyAdapter, String propertyName,
+            PropertyAdapter propertyAdapter)
     {
-        expect(classPropertyAdapter.getPropertyAdapter(propertyName)).andReturn(propertyAdapter)
-                .atLeastOnce();
+        expect(classPropertyAdapter.getPropertyAdapter(propertyName)).andReturn(propertyAdapter).atLeastOnce();
     }
 
     protected final void train_getAdapter(PropertyAccess access, Object object,
@@ -672,8 +627,8 @@ public class InternalBaseTestCase extend
         return newMock(FieldComponent.class);
     }
 
-    protected final void train_setLocaleFromLocaleName(LocalizationSetter localizationSetter,
-            String localeName, boolean recognized)
+    protected final void train_setLocaleFromLocaleName(LocalizationSetter localizationSetter, String localeName,
+            boolean recognized)
     {
         expect(localizationSetter.setLocaleFromLocaleName(localeName)).andReturn(recognized);
     }