Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 1d5480687 -> e761f428f


Entitlements improvements

- Adds toString in various places.
- Entitlements.allOf/anyOf takes Utterable<EntitlementManager>, as well
  as the overloaded varargs version.
- Clean up reflectively instantiating global EntitlementManager.
  - Use catalog-class-loader
  - Allow various constructors, for optionally having ManagementContext
    and/or BrooklynProperties
- On “reload brooklyn properties”, recreate EntitlementManager in case
  entitlements have changed.

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

Branch: refs/heads/master
Commit: bcd6baaec698e536022e5c79b8a1c29e2ab71b5a
Parents: 05b95f3
Author: Aled Sage <[email protected]>
Authored: Wed Jul 29 15:40:35 2015 +0100
Committer: Aled Sage <[email protected]>
Committed: Wed Jul 29 15:40:35 2015 +0100

----------------------------------------------------------------------
 .../BasicEntitlementClassDefinition.java        |  5 ++
 .../management/entitlement/Entitlements.java    | 76 ++++++++++++++++----
 .../internal/LocalManagementContext.java        |  4 +-
 .../entitlement/AcmeEntitlementManager.java     |  2 +-
 .../AcmeEntitlementManagerTestFixture.java      |  6 +-
 5 files changed, 75 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bcd6baae/core/src/main/java/brooklyn/management/entitlement/BasicEntitlementClassDefinition.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/management/entitlement/BasicEntitlementClassDefinition.java
 
b/core/src/main/java/brooklyn/management/entitlement/BasicEntitlementClassDefinition.java
index cbe8892..8f95ee0 100644
--- 
a/core/src/main/java/brooklyn/management/entitlement/BasicEntitlementClassDefinition.java
+++ 
b/core/src/main/java/brooklyn/management/entitlement/BasicEntitlementClassDefinition.java
@@ -18,6 +18,7 @@
  */
 package brooklyn.management.entitlement;
 
+import com.google.common.base.Objects;
 import com.google.common.reflect.TypeToken;
 
 
@@ -46,4 +47,8 @@ public class BasicEntitlementClassDefinition<T> implements 
EntitlementClass<T> {
         return argumentType;
     }
 
