This is an automated email from the ASF dual-hosted git repository.

theigl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/master by this push:
     new 671df12  WICKET-6833 Reduce allocations for `PageParameters.mergeWith`
     new cc4e484  Merge pull request #454 from 
theigl/WICKET-6833-merge-with-improvements
671df12 is described below

commit 671df12aaf56996bbc2f2c73d612fa84eb1a3949
Author: Thomas Heigl <[email protected]>
AuthorDate: Fri Sep 25 15:51:19 2020 +0200

    WICKET-6833 Reduce allocations for `PageParameters.mergeWith`
---
 .../request/mapper/parameter/PageParameters.java   | 102 ++++++++++++++-------
 .../mapper/parameter/PageParametersTest.java       |  33 +++++++
 2 files changed, 102 insertions(+), 33 deletions(-)

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 d4736e5..57ca7f5 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
@@ -17,7 +17,6 @@
 package org.apache.wicket.request.mapper.parameter;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -294,35 +293,48 @@ public class PageParameters implements IClusterable, 
IIndexedParameters, INamedP
                Args.notEmpty(name, "name");
                Args.notNull(value, "value");
 
-               if (namedParameters == null)
-               {
-                       namedParameters = new ArrayList<>(1);
-               }
-
-               List<String> values = new ArrayList<>();
                if (value instanceof String[])
                {
-                       values.addAll(Arrays.asList((String[])value));
+                       addNamed(name, (String[]) value, index, type);
                }
                else
                {
-                       values.add(value.toString());
+                       addNamed(name, value.toString(), index, type);
+               }
+
+               return this;
+       }
+
+       private void addNamed(String name, String[] values, int index, Type 
type) 
+       {
+               if (namedParameters == null && values.length > 0)
+               {
+                       namedParameters = new ArrayList<>(values.length);
                }
 
                for (String val : values)
                {
-                       NamedPair entry = new NamedPair(name, val, type);
+                       addNamed(name, val, index, type);
+               }
+       }
 
-                       if (index < 0 || index > namedParameters.size())
-                       {
-                               namedParameters.add(entry);
-                       }
-                       else
-                       {
-                               namedParameters.add(index, entry);
-                       }
+       private void addNamed(String name, String value, int index, Type type) 
+       {
+               if (namedParameters == null)
+               {
+                       namedParameters = new ArrayList<>(1);
+               }
+
+               NamedPair entry = new NamedPair(name, value, type);
+
+               if (index < 0 || index > namedParameters.size())
+               {
+                       namedParameters.add(entry);
+               }
+               else
+               {
+                       namedParameters.add(index, entry);
                }
-               return this;
        }
 
        /**
@@ -413,23 +425,47 @@ public class PageParameters implements IClusterable, 
IIndexedParameters, INamedP
        {
                if (other != null && this != other)
                {
-                       for (int index = 0; index < other.getIndexedCount(); 
index++)
-                       {
-                               if (!other.get(index).isNull())
-                               {
-                                       set(index, other.get(index));
-                               }
-                       }
-                       for (String name : other.getNamedKeys())
-                       {
-                               remove(name);
-                       }
-                       for (NamedPair curNamed : other.getAllNamed())
+                       mergeIndexed(other);
+                       mergeNamed(other);
+               }
+               return this;
+       }
+
+       private void mergeIndexed(PageParameters other)
+       {
+               final int otherIndexedCount = other.getIndexedCount();
+               for (int index = 0; index < otherIndexedCount; index++)
+               {
+                       final StringValue value = other.get(index);
+                       if (!value.isNull())
                        {
-                               add(curNamed.getKey(), curNamed.getValue(), 
curNamed.getType());
+                               set(index, value);
                        }
                }
-               return this;
+       }
+
+       private void mergeNamed(PageParameters other) 
+       {
+               final List<NamedPair> otherNamed = other.namedParameters;
+               if (otherNamed == null || otherNamed.isEmpty())
+               {
+                       return;
+               }
+
+               for (NamedPair curNamed : otherNamed)
+               {
+                       remove(curNamed.getKey());
+               }
+
+               if (this.namedParameters == null)
+               {
+                       this.namedParameters = new 
ArrayList<>(otherNamed.size());
+               }
+
+               for (NamedPair curNamed : otherNamed)
+               {
+                       add(curNamed.getKey(), curNamed.getValue(),  
curNamed.getType());
+               }
        }
 
        @Override
diff --git 
a/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersTest.java
 
b/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersTest.java
index 513e9ff..f302f36 100644
--- 
a/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersTest.java
+++ 
b/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/PageParametersTest.java
@@ -17,6 +17,7 @@
 package org.apache.wicket.request.mapper.parameter;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -65,6 +66,28 @@ class PageParametersTest
                }
        }
 
+       @Test
+       void addEmptyStringArrayValue()
+       {
+               PageParameters parameters = new PageParameters();
+
+               String[] input = new String[] {  };
+               parameters.add("key", input, INamedParameters.Type.MANUAL);
+
+               assertTrue(parameters.isEmpty());
+       }
+
+       @Test
+       void addEmptyStringValue()
+       {
+               PageParameters parameters = new PageParameters();
+
+               parameters.add("key", "", INamedParameters.Type.MANUAL);
+
+               assertFalse(parameters.isEmpty());
+               assertTrue(parameters.get("key").isEmpty());
+       }
+
        /**
         * https://issues.apache.org/jira/browse/WICKET-3906
         */
@@ -179,6 +202,16 @@ class PageParametersTest
                assertEquals("both2-r", 
left.getValues("both").get(1).toString());
        }
 
+       @Test
+       void mergeEmptyParameters() 
+       {
+               final PageParameters left = new PageParameters();
+               final PageParameters right = new PageParameters();
+               left.mergeWith(right);
+               
+               assertTrue(left.isEmpty());
+       }
+
        /**
         * https://issues.apache.org/jira/browse/WICKET-5669
         */

Reply via email to