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 2014/08/30 01:01:21 UTC

[21/26] git commit: make consistent `Mutable{List, Set, Map}.as{Immutable, Unmodifiable, UnmodifiableCopy}()` methods, and more forgiving if null is present, deprecatign the inconsistent and break-prone `toImmutable()`

make consistent `Mutable{List,Set,Map}.as{Immutable,Unmodifiable,UnmodifiableCopy}()` methods, and more forgiving if null is present, deprecatign the inconsistent and break-prone `toImmutable()`


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

Branch: refs/heads/master
Commit: ab1381b413543b69de62b498fe61f05b46cf9cae
Parents: 5db500e
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Aug 26 22:17:20 2014 -0500
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Aug 27 02:21:22 2014 -0400

----------------------------------------------------------------------
 .../drivers/downloads/BasicDownloadTargets.java |  2 +-
 .../brooklyn/event/basic/ListConfigKey.java     |  2 +-
 .../java/brooklyn/event/basic/SetConfigKey.java |  2 +-
 .../brooklyn/entity/basic/EntityTypeTest.java   |  4 +--
 .../brooklyn/location/jclouds/JcloudsUtil.java  |  2 +-
 .../brooklyn/entity/chef/KnifeTaskFactory.java  |  4 +--
 .../rest/transform/LocationTransformer.java     |  2 +-
 .../brooklyn/util/collections/MutableList.java  | 23 +++++++++++++++-
 .../brooklyn/util/collections/MutableMap.java   | 21 +++++++++++++++
 .../brooklyn/util/collections/MutableSet.java   | 28 +++++++++++++++++++-
 .../util/collections/MutableListTest.java       | 23 ++++++++++++++++
 11 files changed, 102 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/core/src/main/java/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java b/core/src/main/java/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java
