This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit f11e7cecda357256b7966dba685df0def2e832fd
Author: Alex Heneveld <[email protected]>
AuthorDate: Thu Nov 12 13:49:57 2020 +0000

    allow just-in-time resolution for beans, like we do for spec types
---
 .../brooklyn/CustomTypeConfigYamlOsgiTest.java     |  5 ---
 .../camp/brooklyn/CustomTypeConfigYamlTest.java    | 42 ++++++++--------------
 .../core/typereg/BasicBrooklynTypeRegistry.java    | 26 ++++++++++++--
 3 files changed, 38 insertions(+), 35 deletions(-)

diff --git 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlOsgiTest.java
 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlOsgiTest.java
index b727377..c442315 100644
--- 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlOsgiTest.java
+++ 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlOsgiTest.java
@@ -55,9 +55,4 @@ public class CustomTypeConfigYamlOsgiTest extends 
CustomTypeConfigYamlTest {
         Asserts.assertEquals(b1n, 1);
     }
 
-    @Override // multiple type works in OSGi
-    @Test
-    public void TestRegisteredType_Inherited_OneStep_FailsInPojo() {
-        doTestRegisteredType_Inherited();
-    }
 }
diff --git 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlTest.java
 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlTest.java
index e99ffa8..1598f0b 100644
--- 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlTest.java
+++ 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/CustomTypeConfigYamlTest.java
@@ -323,33 +323,21 @@ public class CustomTypeConfigYamlTest extends 
AbstractYamlTest {
     }
 
     @Test
-    public void TestRegisteredType_Inherited_OneStep_FailsInPojo() {
-        Asserts.assertFailsWith(this::doTestRegisteredType_Inherited,
-                e -> {
-                    
Asserts.expectedFailureContainsIgnoreCase(Exceptions.collapseIncludingAllCausalMessages(e),
 "could not resolve", "custom-type-0");
-                    return true;
-                });
-    }
-
-    protected void doTestRegisteredType_Inherited() {
-        try {
-            addCatalogItems(
-                    "brooklyn.catalog:",
-                    "  version: " + TEST_VERSION,
-                    "  items:",
-                    "  - id: custom-type-0",
-                    "    item:",
-                    "      type: " + 
CustomTypeConfigYamlTest.TestingCustomType.class.getName(),
-                    "      x: foo2",
-                    "  - id: custom-type",
-                    "    item:",
-                    "      type: custom-type-0",
-                    "      y: bar");
-            lastDeployedEntity = deployWithTestingCustomTypeObjectConfig(true, 
true, false, "custom-type", CONF1_ANONYMOUS, false);
-            
assertLastDeployedKeysValueIsOurCustomTypeWithFieldValues(CONF1_ANONYMOUS, 
"foo2", "bar");
-        } catch (Exception e) {
-            throw Exceptions.propagate(e);
-        }
+    public void TestRegisteredType_InheritFromPeer_nowWorksInPojoAndOsgi() 
throws Exception {
+        addCatalogItems(
+                "brooklyn.catalog:",
+                "  version: " + TEST_VERSION,
+                "  items:",
+                "  - id: custom-type-0",
+                "    item:",
+                "      type: " + 
CustomTypeConfigYamlTest.TestingCustomType.class.getName(),
+                "      x: foo2",
+                "  - id: custom-type",
+                "    item:",
+                "      type: custom-type-0",
+                "      y: bar");
+        lastDeployedEntity = deployWithTestingCustomTypeObjectConfig(true, 
true, false, "custom-type", CONF1_ANONYMOUS, false);
+        
assertLastDeployedKeysValueIsOurCustomTypeWithFieldValues(CONF1_ANONYMOUS, 
"foo2", "bar");
     }
 
     @Test
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 7b93ff7..9160fc1 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
@@ -258,7 +258,7 @@ public class BasicBrooklynTypeRegistry implements 
BrooklynTypeRegistry {
             
         } else if (type.getKind()==RegisteredTypeKind.UNRESOLVED) {
             if (constraint != null && 
constraint.getAlreadyEncounteredTypes().contains(type.getSymbolicName())) {
-                throw new UnsupportedTypePlanException("Cannot create spec 
from type "+type+" (kind "+type.getKind()+"), recursive reference following 
"+constraint.getAlreadyEncounteredTypes());
+                throw new TypePlanException("Cannot create spec from type 
"+type+" (kind "+type.getKind()+"), recursive reference following 
"+constraint.getAlreadyEncounteredTypes());
                 
             } else {
                 // try just-in-time validation
@@ -354,8 +354,28 @@ public class BasicBrooklynTypeRegistry implements 
BrooklynTypeRegistry {
     public <T> T createBean(RegisteredType type, @Nullable 
RegisteredTypeLoadingContext constraint, @Nullable Class<T> 
optionalResultSuperType) {
         Preconditions.checkNotNull(type, "type");
         if (type.getKind()!=RegisteredTypeKind.BEAN) { 
-            if (type.getKind()==RegisteredTypeKind.UNRESOLVED) throw new 
ReferencedUnresolvedTypeException(type);
-            else throw new UnsupportedTypePlanException("Cannot create bean 
from type "+type+" (kind "+type.getKind()+")");
+            if (type.getKind()==RegisteredTypeKind.UNRESOLVED) {
+                // attempt to resolve
+                if (constraint != null && 
constraint.getAlreadyEncounteredTypes().contains(type.getSymbolicName())) {
+                    throw new TypePlanException("Cannot create bean from type 
"+type+" (kind "+type.getKind()+"), recursive reference following 
"+constraint.getAlreadyEncounteredTypes());
+
+                } else {
+                    // try just-in-time validation
+                    Collection<Throwable> validationErrors = 
mgmt.getCatalog().validateType(type, constraint, false);
+                    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) {
+                        // shouldn't come here
+                        throw new ReferencedUnresolvedTypeException(type);
+                    }
+                    // continue below to do transform
+                }
+
+            } else {
+                throw new UnsupportedTypePlanException("Cannot create bean 
from type "+type+" (kind "+type.getKind()+")");
+            }
         }
         if (constraint!=null) {
             if (constraint.getExpectedKind()!=null && 
constraint.getExpectedKind()!=RegisteredTypeKind.SPEC) {

Reply via email to