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) {