index eca50ea..2b1c545 100644
--- a/core/src/main/java/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java
+++ b/core/src/main/java/brooklyn/entity/drivers/downloads/BasicDownloadTargets.java
@@ -94,7 +94,7 @@ public class BasicDownloadTargets implements DownloadTargets {
     
     protected BasicDownloadTargets(Builder builder) {
         primaries = ImmutableList.copyOf(builder.primaries);
-        fallbacks = MutableList.<String>builder().addAll(builder.fallbacks).removeAll(builder.primaries).build().toImmutable();
+        fallbacks = MutableList.<String>builder().addAll(builder.fallbacks).removeAll(builder.primaries).build().asUnmodifiable();
         canContinueResolving = builder.canContinueResolving;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/core/src/main/java/brooklyn/event/basic/ListConfigKey.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/ListConfigKey.java b/core/src/main/java/brooklyn/event/basic/ListConfigKey.java
index b56d9e9..0ad4d54 100644
--- a/core/src/main/java/brooklyn/event/basic/ListConfigKey.java
+++ b/core/src/main/java/brooklyn/event/basic/ListConfigKey.java
@@ -76,7 +76,7 @@ public class ListConfigKey<V> extends AbstractCollectionConfigKey<List<? extends
     protected List<Object> merge(boolean unmodifiable, Iterable<?>... sets) {
         MutableList<Object> result = MutableList.of();
         for (Iterable<?> set: sets) result.addAll(set);
-        if (unmodifiable) return result.toImmutable();
+        if (unmodifiable) return result.asUnmodifiable();
         return result;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/core/src/main/java/brooklyn/event/basic/SetConfigKey.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/SetConfigKey.java b/core/src/main/java/brooklyn/event/basic/SetConfigKey.java
index 2f04609..fcd4afe 100644
--- a/core/src/main/java/brooklyn/event/basic/SetConfigKey.java
+++ b/core/src/main/java/brooklyn/event/basic/SetConfigKey.java
@@ -67,7 +67,7 @@ public class SetConfigKey<V> extends AbstractCollectionConfigKey<Set<? extends V
     protected Set<Object> merge(boolean unmodifiable, Iterable<?>... sets) {
         MutableSet<Object> result = MutableSet.of();
         for (Iterable<?> set: sets) result.addAll(set);
-        if (unmodifiable) return result.toImmutable();
+        if (unmodifiable) return result.asUnmodifiable();
         return result;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java b/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java
index 5c54e22..6dd5693 100644
--- a/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java
+++ b/core/src/test/java/brooklyn/entity/basic/EntityTypeTest.java
@@ -210,7 +210,7 @@ public class EntityTypeTest extends BrooklynAppUnitTestSupport {
     public void testRemoveSensor() throws Exception {
         entity.getMutableEntityType().removeSensor(SENSOR_ADDED);
         assertEquals(entity.getEntityType().getSensors(), 
-                MutableSet.builder().addAll(DEFAULT_SENSORS).remove(SENSOR_ADDED).build().toImmutable());
+                MutableSet.builder().addAll(DEFAULT_SENSORS).remove(SENSOR_ADDED).build().asUnmodifiable());
         
         TestUtils.assertEventually(
                 Suppliers.ofInstance(listener.events), 
@@ -222,7 +222,7 @@ public class EntityTypeTest extends BrooklynAppUnitTestSupport {
         entity.getMutableEntityType().removeSensor(SENSOR_ADDED.getName());
         entity.getMutableEntityType().removeSensor(POLICY_ADDED.getName());
         assertEquals(entity.getEntityType().getSensors(), 
-                MutableSet.builder().addAll(DEFAULT_SENSORS).remove(SENSOR_ADDED).remove(POLICY_ADDED).build().toImmutable());
+                MutableSet.builder().addAll(DEFAULT_SENSORS).remove(SENSOR_ADDED).remove(POLICY_ADDED).build().asUnmodifiable());
         
         TestUtils.assertEventually(
                 CollectionFunctionals.sizeSupplier(listener.events), 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java
index 9cb4830..e71f727 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsUtil.java
@@ -273,7 +273,7 @@ public class JcloudsUtil implements JcloudsLocationConfig {
                 .put("credential", credential)
                 .putIfNotNull("endpoint", endpoint)
                 .build()
-                .toImmutable();
+                .asUnmodifiable();
 
         if (allowReuse) {
             ComputeService result = cachedComputeServices.get(cacheKey);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java b/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
index 243ff8d..8a0ffed 100644
--- a/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
+++ b/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
@@ -72,7 +72,7 @@ public class KnifeTaskFactory<RET> extends SystemProcessTaskFactory<KnifeTaskFac
         MutableList<Function<ProcessTaskWrapper<?>, Void>> result = MutableList.copyOf(super.getCompletionListeners());
         if (throwOnCommonKnifeErrors != Boolean.FALSE)
             insertKnifeCompletionListenerIntoCompletionListenersList(result);
-        return result.toImmutable();
+        return result.asUnmodifiable();
     }
     
     public KnifeTaskFactory<RET> notThrowingOnCommonKnifeErrors() {
@@ -127,7 +127,7 @@ public class KnifeTaskFactory<RET> extends SystemProcessTaskFactory<KnifeTaskFac
         }
         if (numKnifes==0)
             result.add(buildKnifeCommand(numKnifes++));
-        return result.toImmutable();
+        return result.asUnmodifiable();
     }
     
     /** creates the command for running knife.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/usage/rest-server/src/main/java/brooklyn/rest/transform/LocationTransformer.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/transform/LocationTransformer.java b/usage/rest-server/src/main/java/brooklyn/rest/transform/LocationTransformer.java
index d9b5ff5..79549f2 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/transform/LocationTransformer.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/transform/LocationTransformer.java
@@ -179,7 +179,7 @@ public class LocationTransformer {
             MutableMap.of("self", URI.create("/v1/locations/" + l.getId()))
                 .addIfNotNull("parent", l.getParent()!=null ? URI.create("/v1/locations/"+l.getParent().getId()) : null)
                 .addIfNotNull("spec", specId!=null ? URI.create("/v1/locations/"+specId) : null)
-                .toImmutable() );
+                .asUnmodifiable() );
     }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/utils/common/src/main/java/brooklyn/util/collections/MutableList.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/collections/MutableList.java b/utils/common/src/main/java/brooklyn/util/collections/MutableList.java
index 2c00243..a6638da 100644
--- a/utils/common/src/main/java/brooklyn/util/collections/MutableList.java
+++ b/utils/common/src/main/java/brooklyn/util/collections/MutableList.java
@@ -20,16 +20,22 @@ package brooklyn.util.collections;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
 import javax.annotation.Nullable;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.google.common.collect.ImmutableList;
 
 public class MutableList<V> extends ArrayList<V> {
     private static final long serialVersionUID = -5533940507175152491L;
 
+    private static final Logger log = LoggerFactory.getLogger(MutableList.class);
+    
     public static <V> MutableList<V> of() {
         return new MutableList<V>();
     }
@@ -74,10 +80,25 @@ public class MutableList<V> extends ArrayList<V> {
         }
     }
     
+    /** @deprecated since 0.7.0, use {@link #asImmutableCopy()}, or {@link #asUnmodifiable()} / {@link #asUnmodifiableCopy()} */ @Deprecated
     public ImmutableList<V> toImmutable() {
         return ImmutableList.copyOf(this);
     }
-    
+    public List<V> asImmutableCopy() {
+        try {
+            return ImmutableList.copyOf(this);
+        } catch (Exception e) {
+            log.warn("Error converting list to Immutable, using unmodifiable instead: "+e, e);
+            return asUnmodifiableCopy();
+        }
+    }
+    public List<V> asUnmodifiable() {
+        return Collections.unmodifiableList(this);
+    }
+    public List<V> asUnmodifiableCopy() {
+        return Collections.unmodifiableList(MutableList.copyOf(this));
+    }
+
     public static <V> Builder<V> builder() {
         return new Builder<V>();
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java b/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java
index 2d21d67..2630dbf 100644
--- a/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java
+++ b/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java
@@ -18,6 +18,7 @@
  */
 package brooklyn.util.collections;
 
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -25,6 +26,9 @@ import java.util.Map.Entry;
 
 import javax.annotation.Nullable;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import brooklyn.util.guava.Maybe;
 
 import com.google.common.base.Predicate;
@@ -33,7 +37,9 @@ import com.google.common.collect.ImmutableMap;
 /** Map impl, exposing simple builder operations (add) in a fluent-style API,
  * where the final map is mutable.  You can also toImmutable. */
 public class MutableMap<K,V> extends LinkedHashMap<K,V> {
+    
     private static final long serialVersionUID = -2463168443382874384L;
+    private static final Logger log = LoggerFactory.getLogger(MutableMap.class);
 
     public static <K,V> MutableMap<K,V> of() {
         return new MutableMap<K,V>();
@@ -136,9 +142,24 @@ public class MutableMap<K,V> extends LinkedHashMap<K,V> {
         return Maybe.absent("No entry for key '"+key+"' in this map");
     }
     
+    /** @deprecated since 0.7.0, use {@link #asImmutableCopy()}, or {@link #asUnmodifiable()} / {@link #asUnmodifiableCopy()} */ @Deprecated
     public ImmutableMap<K,V> toImmutable() {
         return ImmutableMap.copyOf(this);
     }
+    public Map<K,V> asImmutableCopy() {
+        try {
+            return ImmutableMap.copyOf(this);
+        } catch (Exception e) {
+            log.warn("Error converting list to Immutable, using unmodifiable instead: "+e, e);
+            return asUnmodifiableCopy();
+        }
+    }
+    public Map<K,V> asUnmodifiable() {
+        return Collections.unmodifiableMap(this);
+    }
+    public Map<K,V> asUnmodifiableCopy() {
+        return Collections.unmodifiableMap(MutableMap.copyOf(this));
+    }
     
     public static <K, V> Builder<K, V> builder() {
         return new Builder<K,V>();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/utils/common/src/main/java/brooklyn/util/collections/MutableSet.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/collections/MutableSet.java b/utils/common/src/main/java/brooklyn/util/collections/MutableSet.java
index cee4176..0653cfd 100644
--- a/utils/common/src/main/java/brooklyn/util/collections/MutableSet.java
+++ b/utils/common/src/main/java/brooklyn/util/collections/MutableSet.java
@@ -26,11 +26,16 @@ import java.util.Set;
 
 import javax.annotation.Nullable;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
 public class MutableSet<V> extends LinkedHashSet<V> {
+    
     private static final long serialVersionUID = 2330133488446834595L;
+    private static final Logger log = LoggerFactory.getLogger(MutableSet.class);
 
     public static <V> MutableSet<V> of() {
         return new MutableSet<V>();
@@ -69,10 +74,25 @@ public class MutableSet<V> extends LinkedHashSet<V> {
         super((source instanceof Collection) ? (Collection<? extends V>)source : Sets.newLinkedHashSet(source));
     }
     
+    /** @deprecated since 0.7.0, use {@link #asImmutableCopy()}, or {@link #asUnmodifiable()} / {@link #asUnmodifiableCopy()} */ @Deprecated
     public Set<V> toImmutable() {
-    	// Don't use ImmutableSet as that does not accept nulls
+        // Don't use ImmutableSet as that does not accept nulls
         return Collections.unmodifiableSet(Sets.newLinkedHashSet(this));
     }
+    public Set<V> asImmutableCopy() {
+        try {
+            return ImmutableSet.copyOf(this);
+        } catch (Exception e) {
+            log.warn("Error converting list to Immutable, using unmodifiable instead: "+e, e);
+            return asUnmodifiableCopy();
+        }
+    }
+    public Set<V> asUnmodifiable() {
+        return Collections.unmodifiableSet(this);
+    }
+    public Set<V> asUnmodifiableCopy() {
+        return Collections.unmodifiableSet(MutableSet.copyOf(this));
+    }
     
     public static <V> Builder<V> builder() {
         return new Builder<V>();
@@ -103,6 +123,12 @@ public class MutableSet<V> extends LinkedHashSet<V> {
             return this;
         }
         
+        public Builder<V> addAll(V[] values) {
+            for (V v : values) {
+                result.add(v);
+            }
+            return this;
+        }
         public Builder<V> addAll(Iterable<? extends V> iterable) {
             if (iterable instanceof Collection) {
                 result.addAll((Collection<? extends V>) iterable);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ab1381b4/utils/common/src/test/java/brooklyn/util/collections/MutableListTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/brooklyn/util/collections/MutableListTest.java b/utils/common/src/test/java/brooklyn/util/collections/MutableListTest.java
index 089cfe4..e7dc5bf 100644
--- a/utils/common/src/test/java/brooklyn/util/collections/MutableListTest.java
+++ b/utils/common/src/test/java/brooklyn/util/collections/MutableListTest.java
@@ -53,4 +53,27 @@ public class MutableListTest {
         Assert.assertEquals(b, a);
     }
 
+    public void testContainingNullAndUnmodifiable() {
+        MutableList<Object> x = MutableList.<Object>of("x", null);
+        Assert.assertTrue(x.contains(null));
+        
+        List<Object> x1 = x.asUnmodifiable();
+        List<Object> x2 = x.asUnmodifiableCopy();
+        List<Object> x3 = x.asImmutableCopy();
+        
+        x.remove(null);
+        Assert.assertFalse(x.contains(null));
+        Assert.assertFalse(x1.contains(null));
+        Assert.assertTrue(x2.contains(null));
+        Assert.assertTrue(x3.contains(null));
+        
+        try { x1.remove("x"); Assert.fail(); } catch (Exception e) { /* expected */ }
+        try { x2.remove("x"); Assert.fail(); } catch (Exception e) { /* expected */ }
+        try { x3.remove("x"); Assert.fail(); } catch (Exception e) { /* expected */ }
+        
+        Assert.assertTrue(x1.contains("x"));
+        Assert.assertTrue(x2.contains("x"));
+        Assert.assertTrue(x3.contains("x"));
+    }
+    
 }