Updated Branches:
  refs/heads/wicket-4774 [created] 665a3e800

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
index a342bd5..b6e9242 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/PackageMapperTest.java
@@ -18,11 +18,6 @@ package org.apache.wicket.core.request.mapper;
 
 import org.apache.wicket.MockPage;
 import 
org.apache.wicket.core.request.handler.BookmarkableListenerInterfaceRequestHandler;
-import org.apache.wicket.markup.html.link.ILinkListener;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.component.IRequestableComponent;
-import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
 import org.apache.wicket.core.request.handler.IPageProvider;
 import org.apache.wicket.core.request.handler.IPageRequestHandler;
@@ -31,6 +26,12 @@ import 
org.apache.wicket.core.request.handler.PageAndComponentProvider;
 import org.apache.wicket.core.request.handler.PageProvider;
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
 import 
org.apache.wicket.core.request.mapper.PackageMapperTest.OuterPage.InnerPage;
+import org.apache.wicket.markup.html.link.ILinkListener;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.component.IRequestableComponent;
+import org.apache.wicket.request.component.IRequestablePage;
+import org.apache.wicket.request.mapper.parameter.IPageParameters;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.lang.PackageName;
 import org.junit.Test;
@@ -123,7 +124,7 @@ public class PackageMapperTest extends AbstractMapperTest
                IRequestablePage page = 
((RenderPageRequestHandler)handler).getPage();
                assertEquals(PAGE_CLASS_NAME, page.getClass().getSimpleName());
 
-               PageParameters p = page.getPageParameters();
+               IPageParameters p = page.getPageParameters();
                assertEquals(1, p.getIndexedCount());
                assertEquals("indexed1", p.get(0).toString());
 
@@ -159,7 +160,7 @@ public class PackageMapperTest extends AbstractMapperTest
                IRequestablePage page = 
((RenderPageRequestHandler)handler).getPage();
                checkPage(page, 15);
 
-               PageParameters p = page.getPageParameters();
+               IPageParameters p = page.getPageParameters();
                assertEquals(0, p.getIndexedCount());
 
                assertEquals(0, p.getNamedKeys().size());
@@ -204,7 +205,7 @@ public class PackageMapperTest extends AbstractMapperTest
                assertEquals(ILinkListener.INTERFACE, h.getListenerInterface());
                assertEquals("foo:bar", h.getComponent().getPageRelativePath());
 
-               PageParameters p = page.getPageParameters();
+               IPageParameters p = page.getPageParameters();
                assertEquals(0, p.getIndexedCount());
 
                assertEquals(0, p.getNamedKeys().size());
