You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by th...@apache.org on 2020/09/28 09:22:25 UTC

[wicket] branch master updated: WICKET-6833 Reduce allocations for `PageParameters.mergeWith`

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 <th...@gmail.com>
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
 	 */