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 2014/08/28 02:56:09 UTC

[1/3] git commit: Add a short sleep, not sure why this is suddenly necessary

Repository: tapestry-5
Updated Branches:
  refs/heads/master 54b524e7d -> 194849cd1


Add a short sleep, not sure why this is suddenly necessary


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/b51a5d68
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/b51a5d68
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/b51a5d68

Branch: refs/heads/master
Commit: b51a5d6880ef0209b2a48495807bb7445ffa7658
Parents: 54b524e
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed Aug 27 17:04:25 2014 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed Aug 27 17:04:25 2014 -0700

----------------------------------------------------------------------
 .../integration/app1/ZoneRefreshTest.java       | 35 ++++++++++----------
 1 file changed, 18 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b51a5d68/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/ZoneRefreshTest.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/ZoneRefreshTest.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/ZoneRefreshTest.java
index 3c116f0..d29d271 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/ZoneRefreshTest.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/ZoneRefreshTest.java
@@ -47,23 +47,24 @@ public class ZoneRefreshTest extends App1TestCase
     @Test
     public void test_if_zone_with_context_works() throws Exception
     {
-       openBaseURL();
-       clickAndWait("link=Zone Refresh With Context");
-
-       // assert that counter value didn't changed
-       assertText("zone", "false");
-       Thread.sleep(2000l);
-       assertText("zone", "false");
-
-       // increment counter
-       click("link=Add");
-       waitForAjaxRequestsToComplete();
-
-       // assert that counter value didn't changed
-       Thread.sleep(2000l);
-       assertText("zone", "true");
-       Thread.sleep(2000l);
-       assertText("zone", "true");
+        openBaseURL();
+        clickAndWait("link=Zone Refresh With Context");
+
+        // assert that counter value didn't changed
+        assertText("zone", "false");
+        Thread.sleep(2000l);
+        assertText("zone", "false");
+
+        // increment counter
+        click("link=Add");
+        Thread.sleep(250l);
+        waitForAjaxRequestsToComplete();
+
+        // assert that counter value didn't changed
+        Thread.sleep(2000l);
+        assertText("zone", "true");
+        Thread.sleep(2000l);
+        assertText("zone", "true");
     }
 
     private void checkZoneValues(String zone, int times) throws Exception


[3/3] git commit: TAP5-633: Allow page classes to have a "Page" suffix that is not included in the URL

Posted by hl...@apache.org.
TAP5-633: Allow page classes to have a "Page" suffix that is not included in the URL


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/194849cd
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/194849cd
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/194849cd

Branch: refs/heads/master
Commit: 194849cd183c57fe49a97da791e3bd73dbf8e046
Parents: 624abbe
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed Aug 27 17:56:05 2014 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed Aug 27 17:56:05 2014 -0700

----------------------------------------------------------------------
 54_RELEASE_NOTES.md                             | 11 ++++
 .../internal/ComponentOverrideImpl.java         | 45 +++++--------
 .../services/ComponentClassResolverImpl.java    | 68 ++++++++++++++------
 .../services/templates/PageTemplateLocator.java | 18 ++----
 .../tapestry5/modules/TapestryModule.java       |  2 +-
 .../tapestry5/services/ComponentOverride.java   | 12 +---
 .../ComponentClassResolverImplTest.groovy       | 25 +++----
 .../templates/PageTemplateLocatorTest.groovy    | 58 +++++++++++------
 .../app3/AdditionalIntegrationTests.java        | 17 -----
 9 files changed, 140 insertions(+), 116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/54_RELEASE_NOTES.md
----------------------------------------------------------------------
diff --git a/54_RELEASE_NOTES.md b/54_RELEASE_NOTES.md
index 75222f0..93d0646 100644
--- a/54_RELEASE_NOTES.md
+++ b/54_RELEASE_NOTES.md
@@ -180,6 +180,17 @@ resurface in the future as a CSS expression, but is currently not supported.
 
 The default exception report page has been modified to display a list of threads.
 
+## Page Suffix for Page Names
+
+It is now possible to use "page" as a suffix on a page name. The "page" suffix is stripped off of the logical page
+name; thus for AccountsPage.java, the logical page name will be "Accounts", and this name (in lower case)
+will be used inside generated URLs.  However, "AccountsPage" will also be recognized in URLs or in code. The
+component template should always be named after the Java class itself, here "AccountsPage.tml".
+
+This name stripping, combined with stripping out package names as prefixes and suffixes, can be somewhat hard to
+reason about. Tapestry has always logged a listing of all these aliases at startup; in rare cases, you may
+see conflicts or undesirable page names, and you should rename your classes to suit.
+
 ## ExceptionReporter Service
 
 A new service, `ExceptionReporter`, will now create a text file on the file system for each runtime request processing exception.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java
index e9ab678..93a5e87 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java
@@ -1,5 +1,3 @@
-// Copyright 2014 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
@@ -11,73 +9,64 @@
 // 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;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
+package org.apache.tapestry5.internal;
 
-import org.apache.tapestry5.ioc.util.CaseInsensitiveMap;
 import org.apache.tapestry5.services.ComponentOverride;
 import org.slf4j.Logger;
 