@@ -337,10 +338,11 @@ public class PackageMapperTest extends AbstractMapperTest
        public void encode4()
        {
                MockPage page = new MockPage(15);
-               page.getPageParameters().set(0, "i1");
-               page.getPageParameters().set(1, "i2");
-               page.getPageParameters().set("a", "b");
-               page.getPageParameters().set("b", "c");
+               PageParameters parameters = page.getPageParameters().mutable();
+               parameters.set(0, "i1");
+               parameters.set(1, "i2");
+               parameters.set("a", "b");
+               parameters.set("b", "c");
                page.setCreatedBookmarkable(true);
 
                IPageProvider provider = new PageProvider(page);
@@ -357,10 +359,11 @@ public class PackageMapperTest extends AbstractMapperTest
        public void encode5()
        {
                MockPage page = new MockPage(15);
-               page.getPageParameters().set(0, "i1");
-               page.getPageParameters().set(1, "i2");
-               page.getPageParameters().set("a", "b");
-               page.getPageParameters().set("b", "c");
+               PageParameters pageParameters = 
page.getPageParameters().mutable();
+               pageParameters.set(0, "i1");
+               pageParameters.set(1, "i2");
+               pageParameters.set("a", "b");
+               pageParameters.set("b", "c");
 
                page.setCreatedBookmarkable(false);
 
@@ -381,10 +384,11 @@ public class PackageMapperTest extends AbstractMapperTest
        public void encode6()
        {
                MockPage page = new MockPage(15);
-               page.getPageParameters().set(0, "i1");
-               page.getPageParameters().set(1, "i2");
-               page.getPageParameters().set("a", "b");
-               page.getPageParameters().set("b", "c");
+               PageParameters parameters = page.getPageParameters().mutable();
+               parameters.set(0, "i1");
+               parameters.set(1, "i2");
+               parameters.set("a", "b");
+               parameters.set("b", "c");
 
                // shouldn't make any difference for 
BookmarkableListenerInterfaceRequestHandler,
                // as this explicitely says the url must be bookmarkable
@@ -408,10 +412,11 @@ public class PackageMapperTest extends AbstractMapperTest
        public void encode7()
        {
                MockPage page = new MockPage(15);
-               page.getPageParameters().set(0, "i1");
-               page.getPageParameters().set(1, "i2");
-               page.getPageParameters().set("a", "b");
-               page.getPageParameters().set("b", "c");
+               PageParameters parameters = page.getPageParameters().mutable();
+               parameters.set(0, "i1");
+               parameters.set(1, "i2");
+               parameters.set("a", "b");
+               parameters.set("b", "c");
 
                // shouldn't make any difference for 
BookmarkableListenerInterfaceRequestHandler,
                // as this explicitely says the url must be bookmarkable

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/ResourceMapperTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/ResourceMapperTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/ResourceMapperTest.java
index a0e3512..64cd303 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/ResourceMapperTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/ResourceMapperTest.java
@@ -26,7 +26,7 @@ import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Url;
 import 
org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.mapper.parameter.IPageParameters;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.request.resource.SharedResourceReference;
@@ -138,7 +138,7 @@ public class ResourceMapperTest extends WicketTestCase
                assertEquals(request.getUrl(), 
mapper.mapHandler(requestHandler));
 
                tester.processRequest(requestHandler);
-               PageParameters params = resource.pageParameters;
+               IPageParameters params = resource.pageParameters;
                assertNotNull(params);
                assertEquals(0, params.getAllNamed().size());
                assertEquals(2, params.getIndexedCount());
@@ -165,7 +165,7 @@ public class ResourceMapperTest extends WicketTestCase
                assertEquals(request.getUrl(), 
mapper.mapHandler(requestHandler));
 
                tester.processRequest(requestHandler);
-               PageParameters params = resource.pageParameters;
+               IPageParameters params = resource.pageParameters;
                assertNotNull(params);
                assertEquals(3, params.getAllNamed().size());
                assertEquals(2, params.getIndexedCount());
@@ -200,7 +200,7 @@ public class ResourceMapperTest extends WicketTestCase
                assertEquals(request.getUrl(), 
mapperWithPlaceholder.mapHandler(requestHandler));
 
                tester.processRequest(requestHandler);
-               PageParameters params = resource.pageParameters;
+               IPageParameters params = resource.pageParameters;
                assertNotNull(params);
                assertEquals(3, params.getAllNamed().size());
                assertEquals(2, params.getIndexedCount());
@@ -237,7 +237,7 @@ public class ResourceMapperTest extends WicketTestCase
                assertNotNull(handler);
 
                tester.processRequest(handler);
-               PageParameters params = resource.pageParameters;
+               IPageParameters params = resource.pageParameters;
                assertNotNull(params);
                assertEquals(2, params.getAllNamed().size());
                assertEquals(2, params.getIndexedCount());
@@ -266,7 +266,7 @@ public class ResourceMapperTest extends WicketTestCase
        {
                private static final long serialVersionUID = 
-3130204487473856574L;
 
-               public PageParameters pageParameters;
+               public IPageParameters pageParameters;
 
                @Override
                public void respond(Attributes attributes)

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
index b3e137a..b5a5eab 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
@@ -19,6 +19,7 @@ package org.apache.wicket.core.request.mapper;
 import org.apache.wicket.MockPage;
 import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.core.request.handler.PageProvider;
 import org.apache.wicket.markup.MarkupParser;
 import org.apache.wicket.page.IPageManagerContext;
 import org.apache.wicket.page.PageStoreManager;
@@ -27,8 +28,7 @@ import org.apache.wicket.pageStore.IDataStore;
 import org.apache.wicket.pageStore.IPageStore;
 import org.apache.wicket.pageStore.memory.DummyPageManagerContext;
 import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.core.request.handler.PageProvider;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.mapper.parameter.IPageParameters;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.request.resource.ResourceReference.Key;
 import org.apache.wicket.request.resource.ResourceReferenceRegistry;
@@ -180,7 +180,7 @@ public class TestMapperContext implements IMapperContext
 
        @Override
        public IRequestablePage newPageInstance(Class<? extends 
IRequestablePage> pageClass,
-               PageParameters pageParameters)
+               IPageParameters pageParameters)
        {
                try
                {
@@ -191,7 +191,7 @@ public class TestMapperContext implements IMapperContext
                        page.setCreatedBookmarkable(true);
                        if (pageParameters != null)
                        {
-                               
page.getPageParameters().overwriteWith(pageParameters);
+                               
page.getPageParameters().mutable().overwriteWith(pageParameters);
                        }
                        return page;
                }

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/MapperDemoResourceReference.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/MapperDemoResourceReference.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/MapperDemoResourceReference.java
index 867aa11..2a039c7 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/MapperDemoResourceReference.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/requestmapper/MapperDemoResourceReference.java
@@ -18,7 +18,7 @@ package org.apache.wicket.examples.requestmapper;
 
 import java.util.Locale;
 
-import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.mapper.parameter.IPageParameters;
 import org.apache.wicket.request.resource.AbstractResource;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
@@ -53,7 +53,7 @@ public class MapperDemoResourceReference extends 
ResourceReference
                        {
                                ResourceResponse resourceResponse = new 
ResourceResponse();
 
-                               PageParameters parameters = 
attributes.getParameters();
+                               IPageParameters parameters = 
attributes.getParameters();
                                StringValue sheetParam = 
parameters.get("sheet");
                                StringValue formatParam = 
parameters.get("format");
                                final String responseText = String.format(

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java
index 311764f..d650eca 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/stateless/StatelessPage3.java
@@ -78,7 +78,7 @@ public class StatelessPage3 extends WicketExamplePage
                                info("Submitted text: " + 
field.getDefaultModelObject());
 
                                // store the value in page parameters
-                               
getPage().getPageParameters().set(PARAMETER_NAME, number);
+                               
getPage().getPageParameters().mutable().set(PARAMETER_NAME, number);
                        }
 
                };

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java
----------------------------------------------------------------------
diff --git 
a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java
 
b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java
index 8151480..90b4369 100644
--- 
a/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java
+++ 
b/wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/WebSocketRequestHandler.java
@@ -32,7 +32,7 @@ import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.http.WebRequest;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.mapper.parameter.IPageParameters;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.visit.IVisit;
@@ -248,7 +248,7 @@ public class WebSocketRequestHandler implements 
AjaxRequestTarget, IWebSocketReq
        }
 
        @Override
-       public PageParameters getPageParameters()
+       public IPageParameters getPageParameters()
        {
                return page.getPageParameters();
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/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 5af0fb0..6f7f7f4 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
@@ -20,6 +20,7 @@ import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.Url.QueryParameter;
+import org.apache.wicket.request.mapper.parameter.IPageParameters;
 import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.lang.Args;
@@ -129,7 +130,7 @@ public abstract class AbstractMapper implements 
IRequestMapper
         * @param encoder
         * @return PageParameters instance
         */
-       protected PageParameters extractPageParameters(final Request request, 
int segmentsToSkip,
+       protected IPageParameters extractPageParameters(final Request request, 
int segmentsToSkip,
                final IPageParametersEncoder encoder)
        {
                Args.notNull(request, "request");
@@ -175,7 +176,7 @@ public abstract class AbstractMapper implements 
IRequestMapper
         * @param encoder
         * @return URL with encoded parameters
         */
-       protected Url encodePageParameters(Url url, PageParameters 
pageParameters,
+       protected Url encodePageParameters(Url url, IPageParameters 
pageParameters,
                final IPageParametersEncoder encoder)
        {
                Args.notNull(url, "url");

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IIndexedParameters.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IIndexedParameters.java
 
b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IIndexedParameters.java
index 073fe34..78e9420 100644
--- 
a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IIndexedParameters.java
+++ 
b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IIndexedParameters.java
@@ -26,7 +26,6 @@ import org.apache.wicket.util.string.StringValue;
  */
 public interface IIndexedParameters
 {
-
        /**
         * Sets the indexed parameter on given index
         * 
@@ -44,7 +43,7 @@ public interface IIndexedParameters
 
        /**
         * Removes indexed parameter on given index
-        * 
+        *
         * @param index
         * @return this
         */
@@ -52,9 +51,13 @@ public interface IIndexedParameters
 
        /**
         * Removes all indexed parameters.
-        * 
+        *
         * @return this
         */
        IIndexedParameters clearIndexed();
 
+       /**
+        * @return count of indexed parameters
+        */
+       int getIndexedCount();
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/INamedParameters.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/INamedParameters.java
 
b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/INamedParameters.java
index 004f020..344d707 100644
--- 
a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/INamedParameters.java
+++ 
b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/INamedParameters.java
@@ -49,7 +49,7 @@ public interface INamedParameters
                 */
                public NamedPair(final String key, final String value)
                {
-                       this.key = Args.notNull(key, "key");;
+                       this.key = Args.notNull(key, "key");
                        this.value = Args.notNull(value, "value");
                }
 
@@ -132,7 +132,7 @@ public interface INamedParameters
 
        /**
         * Removes named parameter with given name.
-        * 
+        *
         * @param name
         *            the name of the parameter to remove
         * @param values
@@ -144,7 +144,7 @@ public interface INamedParameters
 
        /**
         * Adds value to named parameter with given name.
-        * 
+        *
         * @param name
         * @param value
         * @return this

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParameters.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParameters.java
 
b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParameters.java
new file mode 100644
index 0000000..064f67f
--- /dev/null
+++ 
b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParameters.java
@@ -0,0 +1,87 @@
+/*
+ * 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.util.List;
+import java.util.Set;
+
+import org.apache.wicket.util.string.StringValue;
+
+/**
+ * Contains only the accessor methods of PageParameters.
+ * Used as protection of accidental modifications of Page's PageParameters 
(page#getPageParameters()).
+ *
+ * When such modification is really needed {@linkplain #mutable()} method 
should be used:
+ * <code>parameters.mutable().add("name", "value");</code>
+ */
+public interface IPageParameters
+{
+       /**
+        * Return set of all named parameter names.
+        *
+        * @return named parameter names
+        */
+       Set<String> getNamedKeys();
+
+       /**
+        * Returns parameter value of named parameter with given name
+        *
+        * @param name
+        * @return parameter value
+        */
+       StringValue get(final String name);
+
+       /**
+        * Return list of all values for named parameter with given name
+        *
+        * @param name
+        * @return list of parameter values
+        */
+       List<StringValue> getValues(final String name);
+
+       /**
+        * @return All named parameters in exact order.
+        */
+       List<INamedParameters.NamedPair> getAllNamed();
+
+       /**
+        * Returns the position of a named parameter.
+        *
+        * @param name
+        *            the name of the parameter to look for
+        * @return the position of the parameter. {@code -1} if there is no 
parameter with that name.
+        */
+       int getPosition(String name);
+
+       /**
+        * @param index
+        * @return indexed parameter on given index
+        */
+       StringValue get(final int index);
+
+       /**
+        * @return count of indexed parameters
+        */
+       int getIndexedCount();
+
+       /**
+        * @return <code>true</code> if the parameters are empty, 
<code>false</code> otherwise.
+        */
+       boolean isEmpty();
+
+       PageParameters mutable();
+ }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParametersEncoder.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParametersEncoder.java
 
b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParametersEncoder.java
index cef8f50..c58fef7 100644
--- 
a/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParametersEncoder.java
+++ 
b/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/IPageParametersEncoder.java
@@ -34,7 +34,7 @@ public interface IPageParametersEncoder
         *            parameters to encode
         * @return Url generated from the page parameters
         */
-       Url encodePageParameters(PageParameters pageParameters);
+       Url encodePageParameters(IPageParameters pageParameters);
 
        /**
         * Decodes the given URL to {@link PageParameters}. The URL will have 
all
@@ -44,5 +44,5 @@ public interface IPageParametersEncoder
         *            url to decode
         * @return {@link PageParameters} instance or <code>null</code> if empty
         */
-       PageParameters decodePageParameters(Url url);
+       IPageParameters decodePageParameters(Url url);
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/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 956ea75..f1a91b0 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
@@ -45,7 +45,7 @@ import org.apache.wicket.util.string.StringValue;
  * 
  * @author Matej Knopp
  */
-public class PageParameters implements IClusterable, IIndexedParameters, 
INamedParameters
+public class PageParameters implements IClusterable, IPageParameters, 
IIndexedParameters, INamedParameters
 {
        private static class Entry implements IClusterable
        {
@@ -110,25 +110,15 @@ public class PageParameters implements IClusterable, 
IIndexedParameters, INamedP
         * 
         * @param copy
         */
-       public PageParameters(final PageParameters copy)
+       public PageParameters(final IPageParameters copy)
        {
-               if (copy != null)
-               {
-                       if (copy.indexedParameters != null)
-                       {
-                               indexedParameters = new 
ArrayList<String>(copy.indexedParameters);
-                       }
-
-                       if (copy.namedParameters != null)
-                       {
-                               namedParameters = new 
ArrayList<Entry>(copy.namedParameters);
-                       }
-               }
+               overwriteWith(copy);
        }
 
        /**
         * @return count of indexed parameters
         */
+       @Override
        public int getIndexedCount()
        {
                return indexedParameters != null ? indexedParameters.size() : 0;
@@ -350,10 +340,10 @@ public class PageParameters implements IClusterable, 
IIndexedParameters, INamedP
 
                if (namedParameters == null)
                {
-                       namedParameters = new ArrayList<Entry>(1);
+                       namedParameters = new ArrayList<>(1);
                }
 
-               List<String> values = new ArrayList<String>();
+               List<String> values = new ArrayList<>();
                if (value instanceof String[])
                {
                        values.addAll(Arrays.asList((String[])value));
@@ -435,12 +425,39 @@ public class PageParameters implements IClusterable, 
IIndexedParameters, INamedP
         * @param other
         * @return this
         */
-       public PageParameters overwriteWith(final PageParameters other)
+       public PageParameters overwriteWith(final IPageParameters other)
        {
                if (this != other)
                {
-                       indexedParameters = other.indexedParameters;
-                       namedParameters = other.namedParameters;
+                       if (other != null)
+                       {
+                               int indexedCount = other.getIndexedCount();
+                               if (indexedCount > 0)
+                               {
+                                       indexedParameters = new 
ArrayList<>(indexedCount);
+                                       for (int i = 0; i < indexedCount; i++)
+                                       {
+                                               
indexedParameters.add(other.get(i).toString());
+                                       }
+                               }
+
+                               Set<String> namedKeys = other.getNamedKeys();
+                               if (namedKeys.isEmpty() == false)
+                               {
+                                       namedParameters = new 
ArrayList<>(namedKeys.size());
+                                       for (String name : namedKeys)
+                                       {
+                                               List<StringValue> values = 
other.getValues(name);
+                                               for (StringValue value : values)
+                                               {
+                                                       Entry entry = new 
Entry();
+                                                       entry.key = name;
+                                                       entry.value = 
value.toString();
+                                                       
namedParameters.add(entry);
+                                               }
+                                       }
+                               }
+                       }
                }
                return this;
        }
@@ -451,7 +468,7 @@ public class PageParameters implements IClusterable, 
IIndexedParameters, INamedP
         * @param other
         * @return this
         */
-       public PageParameters mergeWith(final PageParameters other)
+       public PageParameters mergeWith(final IPageParameters other)
        {
                if (this != other)
                {
@@ -538,12 +555,19 @@ public class PageParameters implements IClusterable, 
IIndexedParameters, INamedP
        /**
         * @return <code>true</code> if the parameters are empty, 
<code>false</code> otherwise.
         */
+       @Override
        public boolean isEmpty()
        {
                return (getIndexedCount() == 0) && getNamedKeys().isEmpty();
        }
 
        @Override
+       public PageParameters mutable()
+       {
+               return this;
+       }
+
+       @Override
        public String toString()
        {
                StringBuilder str = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/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 8139460..18476c9 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
@@ -37,7 +37,7 @@ public class PageParametersEncoder implements 
IPageParametersEncoder
         * @see 
IPageParametersEncoder#decodePageParameters(org.apache.wicket.request.Url)
         */
        @Override
-       public PageParameters decodePageParameters(final Url url)
+       public IPageParameters decodePageParameters(final Url url)
        {
                PageParameters parameters = new PageParameters();
 
@@ -57,10 +57,10 @@ public class PageParametersEncoder implements 
IPageParametersEncoder
        }
 
        /**
-        * @see 
org.apache.wicket.request.mapper.parameter.IPageParametersEncoder#encodePageParameters(org.apache.wicket.request.mapper.parameter.PageParameters)
+        * @see 
org.apache.wicket.request.mapper.parameter.IPageParametersEncoder#encodePageParameters(org.apache.wicket.request.mapper.parameter.IPageParameters)
         */
        @Override
-       public Url encodePageParameters(final PageParameters pageParameters)
+       public Url encodePageParameters(final IPageParameters pageParameters)
        {
                Url url = new Url();
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/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 03740d7..fab72f0 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
@@ -46,7 +46,7 @@ import org.apache.wicket.util.string.Strings;
 public class UrlPathPageParametersEncoder implements IPageParametersEncoder
 {
        @Override
-       public Url encodePageParameters(PageParameters params)
+       public Url encodePageParameters(IPageParameters params)
        {
                Args.notNull(params, "params");
                Args.isTrue(params.getIndexedCount() == 0,
@@ -65,7 +65,7 @@ public class UrlPathPageParametersEncoder implements 
IPageParametersEncoder
        }
 
        @Override
-       public PageParameters decodePageParameters(Url url)
+       public IPageParameters decodePageParameters(Url url)
        {
                PageParameters params = new PageParameters();
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/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
index 0490d0c..4a66e83 100644
--- 
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
@@ -37,7 +37,7 @@ public class PageParametersEncoderTest extends Assert
 
                Url url = Url.parse("idx1/idx2?named1=value1&named2=value2");
 
-               PageParameters pageParameters = 
encoder.decodePageParameters(url);
+               IPageParameters pageParameters = 
encoder.decodePageParameters(url);
                assertEquals("idx1", pageParameters.get(0).toOptionalString());
                assertEquals("idx2", pageParameters.get(1).toOptionalString());
                assertEquals("value1", 
pageParameters.get("named1").toOptionalString());

http://git-wip-us.apache.org/repos/asf/wicket/blob/665a3e80/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
 
b/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
index 9eca67c..6e2f460 100644
--- 
a/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
+++ 
b/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
@@ -83,7 +83,7 @@ public class UrlPathPageParametersEncoderTest extends Assert
                Url url = Url.parse("name1/value1/name2/value2");
 
                UrlPathPageParametersEncoder decoder = new 
UrlPathPageParametersEncoder();
-               PageParameters parameters = decoder.decodePageParameters(url);
+               IPageParameters parameters = decoder.decodePageParameters(url);
 
                assertEquals(2, parameters.getAllNamed().size());
                assertEquals("value1", parameters.get("name1").toString());
@@ -100,7 +100,7 @@ public class UrlPathPageParametersEncoderTest extends Assert
                Url url = Url.parse("name1/value1/name2/value2/");
 
                UrlPathPageParametersEncoder decoder = new 
UrlPathPageParametersEncoder();
-               PageParameters parameters = decoder.decodePageParameters(url);
+               IPageParameters parameters = decoder.decodePageParameters(url);
 
                assertEquals(2, parameters.getAllNamed().size());
                assertEquals("value1", parameters.get("name1").toString());
@@ -117,7 +117,7 @@ public class UrlPathPageParametersEncoderTest extends Assert
                Url url = Url.parse("name1/value1/name2/value2/name3");
 
                UrlPathPageParametersEncoder decoder = new 
UrlPathPageParametersEncoder();
-               PageParameters parameters = decoder.decodePageParameters(url);
+               IPageParameters parameters = decoder.decodePageParameters(url);
 
                assertEquals(2, parameters.getAllNamed().size());
                assertEquals("value1", parameters.get("name1").toString());
@@ -133,7 +133,7 @@ public class UrlPathPageParametersEncoderTest extends Assert
                Url url = Url.parse("/name1/value1/name2/value2");
 
                UrlPathPageParametersEncoder decoder = new 
UrlPathPageParametersEncoder();
-               PageParameters parameters = decoder.decodePageParameters(url);
+               IPageParameters parameters = decoder.decodePageParameters(url);
 
                assertEquals(2, parameters.getAllNamed().size());
                assertEquals("value1", parameters.get("name1").toString());
@@ -150,7 +150,7 @@ public class UrlPathPageParametersEncoderTest extends Assert
                Url url = Url.parse("name1/value1////name2/value2");
 
                UrlPathPageParametersEncoder decoder = new 
UrlPathPageParametersEncoder();
-               PageParameters parameters = decoder.decodePageParameters(url);
+               IPageParameters parameters = decoder.decodePageParameters(url);
 
                assertEquals(2, parameters.getAllNamed().size());
                assertEquals("value1", parameters.get("name1").toString());
@@ -167,7 +167,7 @@ public class UrlPathPageParametersEncoderTest extends Assert
                Url url = Url.parse("name1/value1////name2//");
 
                UrlPathPageParametersEncoder decoder = new 
UrlPathPageParametersEncoder();
-               PageParameters parameters = decoder.decodePageParameters(url);
+               IPageParameters parameters = decoder.decodePageParameters(url);
 
                assertEquals(2, parameters.getAllNamed().size());
                assertEquals("value1", parameters.get("name1").toString());

Reply via email to