+    @Override
+    public String toString() {
+        return Objects.toStringHelper(this).add("identitifier", 
identifier).add("argumentType", argumentType).toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bcd6baae/core/src/main/java/brooklyn/management/entitlement/Entitlements.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/management/entitlement/Entitlements.java 
b/core/src/main/java/brooklyn/management/entitlement/Entitlements.java
index 76cf060..16b3924 100644
--- a/core/src/main/java/brooklyn/management/entitlement/Entitlements.java
+++ b/core/src/main/java/brooklyn/management/entitlement/Entitlements.java
@@ -18,11 +18,23 @@
  */
 package brooklyn.management.entitlement;
 
+import java.util.Arrays;
+import java.util.List;
+
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.Beta;
+import com.google.common.base.Joiner;
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.common.reflect.TypeToken;
+
 import brooklyn.config.BrooklynProperties;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Entity;
@@ -37,13 +49,6 @@ import brooklyn.util.javalang.Reflections;
 import brooklyn.util.task.Tasks;
 import brooklyn.util.text.Strings;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.reflect.TypeToken;
-
 /** @since 0.7.0 */
 @Beta
 public class Entitlements {
@@ -173,6 +178,10 @@ public class Entitlements {
             public <T> boolean isEntitled(EntitlementContext context, 
EntitlementClass<T> permission, T typeArgument) {
                 return true;
             }
+            @Override
+            public String toString() {
+                return "Entitlements.root";
+            }
         };
     }
 
@@ -183,12 +192,22 @@ public class Entitlements {
             public <T> boolean isEntitled(EntitlementContext context, 
EntitlementClass<T> permission, T typeArgument) {
                 return false;
             }
+            @Override
+            public String toString() {
+                return "Entitlements.minimal";
+            }
         };
     }
 
     public static class FineGrainedEntitlements {
     
+        private static final Joiner COMMA_JOINER = Joiner.on(',');
+
         public static EntitlementManager anyOf(final EntitlementManager... 
checkers) {
+            return anyOf(Arrays.asList(checkers));
+        }
+        
+        public static EntitlementManager anyOf(final Iterable<? extends 
EntitlementManager> checkers) {
             return new EntitlementManager() {
                 @Override
                 public <T> boolean isEntitled(EntitlementContext context, 
EntitlementClass<T> permission, T typeArgument) {
@@ -197,10 +216,18 @@ public class Entitlements {
                             return true;
                     return false;
                 }
+                @Override
+                public String toString() {
+                    return "Entitlements.anyOf(" + COMMA_JOINER.join(checkers) 
+ ")";
+                }
             };
         }
         
         public static EntitlementManager allOf(final EntitlementManager... 
checkers) {
+            return allOf(Arrays.asList(checkers));
+        }
+        
+        public static EntitlementManager allOf(final Iterable<? extends 
EntitlementManager> checkers) {
             return new EntitlementManager() {
                 @Override
                 public <T> boolean isEntitled(EntitlementContext context, 
EntitlementClass<T> permission, T typeArgument) {
@@ -209,6 +236,10 @@ public class Entitlements {
                             return true;
                     return false;
                 }
+                @Override
+                public String toString() {
+                    return "Entitlements.allOf(" + COMMA_JOINER.join(checkers) 
+ ")";
+                }
             };
         }
 
@@ -235,7 +266,10 @@ public class Entitlements {
                 if (!Objects.equal(this.permission, permission)) return false;
                 return test.apply((U)typeArgument);
             }
-            
+            @Override
+            public String toString() {
+                return "Entitlements.allowing(" + permission + " -> " + test + 
")";
+            }
         }
         public static EntitlementManager seeNonSecretSensors() {
             return allowing(SEE_SENSOR, new Predicate<EntityAndItem<String>>() 
{
@@ -244,6 +278,10 @@ public class Entitlements {
                     if (input == null) return false;
                     return !Entities.isSecret(input.getItem());
                 }
+                @Override
+                public String toString() {
+                    return "Predicates.nonSecret";
+                }
             });
         }
         
@@ -348,12 +386,14 @@ public class Entitlements {
         if ("minimal".equalsIgnoreCase(type)) return minimal();
         if (Strings.isNonBlank(type)) {
             try {
-                ClassLoader cl = mgmt==null ? null : 
((ManagementContextInternal)mgmt).getBaseClassLoader();
+                ClassLoader cl = mgmt==null ? null : 
((ManagementContextInternal)mgmt).getCatalogClassLoader();
                 if (cl==null) cl = Entitlements.class.getClassLoader();
                 Class<?> clazz = cl.loadClass(type);
-                Optional<?> result = 
Reflections.invokeConstructorWithArgs(clazz, brooklynProperties);
-                if (result.isPresent()) return (EntitlementManager) 
result.get();
-                return (EntitlementManager) clazz.newInstance();
+                return (EntitlementManager) instantiate(clazz, 
ImmutableList.of(
+                        new Object[] {mgmt, brooklynProperties},
+                        new Object[] {mgmt},
+                        new Object[] {brooklynProperties},
+                        new Object[0]));
             } catch (Exception e) { 
                 throw Exceptions.propagate(e); 
             }
@@ -361,5 +401,15 @@ public class Entitlements {
         throw new IllegalStateException("Invalid entitlement manager 
specified: '"+type+"'");
     }
     
-
+    private static Object instantiate(Class<?> clazz, List<Object[]> 
constructorArgOptions) {
+        try {
+            for (Object[] constructorArgOption : constructorArgOptions) {
+                Optional<?> result = 
Reflections.invokeConstructorWithArgs(clazz, constructorArgOption);
+                if (result.isPresent()) return result.get();
+            }
+        } catch (Exception e) { 
+            throw Exceptions.propagate(e); 
+        }
+        throw new IllegalStateException("No matching constructor to 
instantiate "+clazz);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bcd6baae/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java 
b/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
index 39e4dc5..d0750f4 100644
--- 
a/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
+++ 
b/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
@@ -54,6 +54,7 @@ import brooklyn.management.ManagementContext;
 import brooklyn.management.SubscriptionManager;
 import brooklyn.management.Task;
 import brooklyn.management.TaskAdaptable;
+import brooklyn.management.entitlement.Entitlements;
 import brooklyn.management.ha.OsgiManager;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.guava.Maybe;
@@ -386,7 +387,8 @@ public class LocalManagementContext extends 
AbstractManagementContext {
             configMap.addFromMap(brooklynAdditionalProperties);
         }
         this.downloadsManager = BasicDownloadsManager.newDefault(configMap);
-
+        this.entitlementManager = Entitlements.newManager(this, configMap);
+        
         clearLocationRegistry();
         
         BrooklynFeatureEnablement.init(configMap);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bcd6baae/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManager.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManager.java
 
b/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManager.java
index 9cc02dd..c7e5405 100644
--- 
a/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManager.java
+++ 
b/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManager.java
@@ -18,7 +18,7 @@
  */
 package brooklyn.management.entitlement;
 
-class AcmeEntitlementManager extends PerUserEntitlementManager {
+public class AcmeEntitlementManager extends PerUserEntitlementManager {
 
     public AcmeEntitlementManager() {
         // default mode (if no user specified) is root

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bcd6baae/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManagerTestFixture.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManagerTestFixture.java
 
b/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManagerTestFixture.java
index a0fd135..a8f0261 100644
--- 
a/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManagerTestFixture.java
+++ 
b/core/src/test/java/brooklyn/management/entitlement/AcmeEntitlementManagerTestFixture.java
@@ -47,9 +47,9 @@ import brooklyn.util.exceptions.Exceptions;
 
 public abstract class AcmeEntitlementManagerTestFixture {
 
-    ManagementContext mgmt;
-    Application app;
-    ConfigBag configBag;
+    protected ManagementContext mgmt;
+    protected Application app;
+    protected ConfigBag configBag;
     
     public void setup(ConfigBag cfg) {
         mgmt = new 
LocalManagementContextForTests(BrooklynProperties.Factory.newEmpty().addFrom(cfg));

Reply via email to