Repository: wicket Updated Branches: refs/heads/WICKET-6419 [created] 769774125
WICKET-6419 Localization of PageParameters Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/76977412 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/76977412 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/76977412 Branch: refs/heads/WICKET-6419 Commit: 7697741252d9542a9686f8d745a4e8c19465be32 Parents: 3e6aa9b Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Tue Jul 18 23:04:11 2017 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Tue Jul 18 23:04:11 2017 +0200 ---------------------------------------------------------------------- .../mapper/AbstractBookmarkableMapper.java | 48 ++++++++- .../mapper/BasicResourceReferenceMapper.java | 1 + .../core/request/mapper/BookmarkableMapper.java | 37 +------ .../core/request/mapper/MountedMapper.java | 11 +- .../core/request/mapper/PackageMapper.java | 3 +- .../core/request/mapper/ResourceMapper.java | 7 +- .../org/apache/wicket/RequestEncodingTest.java | 20 ---- .../mapper/LocaleAwarePageParametersTest.java | 106 +++++++++++++++++++ .../wicket/request/mapper/AbstractMapper.java | 8 ++ .../mapper/parameter/PageParameters.java | 27 ++--- 10 files changed, 186 insertions(+), 82 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java index f12aaec8..9cc0597 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java @@ -18,8 +18,10 @@ package org.apache.wicket.core.request.mapper; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import org.apache.wicket.IRequestListener; +import org.apache.wicket.Session; import org.apache.wicket.core.request.handler.BookmarkableListenerRequestHandler; import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler; import org.apache.wicket.core.request.handler.IPageRequestHandler; @@ -34,6 +36,7 @@ import org.apache.wicket.request.IRequestHandlerDelegate; import org.apache.wicket.request.Request; import org.apache.wicket.request.Url; import org.apache.wicket.request.component.IRequestablePage; +import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.http.WebRequest; import org.apache.wicket.request.mapper.info.ComponentInfo; import org.apache.wicket.request.mapper.info.PageComponentInfo; @@ -43,8 +46,6 @@ import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.mapper.parameter.PageParametersEncoder; import org.apache.wicket.util.lang.Args; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Abstract encoder for Bookmarkable, Hybrid and BookmarkableListener URLs. @@ -53,7 +54,6 @@ import org.slf4j.LoggerFactory; */ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper { - private static Logger logger = LoggerFactory.getLogger(AbstractBookmarkableMapper.class); /** * A flag that is used when comparing the mounted paths' segments against @@ -479,6 +479,45 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper return new PageInfo(pageId); } + /** + * @return a new instance of {@link PageParameters} that will be passed to the page/resource + */ + protected PageParameters newPageParameters() + { + final PageParameters parameters = new PageParameters(); + parameters.setLocale(resolveLocale()); + return parameters; + } + + /** + * Override {@link #resolveLocale()} to return the result of this method if you want to use + * the user's session or request locale for parsing numbers from the page parameters + * + * @return the Session or Request's locale to use for parsing any numbers in the request parameters + */ + protected Locale resolveUserLocale() + { + Locale locale = super.resolveLocale(); + if (Session.exists()) + { + locale = Session.get().getLocale(); + } + else + { + RequestCycle requestCycle = RequestCycle.get(); + if (requestCycle != null) + { + Request request = requestCycle.getRequest(); + if (request != null) + { + locale = request.getLocale(); + } + } + } + + return locale; + } + protected static class MountPathSegment { private int segmentIndex; @@ -587,6 +626,7 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper for (int curMatchSize : matchedParameters) total += curMatchSize; PageParameters pageParameters = extractPageParameters(request, total, pageParametersEncoder); + pageParameters.setLocale(resolveLocale()); int skippedParameters = 0; for (int pathSegmentIndex = 0; pathSegmentIndex < pathSegments.size(); pathSegmentIndex++) @@ -598,7 +638,7 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper { if (pageParameters == null) { - pageParameters = new PageParameters(); + pageParameters = newPageParameters(); } int curSegmentIndex = matchSegment + curPathSegment.getSegmentIndex(); http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java index 2bdc65e..aeaf81b 100755 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java @@ -93,6 +93,7 @@ public class BasicResourceReferenceMapper extends AbstractResourceReferenceMappe // extract the PageParameters from URL if there are any PageParameters pageParameters = extractPageParameters(request, segmentsSize, pageParametersEncoder); + pageParameters.setLocale(resolveLocale()); String className = url.getSegments().get(2); StringBuilder name = new StringBuilder(segmentsSize * 2); http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java index 9b301f1..5388fcb 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BookmarkableMapper.java @@ -19,12 +19,9 @@ package org.apache.wicket.core.request.mapper; import java.util.List; import org.apache.wicket.Application; -import org.apache.wicket.request.IRequestMapper; import org.apache.wicket.request.Request; import org.apache.wicket.request.Url; import org.apache.wicket.request.component.IRequestablePage; -import org.apache.wicket.request.mapper.ICompoundRequestMapper; -import org.apache.wicket.request.mapper.IRequestMapperDelegate; import org.apache.wicket.request.mapper.info.PageComponentInfo; import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder; import org.apache.wicket.request.mapper.parameter.PageParameters; @@ -126,6 +123,7 @@ public class BookmarkableMapper extends AbstractBookmarkableMapper // extract the PageParameters from URL if there are any PageParameters pageParameters = extractPageParameters(request, 3, pageParametersEncoder); + pageParameters.setLocale(resolveLocale()); return new UrlInfo(info, pageClass, pageParameters); } @@ -133,39 +131,6 @@ public class BookmarkableMapper extends AbstractBookmarkableMapper return null; } - private boolean isPageMounted(Class<? extends IRequestablePage> pageClass, ICompoundRequestMapper compoundMapper) - { - for (IRequestMapper requestMapper : compoundMapper) - { - while (requestMapper instanceof IRequestMapperDelegate) - { - requestMapper = ((IRequestMapperDelegate)requestMapper).getDelegateMapper(); - } - - if (requestMapper instanceof ICompoundRequestMapper) - { - if (isPageMounted(pageClass, (ICompoundRequestMapper)requestMapper)) - { - return true; - } - } - else - { - if (requestMapper instanceof AbstractBookmarkableMapper && requestMapper != this) - { - AbstractBookmarkableMapper mapper = (AbstractBookmarkableMapper) requestMapper; - - if (mapper.checkPageClass(pageClass)) - { - return true; - } - } - } - } - - return false; - } - @Override protected boolean pageMustHaveBeenCreatedBookmarkable() { http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java index d308ac1..413e866 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java @@ -148,11 +148,6 @@ public class MountedMapper extends AbstractBookmarkableMapper } } - protected PageParameters newPageParameters() - { - return new PageParameters(); - } - @Override public Url mapHandler(IRequestHandler requestHandler) { @@ -175,7 +170,8 @@ public class MountedMapper extends AbstractBookmarkableMapper PageInfo pageInfo = getPageInfo(handler); ComponentInfo componentInfo = new ComponentInfo(renderCount, componentPath, handler.getBehaviorIndex()); PageComponentInfo pageComponentInfo = new PageComponentInfo(pageInfo, componentInfo); - PageParameters parameters = new PageParameters(page.getPageParameters()); + PageParameters parameters = newPageParameters(); + parameters.mergeWith(page.getPageParameters()); UrlInfo urlInfo = new UrlInfo(pageComponentInfo, page.getClass(), parameters.mergeWith(handler.getPageParameters())); url = buildUrl(urlInfo); @@ -198,7 +194,8 @@ public class MountedMapper extends AbstractBookmarkableMapper } encodePageComponentInfo(url, info.getPageComponentInfo()); - PageParameters copy = new PageParameters(info.getPageParameters()); + PageParameters copy = newPageParameters(); + copy.mergeWith(info.getPageParameters()); if (setPlaceholders(copy, url) == false) { // mandatory parameter is not provided => cannot build Url http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java index 6205e78..a5a376e 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PackageMapper.java @@ -118,7 +118,8 @@ public class PackageMapper extends AbstractBookmarkableMapper url.getSegments().add(packageRelativeClassName); encodePageComponentInfo(url, info.getPageComponentInfo()); - PageParameters copy = new PageParameters(info.getPageParameters()); + PageParameters copy = newPageParameters(); + copy.mergeWith(info.getPageParameters()); if (setPlaceholders(copy, url) == false) { // mandatory parameter is not provided => cannot build Url http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java index b6565be..8d8b0fa 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java @@ -126,6 +126,7 @@ public class ResourceMapper extends AbstractBookmarkableMapper // now extract the page parameters from the request url PageParameters parameters = extractPageParameters(request, mountSegments.length, parametersEncoder); + parameters.setLocale(resolveLocale()); // remove caching information from current request removeCachingDecoration(url, parameters); @@ -146,7 +147,7 @@ public class ResourceMapper extends AbstractBookmarkableMapper // extract the parameter from URL if (parameters == null) { - parameters = new PageParameters(); + parameters = newPageParameters(); } parameters.add(placeholder, url.getSegments().get(index), INamedParameters.Type.PATH); } @@ -174,6 +175,7 @@ public class ResourceMapper extends AbstractBookmarkableMapper { Url originalUrl = new Url(request.getUrl()); PageParameters parameters = extractPageParameters(request, mountSegments.length, parametersEncoder); + parameters.setLocale(resolveLocale()); removeCachingDecoration(originalUrl, parameters); Request requestWithoutDecoration = request.cloneWithUrl(originalUrl); @@ -214,7 +216,8 @@ public class ResourceMapper extends AbstractBookmarkableMapper } // replace placeholder parameters - PageParameters parameters = new PageParameters(handler.getPageParameters()); + PageParameters parameters = newPageParameters(); + parameters.mergeWith(handler.getPageParameters()); for (int index = 0; index < mountSegments.length; ++index) { http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java b/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java index edfe42d..8b66dce 100644 --- a/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/RequestEncodingTest.java @@ -23,23 +23,13 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * - */ public class RequestEncodingTest extends Assert { - /** Log. */ - private static final Logger log = LoggerFactory.getLogger(RequestEncodingTest.class); private RedirectApplication application; private WicketTester tester; - /** - * @see WicketTestCase#commonBefore() - */ @Before public void setUp() { @@ -49,18 +39,12 @@ public class RequestEncodingTest extends Assert tester.assertRenderedPage(RedirectHomePage.class); } - /** - * - */ @After public void tearDown() { tester.destroy(); } - /** - * - */ @Test public void defaultTest() { @@ -81,10 +65,6 @@ public class RequestEncodingTest extends Assert assertTrue(document.contains("umlaut-\u00E4-\u00F6-\u00FC")); } - - /** - * - */ @Test public void umlautsInRequestUri() { http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/LocaleAwarePageParametersTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/LocaleAwarePageParametersTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/LocaleAwarePageParametersTest.java new file mode 100644 index 0000000..01453e9 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/LocaleAwarePageParametersTest.java @@ -0,0 +1,106 @@ +package org.apache.wicket.core.request.mapper; + +import static org.hamcrest.Matchers.is; + +import java.util.Locale; + +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.Page; +import org.apache.wicket.Session; +import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.mock.MockApplication; +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.Response; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.StringResourceStream; +import org.apache.wicket.util.tester.WicketTestCase; +import org.junit.Test; + +/** + * https://issues.apache.org/jira/browse/WICKET-6419 + */ +public class LocaleAwarePageParametersTest extends WicketTestCase +{ + @Override + protected WebApplication newApplication() + { + return new MockApplication() + { + @Override + protected void init() + { + super.init(); + + mountPage("unaware", LocaleUnawarePageParametersPage.class); + mount(new MountedMapper("aware", LocaleAwarePageParametersPage.class) + { + @Override + protected Locale resolveLocale() + { + return resolveUserLocale(); + } + } + ); + } + + @Override + public Session newSession(Request request, Response response) + { + final Session session = super.newSession(request, response); + session.setLocale(Locale.GERMANY); + return session; + } + }; + } + + @Test + public void localeUnaware() + { + tester.executeUrl("unaware?number=1.234,0"); + final Page page = tester.getLastRenderedPage(); + + assertThat(page.getPageParameters().get("number").toDouble(), is(1.234)); + } + + @Test + public void localeAware() + { + tester.executeUrl("aware?number=1.234,0"); + final Page page = tester.getLastRenderedPage(); + + assertThat(page.getPageParameters().get("number").toDouble(), is(1234d)); + } + + private static class BasePage extends WebPage implements IMarkupResourceStreamProvider + { + protected BasePage(PageParameters parameters) + { + super(parameters); + } + + @Override + public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) + { + return new StringResourceStream("<html><body>content</body></html>"); + } + } + + public static class LocaleUnawarePageParametersPage extends BasePage + { + public LocaleUnawarePageParametersPage(PageParameters parameters) + { + super(parameters); + } + } + + public static class LocaleAwarePageParametersPage extends BasePage + { + public LocaleAwarePageParametersPage(PageParameters parameters) + { + super(parameters); + } + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java index a9f7143..1fdf955 100644 --- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java @@ -17,6 +17,7 @@ package org.apache.wicket.request.mapper; import java.util.List; +import java.util.Locale; import org.apache.wicket.request.IRequestMapper; import org.apache.wicket.request.Request; @@ -251,4 +252,11 @@ public abstract class AbstractMapper implements IRequestMapper return res; } + /** + * @return the locale to use for parsing any numbers in the request parameters + */ + protected Locale resolveLocale() + { + return Locale.getDefault(Locale.Category.DISPLAY); + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/76977412/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java index c985dcb..e1ce701 100644 --- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParameters.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.TreeSet; @@ -55,6 +56,8 @@ public class PageParameters implements IClusterable, IIndexedParameters, INamedP private List<NamedPair> namedParameters; + private Locale locale = Locale.getDefault(Locale.Category.DISPLAY); + /** * Constructor. */ @@ -72,15 +75,8 @@ public class PageParameters implements IClusterable, IIndexedParameters, INamedP { if (copy != null) { - if (copy.indexedParameters != null) - { - indexedParameters = new ArrayList<>(copy.indexedParameters); - } - - if (copy.namedParameters != null) - { - namedParameters = new ArrayList<>(copy.namedParameters); - } + mergeWith(copy); + setLocale(copy.locale); } } @@ -119,7 +115,7 @@ public class PageParameters implements IClusterable, IIndexedParameters, INamedP { if ((index >= 0) && (index < indexedParameters.size())) { - return StringValue.valueOf(indexedParameters.get(index)); + return StringValue.valueOf(indexedParameters.get(index), locale); } } return StringValue.valueOf((String)null); @@ -164,7 +160,7 @@ public class PageParameters implements IClusterable, IIndexedParameters, INamedP { if (entry.getKey().equals(name)) { - return StringValue.valueOf(entry.getValue()); + return StringValue.valueOf(entry.getValue(), locale); } } } @@ -183,7 +179,7 @@ public class PageParameters implements IClusterable, IIndexedParameters, INamedP { if (entry.getKey().equals(name)) { - result.add(StringValue.valueOf(entry.getValue())); + result.add(StringValue.valueOf(entry.getValue(), locale)); } } return Collections.unmodifiableList(result); @@ -401,6 +397,7 @@ public class PageParameters implements IClusterable, IIndexedParameters, INamedP { indexedParameters = other.indexedParameters; namedParameters = other.namedParameters; + locale = other.locale; } return this; } @@ -508,6 +505,12 @@ public class PageParameters implements IClusterable, IIndexedParameters, INamedP return (getIndexedCount() == 0) && getNamedKeys().isEmpty(); } + public PageParameters setLocale(Locale locale) + { + this.locale = locale != null ? locale : Locale.getDefault(Locale.Category.DISPLAY); + return this; + } + @Override public String toString() {
