Repository: brooklyn-server
Updated Branches:
  refs/heads/master 972a0d8e1 -> 0570ca5a5


BROOKLYN-404: improve BrooklynProperties concurrency

BrooklynProperties no longer exposed as java.util.Map


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

Branch: refs/heads/master
Commit: 4c1fe06042eca2be3edcd8c603d8435559b4a9a9
Parents: 972a0d8
Author: Aled Sage <aled.s...@gmail.com>
Authored: Wed Jan 4 16:23:17 2017 +0000
Committer: Aled Sage <aled.s...@gmail.com>
Committed: Tue Jan 24 10:14:30 2017 +0000

----------------------------------------------------------------------
 .../brooklyn/core/config/ConfigUtils.java       |  15 +-
 .../core/internal/BrooklynProperties.java       |  29 ++-
 .../core/internal/BrooklynPropertiesImpl.java   | 183 ++++++++++++++-----
 .../core/location/BasicLocationDefinition.java  |   4 +-
 .../core/location/BasicLocationRegistry.java    |   5 +-
 .../BasicExternalConfigSupplierRegistry.java    |   6 +-
 .../internal/DeferredBrooklynProperties.java    |  84 ++++-----
 .../config/BrooklynPropertiesBuilderTest.java   |   8 +-
 .../core/config/BrooklynPropertiesTest.java     |  13 +-
 .../internal/LocalManagementContextTest.java    |   6 +-
 .../brooklyn/launcher/BrooklynLauncher.java     |   2 +-
 ...lynLauncherRebindToCloudObjectStoreTest.java |   2 +-
 .../jclouds/BailOutJcloudsLocation.java         |   8 +-
 .../location/jclouds/JcloudsLocationTest.java   |   6 +-
 .../brooklynnode/LocalBrooklynNodeImpl.java     |   6 +-
 15 files changed, 246 insertions(+), 131 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/main/java/org/apache/brooklyn/core/config/ConfigUtils.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/config/ConfigUtils.java 
