You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2018/09/26 12:51:11 UTC

[1/3] brooklyn-server git commit: improve CollectionMerger to take a configurable list merge function

Repository: brooklyn-server
Updated Branches:
  refs/heads/master a3d0ea06e -> d34266387


improve CollectionMerger to take a configurable list merge function


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/e8427f7f
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/e8427f7f
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/e8427f7f

Branch: refs/heads/master
Commit: e8427f7fa938f76eb75f0dc9d478d27a4f575ccd
Parents: e27cc7b
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Sep 25 15:20:30 2018 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Sep 25 15:20:30 2018 +0100

----------------------------------------------------------------------
 .../util/collections/CollectionMerger.java      | 64 +++++++++-----------
 .../util/collections/CollectionMergerTest.java  | 16 +++++
 2 files changed, 43 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e8427f7f/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java b/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java
index 337e4cc..8707fb9 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java
@@ -23,10 +23,11 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.Collection;
 import java.util.Date;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.BiFunction;
 
 import org.apache.brooklyn.util.guava.Maybe;
 
@@ -43,8 +44,8 @@ public class CollectionMerger {
     public static class Builder {
         protected int depth = Integer.MAX_VALUE;
         protected boolean mergeNestedMaps = true;
-        protected boolean mergeNestedLists = false;
         protected boolean preferSecondOnConflict = false;
+        protected BiFunction<Collection<?>, Collection<?>, Collection<?>> mergeNestedLists = null;
         
         /** Sets effectively infinite {@link #depth(int)} (the default) */
         public Builder deep(boolean val) {
@@ -71,10 +72,25 @@ s         *
         }
         /** By default lists will not be merged, and either the first or second will be kept 
          * depending on {@link #preferSecondOnConflict(boolean)}. Set this to true to cause
-         * lists in the second merge argument to be appended to lists in the first. 
+         * lists in the second merge argument to be appended to lists in the first, or false for the default behaviour. 
+         * For more complex behaviours use {@link #mergeNestedLists(BiFunction)}.
          */
         public Builder mergeNestedLists(boolean val) {
-            this.mergeNestedLists = val;
+            if (val) {
+                mergeNestedLists((l1,l2) -> {
+                    Collection<Object> result = l1 instanceof Set ? MutableSet.of() : MutableList.of();
+                    result.addAll(l1);
+                    result.addAll(l2);
+                    return result;
+                });
+            } else {
+                mergeNestedLists(null);
+            }
+            return this;
+        }
+        /** Defines a function to use to determine the result when lists or sets need merging. */ 
+        public Builder mergeNestedLists(BiFunction<Collection<?>, Collection<?>, Collection<?>> listMergeFunction) {
+            this.mergeNestedLists = listMergeFunction;
             return this;
         }
         /** defaults to false, so if there is an unmergeable conflict, e.g. two strings, the first will be kept */
@@ -92,7 +108,7 @@ s         *
     }
     
     protected final int depth;
-    protected final boolean mergeNestedLists;
+    protected final BiFunction<Collection<?>, Collection<?>, Collection<?>> mergeNestedLists;
     protected final boolean preferSecondOnConflict;
 
     protected CollectionMerger(Builder builder) {
@@ -142,15 +158,14 @@ s         *
             }
         }
         if (val1.get() instanceof Iterable) {
-            if (!mergeNestedLists) {
-                return val1.get();
-            }
-            Iterable<?> iter1 = (Iterable<?>) val1.get();
-            if (val2.get() instanceof Iterable) {
-                return mergeIterablesImpl(iter1, (Iterable<?>) val2.get(), depthRemaining, visited);
-            } else {
+            if (mergeNestedLists == null) {
+                return conflictResult;
+            } else if (!(val2.get() instanceof Iterable)) {
                 // incompatible types; not merging
                 return conflictResult;
+            } else {
+                Collection<?> iter1 = val1.get() instanceof Collection ? (Collection<?>) val1.get() : MutableList.copyOf((Iterable<?>)val1.get());
+                return mergeNestedLists.apply(iter1, MutableList.copyOf((Iterable<?>)val2.get()));
             }
         }
         return conflictResult;
@@ -169,31 +184,6 @@ s         *
         return result;
     }
     
