Updated Branches: refs/heads/wicket-1.5.x 87245722e -> 426d0f708
WICKET-4338 POST params ignored by IPageParametersEncoder#decodePageParameters() Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/426d0f70 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/426d0f70 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/426d0f70 Branch: refs/heads/wicket-1.5.x Commit: 426d0f708f0a8b9fcf8701bda26a6609631b230b Parents: 8724572 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Tue Jan 17 11:12:35 2012 +0100 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Tue Jan 17 11:12:35 2012 +0100 ---------------------------------------------------------------------- .../mapper/parameter/PageParametersEncoder.java | 15 ++- .../parameter/UrlPathPageParametersEncoder.java | 3 + .../CombinedRequestParametersAdapter.java | 10 +- .../parameter/UrlRequestParametersAdapter.java | 4 +- .../parameter/PageParametersEncoderTest.java | 126 +++++++++++++++ 5 files changed, 147 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/426d0f70/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java index 2312995..5687a71 100644 --- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoder.java @@ -16,9 +16,13 @@ */ package org.apache.wicket.request.mapper.parameter; +import java.util.List; + +import org.apache.wicket.request.IRequestParameters; import org.apache.wicket.request.Request; import org.apache.wicket.request.Url; import org.apache.wicket.request.Url.QueryParameter; +import org.apache.wicket.util.string.StringValue; /** * Simple encoder with direct indexed/named parameters mapping. @@ -47,10 +51,15 @@ public class PageParametersEncoder implements IPageParametersEncoder parameters.set(i, s); ++i; } - - for (QueryParameter p : request.getUrl().getQueryParameters()) + + IRequestParameters requestParameters = request.getRequestParameters(); + for (String paramName : requestParameters.getParameterNames()) { - parameters.add(p.getName(), p.getValue()); + List<StringValue> parameterValues = requestParameters.getParameterValues(paramName); + for (StringValue paramValue : parameterValues) + { + parameters.add(paramName, paramValue); + } } return parameters.isEmpty() ? null : parameters; http://git-wip-us.apache.org/repos/asf/wicket/blob/426d0f70/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java index db3ea51..f31f5c1 100644 --- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java @@ -25,9 +25,12 @@ import org.apache.wicket.util.string.Strings; /** + * <p> * Encodes page parameters into Url path fragments instead of the query string like the default * {@link PageParametersEncoder}. The parameters are encoded in the following format: * {@code /param1Name/param1Value/param2Name/param2Value}. + * </p> + * <strong>Note</strong>: Because of the nature of the encoder it doesn't support POST request parameters. * <p> * This used to be the default way of encoding page parameters in 1.4.x applications. Newer 1.5.x+ * applications use the query string, by default. This class facilitates backwards compatibility and http://git-wip-us.apache.org/repos/asf/wicket/blob/426d0f70/wicket-request/src/main/java/org/apache/wicket/request/parameter/CombinedRequestParametersAdapter.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/main/java/org/apache/wicket/request/parameter/CombinedRequestParametersAdapter.java b/wicket-request/src/main/java/org/apache/wicket/request/parameter/CombinedRequestParametersAdapter.java index e895f3b..b5792cc 100755 --- a/wicket-request/src/main/java/org/apache/wicket/request/parameter/CombinedRequestParametersAdapter.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/parameter/CombinedRequestParametersAdapter.java @@ -19,10 +19,12 @@ package org.apache.wicket.request.parameter; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.apache.wicket.request.IRequestParameters; +import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.string.StringValue; /** @@ -41,11 +43,7 @@ public class CombinedRequestParametersAdapter implements IRequestParameters */ public CombinedRequestParametersAdapter(final IRequestParameters... parameters) { - if (parameters == null) - { - throw new IllegalStateException("Argument 'parameters' may not be null"); - } - this.parameters = parameters; + this.parameters = Args.notNull(parameters, "parameters"); } /** @@ -53,7 +51,7 @@ public class CombinedRequestParametersAdapter implements IRequestParameters */ public Set<String> getParameterNames() { - Set<String> result = new HashSet<String>(); + Set<String> result = new LinkedHashSet<String>(); for (IRequestParameters p : parameters) { result.addAll(p.getParameterNames()); http://git-wip-us.apache.org/repos/asf/wicket/blob/426d0f70/wicket-request/src/main/java/org/apache/wicket/request/parameter/UrlRequestParametersAdapter.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/main/java/org/apache/wicket/request/parameter/UrlRequestParametersAdapter.java b/wicket-request/src/main/java/org/apache/wicket/request/parameter/UrlRequestParametersAdapter.java index d65d1d6..bbdd1da 100755 --- a/wicket-request/src/main/java/org/apache/wicket/request/parameter/UrlRequestParametersAdapter.java +++ b/wicket-request/src/main/java/org/apache/wicket/request/parameter/UrlRequestParametersAdapter.java @@ -18,7 +18,7 @@ package org.apache.wicket.request.parameter; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -55,7 +55,7 @@ public class UrlRequestParametersAdapter implements IRequestParameters */ public Set<String> getParameterNames() { - Set<String> result = new HashSet<String>(); + Set<String> result = new LinkedHashSet<String>(); for (QueryParameter parameter : url.getQueryParameters()) { result.add(parameter.getName()); http://git-wip-us.apache.org/repos/asf/wicket/blob/426d0f70/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoderTest.java ---------------------------------------------------------------------- diff --git a/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoderTest.java b/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoderTest.java new file mode 100644 index 0000000..e07439f --- /dev/null +++ b/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersEncoderTest.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.request.mapper.parameter; + +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import org.apache.wicket.request.IRequestParameters; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.Url; +import org.apache.wicket.util.string.StringValue; +import org.junit.Assert; +import org.junit.Test; + +/** + * Tests for PageParametersEncoder + */ +public class PageParametersEncoderTest extends Assert +{ + /** + * Tests that PageParametersEncoder decodes both GET and POST parameters + * @throws Exception + */ + @Test + public void decodePostParameters() throws Exception + { + PageParametersEncoder encoder = new PageParametersEncoder(); + Request request = new Request() + { + @Override + public Url getUrl() + { + return Url.parse("idx1/idx2?named1=value1&named2=value2"); + } + + @Override + public Url getClientUrl() + { + return null; + } + + @Override + public Locale getLocale() + { + return null; + } + + @Override + public Charset getCharset() + { + return null; + } + + @Override + public Object getContainerRequest() + { + return null; + } + + @Override + public IRequestParameters getPostParameters() + { + return new PostParameters(); + } + }; + + PageParameters pageParameters = encoder.decodePageParameters(request); + assertEquals("idx1", pageParameters.get(0).toOptionalString()); + assertEquals("idx2", pageParameters.get(1).toOptionalString()); + assertEquals("value1", pageParameters.get("named1").toOptionalString()); + assertEquals("value2", pageParameters.get("named2").toOptionalString()); + assertEquals("1", pageParameters.get("postOne").toOptionalString()); + assertEquals("2", pageParameters.getValues("postTwo").get(0).toOptionalString()); + assertEquals("2.1", pageParameters.getValues("postTwo").get(1).toOptionalString()); + } + + /** + * Mock IRequestParameters that provides static POST parameters + */ + private static class PostParameters implements IRequestParameters + { + private final Map<String, List<StringValue>> params = new HashMap<String, List<StringValue>>(); + { + params.put("postOne", Arrays.asList(StringValue.valueOf("1"))); + params.put("postTwo", Arrays.asList(StringValue.valueOf("2"), StringValue.valueOf("2.1"))); + } + + public Set<String> getParameterNames() + { + return params.keySet(); + } + + public StringValue getParameterValue(String name) + { + List<StringValue> values = params.get(name); + return (values != null && !values.isEmpty()) ? values.get(0) + : StringValue.valueOf((String)null); + } + + public List<StringValue> getParameterValues(String name) + { + List<StringValue> values = params.get(name); + return values != null ? Collections.unmodifiableList(values) : null; + } + } +}
