You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/03/11 13:28:56 UTC

[3/4] incubator-brooklyn git commit: Make Sanitizer instantiable taking a predicate

Make Sanitizer instantiable taking a predicate

also adds extra checking for other datatypes


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

Branch: refs/heads/master
Commit: fd307c879d8d2978090b001460151a9958935671
Parents: 37341a8
Author: Robert Moss <ro...@gmail.com>
Authored: Tue Mar 10 15:00:03 2015 +0000
Committer: Robert Moss <ro...@gmail.com>
Committed: Tue Mar 10 15:00:03 2015 +0000

----------------------------------------------------------------------
 .../java/brooklyn/entity/basic/Entities.java    |  13 ++-
 .../java/brooklyn/entity/basic/Sanitizer.java   | 113 +++++++++++++++++--
 2 files changed, 111 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/fd307c87/core/src/main/java/brooklyn/entity/basic/Entities.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/Entities.java b/core/src/main/java/brooklyn/entity/basic/Entities.java
index c826070..48ba2d0 100644
--- a/core/src/main/java/brooklyn/entity/basic/Entities.java
+++ b/core/src/main/java/brooklyn/entity/basic/Entities.java
@@ -127,7 +127,10 @@ public class Entities {
     /**
      * Names that, if they appear anywhere in an attribute/config/field indicates that it
      * may be private, so should not be logged etc.
+     * 
+     * @deprecated since 0.7; instead use {@link Sanitizer#SECRET_NAMES}
      */
+    @Deprecated
     public static final List<String> SECRET_NAMES = ImmutableList.of(
             "password",
             "passwd",
@@ -250,12 +253,12 @@ public class Entities {
         return invokeEffector(callingEntity, entitiesToCall, effector, Collections.<String,Object>emptyMap());
     }
 
+    /**
+     * @deprecated since 0.7; instead use {@link Sanitizer#IS_SECRET_PREDICATE.apply(Object)}
+     */
+    @Deprecated
     public static boolean isSecret(String name) {
-        String lowerName = name.toLowerCase();
-        for (String secretName : SECRET_NAMES) {
-            if (lowerName.contains(secretName)) return true;
-        }
-        return false;
+        return Sanitizer.IS_SECRET_PREDICATE.apply(name);
     }
 
     public static boolean isTrivial(Object v) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/fd307c87/core/src/main/java/brooklyn/entity/basic/Sanitizer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/Sanitizer.java b/core/src/main/java/brooklyn/entity/basic/Sanitizer.java
index 15dd63e..6e07071 100644
--- a/core/src/main/java/brooklyn/entity/basic/Sanitizer.java
+++ b/core/src/main/java/brooklyn/entity/basic/Sanitizer.java
@@ -18,18 +18,53 @@
  */
 package brooklyn.entity.basic;
 
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import brooklyn.util.config.ConfigBag;
 
+import com.google.api.client.util.Lists;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
 public final class Sanitizer {
 
-    private Sanitizer() {
-    } // not instantiable
+    /**
+     * Names that, if they appear anywhere in an attribute/config/field
+     * indicates that it may be private, so should not be logged etc.
+     */
+    public static final List<String> SECRET_NAMES = ImmutableList.of(
+            "password", 
+            "passwd", 
+            "credential", 
+            "secret", 
+            "private",
+            "access.cert", 
+            "access.key");
+    
+    public static final Predicate<Object> IS_SECRET_PREDICATE = new Predicate<Object>() {
+
+        @Override
+        public boolean apply(Object name) {
+            String lowerName = name.toString().toLowerCase();
+            for (String secretName : SECRET_NAMES) {
+                if (lowerName.contains(secretName))
+                    return true;
+            }
+            return false;
+        }
+    };
+
+    public static Sanitizer newInstance(Predicate<Object> sanitizingNeededCheck) {
+        return new Sanitizer(sanitizingNeededCheck);
+    }
+    
+    public static Sanitizer newInstance(){
+        return newInstance(IS_SECRET_PREDICATE);
+    }
 
     public static Map<String, Object> sanitize(ConfigBag input) {
         return sanitize(input.getAllConfig());
@@ -39,21 +74,79 @@ public final class Sanitizer {
         return sanitize(input, Sets.newHashSet());
     }
 
-    public static <K> Map<K, Object> sanitize(Map<K, ?> input, Set<Object> visited) {
+    static <K> Map<K, Object> sanitize(Map<K, ?> input, Set<Object> visited) {
+        return newInstance().apply(input, visited);
+    }
+    
+    private Predicate<Object> predicate;
+
+    private Sanitizer(Predicate<Object> sanitizingNeededCheck) {
+        predicate = sanitizingNeededCheck;
+    }
+
+    public <K> Map<K, Object> apply(Map<K, ?> input) {
+        return apply(input, Sets.newHashSet());
+    }
+
+    private <K> Map<K, Object> apply(Map<K, ?> input, Set<Object> visited) {
         Map<K, Object> result = Maps.newLinkedHashMap();
         for (Map.Entry<K, ?> e : input.entrySet()) {
-            if (Entities.isSecret("" + e.getKey()))
+            if (predicate.apply(e.getKey())){
                 result.put(e.getKey(), "xxxxxxxx");
-            else if (e.getValue() instanceof Map) {
-                if (visited.contains(e.getValue())) {
-                    continue;
-                }
-                visited.add(e.getValue());
-                result.put(e.getKey(), sanitize((Map<?, ?>) e.getValue(), visited));
+                continue;
+            } 
+            
+            // need to compare object reference, not equality since we may miss some.
+            // not a perfect identifier, but very low probability of collision.
+            if (visited.contains(System.identityHashCode(e.getValue()))) {
+                result.put(e.getKey(), e.getValue());
+                continue;
+            }
+
+            visited.add(System.identityHashCode(e.getValue()));
+            if (e.getValue() instanceof Map) {
+                result.put(e.getKey(), apply((Map<?, ?>) e.getValue(), visited));
+            } else if (e.getValue() instanceof List) {
+                result.put(e.getKey(), applyList((List<?>) e.getValue(), visited));
+            } else if (e.getValue() instanceof Set) {
+                result.put(e.getKey(), applySet((Set<?>) e.getValue(), visited));
             } else {
                 result.put(e.getKey(), e.getValue());
             }
         }
         return result;
     }
+    
+    private List<Object> applyIterable(Iterable<?> input, Set<Object> visited){
+        List<Object> result = Lists.newArrayList();
+        for(Object o : input){
+            if(visited.contains(System.identityHashCode(o))){
+                result.add(o);
+                continue;
+            }
+
+            visited.add(System.identityHashCode(o));
+            if (o instanceof Map) {
+                result.add(apply((Map<?, ?>) o, visited));
+            } else if (o instanceof List) {
+                result.add(applyList((List<?>) o, visited));
+            } else if (o instanceof Set) {
+                result.add(applySet((Set<?>) o, visited));
+            } else {
+                result.add(o);
+            }
+
+        }
+        return result;
+    }
+    
+    private List<Object> applyList(List<?> input, Set<Object> visited) {
+       return applyIterable(input, visited);
+    }
+    
+    private Set<Object> applySet(Set<?> input, Set<Object> visited) {
+        Set<Object> result = Sets.newLinkedHashSet();
+        result.addAll(applyIterable(input, visited));
+        return result;
+    }
 }