You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/10/18 00:31:36 UTC

svn commit: r1185406 - in /tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services: ComponentEventLinkEncoderImpl.java RootPathDispatcher.java

Author: hlship
Date: Mon Oct 17 22:31:35 2011
New Revision: 1185406

URL: http://svn.apache.org/viewvc?rev=1185406&view=rev
Log:
TAP5-1701: If the incoming request does not include a locale in the path, the application uses the server locale (not a locale extracted from the request headers)

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RootPathDispatcher.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImpl.java?rev=1185406&r1=1185405&r2=1185406&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImpl.java Mon Oct 17 22:31:35 2011
@@ -236,6 +236,8 @@ public class ComponentEventLinkEncoderIm
 
     public ComponentEventRequestParameters decodeComponentEventRequest(Request request)
     {
+        boolean explicitLocale = false;
+
         Matcher matcher = COMPONENT_EVENT_REQUEST_PATH_PATTERN.matcher(request.getPath());
 
         if (!matcher.matches())
@@ -257,6 +259,7 @@ public class ComponentEventLinkEncoderIm
         if (localizationSetter.setLocaleFromLocaleName(possibleLocaleName))
         {
             activePageName = activePageName.substring(slashx + 1);
+            explicitLocale = true;
         }
 
         if (!componentClassResolver.isPageName(activePageName))
@@ -289,12 +292,28 @@ public class ComponentEventLinkEncoderIm
         else
             containingPageName = componentClassResolver.canonicalizePageName(containingPageName);
 
+        if (!explicitLocale)
+        {
+            setLocaleFromRequest(request);
+        }
+
         return new ComponentEventRequestParameters(activePageName, containingPageName, nestedComponentId, eventType,
                 activationContext, eventContext);
     }
 
+    private void setLocaleFromRequest(Request request)
+    {
+        Locale locale = request.getLocale();
+
+        // And explicit locale will have invoked setLocaleFromLocaleName().
+
+        localizationSetter.setNonPeristentLocaleFromLocaleName(locale.toString());
+    }
+
     public PageRenderRequestParameters decodePageRenderRequest(Request request)
     {
+        boolean explicitLocale = false;
+
         // The extended name may include a page activation context. The trick is
         // to figure out where the logical page name stops and where the
         // activation context begins. Further, strip out the leading slash.
@@ -347,6 +366,7 @@ public class ComponentEventLinkEncoderIm
         if (localizationSetter.setLocaleFromLocaleName(possibleLocaleName))
         {
             extendedName = slashx > 0 ? extendedName.substring(slashx + 1) : "";
+            explicitLocale = true;
         }
 
         slashx = extendedName.length();
@@ -372,7 +392,14 @@ public class ComponentEventLinkEncoderIm
 
         // OK, maybe its all page activation context for the root Index page.
 
-        return checkIfPage(request, "", extendedName);
+        PageRenderRequestParameters result = checkIfPage(request, "", extendedName);
+
+        if (result != null && !explicitLocale)
+        {
+            setLocaleFromRequest(request);
+        }
+
+        return result;
     }
 
     private PageRenderRequestParameters checkIfPage(Request request, String pageName, String pageActivationContext)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RootPathDispatcher.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RootPathDispatcher.java?rev=1185406&r1=1185405&r2=1185406&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RootPathDispatcher.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RootPathDispatcher.java Mon Oct 17 22:31:35 2011
@@ -1,4 +1,4 @@
-// Copyright 2007, 2008, 2010 The Apache Software Foundation
+// Copyright 2007, 2008, 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -14,18 +14,13 @@
 
 package org.apache.tapestry5.internal.services;
 
-import java.io.IOException;
-
 import org.apache.tapestry5.EventContext;
 import org.apache.tapestry5.SymbolConstants;
 import org.apache.tapestry5.internal.EmptyEventContext;
 import org.apache.tapestry5.ioc.annotations.Symbol;
-import org.apache.tapestry5.services.ComponentClassResolver;
-import org.apache.tapestry5.services.ComponentRequestHandler;
-import org.apache.tapestry5.services.Dispatcher;
-import org.apache.tapestry5.services.PageRenderRequestParameters;
-import org.apache.tapestry5.services.Request;
-import org.apache.tapestry5.services.Response;
+import org.apache.tapestry5.services.*;
+
+import java.io.IOException;
 
 /**
  * Recognizes a request for the application root (i.e., "/") and handles this the same as a render request for the
@@ -43,16 +38,19 @@ public class RootPathDispatcher implemen
 
     private final PageRenderRequestParameters parameters;
 
+    private final LocalizationSetter localizationSetter;
+
     public RootPathDispatcher(ComponentClassResolver componentClassResolver,
 
-    ComponentRequestHandler handler,
+                              ComponentRequestHandler handler,
 
-    @Symbol(SymbolConstants.START_PAGE_NAME)
-    String startPageName)
+                              @Symbol(SymbolConstants.START_PAGE_NAME)
+                              String startPageName, LocalizationSetter localizationSetter)
     {
         this.componentClassResolver = componentClassResolver;
         this.handler = handler;
         this.startPageName = startPageName;
+        this.localizationSetter = localizationSetter;
 
         parameters = new PageRenderRequestParameters(this.startPageName, EMPTY_CONTEXT, false);
     }
@@ -63,6 +61,8 @@ public class RootPathDispatcher implemen
 
         if (request.getPath().equals("/") && componentClassResolver.isPageName(startPageName))
         {
+            localizationSetter.setNonPeristentLocaleFromLocaleName(request.getLocale().toString());
+
             handler.handlePageRender(parameters);
 
             return true;