Repository: brooklyn-server
Updated Branches:
  refs/heads/master f43e8380e -> 2683b89fe


fix bug tested in previous commit, where unresolved templates fail too fast 
when referenced


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

Branch: refs/heads/master
Commit: c4ccdd73d51c7aaeb6ff2410982fc749735341d2
Parents: d87bddc
Author: Alex Heneveld <[email protected]>
Authored: Wed Aug 16 09:11:28 2017 +0100
Committer: Alex Heneveld <[email protected]>
Committed: Wed Aug 16 09:12:09 2017 +0100

----------------------------------------------------------------------
 .../core/typereg/BasicBrooklynTypeRegistry.java   | 18 ++++++++++++++++--
 .../ReferencedUnresolvedTypeException.java        |  7 ++++++-
 2 files changed, 22 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c4ccdd73/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 60142a7..aae9297 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
@@ -18,6 +18,7 @@
  */
 package org.apache.brooklyn.core.typereg;
 
+import java.util.Collection;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
@@ -179,8 +180,21 @@ public class BasicBrooklynTypeRegistry implements 
BrooklynTypeRegistry {
     public <SpecT extends AbstractBrooklynObjectSpec<?,?>> SpecT 
createSpec(RegisteredType type, @Nullable RegisteredTypeLoadingContext 
constraint, Class<SpecT> specSuperType) {
         Preconditions.checkNotNull(type, "type");
         if (type.getKind()!=RegisteredTypeKind.SPEC) { 
-            if (type.getKind()==RegisteredTypeKind.UNRESOLVED) throw new 
ReferencedUnresolvedTypeException(type);
-            else throw new UnsupportedTypePlanException("Cannot create spec 
from type "+type+" (kind "+type.getKind()+")");
+            if (type.getKind()==RegisteredTypeKind.UNRESOLVED) {
+                // try just-in-time validation
+                Collection<Throwable> validationErrors = 
mgmt.getCatalog().validateType(type);
+                if (!validationErrors.isEmpty()) {
+                    throw new ReferencedUnresolvedTypeException(type, true, 
Exceptions.create(validationErrors));
+                }
+                type = mgmt.getTypeRegistry().get(type.getSymbolicName(), 
type.getVersion());
+                if (type==null || 
type.getKind()==RegisteredTypeKind.UNRESOLVED) {
+                    throw new ReferencedUnresolvedTypeException(type);
+                }
+                return createSpec(type, constraint, specSuperType);
+                
+            } else {
+                throw new UnsupportedTypePlanException("Cannot create spec 
from type "+type+" (kind "+type.getKind()+")");
+            }
         }
         return createSpec(type, type.getPlan(), type.getSymbolicName(), 
type.getVersion(), type.getSuperTypes(), constraint, specSuperType);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c4ccdd73/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java
 
b/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java
index c82ed9b..94da566 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java
@@ -34,7 +34,12 @@ public class ReferencedUnresolvedTypeException extends 
UnsupportedTypePlanExcept
     }
 
     public ReferencedUnresolvedTypeException(RegisteredType t) {
-        this("Reference to "+t.getVersionedName()+" in plan but that type 
cannot be resolved (recursive plan or premature evaluation?)");
+        this(t, false, null);
+    }
+    
+    public ReferencedUnresolvedTypeException(RegisteredType t, boolean 
attemptedAnyway, Throwable cause) {
+        this("Reference to known type "+t.getVersionedName()+" in plan but 
it's definition is unresolved (recursive plan or premature evaluation?)"
+            + (attemptedAnyway ? "; attempted to read definition again" : ""), 
cause);
     }
     
     public ReferencedUnresolvedTypeException(Throwable cause) {

Reply via email to