-    private Iterable<?> mergeIterablesImpl(Iterable<?> val1, Iterable<?> val2, int depthRemaining, Visited visited) {
-        if (depthRemaining < 1) {
-            return val1;
-        }
-        if (val1 instanceof Set) {
-            return mergeSetsImpl((Set<?>)val1, MutableSet.copyOf(val2), depthRemaining, visited);
-        } else {
-            return mergeListsImpl(MutableList.copyOf(val1), val2, depthRemaining, visited);
-        }
-    }
-
-    private Set<?> mergeSetsImpl(Set<?> val1, Set<?> val2, int depthRemaining, Visited visited) {
-        return MutableSet.builder()
-                .addAll(val1)
-                .addAll(val2)
-                .build();
-    }
-
-    private List<?> mergeListsImpl(List<?> val1, Iterable<?> val2, int depthRemaining, Visited visited) {
-        return MutableList.builder()
-                .addAll(val1)
-                .addAll(val2)
-                .build();
-    }
-
     /**
      * For avoiding infinite loops, we need to know which objects we have already visited. 
      * If we come across that object again, then want to return the same result (rather than

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e8427f7f/utils/common/src/test/java/org/apache/brooklyn/util/collections/CollectionMergerTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/org/apache/brooklyn/util/collections/CollectionMergerTest.java b/utils/common/src/test/java/org/apache/brooklyn/util/collections/CollectionMergerTest.java
index 2b0bf76..5800560 100644
--- a/utils/common/src/test/java/org/apache/brooklyn/util/collections/CollectionMergerTest.java
+++ b/utils/common/src/test/java/org/apache/brooklyn/util/collections/CollectionMergerTest.java
@@ -22,6 +22,8 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotEquals;
 
 import java.io.StringReader;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.brooklyn.test.Asserts;
@@ -428,6 +430,20 @@ public class CollectionMergerTest {
         assertEquals(result2, ImmutableMap.of("key1", "val1b", "key2", "val2", "key3", "val3"));
     }
 
+    @Test
+    public void testMergeListsWithCusomFunction() {
+        Map<?,?> val1 = ImmutableMap.of("key", ImmutableList.of("a", "c"));
+        Map<?,?> val2 = ImmutableMap.of("key", ImmutableList.of("b"));
+        
+        Map<?, ?> result = CollectionMerger.builder().mergeNestedLists( (l1,l2) -> {
+            List<Object> r = MutableList.<Object>copyOf(l1).appendAll(l2);
+            Collections.sort(r, (o1,o2) -> o1.toString().compareTo(o2.toString()));
+            return r;
+        }).build().merge(val1, val2);
+        
+        assertEquals(result, ImmutableMap.of("key", ImmutableList.of("a", "b", "c")));
+    }
+
     protected Iterable<?> parseYaml(String yaml) {
         return new Yaml().loadAll(new StringReader(yaml));
     }


[3/3] brooklyn-server git commit: This closes #1001

Posted by he...@apache.org.
This closes #1001


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/d3426638
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/d3426638
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/d3426638

Branch: refs/heads/master
Commit: d34266387978f3b36bb4df9b74a6a2bddd115fc3
Parents: a3d0ea0 7e3d1d7
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Sep 26 13:50:58 2018 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Sep 26 13:50:58 2018 +0100

----------------------------------------------------------------------
 .../util/collections/CollectionMerger.java      | 66 +++++++++-----------
 .../util/collections/CollectionMergerTest.java  | 16 +++++
 2 files changed, 45 insertions(+), 37 deletions(-)
----------------------------------------------------------------------



[2/3] brooklyn-server git commit: respect depth when considering merging collections

Posted by he...@apache.org.
respect depth when considering merging collections


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/7e3d1d7a
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/7e3d1d7a
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/7e3d1d7a

Branch: refs/heads/master
Commit: 7e3d1d7aa330200d8a5068a394e41b196b0c4666
Parents: e8427f7
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Sep 26 00:20:35 2018 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Sep 26 00:20:35 2018 +0100

----------------------------------------------------------------------
 .../org/apache/brooklyn/util/collections/CollectionMerger.java     | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7e3d1d7a/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java b/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java
index 8707fb9..22759f6 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/collections/CollectionMerger.java
@@ -163,6 +163,8 @@ s         *
             } else if (!(val2.get() instanceof Iterable)) {
                 // incompatible types; not merging
                 return conflictResult;
+            } else if (depthRemaining < 1) {
+                return conflictResult;
             } else {
                 Collection<?> iter1 = val1.get() instanceof Collection ? (Collection<?>) val1.get() : MutableList.copyOf((Iterable<?>)val1.get());
                 return mergeNestedLists.apply(iter1, MutableList.copyOf((Iterable<?>)val2.get()));