misc fixes related to type-reg / osgi, making the tests work some failing tests still: * still need to address TEMPLATEs in OSGi * deprecation / catalog.xml persistence
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/02cfe50a Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/02cfe50a Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/02cfe50a Branch: refs/heads/master Commit: 02cfe50a2075f0049e4d6c8b526bed1ca5bef4e4 Parents: bf31100 Author: Alex Heneveld <[email protected]> Authored: Fri Jun 30 02:59:39 2017 +0100 Committer: Alex Heneveld <[email protected]> Committed: Fri Jun 30 14:08:25 2017 +0100 ---------------------------------------------------------------------- .../camp/brooklyn/AbstractYamlTest.java | 39 +++++++++++- .../camp/brooklyn/ReferencedOsgiYamlTest.java | 9 +-- .../camp/brooklyn/ReferencedYamlOsgiTest.java | 54 ++++++++++++++++ .../camp/brooklyn/ReferencedYamlTest.java | 10 +-- .../catalog/CatalogOsgiLibraryTest.java | 26 +++++--- .../CatalogYamlEntityOsgiTypeRegistryTest.java | 46 +++----------- .../brooklyn/catalog/CatalogYamlEntityTest.java | 1 + .../core/BrooklynFeatureEnablement.java | 3 +- .../catalog/internal/BasicBrooklynCatalog.java | 27 +++++--- .../catalog/internal/CatalogBundleLoader.java | 7 ++- .../core/catalog/internal/CatalogUtils.java | 65 +++++++++++++++----- .../core/typereg/BasicBrooklynTypeRegistry.java | 3 +- .../brooklyn/core/typereg/RegisteredTypes.java | 12 ++++ .../brooklyn/util/core/ClassLoaderUtils.java | 40 ++++++++---- .../brooklyn/util/core/LoaderDispatcher.java | 3 +- .../util/text/BrooklynVersionSyntax.java | 7 +++ .../brooklyn/util/text/VersionComparator.java | 6 +- 17 files changed, 257 insertions(+), 101 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java index 00b9d4e..0300fc0 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java @@ -18,9 +18,14 @@ */ package org.apache.brooklyn.camp.brooklyn; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.Reader; +import java.util.Collection; import java.util.Map; import java.util.Set; +import java.util.zip.ZipEntry; import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.entity.Application; @@ -30,19 +35,28 @@ import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.mgmt.Task; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.camp.brooklyn.spi.creation.CampTypePlanTransformer; +import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.trait.Startable; import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; import org.apache.brooklyn.core.mgmt.EntityManagementUtils; +import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; +import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests.Builder; +import org.apache.brooklyn.core.typereg.BasicBrooklynTypeRegistry; +import org.apache.brooklyn.core.typereg.BasicManagedBundle; import org.apache.brooklyn.core.typereg.RegisteredTypeLoadingContexts; import org.apache.brooklyn.core.typereg.RegisteredTypePredicates; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.core.ResourceUtils; +import org.apache.brooklyn.util.core.osgi.BundleMaker; +import org.apache.brooklyn.util.exceptions.Exceptions; +import org.apache.brooklyn.util.exceptions.ReferenceWithError; import org.apache.brooklyn.util.net.Urls; +import org.apache.brooklyn.util.osgi.VersionedName; import org.apache.brooklyn.util.stream.Streams; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -218,8 +232,31 @@ public abstract class AbstractYamlTest { mgmt().getCatalog().addItems(catalogYaml, forceUpdate); } + public static void addCatalogItemsAsOsgi(ManagementContext mgmt, String catalogYaml, VersionedName bundleName, boolean force) { + try { + BundleMaker bundleMaker = new BundleMaker(mgmt); + File bf = bundleMaker.createTempZip("test", MutableMap.of( + new ZipEntry(BasicBrooklynCatalog.CATALOG_BOM), new ByteArrayInputStream(catalogYaml.getBytes()))); + ReferenceWithError<OsgiBundleInstallationResult> b = ((ManagementContextInternal)mgmt).getOsgiManager().get().installDeferredStart( + new BasicManagedBundle(bundleName.getSymbolicName(), bundleName.getVersionString(), null), + new FileInputStream(bf), + false); + // bundle not started (no need), and BOM not installed nor validated above; + // do BOM install and validation below manually to test the type registry approach + mgmt.getCatalog().addTypesFromBundleBom(catalogYaml, b.get().getMetadata(), force); + Map<RegisteredType, Collection<Throwable>> validation = mgmt.getCatalog().validateTypes( + mgmt.getTypeRegistry().getMatching(RegisteredTypePredicates.containingBundle(b.get().getVersionedName())) ); + if (!validation.isEmpty()) { + throw Exceptions.propagate("Brooklyn failed to load types: "+validation.keySet(), + Iterables.concat(validation.values())); + } + } catch (Exception e) { + throw Exceptions.propagate(e); + } + } + protected void deleteCatalogEntity(String catalogItem) { - mgmt().getCatalog().deleteCatalogItem(catalogItem, TEST_VERSION); + ((BasicBrooklynTypeRegistry) mgmt().getTypeRegistry()).delete(new VersionedName(catalogItem, TEST_VERSION)); } protected Logger getLogger() { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedOsgiYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedOsgiYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedOsgiYamlTest.java index 4fc647d..640e1c1 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedOsgiYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedOsgiYamlTest.java @@ -22,6 +22,7 @@ import java.util.Collection; import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.entity.Entity; +import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry; import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest; import org.apache.brooklyn.entity.stock.BasicEntity; import org.apache.brooklyn.test.support.TestResourceUnavailableException; @@ -193,10 +194,10 @@ public class ReferencedOsgiYamlTest extends AbstractYamlTest { " item:", " type: " + OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_SIMPLE_ENTITY); - BrooklynCatalog catalog = mgmt().getCatalog(); - Assert.assertNotNull(catalog.getCatalogItem("yaml.nested.catalog.nested", BrooklynCatalog.DEFAULT_VERSION)); - Assert.assertNotNull(catalog.getCatalogItem("yaml.nested.catalog.simple", BrooklynCatalog.DEFAULT_VERSION)); - Assert.assertNotNull(catalog.getCatalogItem("yaml.nested.catalog.more", BrooklynCatalog.DEFAULT_VERSION)); + BrooklynTypeRegistry catalog = mgmt().getTypeRegistry(); + Assert.assertNotNull(catalog.get("yaml.nested.catalog.nested", BrooklynCatalog.DEFAULT_VERSION)); + Assert.assertNotNull(catalog.get("yaml.nested.catalog.simple", BrooklynCatalog.DEFAULT_VERSION)); + Assert.assertNotNull(catalog.get("yaml.nested.catalog.more", BrooklynCatalog.DEFAULT_VERSION)); } protected void assertCatalogReference() throws Exception { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlOsgiTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlOsgiTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlOsgiTest.java new file mode 100644 index 0000000..e46a34f --- /dev/null +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlOsgiTest.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.brooklyn.camp.brooklyn; + +import org.apache.brooklyn.util.osgi.VersionedName; +import org.testng.annotations.Test; + +/** like superclass, but with OSGi enabled, complex references now work */ +public class ReferencedYamlOsgiTest extends ReferencedYamlTest { + + @Override + protected boolean disableOsgi() { + return false; + } + + @Override + protected void addCatalogItems(String catalogYaml) { + addCatalogItemsAsOsgi(mgmt(), catalogYaml, VersionedName.fromString("sample-bundle:0-SNAPSHOT"), isForceUpdate()); + } + + // these are not broken with OSGi + + @Test + public void testYamlReferencingEarlierItemLongFormEntity() throws Exception { + super.testYamlReferencingEarlierItemLongFormEntity(); + } + + @Test + public void testYamlReferencingEarlierItemInUrl() throws Exception { + super.testYamlReferencingEarlierItemInUrl(); + } + + @Test + public void testYamlReferencingEarlierItemInUrlAsType() throws Exception { + super.testYamlReferencingEarlierItemInUrlAsType(); + } + +} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlTest.java index e22a935..2626106 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencedYamlTest.java @@ -169,7 +169,7 @@ public class ReferencedYamlTest extends AbstractYamlTest { checkChildEntitySpec(app, entityName); } - @Test // long form discouraged but references should now still work + @Test(groups="Broken") // long form discouraged but references should still work (but only in OSGi subclass) public void testYamlReferencingEarlierItemLongFormEntity() throws Exception { addCatalogItems( "brooklyn.catalog:", @@ -222,7 +222,7 @@ public class ReferencedYamlTest extends AbstractYamlTest { checkChildEntitySpec(app, entityName); } - @Test // references to co-bundled items work even in nested url yaml + @Test(groups="Broken") // references to co-bundled items work even in nested url yaml (but only in OSGi subclass) public void testYamlReferencingEarlierItemInUrl() throws Exception { addCatalogItems( "brooklyn.catalog:", @@ -231,7 +231,7 @@ public class ReferencedYamlTest extends AbstractYamlTest { " - id: yaml.basic", " version: " + TEST_VERSION, " item:", - " type: org.apache.brooklyn.entity.stock.BasicApplication", + " type: org.apache.brooklyn.entity.stock.BasicEntity", " - id: yaml.reference", " version: " + TEST_VERSION, " item: classpath://yaml-ref-catalog.yaml"); // this references yaml.basic above @@ -245,7 +245,7 @@ public class ReferencedYamlTest extends AbstractYamlTest { checkChildEntitySpec(app, entityName); } - @Test // reference to co-bundled items work also in nested url yaml as a type + @Test(groups="Broken") // reference to co-bundled items work also in nested url yaml as a type (but only in OSGi subclass) public void testYamlReferencingEarlierItemInUrlAsType() throws Exception { addCatalogItems( "brooklyn.catalog:", @@ -254,7 +254,7 @@ public class ReferencedYamlTest extends AbstractYamlTest { " - id: yaml.basic", " version: " + TEST_VERSION, " item:", - " type: org.apache.brooklyn.entity.stock.BasicApplication", + " type: org.apache.brooklyn.entity.stock.BasicEntity", " - id: yaml.reference", " version: " + TEST_VERSION, " item:", http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiLibraryTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiLibraryTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiLibraryTest.java index 87a459e..bd07075 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiLibraryTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiLibraryTest.java @@ -268,6 +268,15 @@ public class CatalogOsgiLibraryTest extends AbstractYamlTest { Assert.fail("Expected to find 'messages.txt'"); } } + + protected void assertCannotFindMessages(Entity entity) { + ResourceUtils ru = ResourceUtils.create(entity); + Iterable<URL> files = ru.getResources("org/apache/brooklyn/test/osgi/resources/message.txt"); + if (files.iterator().hasNext()) { + Entities.dumpInfo(entity); + Assert.fail("Expected NOT to find 'messages.txt'"); + } + } @Test public void testLibraryIsUsedByChildInCatalogItem() throws Exception { @@ -295,16 +304,19 @@ public class CatalogOsgiLibraryTest extends AbstractYamlTest { // the spec has no catalog item ID except at the root Application Entity app = createAndStartApplication("services: [ { type: item-from-library } ]"); - Entity entity = app.getChildren().iterator().next(); - entity = entity.getChildren().iterator().next(); - Entities.dumpInfo(entity); + Entity entity1 = app.getChildren().iterator().next(); + + Entities.dumpInfo(app); - // TODO re-enable when we've converted to a search path; + Assert.assertEquals(entity1.getCatalogItemId(), "item-from-library:1.0"); + assertCanFindMessages( entity1 ); + + // TODO enable when we've converted to a search path; // currently this test method passes because of CatalogUtils.setCatalogItemIdOnAddition // but we don't want to be doing that, we only want the search path - //Assert.assertNull(entity.getCatalogItemId(), "Entity had a catalog item ID, even though it was stockj"); - - assertCanFindMessages( entity ); + //Entity entity2 = entity1.getChildren().iterator().next(); + //Assert.assertNull(entity2.getCatalogItemId(), "Entity had a catalog item ID, even though it was stockj"); + //assertCannotFindMessages( entity2 ); } @Test http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java index cde5159..ac11898 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java @@ -18,25 +18,11 @@ */ package org.apache.brooklyn.camp.brooklyn.catalog; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.util.Collection; -import java.util.Map; -import java.util.zip.ZipEntry; - import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; -import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult; -import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; -import org.apache.brooklyn.core.typereg.BasicManagedBundle; import org.apache.brooklyn.core.typereg.RegisteredTypePredicates; import org.apache.brooklyn.entity.stock.BasicEntity; import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.osgi.BundleMaker; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.exceptions.ReferenceWithError; import org.apache.brooklyn.util.osgi.VersionedName; import org.testng.annotations.Test; @@ -52,29 +38,7 @@ public class CatalogYamlEntityOsgiTypeRegistryTest extends CatalogYamlEntityTest // use type registry appraoch @Override protected void addCatalogItems(String catalogYaml) { - try { - BundleMaker bundleMaker = new BundleMaker(mgmt()); - File bf = bundleMaker.createTempZip("test", MutableMap.of( - new ZipEntry(BasicBrooklynCatalog.CATALOG_BOM), new ByteArrayInputStream(catalogYaml.getBytes()))); - ReferenceWithError<OsgiBundleInstallationResult> b = ((ManagementContextInternal)mgmt()).getOsgiManager().get().installDeferredStart( - new BasicManagedBundle(bundleName(), bundleVersion(), null), - new FileInputStream(bf), - false); - // bundle not started (no need), and BOM not installed nor validated above; - // do BOM install and validation below manually to test the type registry approach - mgmt().getCatalog().addTypesFromBundleBom(catalogYaml, b.get().getMetadata(), isForceUpdate()); - Map<RegisteredType, Collection<Throwable>> validation = mgmt().getCatalog().validateTypes( mgmt().getTypeRegistry().getMatching(RegisteredTypePredicates.containingBundle(b.get().getVersionedName())) ); - if (!validation.isEmpty()) { - throw Exceptions.propagate("Brooklyn failed to load types: "+validation.keySet(), - Iterables.concat(validation.values())); - } - } catch (Exception e) { - throw Exceptions.propagate(e); - } - } - - protected void deleteCatalogEntity(String catalogItem) { - mgmt().getCatalog().deleteCatalogItem(catalogItem, TEST_VERSION); + addCatalogItemsAsOsgi(mgmt(), catalogYaml, new VersionedName(bundleName(), bundleVersion()), isForceUpdate()); } protected String bundleName() { return "sample-bundle"; } @@ -91,6 +55,12 @@ public class CatalogYamlEntityOsgiTypeRegistryTest extends CatalogYamlEntityTest Asserts.assertEquals(item, Iterables.getOnlyElement(itemsInstalled), "Wrong item; installed: "+itemsInstalled); } - // many other tests from super now run, with the type registry approach instead of catalog item / catalog approach + @Test // test broken in super works here + // TODO" comment at https://issues.apache.org/jira/browse/BROOKLYN-343 + public void testSameCatalogReferences() { + super.testSameCatalogReferences(); + } + + // also runs many other tests from super, here using the osgi/type-registry appraoch } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java ---------------------------------------------------------------------- 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 d39a97e..9d907d9 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 @@ -552,6 +552,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { @Test(groups = "Broken") // See https://issues.apache.org/jira/browse/BROOKLYN-343 + // Fixed in OSGi subclass public void testSameCatalogReferences() { addCatalogItems( "brooklyn.catalog:", http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java b/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java index fe3609a..2776d9b 100644 --- a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java +++ b/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java @@ -22,7 +22,6 @@ import java.util.Map; import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode; import org.apache.brooklyn.core.internal.BrooklynProperties; -import org.apache.brooklyn.core.internal.storage.BrooklynStorage; import org.apache.brooklyn.util.core.internal.ssh.ShellTool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -121,6 +120,8 @@ public class BrooklynFeatureEnablement { * The functionality loads catalog items regardless of the persistence state so best used with persistence disabled. * If a bundle is uploaded its BOM is scanned regardless of this property (this only applies to bundles * installed through a non-brooklyn method, eg karaf.) + * + * This installs legacy items and so should be deprecated in favour of uploading BOMs which Brooklyn manages. */ public static final String FEATURE_LOAD_BUNDLE_CATALOG_BOM = FEATURE_PROPERTY_PREFIX+".osgi.catalog_bom"; http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java ---------------------------------------------------------------------- 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 323c70f..8beb3be 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 @@ -627,11 +627,12 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { // don't scan } else { if (isNoBundleOrSimpleWrappingBundle(mgmt, containingBundle)) { + Collection<CatalogItemDtoAbstract<?, ?>> scanResult; // BOMs wrapped in JARs, or without JARs, have special treatment if (isLibrariesMoreThanJustContainingBundle(librariesAddedHereBundles, containingBundle)) { // legacy mode, since 0.12.0, scan libraries referenced in a legacy non-bundle BOM log.warn("Deprecated use of scanJavaAnnotations to scan other libraries ("+librariesAddedHereBundles+"); libraries should declare they scan themselves"); - result.addAll(scanAnnotationsLegacyInListOfLibraries(mgmt, librariesAddedHereBundles, catalogMetadata, containingBundle)); + scanResult = scanAnnotationsLegacyInListOfLibraries(mgmt, librariesAddedHereBundles, catalogMetadata, containingBundle); } else if (!isLibrariesMoreThanJustContainingBundle(libraryBundles, containingBundle)) { // for default catalog, no libraries declared, we want to scan local classpath // bundle should be named "brooklyn-default-catalog" @@ -642,10 +643,20 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { // since 0.12.0, require this to be right next to where libraries are defined, or at root log.warn("Deprecated use of scanJavaAnnotations declared in item; should be declared at the top level of the BOM"); } - result.addAll(scanAnnotationsFromLocalNonBundleClasspath(mgmt, catalogMetadata, containingBundle)); + scanResult = scanAnnotationsFromLocalNonBundleClasspath(mgmt, catalogMetadata, containingBundle); } else { throw new IllegalStateException("Cannot scan for Java catalog items when libraries declared on an ancestor; scanJavaAnnotations should be specified alongside brooklyn.libraries (or ideally those libraries should specify to scan)"); } + if (scanResult!=null && !scanResult.isEmpty()) { + if (result!=null) { + result.addAll( scanResult ); + } else { + // not returning a result; we need to add here + for (CatalogItem item: scanResult) { + mgmt.getCatalog().addItem(item); + } + } + } } else { throw new IllegalArgumentException("Scanning for Java annotations is not supported in BOMs in bundles; " + "entries should be listed explicitly in the catalog.bom"); @@ -847,7 +858,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { // run again now that we know the ID to catch recursive definitions and possibly other mistakes (itemType inconsistency?) planInterpreter = new PlanInterpreterGuessingType(id, item, sourceYaml, itemType, libraryBundles, result).reconstruct(); if (resolutionError==null && !planInterpreter.isResolved()) { - resolutionError = new IllegalStateException("Plan resolution breaks after id and itemType are set; is there a recursive reference or other type inconsistency?\n"+sourceYaml); + resolutionError = new IllegalStateException("Plan resolution for "+id+" breaks after id and itemType are set; is there a recursive reference or other type inconsistency?\n"+sourceYaml); } String sourcePlanYaml = planInterpreter.getPlanYaml(); @@ -951,7 +962,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { private void collectUrlReferencedCatalogItems(String url, ManagedBundle containingBundle, List<CatalogItemDtoAbstract<?, ?>> result, boolean requireValidation, Map<Object, Object> parentMeta, int depth, boolean force) { @SuppressWarnings("unchecked") - List<?> parentLibrariesRaw = MutableList.copyOf(getFirstAs(parentMeta, List.class, "brooklyn.libraries", "libraries").orNull()); + List<?> parentLibrariesRaw = MutableList.copyOf(getFirstAs(parentMeta, Iterable.class, "brooklyn.libraries", "libraries").orNull()); Collection<CatalogBundle> parentLibraries = CatalogItemDtoAbstract.parseLibraries(parentLibrariesRaw); BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, "<catalog url reference loader>:0.0.0", parentLibraries); String yaml; @@ -1626,11 +1637,11 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { CatalogItem<?, ?> existingDto = existingItem.getDto(); if (existingDto.equals(itemDto)) { if (allowDuplicates) return existingItem; - throw new IllegalStateException("Updating existing catalog entries, even with the same content, is forbidden: " + - itemDto.getSymbolicName() + ":" + itemDto.getVersion() + ". Use forceUpdate argument to override."); + throw new IllegalStateException("Not allowed to update existing catalog entries, even with the same content: " + + itemDto.getSymbolicName() + ":" + itemDto.getVersion()); } else { - throw new IllegalStateException("Updating existing catalog entries is forbidden: " + - itemDto.getSymbolicName() + ":" + itemDto.getVersion() + ". Use forceUpdate argument to override."); + throw new IllegalStateException("Cannot add " + itemDto.getSymbolicName() + ":" + itemDto.getVersion() + + " to catalog; a different definition is already present"); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java index bd9c7fa..90bc628 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java @@ -31,6 +31,7 @@ import java.util.Map; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.typereg.ManagedBundle; +import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.typereg.RegisteredTypePredicates; @@ -90,6 +91,10 @@ public class CatalogBundleLoader { if (null != bom) { LOG.debug("Found catalog BOM in {} {} {}", CatalogUtils.bundleIds(bundle)); String bomText = readBom(bom); + if (mb==null) { + LOG.warn("Bundle "+bundle+" containing BOM is not managed by Brooklyn; using legacy item installation"); + legacy = true; + } if (legacy) { catalogItems = this.managementContext.getCatalog().addItems(bomText, mb, force); for (CatalogItem<?, ?> item : catalogItems) { @@ -107,7 +112,7 @@ public class CatalogBundleLoader { } } - if (BasicBrooklynCatalog.isNoBundleOrSimpleWrappingBundle(managementContext, mb)) { + if (!legacy && BasicBrooklynCatalog.isNoBundleOrSimpleWrappingBundle(managementContext, mb)) { ((ManagementContextInternal)managementContext).getOsgiManager().get().addInstalledWrapperBundle(mb); } } else { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/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 473fa6b..81cbbcf 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 @@ -20,6 +20,7 @@ package org.apache.brooklyn.core.catalog.internal; import java.util.Collection; import java.util.List; +import java.util.NoSuchElementException; import javax.annotation.Nullable; @@ -31,6 +32,7 @@ import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext; import org.apache.brooklyn.api.objs.BrooklynObject; import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry; +import org.apache.brooklyn.api.typereg.ManagedBundle; import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.BrooklynLogging; @@ -50,7 +52,9 @@ import org.apache.brooklyn.core.typereg.RegisteredTypeNaming; import org.apache.brooklyn.core.typereg.RegisteredTypePredicates; import org.apache.brooklyn.core.typereg.RegisteredTypes; import org.apache.brooklyn.util.collections.MutableList; +import org.apache.brooklyn.util.collections.MutableSet; import org.apache.brooklyn.util.guava.Maybe; +import org.apache.brooklyn.util.osgi.VersionedName; import org.apache.brooklyn.util.text.Strings; import org.apache.brooklyn.util.time.Time; import org.osgi.framework.Bundle; @@ -97,11 +101,11 @@ public class CatalogUtils { log.warn("Cannot load "+catId+" to get classloader for "+entity+"; will try with standard loader, but might fail subsequently"); return JavaBrooklynClassLoadingContext.create(mgmt); } - return newClassLoadingContext(mgmt, cat.get()); + return newClassLoadingContext(mgmt, cat.get(), JavaBrooklynClassLoadingContext.create(mgmt)); } public static BrooklynClassLoadingContext newClassLoadingContext(@Nullable ManagementContext mgmt, String catalogItemId, Collection<? extends OsgiBundleWithUrl> libraries) { - return newClassLoadingContext(mgmt, catalogItemId, libraries, null); + return newClassLoadingContext(mgmt, catalogItemId, libraries, JavaBrooklynClassLoadingContext.create(mgmt)); } @Deprecated /** @deprecated since 0.9.0; becoming private because we should now always have a registered type callers can pass instead of the catalog item id */ @@ -146,12 +150,12 @@ public class CatalogUtils { } public static BrooklynClassLoadingContext newClassLoadingContextForCatalogItems( - ManagementContext managementContext, String catalogItemId, List<String> searchPath) { + ManagementContext managementContext, String primaryItemId, List<String> searchPath) { BrooklynClassLoadingContextSequential seqLoader = new BrooklynClassLoadingContextSequential(managementContext); - addCatalogItemContext(managementContext, seqLoader, catalogItemId); + addSearchItem(managementContext, seqLoader, primaryItemId); for (String searchId : searchPath) { - addCatalogItemContext(managementContext, seqLoader, searchId); + addSearchItem(managementContext, seqLoader, searchId); } return seqLoader; } @@ -341,29 +345,58 @@ public class CatalogUtils { @Deprecated public static void setDeprecated(ManagementContext mgmt, String symbolicName, String version, boolean newValue) { CatalogItem<?, ?> item = mgmt.getCatalog().getCatalogItem(symbolicName, version); - Preconditions.checkNotNull(item, "No such item: "+symbolicName+" v "+version); - item.setDeprecated(newValue); - mgmt.getCatalog().persist(item); + if (item!=null) { + item.setDeprecated(newValue); + mgmt.getCatalog().persist(item); + } else { + RegisteredType type = mgmt.getTypeRegistry().get(symbolicName, version); + if (type!=null) { + RegisteredTypes.setDeprecated(type, newValue); + } else { + throw new NoSuchElementException(symbolicName+":"+version); + } + } } /** @deprecated since it was introduced in 0.9.0; TBD where this should live */ @Deprecated public static void setDisabled(ManagementContext mgmt, String symbolicName, String version, boolean newValue) { CatalogItem<?, ?> item = mgmt.getCatalog().getCatalogItem(symbolicName, version); - Preconditions.checkNotNull(item, "No such item: "+symbolicName+" v "+version); - item.setDisabled(newValue); - mgmt.getCatalog().persist(item); + if (item!=null) { + item.setDisabled(newValue); + mgmt.getCatalog().persist(item); + } else { + RegisteredType type = mgmt.getTypeRegistry().get(symbolicName, version); + if (type!=null) { + RegisteredTypes.setDisabled(type, newValue); + } else { + throw new NoSuchElementException(symbolicName+":"+version); + } + } } - private static void addCatalogItemContext(ManagementContext managementContext, BrooklynClassLoadingContextSequential loader, String catalogItemId) { - RegisteredType item = managementContext.getTypeRegistry().get(catalogItemId); - + private static void addSearchItem(ManagementContext managementContext, BrooklynClassLoadingContextSequential loader, String itemId) { + OsgiManager osgi = ((ManagementContextInternal)managementContext).getOsgiManager().orNull(); + boolean didSomething = false; + if (osgi!=null) { + ManagedBundle bundle = osgi.getManagedBundle(VersionedName.fromString(itemId)); + if (bundle!=null) { + loader.add( newClassLoadingContext(managementContext, itemId, MutableSet.of(bundle)) ); + didSomething = true; + // but also load entities, if name is same as a bundle and libraries are set on entity + } + } + + RegisteredType item = managementContext.getTypeRegistry().get(itemId); if (item != null) { BrooklynClassLoadingContext itemLoader = newClassLoadingContext(managementContext, item); loader.add(itemLoader); - } else { + didSomething = true; + } + + if (!didSomething) { // TODO review what to do here - log.warn("Can't find catalog item " + catalogItemId); + log.warn("Can't find catalog item " + itemId); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/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 1d07a5a..5095f68 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 @@ -41,6 +41,7 @@ import org.apache.brooklyn.util.collections.MutableSet; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.osgi.VersionedName; +import org.apache.brooklyn.util.text.BrooklynVersionSyntax; import org.apache.brooklyn.util.text.Identifiers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -311,7 +312,7 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry { Asserts.fail("Registered type "+type+" has ID / symname mismatch"); RegisteredType oldType = mgmt.getTypeRegistry().get(type.getId()); - if (oldType==null || canForce) { + if (oldType==null || canForce || BrooklynVersionSyntax.isSnapshot(oldType.getVersion())) { log.debug("Inserting "+type+" into "+this); localRegisteredTypes.put(type.getId(), type); } else { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/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 2f205eb..06014c6 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 @@ -210,6 +210,18 @@ public class RegisteredTypes { } @Beta + public static RegisteredType setDeprecated(RegisteredType type, boolean deprecated) { + ((BasicRegisteredType)type).deprecated = deprecated; + return type; + } + + @Beta + public static RegisteredType setDisabled(RegisteredType type, boolean disabled) { + ((BasicRegisteredType)type).disabled = disabled; + return type; + } + + @Beta public static RegisteredType addSuperType(RegisteredType type, @Nullable Class<?> superType) { if (superType!=null) { ((BasicRegisteredType)type).superTypes.add(superType); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java index 8d5cf0f..c3e75be 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java @@ -27,20 +27,21 @@ import javax.annotation.Nullable; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.BrooklynVersion; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; import org.apache.brooklyn.core.entity.EntityInternal; import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContextSequential; import org.apache.brooklyn.core.mgmt.ha.OsgiManager; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; +import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.core.LoaderDispatcher.ClassLoaderDispatcher; import org.apache.brooklyn.util.core.LoaderDispatcher.MultipleResourceLoaderDispatcher; import org.apache.brooklyn.util.core.LoaderDispatcher.ResourceLoaderDispatcher; import org.apache.brooklyn.util.core.osgi.Osgis; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.osgi.OsgiUtils; -import org.apache.brooklyn.util.text.BrooklynVersionSyntax; import org.apache.brooklyn.util.text.Strings; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -253,18 +254,31 @@ public class ClassLoaderUtils { Maybe<T> cls; if (entity != null && mgmt != null) { String catalogItemId = entity.getCatalogItemId(); + if (catalogItemId != null) { -// RegisteredType type = mgmt.getTypeRegistry().get(catalogItemId); -// if (type != null) { -// BrooklynClassLoadingContextSequential loader = new BrooklynClassLoadingContextSequential(mgmt); -// loader.add(newClassLoadingContextForCatalogItems(mgmt, type.getId(), -// type.getContainingBundle() + type.getLibraries() ?); -// cls = dispatcher.tryLoadFrom(loader, className); -// if (cls.isPresent()) { -// return cls; -// } - // TODO prefer above to below, but need to reconcile item.searchPath with RegisteredType? - // or use entity search path ? + { + BrooklynClassLoadingContextSequential loader = new BrooklynClassLoadingContextSequential(mgmt); + loader.add( newClassLoadingContextForCatalogItems(mgmt, catalogItemId, + entity.getCatalogItemIdSearchPath()) ); + cls = dispatcher.tryLoadFrom(loader, className); + if (cls.isPresent()) { + return cls; + } + } + // the above (entity) should be sufficient? + + RegisteredType type = mgmt.getTypeRegistry().get(catalogItemId); + if (type != null) { + BrooklynClassLoadingContextSequential loader = new BrooklynClassLoadingContextSequential(mgmt); + List<String> libs = MutableList.of(); + for (OsgiBundleWithUrl o: type.getLibraries()) libs.add(o.getVersionedName().toString()); + loader.add( newClassLoadingContextForCatalogItems(mgmt, type.getContainingBundle(), libs) ); + cls = dispatcher.tryLoadFrom(loader, className); + if (cls.isPresent()) { + return cls; + } + } + CatalogItem<?, ?> item = CatalogUtils.getCatalogItemOptionalVersion(mgmt, catalogItemId); if (item != null) { BrooklynClassLoadingContextSequential loader = new BrooklynClassLoadingContextSequential(mgmt); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/core/src/main/java/org/apache/brooklyn/util/core/LoaderDispatcher.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/LoaderDispatcher.java b/core/src/main/java/org/apache/brooklyn/util/core/LoaderDispatcher.java index 8fffa9d..4d13aa8 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/LoaderDispatcher.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/LoaderDispatcher.java @@ -54,7 +54,8 @@ public interface LoaderDispatcher<T> { @Override public Maybe<Class<?>> tryLoadFrom(BrooklynClassLoadingContext loader, String className) { try { - return Maybe.<Class<?>>of(loader.loadClass(className)); + // return Maybe.<Class<?>>of(loader.loadClass(className)); + return loader.tryLoadClass(className); } catch (IllegalStateException e) { propagateIfCauseNotClassNotFound(e); return Maybe.absent("Failed to load class " + className + " from loader " + loader, e); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java ---------------------------------------------------------------------- diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java b/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java index 887ca6b..1e0e698 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java @@ -31,6 +31,8 @@ import com.google.common.base.Preconditions; */ public class BrooklynVersionSyntax { + private static final String SNAPSHOT = "SNAPSHOT"; + public static final String USABLE_REGEX = "[^:\\s/\\\\]+"; public static final String DOT = "\\."; @@ -192,4 +194,9 @@ public class BrooklynVersionSyntax { return toValidOsgiVersion(v1).equals(toValidOsgiVersion(v2)); } + public static boolean isSnapshot(String version) { + if (version==null) return false; + return version.toUpperCase().contains(SNAPSHOT); + } + } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/02cfe50a/utils/common/src/main/java/org/apache/brooklyn/util/text/VersionComparator.java ---------------------------------------------------------------------- diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/text/VersionComparator.java b/utils/common/src/main/java/org/apache/brooklyn/util/text/VersionComparator.java index 120a210..449d0e5 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/text/VersionComparator.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/text/VersionComparator.java @@ -44,8 +44,6 @@ import com.google.common.base.Objects; */ public class VersionComparator implements Comparator<String> { - private static final String SNAPSHOT = "SNAPSHOT"; - public static final VersionComparator INSTANCE = new VersionComparator(); public static VersionComparator getInstance() { @@ -53,10 +51,8 @@ public class VersionComparator implements Comparator<String> { } public static boolean isSnapshot(String version) { - if (version==null) return false; - return version.toUpperCase().contains(SNAPSHOT); + return BrooklynVersionSyntax.isSnapshot(version); } - @SuppressWarnings("unused") private static class TwoBooleans {
