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 5b4e67064b96f26ebb32dc7d0c8bc42ca3519b11 Author: Alex Heneveld <alex.henev...@cloudsoftcorp.com> AuthorDate: Thu Oct 1 16:01:56 2020 +0100 fix remaining tests for OSGi ensure constraints passed including when resolving --- .../brooklyn/catalog/CatalogYamlEntityTest.java | 6 ++---- .../core/catalog/internal/BasicBrooklynCatalog.java | 21 ++++++++++++++++----- .../core/typereg/RegisteredTypeLoadingContexts.java | 11 ++++++++++- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java index 12edf35..6f52053 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java @@ -368,7 +368,6 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { public void testLaunchApplicationChildLoopCatalogIdFails() throws Exception { String referrerSymbolicName = "my.catalog.app.id.child.referring"; try { - // TODO only fails if using 'services', because that forces plan parsing; should fail in all cases addCatalogItems( "brooklyn.catalog:", " id: " + referrerSymbolicName, @@ -386,11 +385,10 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { } } - @Test(groups="WIP") - public void testLaunchApplicationChildLoopCatalogIdFailsWithNewSyntax() throws Exception { + @Test + public void testLaunchApplicationChildLoopCatalogIdFailsWithTypeSyntax() throws Exception { String referrerSymbolicName = "my.catalog.app.id.child.referring"; try { - // TODO previous test using 'services' fails nicely, but this doesn't; it throws an SO exception, doesn't see the cyclic dependency addCatalogItems( "brooklyn.catalog:", " id: " + referrerSymbolicName, diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java index ea8efab..d1d75c9 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java @@ -740,7 +740,8 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { } PlanInterpreterInferringType planInterpreter = new PlanInterpreterInferringType(id, item, sourceYaml, itemType, format, - (containingBundle instanceof CatalogBundle ? ((CatalogBundle)containingBundle) : null), libraryBundles, resultLegacyFormat).resolve(); + (containingBundle instanceof CatalogBundle ? ((CatalogBundle)containingBundle) : null), libraryBundles, + null, resultLegacyFormat).resolve(); Exception resolutionError = null; if (!planInterpreter.isResolved()) { // don't throw yet, we may be able to add it in an unresolved state @@ -1216,7 +1217,8 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { final CatalogBundle containingBundle; final Collection<CatalogBundle> libraryBundles; final List<CatalogItemDtoAbstract<?, ?>> itemsDefinedSoFar; - + RegisteredTypeLoadingContext constraint; + CatalogItemType catalogItemType; String planYaml; boolean resolved = false; @@ -1225,11 +1227,14 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { List<Exception> transformerErrors = MutableList.of(); public PlanInterpreterInferringType(@Nullable String itemId, Object itemDefinitionParsedToStringOrMap, String itemYaml, @Nullable CatalogItemType optionalCiType, @Nullable String format, - CatalogBundle containingBundle, Collection<CatalogBundle> libraryBundles, List<CatalogItemDtoAbstract<?,?>> itemsDefinedSoFar) { + CatalogBundle containingBundle, Collection<CatalogBundle> libraryBundles, + RegisteredTypeLoadingContext constraint, List<CatalogItemDtoAbstract<?,?>> itemsDefinedSoFar) { // ID is useful to prevent recursive references (possibly only supported for entities?) this.itemId = itemId; this.containingBundle = containingBundle; + this.constraint = constraint; + if (itemDefinitionParsedToStringOrMap instanceof String) { if (((String)itemDefinitionParsedToStringOrMap).trim().indexOf("\n")<0) { // if just a one-line string supplied, treat at type unless it parses as a map @@ -1345,8 +1350,14 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { } } + if (constraint==null) { + constraint = RegisteredTypeLoadingContexts.loaderAlreadyEncountered(loader, null, itemId); + } else { + constraint = RegisteredTypeLoadingContexts.withLoader(constraint, loader); + constraint = RegisteredTypeLoadingContexts.withEncounteredItem(constraint, itemId); + } + Object t = null; - RegisteredTypeLoadingContext constraint = RegisteredTypeLoadingContexts.loader(loader); if (catalogItemType == CatalogItemType.BEAN || suspicionOfABean) { try { t = mgmt.getTypeRegistry().createBeanFromPlan(format, itemYaml, constraint, null); @@ -1854,7 +1865,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { } String format = typeToValidate.getPlan().getPlanFormat(); PlanInterpreterInferringType guesser = new PlanInterpreterInferringType(typeToValidate.getSymbolicName(), Iterables.getOnlyElement( Yamls.parseAll(yaml) ), - yaml, itemType, format, bundle, CatalogItemDtoAbstract.parseLibraries( typeToValidate.getLibraries() ), null); + yaml, itemType, format, bundle, CatalogItemDtoAbstract.parseLibraries( typeToValidate.getLibraries() ), constraint, null); guesser.resolve(); guesserErrors.addAll(guesser.getErrors()); diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeLoadingContexts.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeLoadingContexts.java index 7eab626..b7a485d 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeLoadingContexts.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeLoadingContexts.java @@ -229,11 +229,20 @@ public class RegisteredTypeLoadingContexts { result.loader = loader; return result; } - + public static RegisteredTypeLoadingContext withLoader(RegisteredTypeLoadingContext constraint, BrooklynClassLoadingContext loader) { BasicRegisteredTypeLoadingContext result = new BasicRegisteredTypeLoadingContext(constraint); result.loader = loader; return result; } + public static RegisteredTypeLoadingContext withEncounteredItem(RegisteredTypeLoadingContext constraint, String itemId) { + if (constraint.getAlreadyEncounteredTypes().contains(itemId)) { + return constraint; + } + BasicRegisteredTypeLoadingContext result = new BasicRegisteredTypeLoadingContext(constraint); + result.encounteredTypes = ImmutableSet.<String>builder().addAll(constraint.getAlreadyEncounteredTypes()).add(itemId).build(); + return result; + } + }