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
*/