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 2015/12/21 13:10:58 UTC

[08/12] incubator-brooklyn git commit: resolve the curious Maybe.Present(null) making use of new Absent.isNull()

resolve the curious Maybe.Present(null) making use of new Absent.isNull()


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

Branch: refs/heads/master
Commit: 3900e19d6df17bf1f605508b62dbcea98b336467
Parents: 0b9b2e3
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Dec 17 13:59:48 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Dec 17 14:23:02 2015 +0000

----------------------------------------------------------------------
 .../core/catalog/internal/CatalogUtils.java     |  2 +-
 .../typereg/AbstractTypePlanTransformer.java    | 15 ++++-------
 .../core/typereg/BasicBrooklynTypeRegistry.java | 11 ++++----
 .../brooklyn/core/typereg/RegisteredTypes.java  | 27 +++++++++++---------
 .../BrooklynEntityDecorationResolver.java       |  3 ++-
 .../rest/resources/ApplicationResource.java     | 24 +++++++++++------
 .../rest/resources/CatalogResource.java         | 16 ++++++++----
 7 files changed, 55 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3900e19d/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
index fbf34f7..a1b2040 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
@@ -87,7 +87,7 @@ public class CatalogUtils {
         String catId = entity.getCatalogItemId();
         if (Strings.isBlank(catId)) return JavaBrooklynClassLoadingContext.create(mgmt);
         Maybe<RegisteredType> cat = RegisteredTypes.tryValidate(mgmt.getTypeRegistry().get(catId), RegisteredTypeLoadingContexts.spec(Entity.class));
-        if (cat.get()==null) {
+        if (cat.isNull()) {
             log.warn("Cannot load "+catId+" to get classloader for "+entity+"; will try with standard loader, but might fail subsequently");
             return JavaBrooklynClassLoadingContext.create(mgmt);
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3900e19d/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
index 7b91529..8f671f2 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
@@ -23,6 +23,7 @@ import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -98,7 +99,7 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
     @Override
     public Object create(final RegisteredType type, final RegisteredTypeLoadingContext context) {
         try {
-            return validate(new RegisteredTypeKindVisitor<Object>() {
+            return tryValidate(new RegisteredTypeKindVisitor<Object>() {
                 @Override protected Object visitSpec() {
                     try { 
                         AbstractBrooklynObjectSpec<?, ?> result = createSpec(type, context);
@@ -112,7 +113,7 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
                     } catch (Exception e) { throw Exceptions.propagate(e); }
                 }
                 
-            }.visit(type.getKind()), type, context);
+            }.visit(type.getKind()), type, context).get();
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
             if (!(e instanceof UnsupportedTypePlanException)) {
@@ -125,14 +126,8 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
     /** Validates the object. Subclasses may do further validation based on the context. 
      * @throw UnsupportedTypePlanException if we want to quietly abandon this, any other exception to report the problem, when validation fails
      * @return the created object for fluent usage */
-    protected <T> T validate(T createdObject, RegisteredType type, RegisteredTypeLoadingContext constraint) {
-        if (createdObject==null) return null;
-        try {
-            return RegisteredTypes.tryValidate(createdObject, type, constraint).get();
-        } catch (Exception e) {
-            Exceptions.propagateIfFatal(e);
-            throw new IllegalStateException("Created incompatible object: "+Exceptions.collapseText(e), e);
-        }
+    protected <T> Maybe<T> tryValidate(T createdObject, RegisteredType type, RegisteredTypeLoadingContext constraint) {
+        return RegisteredTypes.tryValidate(createdObject, type, constraint);
     }
 
     protected abstract AbstractBrooklynObjectSpec<?,?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3900e19d/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
index 496c028..1b47648 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
@@ -71,10 +71,10 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry {
         return Iterables.filter(localRegisteredTypes.values(), filter);
     }
 
-    private RegisteredType getExactWithoutLegacyCatalog(String symbolicName, String version, RegisteredTypeLoadingContext constraint) {
+    private Maybe<RegisteredType> getExactWithoutLegacyCatalog(String symbolicName, String version, RegisteredTypeLoadingContext constraint) {
         // TODO look in any nested/private registries
         RegisteredType item = localRegisteredTypes.get(symbolicName+":"+version);
-        return RegisteredTypes.tryValidate(item, constraint).orNull();
+        return RegisteredTypes.tryValidate(item, constraint);
     }
 
     @SuppressWarnings("deprecation")
@@ -93,12 +93,11 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry {
         String version = versionFinal;
         if (version==null) version = BrooklynCatalog.DEFAULT_VERSION;
 
-        RegisteredType type;
         if (!BrooklynCatalog.DEFAULT_VERSION.equals(version)) {
             // normal code path when version is supplied
             
-            type = getExactWithoutLegacyCatalog(symbolicNameOrAliasIfNoVersion, version, context);
-            if (type!=null) return Maybe.of(type);
+            Maybe<RegisteredType> type = getExactWithoutLegacyCatalog(symbolicNameOrAliasIfNoVersion, version, context);
+            if (type.isPresent()) return type;
         }
 
         if (BrooklynCatalog.DEFAULT_VERSION.equals(version)) {
@@ -123,7 +122,7 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry {
                 }
             }
             if (!Iterables.isEmpty(types)) {
-                type = RegisteredTypes.getBestVersion(types);
+                RegisteredType type = RegisteredTypes.getBestVersion(types);
                 if (type!=null) return Maybe.of(type);
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3900e19d/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
index 2f792f0..0c7b09b 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
@@ -24,7 +24,6 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
-import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
@@ -42,6 +41,7 @@ import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
 import org.apache.brooklyn.core.typereg.JavaClassNameTypePlanTransformer.JavaClassNameTypeImplementationPlan;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
+import org.apache.brooklyn.util.guava.Maybe.Absent;
 import org.apache.brooklyn.util.text.NaturalOrderComparator;
 import org.apache.brooklyn.util.text.VersionComparator;
 import org.apache.brooklyn.util.yaml.Yamls;
@@ -284,13 +284,15 @@ public class RegisteredTypes {
     }
 
     /** Validates that the given type matches the context (if supplied);
-     * returns a Maybe(null) if the type is null. */
+     * if not satisfied. returns an {@link Absent} if failed with details of the error,
+     * with {@link Absent#isNull()} true if the object is null. */
     public static Maybe<RegisteredType> tryValidate(RegisteredType item, final RegisteredTypeLoadingContext constraint) {
         // kept as a Maybe in case someone wants a wrapper around item validity;
         // unclear what the contract should be, as this can return Maybe.Present(null)
         // which is suprising, but it is more natural to callers otherwise they'll likely do a separate null check on the item
         // (often handling null different to errors) so the Maybe.get() is redundant as they have an object for the input anyway.
-        if (item==null || constraint==null) return Maybe.of(item);
+        
+        if (item==null || constraint==null) return Maybe.ofDisallowingNull(item);
         if (constraint.getExpectedKind()!=null && !constraint.getExpectedKind().equals(item.getKind()))
             return Maybe.absent(item+" is not the expected kind "+constraint.getExpectedKind());
         if (constraint.getExpectedJavaSuperType()!=null) {
@@ -336,9 +338,10 @@ public class RegisteredTypes {
 
     /** validates that the given object (required) satisfies the constraints implied by the given
      * type and context object, using {@link Maybe} as the result set absent containing the error(s)
-     * if not satisfied */
-    public static <T> Maybe<T> tryValidate(@Nonnull final T object, @Nullable final RegisteredType type, @Nullable final RegisteredTypeLoadingContext context) {
-        if (object==null) return Maybe.absent("object is null");
+     * if not satisfied. returns an {@link Absent} if failed with details of the error,
+     * with {@link Absent#isNull()} true if the object is null. */
+    public static <T> Maybe<T> tryValidate(final T object, @Nullable final RegisteredType type, @Nullable final RegisteredTypeLoadingContext context) {
+        if (object==null) return Maybe.absentNull("object is null");
         
         RegisteredTypeKind kind = type!=null ? type.getKind() : context!=null ? context.getExpectedKind() : null;
         if (kind==null) {
@@ -348,18 +351,18 @@ public class RegisteredTypes {
         return new RegisteredTypeKindVisitor<Maybe<T>>() {
             @Override
             protected Maybe<T> visitSpec() {
-                return validateSpec(object, type, context);
+                return tryValidateSpec(object, type, context);
             }
 
             @Override
             protected Maybe<T> visitBean() {
-                return validateBean(object, type, context);
+                return tryValidateBean(object, type, context);
             }
         }.visit(kind);
     }
 
-    private static <T> Maybe<T> validateBean(T object, RegisteredType type, final RegisteredTypeLoadingContext context) {
-        if (object==null) return Maybe.absent("object is null");
+    private static <T> Maybe<T> tryValidateBean(T object, RegisteredType type, final RegisteredTypeLoadingContext context) {
+        if (object==null) return Maybe.absentNull("object is null");
         
         if (type!=null) {
             if (type.getKind()!=RegisteredTypeKind.BEAN)
@@ -378,8 +381,8 @@ public class RegisteredTypes {
         return Maybe.of(object);
     }
 
-    private static <T> Maybe<T> validateSpec(T object, RegisteredType rType, final RegisteredTypeLoadingContext constraint) {
-        if (object==null) return Maybe.absent("object is null");
+    private static <T> Maybe<T> tryValidateSpec(T object, RegisteredType rType, final RegisteredTypeLoadingContext constraint) {
+        if (object==null) return Maybe.absentNull("object is null");
         
         if (!(object instanceof AbstractBrooklynObjectSpec)) {
             Maybe.absent("Found "+object+" when expecting a spec");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3900e19d/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
index e4f500d..6734875 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
@@ -118,7 +118,8 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
             
             Maybe<RegisteredType> item = RegisteredTypes.tryValidate(mgmt.getTypeRegistry().get(policyType), RegisteredTypeLoadingContexts.spec(Policy.class));
             PolicySpec<?> spec;
-            if (item.get()!=null) {
+            if (!item.isNull()) {
+                // throw error if absent for any reason other than null
                 spec = mgmt.getTypeRegistry().createSpec(item.get(), null, PolicySpec.class);
             } else {
                 Class<? extends Policy> type = decoLoader.getType(Policy.class);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3900e19d/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
index 83c6423..22a4502 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
@@ -45,6 +45,7 @@ import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Sensor;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.config.ConstraintViolationException;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.EntityPredicates;
@@ -75,6 +76,7 @@ import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.exceptions.UserFacingException;
+import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.text.Strings;
 import org.codehaus.jackson.JsonNode;
@@ -402,15 +404,21 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
     }
 
     private void checkSpecTypeIsValid(String type, Class<? extends BrooklynObject> subType) {
-        if (RegisteredTypes.tryValidate(mgmt().getTypeRegistry().get(type), RegisteredTypeLoadingContexts.spec(subType)) == null) {
-            try {
-                brooklyn().getCatalogClassLoader().loadClass(type);
-            } catch (ClassNotFoundException e) {
-                log.debug("Class not found for type '" + type + "'; reporting 404", e);
-                throw WebResourceUtils.notFound("Undefined type '%s'", type);
-            }
-            log.info(JavaClassNames.simpleClassName(subType)+" type '{}' not defined in catalog but is on classpath; continuing", type);
+        Maybe<RegisteredType> typeV = RegisteredTypes.tryValidate(mgmt().getTypeRegistry().get(type), RegisteredTypeLoadingContexts.spec(subType));
+        if (!typeV.isNull()) {
+            // found, throw if any problem
+            typeV.get();
+            return;
+        }
+        
+        // not found, try classloading
+        try {
+            brooklyn().getCatalogClassLoader().loadClass(type);
+        } catch (ClassNotFoundException e) {
+            log.debug("Class not found for type '" + type + "'; reporting 404", e);
+            throw WebResourceUtils.notFound("Undefined type '%s'", type);
         }
+        log.info(JavaClassNames.simpleClassName(subType)+" type '{}' not defined in catalog but is on classpath; continuing", type);
     }
     
     private void checkEntityTypeIsValid(String type) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/3900e19d/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
index 0993f16..01bf992 100644
--- a/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
+++ b/usage/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java
@@ -65,6 +65,7 @@ import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.StringPredicates;
 import org.apache.brooklyn.util.text.Strings;
@@ -149,15 +150,20 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat
                 Entitlements.getEntitlementContext().user());
         }
         try {
-            RegisteredType item = mgmt().getTypeRegistry().get(entityId);
-            if (item==null) {
+            Maybe<RegisteredType> item = RegisteredTypes.tryValidate(mgmt().getTypeRegistry().get(entityId), RegisteredTypeLoadingContexts.spec(Entity.class));
+            if (item.isNull()) {
                 throw WebResourceUtils.notFound("Entity with id '%s' not found", entityId);
             }
-            RegisteredTypes.tryValidate(item, RegisteredTypeLoadingContexts.spec(Entity.class));
+            if (item.isAbsent()) {
+                throw WebResourceUtils.notFound("Item with id '%s' is not an entity", entityId);
+            }
+            
+            brooklyn().getCatalog().deleteCatalogItem(item.get().getSymbolicName(), item.get().getVersion());
             
-            brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion());
         } catch (NoSuchElementException e) {
-            throw WebResourceUtils.notFound("Entity with id '%s' not found", entityId);
+            // shouldn't come here
+            throw WebResourceUtils.notFound("Entity with id '%s' could not be deleted", entityId);
+            
         }
     }