+import java.util.*;
+
 public class ComponentOverrideImpl implements ComponentOverride
 {
 
-    final Logger logger;
-    final private Map<Class, Class> replacements;
-    final private Map<String, Class> nameToClass;
+    private final Map<String, Class> nameToClass;
 
     @SuppressWarnings("rawtypes")
     public ComponentOverrideImpl(Map<Class, Class> contributions, Logger logger)
     {
 
-        this.logger = logger;
-        this.replacements = Collections.unmodifiableMap(contributions);
+        Map<Class, Class> replacements = Collections.unmodifiableMap(contributions);
         Map<String, Class> nameToClass = new HashMap<String, Class>();
 
         int maxLength = 0;
 
-        for (Class<?> clasz : contributions.keySet())
+        for (Class<?> clazz : contributions.keySet())
         {
 
-            final String name = clasz.getName();
-            if (name.length() > maxLength) {
+            final String name = clazz.getName();
+            if (name.length() > maxLength)
+            {
                 maxLength = name.length();
             }
-            nameToClass.put(name, contributions.get(clasz));
+            nameToClass.put(name, contributions.get(clazz));
 
         }
 
         this.nameToClass = Collections.unmodifiableMap(nameToClass);
-        
+
         if (replacements.size() > 0 && logger.isInfoEnabled())
         {
-            
             StringBuilder builder = new StringBuilder(1000);
             final String format = "%" + maxLength + "s: %s\n";
             builder.append("Component replacements (including components, pages and mixins):\n");
             List<String> names = new ArrayList<String>(nameToClass.keySet());
             Collections.sort(names);
-            
-            for (String name : names) {
+
+            for (String name : names)
+            {
                 builder.append(String.format(format, name, nameToClass.get(name).getName()));
             }
-            
+
             logger.info(builder.toString());
-            
         }
 
     }
 
     @Override
-    public Map<Class, Class> getReplacements()
+    public boolean hasReplacements()
     {
-        return replacements;
+        return !nameToClass.isEmpty();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
index 4d29a3e..7f8c666 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
@@ -68,6 +68,15 @@ public class ComponentClassResolverImpl implements ComponentClassResolver, Inval
 
     private final Collection<LibraryMapping> libraryMappings;
 
+    private final Pattern endsWithPagePattern = Pattern.compile(".*/?\\w+page$", Pattern.CASE_INSENSITIVE);
+
+    private boolean endsWithPage(String name)
+    {
+        // Don't treat a name that's just "page" as a suffix to strip off.
+
+        return endsWithPagePattern.matcher(name).matches();
+    }
+
     private class Data
     {
 
@@ -112,58 +121,75 @@ public class ComponentClassResolverImpl implements ComponentClassResolver, Inval
 
         private void rebuild(String pathPrefix, String rootPackage)
         {
-            fillNameToClassNameMap(pathPrefix, rootPackage, InternalConstants.PAGES_SUBPACKAGE, pageToClassName, pageToClassNames);
-            fillNameToClassNameMap(pathPrefix, rootPackage, InternalConstants.COMPONENTS_SUBPACKAGE, componentToClassName, componentToClassNames);
-            fillNameToClassNameMap(pathPrefix, rootPackage, InternalConstants.MIXINS_SUBPACKAGE, mixinToClassName, mixinToClassNames);
+            fill(pathPrefix, rootPackage, InternalConstants.PAGES_SUBPACKAGE, pageToClassName, pageToClassNames);
+            fill(pathPrefix, rootPackage, InternalConstants.COMPONENTS_SUBPACKAGE, componentToClassName, componentToClassNames);
+            fill(pathPrefix, rootPackage, InternalConstants.MIXINS_SUBPACKAGE, mixinToClassName, mixinToClassNames);
         }
 
-        private void fillNameToClassNameMap(String pathPrefix, String rootPackage, String subPackage,
-                                            Map<String, String> logicalNameToClassName,
-                                            Map<String, Set<String>> nameToClassNames)
+        private void fill(String pathPrefix, String rootPackage, String subPackage,
+                          Map<String, String> logicalNameToClassName,
+                          Map<String, Set<String>> nameToClassNames)
         {
             String searchPackage = rootPackage + "." + subPackage;
             boolean isPage = subPackage.equals(InternalConstants.PAGES_SUBPACKAGE);
 
             Collection<String> classNames = classNameLocator.locateClassNames(searchPackage);
 
+            Set<String> aliases = CollectionFactory.newSet();
+
             int startPos = searchPackage.length() + 1;
 
             for (String className : classNames)
             {
+                aliases.clear();
+
                 String logicalName = toLogicalName(className, pathPrefix, startPos, true);
                 String unstrippedName = toLogicalName(className, pathPrefix, startPos, false);
 
+                aliases.add(logicalName);
+                aliases.add(unstrippedName);
+
                 if (isPage)
                 {
+                    if (endsWithPage(logicalName))
+                    {
+                        logicalName = logicalName.substring(0, logicalName.length() - 4);
+                        aliases.add(logicalName);
+                    }
+
                     int lastSlashx = logicalName.lastIndexOf("/");
 
                     String lastTerm = lastSlashx < 0 ? logicalName : logicalName.substring(lastSlashx + 1);
 
-                    if (lastTerm.equalsIgnoreCase("index") || lastTerm.equalsIgnoreCase(startPageName))
+                    if (lastTerm.equalsIgnoreCase("index"))
                     {
                         String reducedName = lastSlashx < 0 ? "" : logicalName.substring(0, lastSlashx);
 
                         // Make the super-stripped name another alias to the class.
                         // TAP5-1444: Everything else but a start page has precedence
 
-                        if (!(lastTerm.equalsIgnoreCase(startPageName) && logicalNameToClassName.containsKey(reducedName)))
-                        {
-                            logicalNameToClassName.put(reducedName, className);
-                            pageNameToCanonicalPageName.put(reducedName, logicalName);
-                            addNameMapping(nameToClassNames, reducedName, className);
-                        }
+
+                        aliases.add(reducedName);
+                    }
+
+                    if (logicalName.equals(startPageName))
+                    {
+                        aliases.add("");
                     }
 
                     pageClassNameToLogicalName.put(className, logicalName);
-                    pageNameToCanonicalPageName.put(logicalName, logicalName);
-                    pageNameToCanonicalPageName.put(unstrippedName, logicalName);
                 }
 
-                logicalNameToClassName.put(logicalName, className);
-                logicalNameToClassName.put(unstrippedName, className);
+                for (String alias : aliases)
+                {
+                    logicalNameToClassName.put(alias, className);
+                    addNameMapping(nameToClassNames, alias, className);
 
-                addNameMapping(nameToClassNames, logicalName, className);
-                addNameMapping(nameToClassNames, unstrippedName, className);
+                    if (isPage)
+                    {
+                        pageNameToCanonicalPageName.put(alias, logicalName);
+                    }
+                }
             }
         }
 
@@ -204,11 +230,15 @@ public class ComponentClassResolverImpl implements ComponentClassResolver, Inval
                 sep = "/";
 
                 if (stripTerms)
+                {
                     logicalName = stripTerm(term, logicalName);
+                }
             }
 
             if (logicalName.equals(""))
+            {
                 logicalName = unstripped;
+            }
 
             builder.append(sep);
             builder.append(logicalName);

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
index 77ee6f5..6f4d427 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
@@ -1,5 +1,3 @@
-// Copyright 2010, 2011 The Apache Software Foundation
-//
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
@@ -55,19 +53,15 @@ public class PageTemplateLocator implements ComponentTemplateLocator
 
         String logicalName = resolver.resolvePageClassNameToPageName(className);
 
-        int slashx = logicalName.lastIndexOf('/');
-
-        if (slashx > 0)
-        {
-            // However, the logical name isn't quite what we want. It may have been somewhat
-            // trimmed.
+        String simpleClassName = InternalUtils.lastTerm(className);
 
-            String simpleClassName = InternalUtils.lastTerm(className);
+        int slashx = logicalName.lastIndexOf('/');
 
-            logicalName = logicalName.substring(0, slashx + 1) + simpleClassName;
-        }
+        // Using the simple class name always accounts for the case where a "page" suffix was stripped off to form
+        // the logical page name (and several other cases where the name was simplified in some way).
+        String baseName = slashx < 0 ? simpleClassName : logicalName.substring(0, slashx + 1) + simpleClassName;
 
-        String path = prefix + logicalName + "." + TapestryConstants.TEMPLATE_EXTENSION;
+        String path = prefix + baseName + "." + TapestryConstants.TEMPLATE_EXTENSION;
 
         return contextRoot.forFile(path).forLocale(locale);
     }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
index 92b06d5..e3902de 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
@@ -2691,7 +2691,7 @@ public final class TapestryModule
                                          final ComponentOverride componentReplacer) throws NoSuchMethodException, SecurityException
     {
 
-        if (componentReplacer.getReplacements().size() > 0)
+        if (componentReplacer.hasReplacements())
         {
 
             MethodAdvice advice = new MethodAdvice()

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java
index 1219b15..cbbbf98 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java
@@ -1,5 +1,3 @@
-// Copyright 2014 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
@@ -14,9 +12,6 @@
 
 package org.apache.tapestry5.services;
 
-import java.util.Map;
-
-import org.apache.tapestry5.ioc.MethodAdviceReceiver;
 import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration;
 
 /**
@@ -28,18 +23,17 @@ import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration;
  * replaced, the value is the replacement.
  *
  * @since 5.4
- * @see ComponentClassResolver.
+ * @see org.apache.tapestry5.services.ComponentClassResolver.
  */
 @UsesMappedConfiguration(key = Class.class, value = Class.class)
 public interface ComponentOverride
 {
 
     /**
-     * Returns an immutable map of replacements. Internal use only.
+     * Returns true if the service configuration is non-empty.
      * 
-     * @return a {@link Map}.
      */
-    Map<Class, Class> getReplacements();
+   boolean hasReplacements();
     
     /**
      * Returns the replacement for a class given its name.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy
index 9b7d4a2..78b016e 100644
--- a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy
+++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy
@@ -8,7 +8,6 @@ import org.apache.tapestry5.services.ComponentClassResolver
 import org.apache.tapestry5.services.LibraryMapping
 import org.easymock.EasyMock
 import org.slf4j.Logger
-import org.slf4j.LoggerFactory
 import org.testng.annotations.Test
 
 import static org.easymock.EasyMock.isA
@@ -80,7 +79,7 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         List<String> pageNames = resolver.getPageNames()
 
-        assertListsEquals(pageNames, "SimplePage", "nested/Index", "nested/Other", "nested/Page")
+        assertListsEquals(pageNames, "Simple", "nested/Index", "nested/Other", "nested/Page")
 
         verify()
     }
@@ -119,7 +118,8 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         ComponentClassResolver resolver = create(logger, locator, [])
 
-        assertEquals(resolver.canonicalizePageName("simplepage"), "SimplePage")
+        assertEquals(resolver.canonicalizePageName("simplepage"), "Simple")
+        assertEquals(resolver.canonicalizePageName("simple"), "Simple")
 
         verify()
     }
@@ -135,12 +135,13 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         replay()
 
-        ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, locator, "HomePage",
+        ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, locator, "Home",
             APP_ROOT_PACKAGE_MAPPINGS)
 
-        assertEquals(resolver.canonicalizePageName("HomePage"), "HomePage")
-        assertEquals(resolver.canonicalizePageName(""), "HomePage")
-        assertTrue(resolver.isPageName("HomePage"))
+        assertEquals(resolver.canonicalizePageName("Home"), "Home")
+        assertEquals(resolver.canonicalizePageName("HomePage"), "Home")
+        assertEquals(resolver.canonicalizePageName(""), "Home")
+        assertTrue(resolver.isPageName("Home"))
 
         verify()
     }
@@ -156,11 +157,11 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         replay()
 
-        ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, locator, "HomePage",
+        ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, locator, "Home",
             APP_ROOT_PACKAGE_MAPPINGS)
 
-        assertEquals(resolver.canonicalizePageName("sub/HomePage"), "sub/HomePage")
-        assertEquals(resolver.canonicalizePageName("sub"), "sub/HomePage")
+        assertEquals(resolver.canonicalizePageName("sub/HomePage"), "sub/Home")
+        assertEquals(resolver.canonicalizePageName("sub/home"), "sub/Home")
         assertTrue(resolver.isPageName("sub/HomePage"))
 
         verify()
@@ -390,7 +391,7 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         ComponentClassResolver resolver = create(logger, locator, [])
 
-        assertEquals(resolver.resolvePageClassNameToPageName(className), "SimplePage")
+        assertEquals(resolver.resolvePageClassNameToPageName(className), "Simple")
 
         verify()
     }
@@ -468,7 +469,7 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         ComponentClassResolver resolver = create(logger, locator, new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE))
 
-        assertEquals(resolver.resolvePageClassNameToPageName(className), "core/MyCorePage")
+        assertEquals(resolver.resolvePageClassNameToPageName(className), "core/MyCore")
 
         verify()
     }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
index d376466..16ee7a3 100644
--- a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
+++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
@@ -1,5 +1,3 @@
-// Copyright 2010, 2011 The Apache Software Foundation
-//
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
@@ -12,15 +10,13 @@
 // 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
+package org.apache.tapestry5.internal.services.templates
 
 import org.apache.tapestry5.internal.test.InternalBaseTestCase
 import org.testng.annotations.Test
 
-class PageTemplateLocatorTest extends InternalBaseTestCase
-{
+class PageTemplateLocatorTest extends InternalBaseTestCase {
+
     void execute(root, resolver, closure) {
 
         replay()
@@ -38,9 +34,9 @@ class PageTemplateLocatorTest extends InternalBaseTestCase
 
         expect(model.page).andReturn(false)
 
-        execute (root, resolver) {
+        execute(root, resolver) {
 
-            assert it.locateTemplate (model, Locale.FRENCH) == null
+            assert it.locateTemplate(model, Locale.FRENCH) == null
         }
     }
 
@@ -63,7 +59,7 @@ class PageTemplateLocatorTest extends InternalBaseTestCase
         train_forFile(root, "Foo.tml", withExtension)
         train_forLocale(withExtension, locale, forLocale)
 
-        execute (root, resolver) {
+        execute(root, resolver) {
 
             assertSame it.locateTemplate(model, locale), forLocale
         }
@@ -88,14 +84,40 @@ class PageTemplateLocatorTest extends InternalBaseTestCase
         expect(model.page).andReturn(true)
 
         train_getComponentClassName(model, className)
-        train_resolvePageClassNameToPageName (resolver, className, "foo/Create")
+        train_resolvePageClassNameToPageName(resolver, className, "foo/Create")
 
         train_forFile(root, "foo/CreateFoo.tml", withExtension)
         train_forLocale(withExtension, locale, forLocale)
 
-        execute (root, resolver){
+        execute(root, resolver) {
 
-            assertSame it.locateTemplate (model, locale), forLocale
+            assertSame it.locateTemplate(model, locale), forLocale
+        }
+    }
+
+    @Test
+    void uses_class_name_when_different_than_logical_name() {
+
+        def model = mockComponentModel()
+        def root = mockResource()
+        def withExtension = mockResource()
+        def forLocale = mockResource()
+        def resolver = mockComponentClassResolver()
+
+        def locale = Locale.FRENCH
+        def className = "myapp.pages.foo.CreateFooPage"
+
+        expect(model.page).andReturn(true)
+
+        train_getComponentClassName(model, className)
+        train_resolvePageClassNameToPageName(resolver, className, "foo/CreatePage")
+
+        train_forFile(root, "foo/CreateFooPage.tml", withExtension)
+        train_forLocale(withExtension, locale, forLocale)
+
+        execute(root, resolver) {
+
+            assertSame it.locateTemplate(model, locale), forLocale
         }
     }
 
@@ -105,18 +127,18 @@ class PageTemplateLocatorTest extends InternalBaseTestCase
         def root = mockResource()
         def withExtension = mockResource()
         def resolver = mockComponentClassResolver()
-        def locale= Locale.GERMAN;
+        def locale = Locale.GERMAN;
         def className = "myapp.pages.bar.Baz"
 
-        expect (model.page).andReturn(true)
+        expect(model.page).andReturn(true)
 
-        train_getComponentClassName (model, className)
-        train_resolvePageClassNameToPageName (resolver, className, "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)  {
+        execute(root, resolver) {
 
             assertNull it.locateTemplate(model, locale)
         }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java
index f94eff0..2b8a7e2 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java
@@ -1,5 +1,3 @@
-// Copyright 2007, 2008, 2011, 2014 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
@@ -75,21 +73,6 @@ public class AdditionalIntegrationTests extends TapestryCoreTestCase
         // Fuckin Selenium
         // assertAttribute("//a[2]/@href", "login");
     }
-
-    public void ajax_server_side_exception()
-    {
-        openLinks("Console demo");
-
-        assertTextPresent("Demonstrates Tapestry console");
-
-        click("link=Failure on the server side");
-
-        // Wait for the console to appear
-
-        waitForCSSSelectedElementToAppear(".t-console div.t-err");
-
-        assertTextPresent("Communication with the server failed: Server-side exception.");
-    }
     
     // TAP5-1611
     @Test


[2/3] git commit: Include thread name in logging output

Posted by hl...@apache.org.
Include thread name in logging output


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/624abbec
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/624abbec
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/624abbec

Branch: refs/heads/master
Commit: 624abbecdf8340005668f2fd560c5c266f2a4287
Parents: b51a5d6
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed Aug 27 17:55:11 2014 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed Aug 27 17:55:11 2014 -0700

----------------------------------------------------------------------
 tapestry-core/src/test/resources/log4j.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/624abbec/tapestry-core/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/resources/log4j.properties b/tapestry-core/src/test/resources/log4j.properties
index 37d6290..7090fd4 100644
--- a/tapestry-core/src/test/resources/log4j.properties
+++ b/tapestry-core/src/test/resources/log4j.properties
@@ -5,7 +5,7 @@ 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.appender.A1.layout.ConversionPattern=%t [%p] %c{1} %m%n
 
 log4j.category.org.apache.tapestry5.integration.app2=debug
 


[3/3] git commit: TAP5-633: Allow page classes to have a "Page" suffix that is not included in the URL

Posted by hl...@apache.org.
TAP5-633: Allow page classes to have a "Page" suffix that is not included in the URL


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/194849cd
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/194849cd
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/194849cd

Branch: refs/heads/master
Commit: 194849cd183c57fe49a97da791e3bd73dbf8e046
Parents: 624abbe
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed Aug 27 17:56:05 2014 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed Aug 27 17:56:05 2014 -0700

----------------------------------------------------------------------
 54_RELEASE_NOTES.md                             | 11 ++++
 .../internal/ComponentOverrideImpl.java         | 45 +++++--------
 .../services/ComponentClassResolverImpl.java    | 68 ++++++++++++++------
 .../services/templates/PageTemplateLocator.java | 18 ++----
 .../tapestry5/modules/TapestryModule.java       |  2 +-
 .../tapestry5/services/ComponentOverride.java   | 12 +---
 .../ComponentClassResolverImplTest.groovy       | 25 +++----
 .../templates/PageTemplateLocatorTest.groovy    | 58 +++++++++++------
 .../app3/AdditionalIntegrationTests.java        | 17 -----
 9 files changed, 140 insertions(+), 116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/54_RELEASE_NOTES.md
----------------------------------------------------------------------
diff --git a/54_RELEASE_NOTES.md b/54_RELEASE_NOTES.md
index 75222f0..93d0646 100644
--- a/54_RELEASE_NOTES.md
+++ b/54_RELEASE_NOTES.md
@@ -180,6 +180,17 @@ resurface in the future as a CSS expression, but is currently not supported.
 
 The default exception report page has been modified to display a list of threads.
 
+## Page Suffix for Page Names
+
+It is now possible to use "page" as a suffix on a page name. The "page" suffix is stripped off of the logical page
+name; thus for AccountsPage.java, the logical page name will be "Accounts", and this name (in lower case)
+will be used inside generated URLs.  However, "AccountsPage" will also be recognized in URLs or in code. The
+component template should always be named after the Java class itself, here "AccountsPage.tml".
+
+This name stripping, combined with stripping out package names as prefixes and suffixes, can be somewhat hard to
+reason about. Tapestry has always logged a listing of all these aliases at startup; in rare cases, you may
+see conflicts or undesirable page names, and you should rename your classes to suit.
+
 ## ExceptionReporter Service
 
 A new service, `ExceptionReporter`, will now create a text file on the file system for each runtime request processing exception.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java
index e9ab678..93a5e87 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/ComponentOverrideImpl.java
@@ -1,5 +1,3 @@
-// Copyright 2014 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
@@ -11,73 +9,64 @@
 // 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;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
+package org.apache.tapestry5.internal;
 
-import org.apache.tapestry5.ioc.util.CaseInsensitiveMap;
 import org.apache.tapestry5.services.ComponentOverride;
 import org.slf4j.Logger;
 
+import java.util.*;
+
 public class ComponentOverrideImpl implements ComponentOverride
 {
 
-    final Logger logger;
-    final private Map<Class, Class> replacements;
-    final private Map<String, Class> nameToClass;
+    private final Map<String, Class> nameToClass;
 
     @SuppressWarnings("rawtypes")
     public ComponentOverrideImpl(Map<Class, Class> contributions, Logger logger)
     {
 
-        this.logger = logger;
-        this.replacements = Collections.unmodifiableMap(contributions);
+        Map<Class, Class> replacements = Collections.unmodifiableMap(contributions);
         Map<String, Class> nameToClass = new HashMap<String, Class>();
 
         int maxLength = 0;
 
-        for (Class<?> clasz : contributions.keySet())
+        for (Class<?> clazz : contributions.keySet())
         {
 
-            final String name = clasz.getName();
-            if (name.length() > maxLength) {
+            final String name = clazz.getName();
+            if (name.length() > maxLength)
+            {
                 maxLength = name.length();
             }
-            nameToClass.put(name, contributions.get(clasz));
+            nameToClass.put(name, contributions.get(clazz));
 
         }
 
         this.nameToClass = Collections.unmodifiableMap(nameToClass);
-        
+
         if (replacements.size() > 0 && logger.isInfoEnabled())
         {
-            
             StringBuilder builder = new StringBuilder(1000);
             final String format = "%" + maxLength + "s: %s\n";
             builder.append("Component replacements (including components, pages and mixins):\n");
             List<String> names = new ArrayList<String>(nameToClass.keySet());
             Collections.sort(names);
-            
-            for (String name : names) {
+
+            for (String name : names)
+            {
                 builder.append(String.format(format, name, nameToClass.get(name).getName()));
             }
-            
+
             logger.info(builder.toString());
-            
         }
 
     }
 
     @Override
-    public Map<Class, Class> getReplacements()
+    public boolean hasReplacements()
     {
-        return replacements;
+        return !nameToClass.isEmpty();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
index 4d29a3e..7f8c666 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassResolverImpl.java
@@ -68,6 +68,15 @@ public class ComponentClassResolverImpl implements ComponentClassResolver, Inval
 
     private final Collection<LibraryMapping> libraryMappings;
 
+    private final Pattern endsWithPagePattern = Pattern.compile(".*/?\\w+page$", Pattern.CASE_INSENSITIVE);
+
+    private boolean endsWithPage(String name)
+    {
+        // Don't treat a name that's just "page" as a suffix to strip off.
+
+        return endsWithPagePattern.matcher(name).matches();
+    }
+
     private class Data
     {
 
@@ -112,58 +121,75 @@ public class ComponentClassResolverImpl implements ComponentClassResolver, Inval
 
         private void rebuild(String pathPrefix, String rootPackage)
         {
-            fillNameToClassNameMap(pathPrefix, rootPackage, InternalConstants.PAGES_SUBPACKAGE, pageToClassName, pageToClassNames);
-            fillNameToClassNameMap(pathPrefix, rootPackage, InternalConstants.COMPONENTS_SUBPACKAGE, componentToClassName, componentToClassNames);
-            fillNameToClassNameMap(pathPrefix, rootPackage, InternalConstants.MIXINS_SUBPACKAGE, mixinToClassName, mixinToClassNames);
+            fill(pathPrefix, rootPackage, InternalConstants.PAGES_SUBPACKAGE, pageToClassName, pageToClassNames);
+            fill(pathPrefix, rootPackage, InternalConstants.COMPONENTS_SUBPACKAGE, componentToClassName, componentToClassNames);
+            fill(pathPrefix, rootPackage, InternalConstants.MIXINS_SUBPACKAGE, mixinToClassName, mixinToClassNames);
         }
 
-        private void fillNameToClassNameMap(String pathPrefix, String rootPackage, String subPackage,
-                                            Map<String, String> logicalNameToClassName,
-                                            Map<String, Set<String>> nameToClassNames)
+        private void fill(String pathPrefix, String rootPackage, String subPackage,
+                          Map<String, String> logicalNameToClassName,
+                          Map<String, Set<String>> nameToClassNames)
         {
             String searchPackage = rootPackage + "." + subPackage;
             boolean isPage = subPackage.equals(InternalConstants.PAGES_SUBPACKAGE);
 
             Collection<String> classNames = classNameLocator.locateClassNames(searchPackage);
 
+            Set<String> aliases = CollectionFactory.newSet();
+
             int startPos = searchPackage.length() + 1;
 
             for (String className : classNames)
             {
+                aliases.clear();
+
                 String logicalName = toLogicalName(className, pathPrefix, startPos, true);
                 String unstrippedName = toLogicalName(className, pathPrefix, startPos, false);
 
+                aliases.add(logicalName);
+                aliases.add(unstrippedName);
+
                 if (isPage)
                 {
+                    if (endsWithPage(logicalName))
+                    {
+                        logicalName = logicalName.substring(0, logicalName.length() - 4);
+                        aliases.add(logicalName);
+                    }
+
                     int lastSlashx = logicalName.lastIndexOf("/");
 
                     String lastTerm = lastSlashx < 0 ? logicalName : logicalName.substring(lastSlashx + 1);
 
-                    if (lastTerm.equalsIgnoreCase("index") || lastTerm.equalsIgnoreCase(startPageName))
+                    if (lastTerm.equalsIgnoreCase("index"))
                     {
                         String reducedName = lastSlashx < 0 ? "" : logicalName.substring(0, lastSlashx);
 
                         // Make the super-stripped name another alias to the class.
                         // TAP5-1444: Everything else but a start page has precedence
 
-                        if (!(lastTerm.equalsIgnoreCase(startPageName) && logicalNameToClassName.containsKey(reducedName)))
-                        {
-                            logicalNameToClassName.put(reducedName, className);
-                            pageNameToCanonicalPageName.put(reducedName, logicalName);
-                            addNameMapping(nameToClassNames, reducedName, className);
-                        }
+
+                        aliases.add(reducedName);
+                    }
+
+                    if (logicalName.equals(startPageName))
+                    {
+                        aliases.add("");
                     }
 
                     pageClassNameToLogicalName.put(className, logicalName);
-                    pageNameToCanonicalPageName.put(logicalName, logicalName);
-                    pageNameToCanonicalPageName.put(unstrippedName, logicalName);
                 }
 
-                logicalNameToClassName.put(logicalName, className);
-                logicalNameToClassName.put(unstrippedName, className);
+                for (String alias : aliases)
+                {
+                    logicalNameToClassName.put(alias, className);
+                    addNameMapping(nameToClassNames, alias, className);
 
-                addNameMapping(nameToClassNames, logicalName, className);
-                addNameMapping(nameToClassNames, unstrippedName, className);
+                    if (isPage)
+                    {
+                        pageNameToCanonicalPageName.put(alias, logicalName);
+                    }
+                }
             }
         }
 
@@ -204,11 +230,15 @@ public class ComponentClassResolverImpl implements ComponentClassResolver, Inval
                 sep = "/";
 
                 if (stripTerms)
+                {
                     logicalName = stripTerm(term, logicalName);
+                }
             }
 
             if (logicalName.equals(""))
+            {
                 logicalName = unstripped;
+            }
 
             builder.append(sep);
             builder.append(logicalName);

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
index 77ee6f5..6f4d427 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/templates/PageTemplateLocator.java
@@ -1,5 +1,3 @@
-// Copyright 2010, 2011 The Apache Software Foundation
-//
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
@@ -55,19 +53,15 @@ public class PageTemplateLocator implements ComponentTemplateLocator
 
         String logicalName = resolver.resolvePageClassNameToPageName(className);
 
-        int slashx = logicalName.lastIndexOf('/');
-
-        if (slashx > 0)
-        {
-            // However, the logical name isn't quite what we want. It may have been somewhat
-            // trimmed.
+        String simpleClassName = InternalUtils.lastTerm(className);
 
-            String simpleClassName = InternalUtils.lastTerm(className);
+        int slashx = logicalName.lastIndexOf('/');
 
-            logicalName = logicalName.substring(0, slashx + 1) + simpleClassName;
-        }
+        // Using the simple class name always accounts for the case where a "page" suffix was stripped off to form
+        // the logical page name (and several other cases where the name was simplified in some way).
+        String baseName = slashx < 0 ? simpleClassName : logicalName.substring(0, slashx + 1) + simpleClassName;
 
-        String path = prefix + logicalName + "." + TapestryConstants.TEMPLATE_EXTENSION;
+        String path = prefix + baseName + "." + TapestryConstants.TEMPLATE_EXTENSION;
 
         return contextRoot.forFile(path).forLocale(locale);
     }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
index 92b06d5..e3902de 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
@@ -2691,7 +2691,7 @@ public final class TapestryModule
                                          final ComponentOverride componentReplacer) throws NoSuchMethodException, SecurityException
     {
 
-        if (componentReplacer.getReplacements().size() > 0)
+        if (componentReplacer.hasReplacements())
         {
 
             MethodAdvice advice = new MethodAdvice()

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java
index 1219b15..cbbbf98 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/ComponentOverride.java
@@ -1,5 +1,3 @@
-// Copyright 2014 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
@@ -14,9 +12,6 @@
 
 package org.apache.tapestry5.services;
 
-import java.util.Map;
-
-import org.apache.tapestry5.ioc.MethodAdviceReceiver;
 import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration;
 
 /**
@@ -28,18 +23,17 @@ import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration;
  * replaced, the value is the replacement.
  *
  * @since 5.4
- * @see ComponentClassResolver.
+ * @see org.apache.tapestry5.services.ComponentClassResolver.
  */
 @UsesMappedConfiguration(key = Class.class, value = Class.class)
 public interface ComponentOverride
 {
 
     /**
-     * Returns an immutable map of replacements. Internal use only.
+     * Returns true if the service configuration is non-empty.
      * 
-     * @return a {@link Map}.
      */
-    Map<Class, Class> getReplacements();
+   boolean hasReplacements();
     
     /**
      * Returns the replacement for a class given its name.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy
index 9b7d4a2..78b016e 100644
--- a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy
+++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/ComponentClassResolverImplTest.groovy
@@ -8,7 +8,6 @@ import org.apache.tapestry5.services.ComponentClassResolver
 import org.apache.tapestry5.services.LibraryMapping
 import org.easymock.EasyMock
 import org.slf4j.Logger
-import org.slf4j.LoggerFactory
 import org.testng.annotations.Test
 
 import static org.easymock.EasyMock.isA
@@ -80,7 +79,7 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         List<String> pageNames = resolver.getPageNames()
 
-        assertListsEquals(pageNames, "SimplePage", "nested/Index", "nested/Other", "nested/Page")
+        assertListsEquals(pageNames, "Simple", "nested/Index", "nested/Other", "nested/Page")
 
         verify()
     }
@@ -119,7 +118,8 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         ComponentClassResolver resolver = create(logger, locator, [])
 
-        assertEquals(resolver.canonicalizePageName("simplepage"), "SimplePage")
+        assertEquals(resolver.canonicalizePageName("simplepage"), "Simple")
+        assertEquals(resolver.canonicalizePageName("simple"), "Simple")
 
         verify()
     }
@@ -135,12 +135,13 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         replay()
 
-        ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, locator, "HomePage",
+        ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, locator, "Home",
             APP_ROOT_PACKAGE_MAPPINGS)
 
-        assertEquals(resolver.canonicalizePageName("HomePage"), "HomePage")
-        assertEquals(resolver.canonicalizePageName(""), "HomePage")
-        assertTrue(resolver.isPageName("HomePage"))
+        assertEquals(resolver.canonicalizePageName("Home"), "Home")
+        assertEquals(resolver.canonicalizePageName("HomePage"), "Home")
+        assertEquals(resolver.canonicalizePageName(""), "Home")
+        assertTrue(resolver.isPageName("Home"))
 
         verify()
     }
@@ -156,11 +157,11 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         replay()
 
-        ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, locator, "HomePage",
+        ComponentClassResolver resolver = new ComponentClassResolverImpl(logger, locator, "Home",
             APP_ROOT_PACKAGE_MAPPINGS)
 
-        assertEquals(resolver.canonicalizePageName("sub/HomePage"), "sub/HomePage")
-        assertEquals(resolver.canonicalizePageName("sub"), "sub/HomePage")
+        assertEquals(resolver.canonicalizePageName("sub/HomePage"), "sub/Home")
+        assertEquals(resolver.canonicalizePageName("sub/home"), "sub/Home")
         assertTrue(resolver.isPageName("sub/HomePage"))
 
         verify()
@@ -390,7 +391,7 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         ComponentClassResolver resolver = create(logger, locator, [])
 
-        assertEquals(resolver.resolvePageClassNameToPageName(className), "SimplePage")
+        assertEquals(resolver.resolvePageClassNameToPageName(className), "Simple")
 
         verify()
     }
@@ -468,7 +469,7 @@ class ComponentClassResolverImplTest extends InternalBaseTestCase {
 
         ComponentClassResolver resolver = create(logger, locator, new LibraryMapping(CORE_PREFIX, CORE_ROOT_PACKAGE))
 
-        assertEquals(resolver.resolvePageClassNameToPageName(className), "core/MyCorePage")
+        assertEquals(resolver.resolvePageClassNameToPageName(className), "core/MyCore")
 
         verify()
     }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
index d376466..16ee7a3 100644
--- a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
+++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/templates/PageTemplateLocatorTest.groovy
@@ -1,5 +1,3 @@
-// Copyright 2010, 2011 The Apache Software Foundation
-//
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
@@ -12,15 +10,13 @@
 // 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
+package org.apache.tapestry5.internal.services.templates
 
 import org.apache.tapestry5.internal.test.InternalBaseTestCase
 import org.testng.annotations.Test
 
-class PageTemplateLocatorTest extends InternalBaseTestCase
-{
+class PageTemplateLocatorTest extends InternalBaseTestCase {
+
     void execute(root, resolver, closure) {
 
         replay()
@@ -38,9 +34,9 @@ class PageTemplateLocatorTest extends InternalBaseTestCase
 
         expect(model.page).andReturn(false)
 
-        execute (root, resolver) {
+        execute(root, resolver) {
 
-            assert it.locateTemplate (model, Locale.FRENCH) == null
+            assert it.locateTemplate(model, Locale.FRENCH) == null
         }
     }
 
@@ -63,7 +59,7 @@ class PageTemplateLocatorTest extends InternalBaseTestCase
         train_forFile(root, "Foo.tml", withExtension)
         train_forLocale(withExtension, locale, forLocale)
 
-        execute (root, resolver) {
+        execute(root, resolver) {
 
             assertSame it.locateTemplate(model, locale), forLocale
         }
@@ -88,14 +84,40 @@ class PageTemplateLocatorTest extends InternalBaseTestCase
         expect(model.page).andReturn(true)
 
         train_getComponentClassName(model, className)
-        train_resolvePageClassNameToPageName (resolver, className, "foo/Create")
+        train_resolvePageClassNameToPageName(resolver, className, "foo/Create")
 
         train_forFile(root, "foo/CreateFoo.tml", withExtension)
         train_forLocale(withExtension, locale, forLocale)
 
-        execute (root, resolver){
+        execute(root, resolver) {
 
-            assertSame it.locateTemplate (model, locale), forLocale
+            assertSame it.locateTemplate(model, locale), forLocale
+        }
+    }
+
+    @Test
+    void uses_class_name_when_different_than_logical_name() {
+
+        def model = mockComponentModel()
+        def root = mockResource()
+        def withExtension = mockResource()
+        def forLocale = mockResource()
+        def resolver = mockComponentClassResolver()
+
+        def locale = Locale.FRENCH
+        def className = "myapp.pages.foo.CreateFooPage"
+
+        expect(model.page).andReturn(true)
+
+        train_getComponentClassName(model, className)
+        train_resolvePageClassNameToPageName(resolver, className, "foo/CreatePage")
+
+        train_forFile(root, "foo/CreateFooPage.tml", withExtension)
+        train_forLocale(withExtension, locale, forLocale)
+
+        execute(root, resolver) {
+
+            assertSame it.locateTemplate(model, locale), forLocale
         }
     }
 
@@ -105,18 +127,18 @@ class PageTemplateLocatorTest extends InternalBaseTestCase
         def root = mockResource()
         def withExtension = mockResource()
         def resolver = mockComponentClassResolver()
-        def locale= Locale.GERMAN;
+        def locale = Locale.GERMAN;
         def className = "myapp.pages.bar.Baz"
 
-        expect (model.page).andReturn(true)
+        expect(model.page).andReturn(true)
 
-        train_getComponentClassName (model, className)
-        train_resolvePageClassNameToPageName (resolver, className, "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)  {
+        execute(root, resolver) {
 
             assertNull it.locateTemplate(model, locale)
         }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/194849cd/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java
index f94eff0..2b8a7e2 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app3/AdditionalIntegrationTests.java
@@ -1,5 +1,3 @@
-// Copyright 2007, 2008, 2011, 2014 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
@@ -75,21 +73,6 @@ public class AdditionalIntegrationTests extends TapestryCoreTestCase
         // Fuckin Selenium
         // assertAttribute("//a[2]/@href", "login");
     }
-
-    public void ajax_server_side_exception()
-    {
-        openLinks("Console demo");
-
-        assertTextPresent("Demonstrates Tapestry console");
-
-        click("link=Failure on the server side");
-
-        // Wait for the console to appear
-
-        waitForCSSSelectedElementToAppear(".t-console div.t-err");
-
-        assertTextPresent("Communication with the server failed: Server-side exception.");
-    }
     
     // TAP5-1611
     @Test


[2/3] git commit: Include thread name in logging output

Posted by hl...@apache.org.
Include thread name in logging output


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/624abbec
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/624abbec
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/624abbec

Branch: refs/heads/master
Commit: 624abbecdf8340005668f2fd560c5c266f2a4287
Parents: b51a5d6
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed Aug 27 17:55:11 2014 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed Aug 27 17:55:11 2014 -0700

----------------------------------------------------------------------
 tapestry-core/src/test/resources/log4j.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/624abbec/tapestry-core/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/resources/log4j.properties b/tapestry-core/src/test/resources/log4j.properties
index 37d6290..7090fd4 100644
--- a/tapestry-core/src/test/resources/log4j.properties
+++ b/tapestry-core/src/test/resources/log4j.properties
@@ -5,7 +5,7 @@ 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.appender.A1.layout.ConversionPattern=%t [%p] %c{1} %m%n
 
 log4j.category.org.apache.tapestry5.integration.app2=debug