Author: cbrisson
Date: Mon Jun 25 23:58:00 2018
New Revision: 1834385
URL: http://svn.apache.org/viewvc?rev=1834385&view=rev
Log:
[tools] Have CollectionTool.sort() methods filter out null elements
Added:
velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/CollectionToolTests.java
Modified:
velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/CollectionTool.java
Modified:
velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/CollectionTool.java
URL:
http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/CollectionTool.java?rev=1834385&r1=1834384&r2=1834385&view=diff
==============================================================================
---
velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/CollectionTool.java
(original)
+++
velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/CollectionTool.java
Mon Jun 25 23:58:00 2018
@@ -216,7 +216,7 @@ public class CollectionTool extends Safe
/**
* Sorts a Collection using a Comparator. A defensive copy is made
* of the Collection beforehand, so the original Collection is left
- * untouched.
+ * untouched and null elements filtered out.
*
* @param c The Collection to sort.
* @param comparator The comparator to use for sorting.
@@ -227,7 +227,18 @@ public class CollectionTool extends Safe
public <T> Collection<T> sort(final Collection<T> c,
final Comparator<T> comparator)
{
- final ArrayList<T> list = new ArrayList<>(c);
+ ArrayList<T> list = new ArrayList<>();
+ for (T elem : c)
+ {
+ if (elem != null)
+ {
+ list.add(elem);
+ }
+ }
+ if (list.size() < c.size())
+ {
+ getLog().warn("[collection] sort: null items have been filtered");
+ }
Collections.sort(list, comparator);
return list;
}
@@ -235,7 +246,7 @@ public class CollectionTool extends Safe
/**
* Sorts an array using a Comparator. A defensive copy is made
* of the array beforehand, so the original array is left
- * untouched.
+ * untouched and null elements filtered out.
*
* @param a The array to sort.
* @param comparator The comparator to use for sorting.
@@ -245,7 +256,20 @@ public class CollectionTool extends Safe
*/
public <T> T[] sort(final T[] a, final Comparator<T> comparator)
{
- final T[] copy = a.clone();
+ int nulls = 0;
+ for (T t : a)
+ {
+ if (t == null)
+ {
+ ++nulls;
+ }
+ }
+ if (nulls > 0)
+ {
+ getLog().warn("[collection] sort: null items have been filtered
out");
+ }
+ final T[] copy = Arrays.copyOf(a,a.length - nulls);
+ for (int from = 0, to = 0; from < a.length; ++from) if (a[from] !=
null) copy[to++] = a[from];
Arrays.sort(copy, comparator);
return copy;
}
@@ -366,7 +390,18 @@ public class CollectionTool extends Safe
public Collection sort(Collection collection, List properties)
{
- List<?> list = new ArrayList<>(collection);
+ List list = new ArrayList<>();
+ for (Object o : collection)
+ {
+ if (o != null)
+ {
+ list.add(o);
+ }
+ }
+ if (list.size() < collection.size())
+ {
+ getLog().warn("[collection] sort: null items have been filtered
out");
+ }
return internalSort(list, properties);
}
@@ -377,7 +412,7 @@ public class CollectionTool extends Safe
public Collection sort(Object[] array, List properties)
{
- return internalSort(Arrays.asList(array), properties);
+ return sort(Arrays.asList(array), properties);
}
protected Collection internalSort(List list, List properties)
@@ -387,7 +422,9 @@ public class CollectionTool extends Safe
if (properties == null)
{
Collections.sort(list);
- } else {
+ }
+ else
+ {
Collections.sort(list, new PropertiesComparator(properties));
}
return list;
Added:
velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/CollectionToolTests.java
URL:
http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/CollectionToolTests.java?rev=1834385&view=auto
==============================================================================
---
velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/CollectionToolTests.java
(added)
+++
velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/CollectionToolTests.java
Mon Jun 25 23:58:00 2018
@@ -0,0 +1,28 @@
+package org.apache.velocity.tools.generic;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class CollectionToolTests
+{
+ public @Test
+ void testNullElements()
+ {
+ CollectionTool tool = new CollectionTool();
+
+ List lst = Arrays.asList("b", null, "a");
+ List sorted = (List)tool.sort(lst);
+ assertEquals(2, sorted.size());
+ assertEquals("a", sorted.get(0));
+ assertEquals("b", sorted.get(1));
+
+ String arr[] = new String[] { "foo", null, "bar"};
+ sorted = (List)tool.sort(arr);
+ assertEquals(2, sorted.size());
+ assertEquals("bar", sorted.get(0));
+ assertEquals("foo", sorted.get(1));
+ }
+}