b/core/src/main/java/org/apache/brooklyn/core/config/ConfigUtils.java
index d5b0c41..bbccaa6 100644
--- a/core/src/main/java/org/apache/brooklyn/core/config/ConfigUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/core/config/ConfigUtils.java
@@ -35,6 +35,7 @@ import org.apache.brooklyn.core.config.WrappedConfigKey;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.text.StringPredicates;
 import org.apache.brooklyn.util.text.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -81,20 +82,18 @@ public class ConfigUtils {
     
     public static BrooklynProperties filterFor(BrooklynProperties properties, 
Predicate<? super String> filter) {
         BrooklynProperties result = BrooklynProperties.Factory.newEmpty();
-        for (String k: (Collection<String>)properties.keySet()) {
-            if (filter.apply(k)) {
-                result.put(k, properties.get(k));
-            }
+        Set<ConfigKey<?>> keys = 
properties.findKeys(ConfigPredicates.nameSatisfies(filter));
+        for (ConfigKey<?> key : keys) {
+            result.put(key, properties.getConfig(key));
         }
         return result;
     }
     
     public static BrooklynProperties filterForPrefix(BrooklynProperties 
properties, String prefix) {
         BrooklynProperties result = BrooklynProperties.Factory.newEmpty();
-        for (String k: (Collection<String>)properties.keySet()) {
-            if (k.startsWith(prefix)) {
-                result.put(k, properties.get(k));
-            }
+        Set<ConfigKey<?>> keys = 
properties.findKeys(ConfigPredicates.nameSatisfies(StringPredicates.startsWith(prefix)));
+        for (ConfigKey<?> key : keys) {
+            result.put(key, properties.getConfig(key));
         }
         return result;
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynProperties.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynProperties.java 
b/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynProperties.java
index ad72e4a..9924a90 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynProperties.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynProperties.java
@@ -50,7 +50,7 @@ import com.google.common.base.Supplier;
  * thereafter.
  */
 @SuppressWarnings("rawtypes")
-public interface BrooklynProperties extends Map, StringConfigMap {
+public interface BrooklynProperties extends StringConfigMap {
 
     public static class Factory {
         private static final Logger LOG = 
LoggerFactory.getLogger(BrooklynProperties.Factory.class);
@@ -104,7 +104,7 @@ public interface BrooklynProperties extends Map, 
StringConfigMap {
              * Creates a Builder that when built, will return the 
BrooklynProperties passed to this constructor
              */
             private Builder(BrooklynProperties originalProperties) {
-                this.originalProperties = new 
BrooklynPropertiesImpl().addFromMap(originalProperties);
+                this.originalProperties = new 
BrooklynPropertiesImpl().addFromMap(originalProperties.asMapWithStringKeys());
             }
             
             /**
@@ -157,7 +157,7 @@ public interface BrooklynProperties extends Map, 
StringConfigMap {
             
             public BrooklynProperties build() {
                 if (originalProperties != null) 
-                    return new 
BrooklynPropertiesImpl().addFromMap(originalProperties);
+                    return new 
BrooklynPropertiesImpl().addFromMap(originalProperties.asMapWithStringKeys());
                 
                 BrooklynProperties properties = new BrooklynPropertiesImpl();
 
@@ -181,6 +181,7 @@ public interface BrooklynProperties extends Map, 
StringConfigMap {
             }
 
             @Override
+            @SuppressWarnings("deprecation")
             public String toString() {
                 return Objects.toStringHelper(this)
                         .omitNullValues()
@@ -280,11 +281,9 @@ public interface BrooklynProperties extends Map, 
StringConfigMap {
     public String getFirst(Map flags, String ...keys);
 
     /** like normal map.put, except config keys are dereferenced on the way in 
*/
-    @Override
     public Object put(Object key, Object value);
 
-    /** like normal map.putAll, except config keys are dereferenced on the way 
in */
-    @Override
+    /** like normal {@link java.util.Map#putAll(Map)}, except config keys are 
dereferenced on the way in */
     public void putAll(Map vals);
     
     public <T> Object put(HasConfigKey<T> key, T value);
@@ -293,6 +292,21 @@ public interface BrooklynProperties extends Map, 
StringConfigMap {
     
     public <T> boolean putIfAbsent(ConfigKey<T> key, T value);
     
+    @Beta
+    public boolean containsKey(String key);
+
+    @Beta
+    public boolean containsKey(ConfigKey<?> key);
+
+    @Beta
+    public boolean remove(String key);
+
+    @Beta
+    public boolean remove(ConfigKey<?> key);
+
+    @Beta
+    public Object getConfig(String key);
+
     @Override
     public <T> T getConfig(ConfigKey<T> key);
 
@@ -324,6 +338,9 @@ public interface BrooklynProperties extends Map, 
StringConfigMap {
     @Override
     public BrooklynProperties submap(Predicate<ConfigKey<?>> filter);
 
+    @Beta
+    public BrooklynProperties submapByName(Predicate<? super String> filter);
+
     @Override
     public Map<String, Object> asMapWithStringKeys();
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynPropertiesImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynPropertiesImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynPropertiesImpl.java
index 6c50cde..10470d5 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynPropertiesImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/internal/BrooklynPropertiesImpl.java
@@ -62,9 +62,8 @@ import groovy.lang.Closure;
  * intention is that they are set during startup and not modified thereafter.
  */
 @SuppressWarnings("rawtypes")
-public class BrooklynPropertiesImpl extends LinkedHashMap implements 
BrooklynProperties {
+public class BrooklynPropertiesImpl implements BrooklynProperties {
 
-    private static final long serialVersionUID = -945875483083108978L;
     private static final Logger LOG = 
LoggerFactory.getLogger(BrooklynPropertiesImpl.class);
 
     public static class Factory {
@@ -122,7 +121,7 @@ public class BrooklynPropertiesImpl extends LinkedHashMap 
implements BrooklynPro
              * Creates a Builder that when built, will return the 
BrooklynProperties passed to this constructor
              */
             private Builder(BrooklynPropertiesImpl originalProperties) {
-                this.originalProperties = new 
BrooklynPropertiesImpl().addFromMap(originalProperties);
+                this.originalProperties = new 
BrooklynPropertiesImpl().addFromMap(originalProperties.asMapWithStringKeys());
             }
             
             /**
@@ -167,7 +166,7 @@ public class BrooklynPropertiesImpl extends LinkedHashMap 
implements BrooklynPro
             
             public BrooklynPropertiesImpl build() {
                 if (originalProperties != null) 
-                    return new 
BrooklynPropertiesImpl().addFromMap(originalProperties);
+                    return new 
BrooklynPropertiesImpl().addFromMap(originalProperties.asMapWithStringKeys());
                 
                 BrooklynPropertiesImpl properties = new 
BrooklynPropertiesImpl();
 
@@ -190,6 +189,7 @@ public class BrooklynPropertiesImpl extends LinkedHashMap 
implements BrooklynPro
             }
 
             @Override
+            @SuppressWarnings("deprecation")
             public String toString() {
                 return Objects.toStringHelper(this)
                         .omitNullValues()
@@ -226,6 +226,13 @@ public class BrooklynPropertiesImpl extends LinkedHashMap 
implements BrooklynPro
         }
     }
 
+    /**
+     * The actual properties.
+     * <p>
+     * Care must be taken accessing/modifying these, to ensure it is correctly 
synchronized.
+     */
+    private final Map<String, Object> contents = new LinkedHashMap<>();
+    
     protected BrooklynPropertiesImpl() {
     }
 
@@ -343,17 +350,17 @@ public class BrooklynPropertiesImpl extends LinkedHashMap 
implements BrooklynPro
         return true;
     }
 
-   /** @deprecated attempts to call get with this syntax are probably 
mistakes; get(key, defaultValue) is fine but
-    * Map is unlikely the key, much more likely they meant getFirst(flags, 
key).
-    */
-   @Override
-@Deprecated
-   public String get(Map flags, String key) {
-       LOG.warn("Discouraged use of 'BrooklynProperties.get(Map,String)' 
(ambiguous); use getFirst(Map,String) or get(String) -- assuming the former");
-       LOG.debug("Trace for discouraged use of 
'BrooklynProperties.get(Map,String)'",
-           new Throwable("Arguments: "+flags+" "+key));
-       return getFirst(flags, key);
-   }
+    /** @deprecated attempts to call get with this syntax are probably 
mistakes; get(key, defaultValue) is fine but
+     * Map is unlikely the key, much more likely they meant getFirst(flags, 
key).
+     */
+    @Override
+    @Deprecated
+    public String get(Map flags, String key) {
+        LOG.warn("Discouraged use of 'BrooklynProperties.get(Map,String)' 
(ambiguous); use getFirst(Map,String) or get(String) -- assuming the former");
+        LOG.debug("Trace for discouraged use of 
'BrooklynProperties.get(Map,String)'",
+                new Throwable("Arguments: "+flags+" "+key));
+        return getFirst(flags, key);
+    }
 
     /** returns the value of the first key which is defined
      * <p>
@@ -398,11 +405,22 @@ public class BrooklynPropertiesImpl extends LinkedHashMap 
implements BrooklynPro
 
     /** like normal map.put, except config keys are dereferenced on the way in 
*/
     @Override
-    @SuppressWarnings("unchecked")
-    public Object put(Object key, Object value) {
-        if (key instanceof HasConfigKey) key = 
((HasConfigKey)key).getConfigKey().getName();
-        if (key instanceof ConfigKey) key = ((ConfigKey)key).getName();
-        return super.put(key, value);
+    public Object put(Object rawKey, Object value) {
+        String key;
+        if (rawKey == null) {
+            throw new NullPointerException("Null key not permitted in 
BrooklynProperties");
+        } else if (rawKey instanceof String) {
+            key = (String) rawKey;
+        } else if (rawKey instanceof CharSequence) {
+            key = rawKey.toString();
+        } else if (rawKey instanceof HasConfigKey) {
+            key = ((HasConfigKey)rawKey).getConfigKey().getName();
+        } else if (rawKey instanceof ConfigKey) {
+            key = ((ConfigKey)rawKey).getName();
+        } else {
+            throw new IllegalArgumentException("Invalid key (value='" + rawKey 
+ "', type=" + rawKey.getClass().getName() + ") for BrooklynProperties");
+        }
+        return putImpl(key, value);
     }
 
     /** like normal map.putAll, except config keys are dereferenced on the way 
in */
@@ -414,15 +432,13 @@ public class BrooklynPropertiesImpl extends LinkedHashMap 
implements BrooklynPro
     }
     
     @Override
-    @SuppressWarnings("unchecked")
     public <T> Object put(HasConfigKey<T> key, T value) {
-        return super.put(key.getConfigKey().getName(), value);
+        return putImpl(key.getConfigKey().getName(), value);
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     public <T> Object put(ConfigKey<T> key, T value) {
-        return super.put(key.getName(), value);
+        return putImpl(key.getName(), value);
     }
     
     @Override
@@ -431,6 +447,11 @@ public class BrooklynPropertiesImpl extends LinkedHashMap 
implements BrooklynPro
     }
     
     @Override
+    public Object getConfig(String key) {
+        return get(key);
+    }
+
+    @Override
     public <T> T getConfig(ConfigKey<T> key) {
         return getConfig(key, null);
     }
@@ -474,45 +495,119 @@ public class BrooklynPropertiesImpl extends 
LinkedHashMap implements BrooklynPro
         return getConfigRaw(key);
     }
     
-    @Override
-    public Map<ConfigKey<?>,Object> getAllConfigLocalRaw() {
-        Map<ConfigKey<?>, Object> result = new LinkedHashMap<ConfigKey<?>, 
Object>();
-        for (Object entry: entrySet())
-            result.put(new BasicConfigKey<Object>(Object.class, 
""+((Map.Entry)entry).getKey()), ((Map.Entry)entry).getValue());
-        return result;
-    }
-
     @Override @Deprecated
     public Map<ConfigKey<?>, Object> getAllConfig() {
         return getAllConfigLocalRaw();
     }
 
     @Override
+    public Map<ConfigKey<?>,Object> getAllConfigLocalRaw() {
+        Map<ConfigKey<?>, Object> result = new LinkedHashMap<>();
+        synchronized (contents) {
+            for (Map.Entry<String, Object> entry : contents.entrySet()) {
+                result.put(new BasicConfigKey<Object>(Object.class, 
entry.getKey()), entry.getValue());
+            }
+        }
+        return result;
+    }
+
+    @Override
     public Set<ConfigKey<?>> findKeys(Predicate<? super ConfigKey<?>> filter) {
-        Set<ConfigKey<?>> result = new LinkedHashSet<ConfigKey<?>>();
-        for (Object entry: entrySet()) {
-            ConfigKey<?> k = new BasicConfigKey<Object>(Object.class, 
""+((Map.Entry)entry).getKey());
-            if (filter.apply(k))
-                result.add(new BasicConfigKey<Object>(Object.class, 
""+((Map.Entry)entry).getKey()));
+        Set<ConfigKey<?>> result = new LinkedHashSet<>();
+        synchronized (contents) {
+            for (Map.Entry<String, Object> entry : contents.entrySet()) {
+                ConfigKey<?> k = new BasicConfigKey<Object>(Object.class, 
entry.getKey());
+                if (filter.apply(k)) {
+                    result.add(k);
+                }
+            }
         }
         return result;
     }
     
     @Override
-    public BrooklynPropertiesImpl submap(Predicate<ConfigKey<?>> filter) {
+    public BrooklynProperties submap(Predicate<ConfigKey<?>> filter) {
         BrooklynPropertiesImpl result = Factory.newEmpty();
-        for (Object entry: entrySet()) {
-            ConfigKey<?> k = new BasicConfigKey<Object>(Object.class, 
""+((Map.Entry)entry).getKey());
-            if (filter.apply(k))
-                result.put(((Map.Entry)entry).getKey(), 
((Map.Entry)entry).getValue());
+        synchronized (contents) {
+            for (Map.Entry<String, Object> entry : contents.entrySet()) {
+                ConfigKey<?> k = new BasicConfigKey<Object>(Object.class, 
entry.getKey());
+                if (filter.apply(k)) {
+                    result.put(entry.getKey(), entry.getValue());
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public BrooklynProperties submapByName(Predicate<? super String> filter) {
+        BrooklynPropertiesImpl result = Factory.newEmpty();
+        synchronized (contents) {
+            for (Map.Entry<String, Object> entry : contents.entrySet()) {
+                if (filter.apply(entry.getKey())) {
+                    result.put(entry.getKey(), entry.getValue());
+                }
+            }
         }
         return result;
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public Map<String, Object> asMapWithStringKeys() {
-        return this;
+        synchronized (contents) {
+            return MutableMap.copyOf(contents).asUnmodifiable();
+        }
     }
 
+    @Override
+    public boolean isEmpty() {
+        synchronized (contents) {
+            return contents.isEmpty();
+        }
+    }
+    
+    @Override
+    public int size() {
+        synchronized (contents) {
+            return contents.size();
+        }
+    }
+    
+    @Override
+    public boolean containsKey(String key) {
+        synchronized (contents) {
+            return contents.containsKey(key);
+        }
+    }
+
+    @Override
+    public boolean containsKey(ConfigKey<?> key) {
+        return containsKey(key.getName());
+    }
+    
+    @Override
+    public boolean remove(String key) {
+        synchronized (contents) {
+            boolean result = contents.containsKey(key);
+            contents.remove(key);
+            return result;
+        }
+    }
+    
+    @Override
+    public boolean remove(ConfigKey<?> key) {
+        return remove(key.getName());
+    }
+    
+    protected Object get(String key) {
+        synchronized (contents) {
+            return contents.get(key);
+        }
+    }
+    
+    protected Object putImpl(String key, Object value) {
+        synchronized (contents) {
+            return contents.put(key, value);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.java
 
b/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.java
index 4add560..38023e0 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationDefinition.java
@@ -33,11 +33,11 @@ public class BasicLocationDefinition implements 
LocationDefinition {
     private final String spec;
     private final Map<String,Object> config;
 
-    public BasicLocationDefinition(String name, String spec, Map<String,? 
extends Object> config) {
+    public BasicLocationDefinition(String name, String spec, Map<String, ?> 
config) {
         this(Identifiers.makeRandomId(8), name, spec, config);
     }
     
-    public BasicLocationDefinition(String id, String name, String spec, 
Map<String,? extends Object> config) {      
+    public BasicLocationDefinition(String id, String name, String spec, 
Map<String, ?> config) {      
         this.id = Preconditions.checkNotNull(id);
         this.name = name;
         this.spec = Preconditions.checkNotNull(spec);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
 
b/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
index d7e0000..e68c0dc 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
@@ -43,6 +43,7 @@ import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.core.config.ConfigPredicates;
 import org.apache.brooklyn.core.config.ConfigUtils;
+import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.core.location.internal.LocationInternal;
 import org.apache.brooklyn.core.mgmt.internal.LocalLocationManager;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
@@ -282,8 +283,8 @@ public class BasicLocationRegistry implements 
LocationRegistry {
                     String spec = (String) 
namedLocationProps.asMapWithStringKeys().get(k);
                     // make up an ID
                     String id = Identifiers.makeRandomId(8);
-                    Map<String, Object> config = 
ConfigUtils.filterForPrefixAndStrip(namedLocationProps.asMapWithStringKeys(), 
k+".");
-                    definedLocations.put(id, new BasicLocationDefinition(id, 
name, spec, config));
+                    BrooklynProperties config = 
ConfigUtils.filterForPrefixAndStrip(namedLocationProps.asMapWithStringKeys(), 
k+".");
+                    definedLocations.put(id, new BasicLocationDefinition(id, 
name, spec, config.asMapWithStringKeys()));
                     count++;
                 }
             }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
index 1a388d5..c5dc551 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
@@ -26,6 +26,7 @@ import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.config.ConfigPredicates;
 import org.apache.brooklyn.core.config.ConfigUtils;
 import org.apache.brooklyn.core.config.external.ExternalConfigSupplier;
+import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.Reflections;
@@ -99,11 +100,14 @@ public class BasicExternalConfigSupplierRegistry 
implements ExternalConfigSuppli
 
             String name = strippedKey;
             String providerClassname = (String) 
externalProviderProperties.get(key);
-            Map<String, Object> config = 
ConfigUtils.filterForPrefixAndStrip(externalProviderProperties, key + ".");
+            BrooklynProperties config = 
ConfigUtils.filterForPrefixAndStrip(externalProviderProperties, key + ".");
 
             try {
                 Maybe<ExternalConfigSupplier> configSupplier = 
Reflections.invokeConstructorFromArgs(classloader, 
ExternalConfigSupplier.class, providerClassname, mgmt, name, config);
                 if (!configSupplier.isPresent()) {
+                    configSupplier = 
Reflections.invokeConstructorFromArgs(classloader, 
ExternalConfigSupplier.class, providerClassname, mgmt, name, 
config.asMapWithStringKeys());
+                }
+                if (!configSupplier.isPresent()) {
                     configSupplier = 
Reflections.invokeConstructorFromArgs(classloader, 
ExternalConfigSupplier.class, providerClassname, mgmt, name);
                 }
                 if (!configSupplier.isPresent()) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
index 1bc737e..8ddebd1 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
@@ -31,6 +31,7 @@ import java.util.concurrent.ExecutionException;
 import org.apache.brooklyn.api.mgmt.ExecutionContext;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
@@ -103,6 +104,32 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
     }
     
     @Override
+    public boolean containsKey(String key) {
+        return delegate.containsKey(key);
+    }
+
+    @Override
+    public boolean containsKey(ConfigKey<?> key) {
+        return delegate.containsKey(key);
+    }
+
+    @Override
+    public boolean remove(String key) {
+        return delegate.remove(key);
+    }
+    
+    @Override
+    public boolean remove(ConfigKey<?> key) {
+        return delegate.remove(key);
+    }
+    
+    @Override
+    public Object getConfig(String key) {
+        Object raw = delegate.getConfig(key);
+        return resolve(ConfigKeys.newConfigKey(Object.class, key), raw);
+    }
+
+    @Override
     public <T> T getConfig(ConfigKey<T> key) {
         T raw = delegate.getConfig(key);
         return resolve(key, raw);
@@ -144,7 +171,7 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
 
     @Override
     public Map<ConfigKey<?>,Object> getAllConfigLocalRaw() {
-        Map<ConfigKey<?>, Object> raw = delegate.getAllConfig();
+        Map<ConfigKey<?>, Object> raw = delegate.getAllConfigLocalRaw();
         Map<ConfigKey<?>, Object> result = Maps.newLinkedHashMap();
         for (Map.Entry<ConfigKey<?>, Object> entry : raw.entrySet()) {
             result.put(entry.getKey(), transform(entry.getKey(), 
entry.getValue()));
@@ -159,7 +186,7 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
 
     @Override
     public Map<String, Object> asMapWithStringKeys() {
-        Map<ConfigKey<?>, Object> raw = delegate.getAllConfig();
+        Map<ConfigKey<?>, Object> raw = delegate.getAllConfigLocalRaw();
         Map<String, Object> result = Maps.newLinkedHashMap();
         for (Map.Entry<ConfigKey<?>, Object> entry : raw.entrySet()) {
             result.put(entry.getKey().getName(), transform(entry.getKey(), 
entry.getValue()));
@@ -202,6 +229,13 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
         BrooklynProperties submap = delegate.submap(filter);
         return new DeferredBrooklynProperties(submap, mgmt);
     }
+    
+    @Override
+    public BrooklynProperties submapByName(Predicate<? super String> filter) {
+        BrooklynProperties submap = delegate.submapByName(filter);
+        return new DeferredBrooklynProperties(submap, mgmt);
+    }
+
     @Override
     public Set<ConfigKey<?>> findKeys(Predicate<? super ConfigKey<?>> filter) {
         return delegate.findKeys(filter);
@@ -307,7 +341,7 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
     
     
     
//////////////////////////////////////////////////////////////////////////////////
-    // Methods below from java.util.LinkedHashMap, which BrooklynProperties 
extends //
+    // Methods below from ConfigMap, which BrooklynProperties extends          
     //
     
//////////////////////////////////////////////////////////////////////////////////
     
     @Override
@@ -320,50 +354,12 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
         return delegate.isEmpty();
     }
 
-    @Override
-    public boolean containsKey(Object key) {
-        return delegate.containsKey(key);
-    }
-
-    @Override
-    public boolean containsValue(Object value) {
-        return delegate.containsValue(value);
-    }
-
-    @Override
-    public Object get(Object key) {
-        return delegate.get(key);
-    }
-
-    @Override
-    public Object remove(Object key) {
-        return delegate.remove(key);
-    }
-
-    @Override
-    public void clear() {
-        delegate.clear();
-    }
-
-    @Override
-    @SuppressWarnings("rawtypes")
-    public Set keySet() {
-        return delegate.keySet();
-    }
 
-    @Override
-    @SuppressWarnings("rawtypes")
-    public Collection values() {
-        return delegate.values();
-    }
+    
//////////////////////////////////////////////////////////////////////////////////
+    // Methods below from Object                                               
     //
+    
//////////////////////////////////////////////////////////////////////////////////
     
     @Override
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    public Set<Map.Entry> entrySet() {
-        return delegate.entrySet();
-    }
-
-    @Override
     public boolean equals(Object o) {
         return delegate.equals(o);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesBuilderTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesBuilderTest.java
index bc57824..f40ea52 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesBuilderTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesBuilderTest.java
@@ -58,7 +58,7 @@ public class BrooklynPropertiesBuilderTest {
                 .globalPropertiesFile(globalPropertiesFile.getAbsolutePath())
                 .build();
         
-        assertEquals(props.get("brooklyn.mykey"), "myval");
+        assertEquals(props.getConfig("brooklyn.mykey"), "myval");
     }
     
     @Test
@@ -76,8 +76,8 @@ public class BrooklynPropertiesBuilderTest {
                 .localPropertiesFile(localPropertiesFile.getAbsolutePath())
                 .build();
         
-        assertEquals(props.get("brooklyn.mykey"), "myvaloverriding");
-        assertEquals(props.get("brooklyn.mykey2"), "myvalglobal2");
-        assertEquals(props.get("brooklyn.mykeyLocal"), "myvallocal2");
+        assertEquals(props.getConfig("brooklyn.mykey"), "myvaloverriding");
+        assertEquals(props.getConfig("brooklyn.mykey2"), "myvalglobal2");
+        assertEquals(props.getConfig("brooklyn.mykeyLocal"), "myvallocal2");
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesTest.java
index a427838..d802892 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/config/BrooklynPropertiesTest.java
@@ -155,9 +155,9 @@ public class BrooklynPropertiesTest {
         assertEquals(p2.getFirst("akey"), null);
         
         BrooklynProperties p3a = 
props.submap(ConfigPredicates.startingWith("a."));
-        assertEquals(p3a, p2);
+        assertPropertiesEquals(p3a, p2);
         BrooklynProperties p3b = 
props.submap(ConfigPredicates.matchingRegex("a\\..*"));
-        assertEquals(p3b, p2);
+        assertPropertiesEquals(p3b, p2);
         
         BrooklynProperties p4 = 
props.submap(ConfigPredicates.matchingRegex("a.*"));
         assertEquals(p4.getAllConfig().keySet().size(), 3, "wrong size submap: 
"+p4);
@@ -182,21 +182,24 @@ public class BrooklynPropertiesTest {
         
         props.put(aString, "aval2");
         assertEquals(props.getConfig(aString), "aval2");
-        assertEquals(props.get("a.key"), "aval2");
+        assertEquals(props.getConfig("a.key"), "aval2");
 
         props.put(nNum, "345");
         assertEquals(props.getConfig(nNum), (Integer)345);
-        assertEquals(props.get("n.key"), "345");
+        assertEquals(props.getConfig("n.key"), "345");
 
         assertEquals(props.getConfig(aBsent), null);
         assertEquals(props.getConfig(aBsent, 123), (Integer)123);
         assertEquals(props.getConfig(aDfault), (Integer)123);
         
         props.put(aMisstyped, "x1");
-        assertEquals(props.get("am.isstyped"), "x1");
+        assertEquals(props.getConfig("am.isstyped"), "x1");
         boolean workedWhenShouldntHave = false;
         try { props.getConfig(aMisstyped); workedWhenShouldntHave = true; } 
catch (Exception e) {}
         if (workedWhenShouldntHave) fail("should have failed getting 
"+aMisstyped+" because can't coerce");
     }
 
+    protected void assertPropertiesEquals(BrooklynProperties actual, 
BrooklynProperties expected) {
+        assertEquals(actual.asMapWithStringKeys(), 
expected.asMapWithStringKeys());
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContextTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContextTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContextTest.java
index 2332793..683fedf 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContextTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContextTest.java
@@ -97,11 +97,11 @@ public class LocalManagementContextTest {
         BrooklynProperties properties = BrooklynProperties.Factory.newEmpty();
         properties.put("myname", "myval");
         context = 
LocalManagementContextForTests.builder(true).useProperties(properties).build();
-        assertEquals(context.getBrooklynProperties().get("myname"), "myval");
+        assertEquals(context.getBrooklynProperties().getConfig("myname"), 
"myval");
         properties.put("myname", "newval");
-        assertEquals(properties.get("myname"), "newval");
+        assertEquals(properties.getConfig("myname"), "newval");
         // TODO: Should changes in the 'properties' collection be reflected in 
context.getBrooklynProperties()?
-        assertNotEquals(context.getBrooklynProperties().get("myname"), 
"newval");
+        assertNotEquals(context.getBrooklynProperties().getConfig("myname"), 
"newval");
     }
     
     @Test

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java
----------------------------------------------------------------------
diff --git 
a/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java 
b/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java
index 0578f04..67ad368 100644
--- a/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java
+++ b/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java
@@ -318,7 +318,7 @@ public class BrooklynLauncher extends 
BasicLauncher<BrooklynLauncher> {
             if (port!=null) webServer.setPort(port);
             if (useHttps!=null) webServer.setHttpsEnabled(useHttps);
             webServer.setShutdownHandler(shutdownHandler);
-            webServer.putAttributes(brooklynProperties);
+            webServer.putAttributes(brooklynProperties.asMapWithStringKeys());
             webServer.skipSecurity(skipSecurity);
             for (WebAppContextProvider webapp : webApps) {
                 webServer.addWar(webapp);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherRebindToCloudObjectStoreTest.java
----------------------------------------------------------------------
diff --git 
a/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherRebindToCloudObjectStoreTest.java
 
b/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherRebindToCloudObjectStoreTest.java
index 486e805..56467cc 100644
--- 
a/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherRebindToCloudObjectStoreTest.java
+++ 
b/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherRebindToCloudObjectStoreTest.java
@@ -67,7 +67,7 @@ public class BrooklynLauncherRebindToCloudObjectStoreTest 
extends BrooklynLaunch
     @Override
     protected LocalManagementContextForTests 
newManagementContextForTests(BrooklynProperties props) {
         BrooklynProperties p2 = BrooklynProperties.Factory.newDefault();
-        if (props!=null) p2.putAll(props);
+        if (props!=null) p2.putAll(props.getAllConfigLocalRaw());
         return new LocalManagementContextForTests(p2);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BailOutJcloudsLocation.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BailOutJcloudsLocation.java
 
b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BailOutJcloudsLocation.java
index aabda7c..fa0a18a 100644
--- 
a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BailOutJcloudsLocation.java
+++ 
b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BailOutJcloudsLocation.java
@@ -169,10 +169,10 @@ public class BailOutJcloudsLocation extends 
JcloudsLocation {
      */
     public static BailOutJcloudsLocation 
newBailOutJcloudsLocationForLiveTest(LocalManagementContext mgmt, 
Map<ConfigKey<?>, ?> config) {
         BrooklynProperties brooklynProperties = mgmt.getBrooklynProperties();
-        String identity = (String) 
brooklynProperties.get("brooklyn.location.jclouds.aws-ec2.identity");
-        if (identity == null) identity = (String) 
brooklynProperties.get("brooklyn.jclouds.aws-ec2.identity");
-        String credential = (String) 
brooklynProperties.get("brooklyn.location.jclouds.aws-ec2.credential");
-        if (credential == null) credential = (String) 
brooklynProperties.get("brooklyn.jclouds.aws-ec2.credential");
+        String identity = (String) 
brooklynProperties.getConfig("brooklyn.location.jclouds.aws-ec2.identity");
+        if (identity == null) identity = (String) 
brooklynProperties.getConfig("brooklyn.jclouds.aws-ec2.identity");
+        String credential = (String) 
brooklynProperties.getConfig("brooklyn.location.jclouds.aws-ec2.credential");
+        if (credential == null) credential = (String) 
brooklynProperties.getConfig("brooklyn.jclouds.aws-ec2.credential");
 
         Map<ConfigKey<?>, ?> allConfig = MutableMap.<ConfigKey<?>, 
Object>builder()
                 .put(CLOUD_PROVIDER, AbstractJcloudsLiveTest.AWS_EC2_PROVIDER)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsLocationTest.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsLocationTest.java
 
b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsLocationTest.java
index 20e0242..c10a594 100644
--- 
a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsLocationTest.java
+++ 
b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsLocationTest.java
@@ -521,7 +521,6 @@ public class JcloudsLocationTest implements 
JcloudsLocationConfig {
         Assert.assertEquals(geo.longitude, -20d, 0.00001);
     }
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testInheritsGeoFromLocationMetadataProperties() throws 
Exception {
         // in location-metadata.properties:
@@ -534,8 +533,9 @@ public class JcloudsLocationTest implements 
JcloudsLocationConfig {
             .configure(ACCESS_IDENTITY, "bogus")
             .configure(ACCESS_CREDENTIAL, "bogus")
             .configure(MACHINE_CREATE_ATTEMPTS, 1);
-        FakeLocalhostWithParentJcloudsLocation ll = 
managementContext.getLocationManager().createLocation(LocationSpec.create(FakeLocalhostWithParentJcloudsLocation.class)
-            .configure(new 
JcloudsPropertiesFromBrooklynProperties().getJcloudsProperties("softlayer", 
"wdc01", null, managementContext.getBrooklynProperties()))
+        Map<String, Object> brooklynProperties = 
managementContext.getBrooklynProperties().asMapWithStringKeys();
+               FakeLocalhostWithParentJcloudsLocation ll = 
managementContext.getLocationManager().createLocation(LocationSpec.create(FakeLocalhostWithParentJcloudsLocation.class)
+            .configure(new 
JcloudsPropertiesFromBrooklynProperties().getJcloudsProperties("softlayer", 
"wdc01", null, brooklynProperties))
             .configure(allConfig.getAllConfig()));
         MachineLocation l = ll.obtain();
         log.info("loc:" +l);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4c1fe060/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/LocalBrooklynNodeImpl.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/LocalBrooklynNodeImpl.java
 
b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/LocalBrooklynNodeImpl.java
index 8d95a39..adf46af 100644
--- 
a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/LocalBrooklynNodeImpl.java
+++ 
b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/LocalBrooklynNodeImpl.java
@@ -32,11 +32,11 @@ public class LocalBrooklynNodeImpl extends BrooklynNodeImpl 
implements LocalBroo
         // Override management username and password from brooklyn.properties
         // TODO Why use BrooklynProperties, rather than StringConfigMap 
returned by mgmt.getConfig()?
         BrooklynProperties properties = 
((ManagementContextInternal)getManagementContext()).getBrooklynProperties();
-        String user = (String) 
properties.get(String.format(LOCAL_BROOKLYN_NODE_KEY, "user"));
-        String password = (String) 
properties.get(String.format(LOCAL_BROOKLYN_NODE_KEY, "password"));
+        String user = (String) 
properties.getConfig(String.format(LOCAL_BROOKLYN_NODE_KEY, "user"));
+        String password = (String) 
properties.getConfig(String.format(LOCAL_BROOKLYN_NODE_KEY, "password"));
         if (Strings.isBlank(password)) {
             if (Strings.isBlank(user)) user = "admin";
-            password = (String) 
properties.get(String.format(BROOKLYN_WEBCONSOLE_PASSWORD_KEY, user));
+            password = (String) 
properties.getConfig(String.format(BROOKLYN_WEBCONSOLE_PASSWORD_KEY, user));
         }
         if (Strings.isNonBlank(user) && Strings.isNonBlank(password)) {
             config().set(MANAGEMENT_USER, user);

Reply via email to