You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2022/06/27 16:48:16 UTC

[brooklyn-server] 01/03: Merge branch 'master' into tidy-instantiation

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 48e3cf17f93a98e0c41f81e914b952bcae3a5c16
Merge: e10cf842c1 ead3e69868
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Mon Jun 27 16:55:28 2022 +0100

    Merge branch 'master' into tidy-instantiation
    
    Conflicts:
            camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
            core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
    
    Think above merged correctly, but still needs testing.

 .gitignore                                         |   1 +
 .mvn/jvm.config                                    |   1 -
 server-cli/LICENSE => DEPENDENCIES                 | 998 ++++++++++++++++-----
 Jenkinsfile                                        |   4 +-
 LICENSE                                            | 735 +--------------
 NOTICE                                             | 485 +---------
 README.md                                          |   3 +-
 api/pom.xml                                        |  14 +-
 .../brooklyn/api/catalog/BrooklynCatalog.java      |  81 +-
 .../apache/brooklyn/api/catalog/CatalogItem.java   |  10 +-
 .../brooklyn/api/entity/EntityInitializer.java     |   8 +-
 .../org/apache/brooklyn/api/entity/EntitySpec.java |  23 +-
 .../brooklyn/api/framework/FrameworkLookup.java    |   8 +-
 .../api/internal/AbstractBrooklynObjectSpec.java   |  41 +-
 .../api/internal/BrooklynLoggingCategories.java    |  23 +-
 .../brooklyn/api/location/MachineLocation.java     |   7 +
 .../api/location/MachineManagementMixins.java      |  39 +-
 .../apache/brooklyn/api/location/OsDetails.java    |   2 +-
 .../apache/brooklyn/api/mgmt/EntityManager.java    |  34 +-
 .../api/mgmt/ha/HighAvailabilityManager.java       |   5 +
 .../ha/ManagementPlaneSyncRecordPersister.java     |   3 +
 .../mgmt/rebind/PersistenceExceptionHandler.java   |   7 +
 .../brooklyn/api/mgmt/rebind/RebindManager.java    |   9 +-
 .../rebind/mementos/BrooklynMementoPersister.java  |  12 +-
 .../api/mgmt/rebind/mementos/EntityMemento.java    |   2 +-
 .../mgmt/rebind/mementos/ManagedBundleMemento.java |   6 +
 .../brooklyn/api/mgmt/rebind/mementos/Memento.java |   5 +-
 .../apache/brooklyn/api/objs/BrooklynObject.java   |  14 +-
 .../brooklyn/api/objs/BrooklynObjectType.java      |   2 +-
 .../apache/brooklyn/api/objs/EntityAdjunct.java    |   4 +-
 .../brooklyn/api/typereg/BrooklynTypeRegistry.java |   6 +-
 .../apache/brooklyn/api/typereg/ManagedBundle.java |   5 +-
 .../brooklyn/api/typereg/OsgiBundleWithUrl.java    |   4 +
 camp/camp-base/pom.xml                             |  12 +-
 .../apache/brooklyn/camp/BasicCampPlatform.java    |   2 +-
 .../resolve/interpret/PlanInterpretationNode.java  |   2 +-
 camp/camp-brooklyn/pom.xml                         |  14 +-
 .../camp/brooklyn/BrooklynCampConstants.java       |   7 +-
 .../BrooklynAssemblyTemplateInstantiator.java      |  12 +-
 .../BrooklynComponentTemplateResolver.java         | 248 +++--
 .../creation/BrooklynEntityDecorationResolver.java | 194 ++--
 .../spi/creation/BrooklynEntityMatcher.java        |   2 +-
 .../spi/creation/BrooklynYamlTypeInstantiator.java |  22 +-
 .../camp/brooklyn/spi/creation/CampResolver.java   | 159 +++-
 .../spi/creation/CampTypePlanTransformer.java      |  92 +-
 .../spi/creation/EntitySpecConfiguration.java      |   2 +-
 .../camp/brooklyn/spi/dsl/AppGroupTraverser.java   | 139 +++
 .../spi/dsl/BrooklynDslDeferredSupplier.java       |  22 +-
 .../brooklyn/spi/dsl/BrooklynDslInterpreter.java   |  29 +-
 .../brooklyn/spi/dsl/DslDeferredFunctionCall.java  |  34 +-
 .../spi/dsl/DslDeferredPropertyAccess.java         | 152 ++++
 .../brooklyn/camp/brooklyn/spi/dsl/DslUtils.java   |  93 ++
 .../spi/dsl/methods/BrooklynDslCommon.java         | 254 +++++-
 .../brooklyn/spi/dsl/methods/DslComponent.java     | 229 +++--
 .../spi/dsl/methods/DslToStringHelpers.java        |   2 +-
 .../camp/brooklyn/spi/dsl/parse/DslParser.java     | 131 ++-
 .../brooklyn/spi/dsl/parse/PropertyAccess.java     |  24 +-
 ...apache.brooklyn.core.plan.PlanToSpecTransformer |   4 +
 ...ooklyn.core.typereg.BrooklynTypePlanTransformer |   4 +
 .../camp/brooklyn/AbstractJcloudsStubYamlTest.java |   7 +-
 .../camp/brooklyn/AbstractWindowsYamlTest.java     |   2 +-
 .../camp/brooklyn/AbstractYamlRebindTest.java      |  11 +-
 .../brooklyn/camp/brooklyn/AbstractYamlTest.java   |  29 +-
 .../camp/brooklyn/AddChildrenEffectorYamlTest.java | 133 ++-
 .../brooklyn/AddChildrenInitializerYamlTest.java   | 139 +++
 .../camp/brooklyn/ApplicationsYamlTest.java        |   5 +-
 .../camp/brooklyn/ByonLocationsYamlTest.java       |   4 +-
 .../camp/brooklyn/ConfigParametersYamlTest.java    | 377 +++++---
 .../camp/brooklyn/ConfigTypeCoercionYamlTest.java  |  16 +-
 .../brooklyn/camp/brooklyn/ConfigYamlTest.java     | 208 +++++
 .../brooklyn/CustomTypeConfigYamlOsgiTest.java     |  58 ++
 .../camp/brooklyn/CustomTypeConfigYamlTest.java    | 367 ++++++++
 .../brooklyn/CustomTypeInitializerYamlTest.java    | 354 ++++++++
 .../brooklyn/DynamicMultiGroupYamlRebindTest.java  | 173 ++++
 .../brooklyn/camp/brooklyn/EntitiesYamlTest.java   | 188 +++-
 .../brooklyn/camp/brooklyn/LocationsYamlTest.java  |  67 ++
 .../camp/brooklyn/MapReferenceYamlTest.java        |   1 +
 .../camp/brooklyn/MultiLocationYamlTest.java       |   2 +-
 .../brooklyn/camp/brooklyn/ObjectsYamlTest.java    |  53 ++
 .../brooklyn/camp/brooklyn/RebindOsgiTest.java     |   2 +-
 .../camp/brooklyn/ReferencedOsgiYamlTest.java      |   2 +-
 .../camp/brooklyn/ReferencingYamlTestEntity.java   |   6 +
 ...a => TestSensorAndEffectorInitializerBase.java} |  73 +-
 .../brooklyn/ValidationMissingTypeYamlTest.java    |  76 +-
 .../camp/brooklyn/WindowsYamlLiveTest.java         | 165 +++-
 .../catalog/CatalogMakeOsgiBundleTest.java         |   5 +-
 .../CatalogOsgiVersionMoreEntityRebindTest.java    |  31 +-
 .../catalog/CatalogOsgiVersionMoreEntityTest.java  |   2 +-
 .../catalog/CatalogOsgiYamlEntityTest.java         | 194 +++-
 .../catalog/CatalogOsgiYamlLocationTest.java       |   4 +-
 .../catalog/CatalogOsgiYamlPolicyTest.java         |   8 +-
 .../catalog/CatalogOsgiYamlTemplateTest.java       |  38 +-
 .../camp/brooklyn/catalog/CatalogScanOsgiTest.java | 113 ++-
 .../camp/brooklyn/catalog/CatalogYamlAppTest.java  |   8 +-
 .../brooklyn/catalog/CatalogYamlCombiTest.java     |  10 +-
 .../CatalogYamlEntityOsgiTypeRegistryTest.java     | 100 ++-
 .../brooklyn/catalog/CatalogYamlEntityTest.java    | 171 +++-
 .../brooklyn/catalog/CatalogYamlLocationTest.java  |  12 +-
 .../brooklyn/catalog/CatalogYamlPolicyTest.java    |  12 +-
 .../brooklyn/catalog/CatalogYamlTemplateTest.java  |   8 +-
 .../catalog/CatalogYamlVersioningTest.java         |  26 +-
 .../brooklyn/catalog/GetFileContentsEffector.java  |  12 +-
 .../catalog/SpecParameterParsingOsgiTest.java      |   3 +-
 .../brooklyn/policy/GroupsChangePolicyTest.java    | 440 +++++++++
 .../camp/brooklyn/rebind/RebindMiscTest.java       | 166 ++++
 .../brooklyn/spi/dsl/AppGroupTraverserTest.java    | 154 ++++
 .../brooklyn/spi/dsl/DslParseComponentsTest.java   |  12 +
 .../camp/brooklyn/spi/dsl/DslParseTest.java        |  97 +-
 .../brooklyn/spi/dsl/DslSerializationTest.java     | 177 ++++
 .../camp/brooklyn/spi/dsl/DslYamlTest.java         | 116 ++-
 .../camp/brooklyn/spi/dsl/TagsYamlTest.java        |  67 +-
 .../brooklyn/spi/dsl/methods/DslTestObjects.java   |  20 +-
 .../camp/brooklyn/test/lite/CampYamlLiteTest.java  |   2 +-
 .../test/policy/failover/ElectPrimaryTest.java     |  15 +-
 .../rebind/misc-guava-2021-12-entity-hrxo4j0dcs    | 192 ++++
 ...illa-bash-netcat-w-client-and-effector-ui.yaml} |  28 +-
 .../resources/vanilla-bash-netcat-w-client.yaml    |   2 +-
 .../src/test/yaml/python-webserver.bom             |   2 +-
 camp/camp-server/pom.xml                           |   9 +-
 .../apache/brooklyn/camp/server/RestApiSetup.java  |   2 +-
 camp/pom.xml                                       |   2 +-
 core/pom.xml                                       |  53 +-
 .../brooklyn/core/BrooklynFeatureEnablement.java   |   7 +-
 .../org/apache/brooklyn/core/BrooklynLogging.java  |   1 +
 .../org/apache/brooklyn/core/BrooklynVersion.java  |  16 +-
 .../brooklyn/core/catalog/CatalogPredicates.java   |  11 +-
 .../catalog/internal/BasicBrooklynCatalog.java     | 804 ++++++++++-------
 .../core/catalog/internal/CatalogBundleDto.java    |  14 +-
 .../core/catalog/internal/CatalogBundleLoader.java |  18 +-
 .../core/catalog/internal/CatalogClasspathDo.java  |   4 +-
 .../catalog/internal/CatalogInitialization.java    | 142 ++-
 .../core/catalog/internal/CatalogItemBuilder.java  |   1 +
 .../catalog/internal/CatalogItemDtoAbstract.java   |   3 +-
 .../catalog/internal/CatalogUpgradeScanner.java    |   8 +-
 .../core/catalog/internal/CatalogUtils.java        |  46 +-
 .../brooklyn/core/config/BasicConfigKey.java       |  39 +-
 .../brooklyn/core/config/ConfigConstraints.java    | 261 ++++--
 .../apache/brooklyn/core/config/ConfigUtils.java   |  23 +
 .../core/config/ConstraintViolationException.java  | 190 +++-
 .../apache/brooklyn/core/config/MapConfigKey.java  |  30 +-
 .../org/apache/brooklyn/core/config/Sanitizer.java | 247 ++++-
 .../PropertiesFileExternalConfigSupplier.java      |   5 +-
 .../external/UrlsExternalConfigSupplier.java       |   2 +-
 .../vault/VaultExternalConfigSupplier.java         |  66 +-
 .../vault/VaultUserPassExternalConfigSupplier.java |  16 +-
 .../internal/AbstractCollectionConfigKey.java      |  17 +-
 .../config/internal/AbstractConfigMapImpl.java     | 135 ++-
 .../internal/AbstractStructuredConfigKey.java      |   5 +-
 .../config/internal/LazyContainerAndKeyValue.java  |  19 +-
 .../core/effector/AddChildrenEffector.java         |  98 +-
 .../core/effector/AddDeploySensorsInitializer.java |  98 ++
 .../apache/brooklyn/core/effector/AddEffector.java |  94 +-
 .../effector/AddEffectorInitializerAbstract.java   |  71 ++
 ...va => AddEffectorInitializerAbstractProto.java} |  86 +-
 .../apache/brooklyn/core/effector/AddSensor.java   |  87 +-
 .../core/effector/AddSensorInitializer.java        | 112 +++
 .../AddSensorInitializerAbstractProto.java         |  55 ++
 .../brooklyn/core/effector/BasicParameterType.java |   7 +-
 .../brooklyn/core/effector/CompositeEffector.java  |  18 +-
 .../brooklyn/core/effector/ProxyEffector.java      |  12 +-
 .../core/effector/http/HttpCommandEffector.java    |  17 +-
 .../core/effector/ssh/SshCommandEffector.java      |  20 +-
 .../core/effector/ssh/SshEffectorTasks.java        |   7 +-
 .../brooklyn/core/enricher/AbstractEnricher.java   |   3 +-
 .../core/enricher/EnricherDynamicType.java         |   2 +-
 .../brooklyn/core/entity/AbstractApplication.java  |  37 +-
 .../brooklyn/core/entity/AbstractEntity.java       | 122 ++-
 .../core/entity/AddChildrenInitializer.java        |  61 ++
 .../brooklyn/core/entity/BrooklynConfigKeys.java   |   6 +
 .../org/apache/brooklyn/core/entity/Dumper.java    |   4 +-
 .../org/apache/brooklyn/core/entity/Entities.java  |  73 +-
 .../brooklyn/core/entity/EntityAdjuncts.java       |  47 +
 .../brooklyn/core/entity/EntityDynamicType.java    |  14 +-
 .../brooklyn/core/entity/EntityInitializers.java   | 159 +++-
 .../brooklyn/core/entity/EntityInternal.java       |   3 +
 .../core/entity/EntityPostInitializable.java       |  22 +-
 .../brooklyn/core/entity/EntityPredicates.java     |  23 +
 .../brooklyn/core/entity/StartableApplication.java |   4 +
 .../core/entity/internal/ConfigUtilsInternal.java  |  55 ++
 .../core/entity/internal/EntityConfigMap.java      |   7 +
 .../internal/EntityTransientCopyInternal.java      |  16 +-
 .../core/entity/lifecycle/ServiceStateLogic.java   |  30 +-
 .../core/entity/trait/StartableMethods.java        |  13 +-
 .../apache/brooklyn/core/feed/AbstractFeed.java    |   3 +-
 .../brooklyn/core/feed/AttributePollHandler.java   |  27 +-
 .../java/org/apache/brooklyn/core/feed/Poller.java |  14 +-
 .../core/internal/BrooklynPropertiesImpl.java      |   2 +-
 .../brooklyn/core/location/AbstractLocation.java   |  11 +-
 .../core/location/AbstractMachineLocation.java     |   4 +
 .../core/location/BasicLocationRegistry.java       |  76 +-
 .../core/location/BasicMachineMetadata.java        |  25 +-
 .../brooklyn/core/location/BasicOsDetails.java     |   9 +-
 .../apache/brooklyn/core/location/Locations.java   |   6 +-
 .../core/location/MachineLifecycleUtils.java       | 288 ++++++
 .../location/access/PortForwardManagerImpl.java    |  21 +-
 .../core/location/internal/LocationConfigMap.java  |  16 +-
 .../location/internal/LocationDynamicType.java     |   2 +-
 .../apache/brooklyn/core/mgmt/BrooklynTags.java    | 277 +++++-
 .../brooklyn/core/mgmt/BrooklynTaskTags.java       |  37 +-
 .../brooklyn/core/mgmt/EntityManagementUtils.java  |  86 +-
 .../OsgiBrooklynClassLoadingContext.java           |  23 +-
 .../entitlement/EntitlementManagerAdapter.java     |  13 +
 .../core/mgmt/entitlement/Entitlements.java        | 104 ++-
 .../mgmt/entitlement/WebEntitlementContext.java    |  16 +-
 ...r.java => BrooklynBomOsgiArchiveInstaller.java} | 596 +++++++-----
 .../core/mgmt/ha/HighAvailabilityManagerImpl.java  | 135 ++-
 ...ementPlaneSyncRecordPersisterToObjectStore.java |  33 +-
 .../apache/brooklyn/core/mgmt/ha/OsgiManager.java  | 177 ++--
 .../mgmt/internal/AbstractManagementContext.java   |  10 +-
 .../mgmt/internal/AbstractSubscriptionManager.java |  10 +
 .../internal/AsyncCollectionChangeAdapter.java     |  21 +-
 .../BasicExternalConfigSupplierRegistry.java       |   5 +-
 .../mgmt/internal/BrooklynGarbageCollector.java    | 171 +++-
 .../mgmt/internal/CollectionChangeListener.java    |   6 +
 .../mgmt/internal/EntityManagementSupport.java     | 125 ++-
 .../core/mgmt/internal/EntityManagerInternal.java  |  13 +-
 .../core/mgmt/internal/LocalEntityManager.java     | 312 +++++--
 .../core/mgmt/internal/LocalLocationManager.java   |  26 +-
 .../mgmt/internal/LocalSubscriptionManager.java    |  18 +-
 .../core/mgmt/internal/LocalUsageManager.java      |  20 +-
 .../mgmt/internal/NonDeploymentEntityManager.java  |  13 +-
 .../internal/NonDeploymentManagementContext.java   |  21 +-
 .../BrooklynMementoPersisterToObjectStore.java     | 232 +++--
 .../mgmt/persist/BrooklynPersistenceUtils.java     |  20 +-
 .../mgmt/persist/RetryingMementoSerializer.java    |  11 +-
 .../core/mgmt/persist/XmlMementoSerializer.java    |  79 +-
 .../AbstractBrooklynObjectRebindSupport.java       |   9 +-
 .../core/mgmt/rebind/BasicEntityRebindSupport.java |   3 +-
 .../mgmt/rebind/PeriodicDeltaChangeListener.java   |  55 +-
 .../rebind/PersistenceExceptionHandlerImpl.java    |  18 +-
 .../core/mgmt/rebind/RebindContextImpl.java        |   8 +-
 .../mgmt/rebind/RebindExceptionHandlerImpl.java    |  66 +-
 .../brooklyn/core/mgmt/rebind/RebindIteration.java | 658 ++++++++------
 .../core/mgmt/rebind/RebindManagerImpl.java        | 157 +++-
 .../core/mgmt/rebind/dto/AbstractMemento.java      |   6 +-
 .../mgmt/rebind/dto/BasicManagedBundleMemento.java |  43 +-
 .../core/mgmt/rebind/dto/MementosGenerators.java   |  14 +-
 .../core/network/AbstractOnNetworkEnricher.java    |   2 +-
 .../brooklyn/core/objs/AbstractBrooklynObject.java |   4 +
 .../objs/AbstractConfigurationSupportInternal.java |  41 +-
 .../brooklyn/core/objs/AbstractEntityAdjunct.java  |  37 +-
 .../brooklyn/core/objs/AdjunctConfigMap.java       |   6 +
 .../org/apache/brooklyn/core/objs/AdjunctType.java |  62 +-
 .../core/objs/BasicEntityTypeRegistry.java         |   4 +
 .../brooklyn/core/objs/BasicSpecParameter.java     |  81 +-
 .../brooklyn/core/objs/BrooklynDynamicType.java    |  40 +-
 .../brooklyn/core/objs/BrooklynObjectInternal.java |   5 +
 ...l.java => AbstractBrooklynObjectProxyImpl.java} | 184 ++--
 .../core/objs/proxy/EntityAdjunctProxyImpl.java    |  83 ++
 .../brooklyn/core/objs/proxy/EntityProxyImpl.java  | 195 +---
 .../core/objs/proxy/InternalEntityFactory.java     | 357 +++++---
 .../brooklyn/core/plan/PlanToSpecFactory.java      |   9 +-
 .../brooklyn/core/policy/AbstractPolicy.java       |   3 +-
 .../brooklyn/core/policy/PolicyDynamicType.java    |   2 +-
 .../resolve/entity/CatalogEntitySpecResolver.java  |   6 +-
 .../entity/DelegatingEntitySpecResolver.java       |   5 +-
 .../resolve/jackson/AsPropertyIfAmbiguous.java     | 272 ++++++
 .../jackson/BeanWithTypePlanTransformer.java       |  94 ++
 .../core/resolve/jackson/BeanWithTypeUtils.java    | 275 ++++++
 .../jackson/BrooklynJacksonSerializationUtils.java | 269 ++++++
 .../core/resolve/jackson/BrooklynJacksonType.java  | 196 ++++
 ...BrooklynRegisteredTypeJacksonSerialization.java | 293 ++++++
 .../resolve/jackson/CommonTypesSerialization.java  | 460 ++++++++++
 .../JacksonBetterDelegatingDeserializer.java       | 170 ++++
 .../jackson/JsonSymbolDependentDeserializer.java   | 151 ++++
 .../jackson/ObjectReferencingSerialization.java    | 179 ++++
 .../core/resolve/jackson/WrappedValue.java         | 139 +++
 .../jackson/WrappedValuesSerialization.java        | 257 ++++++
 .../core/sensor/AbstractAddSensorFeed.java         |   4 +-
 .../core/sensor/DependentConfiguration.java        |  24 +-
 .../brooklyn/core/sensor/DurationSinceSensor.java  |  35 +-
 .../brooklyn/core/sensor/MaxConcurrencySensor.java |  19 +-
 .../apache/brooklyn/core/sensor/StaticSensor.java  |  33 +-
 .../core/sensor/function/FunctionSensor.java       |  12 +-
 .../core/sensor/http/HttpRequestSensor.java        |  44 +-
 .../core/sensor/password/CreatePasswordSensor.java |  28 +-
 .../brooklyn/core/sensor/ssh/SshCommandSensor.java | 183 +++-
 .../brooklyn/core/server/BrooklynServerConfig.java |  16 +-
 .../typereg/AbstractCatalogBundleResolver.java     | 286 ++++++
 .../core/typereg/AbstractTypePlanTransformer.java  | 150 +++-
 .../core/typereg/BasicBrooklynTypeRegistry.java    | 144 +--
 .../brooklyn/core/typereg/BasicManagedBundle.java  |  81 +-
 .../core/typereg/BasicOsgiBundleWithUrl.java       |  16 +-
 .../BrooklynBomBundleCatalogBundleResolver.java    |  80 ++
 .../BrooklynBomYamlCatalogBundleResolver.java      | 148 +++
 .../typereg/BrooklynCatalogBundleResolver.java     | 168 ++++
 .../typereg/BrooklynCatalogBundleResolvers.java    | 221 +++++
 .../core/typereg/BrooklynTypePlanTransformer.java  |  26 +-
 .../typereg/JavaClassNameTypePlanTransformer.java  |  52 +-
 .../typereg/ReferencedUnresolvedTypeException.java |   2 +-
 .../typereg/RegisteredTypeLoadingContexts.java     |  20 +-
 .../brooklyn/core/typereg/RegisteredTypes.java     |  13 +-
 ...pePlanException.java => TypePlanException.java} |  13 +-
 .../core/typereg/TypePlanTransformers.java         |  84 +-
 ...java => UnsupportedCatalogBundleException.java} |  10 +-
 .../core/typereg/UnsupportedTypePlanException.java |   3 +-
 .../apache/brooklyn/enricher/stock/Enrichers.java  |   8 +-
 .../enricher/stock/MathAggregatorFunctions.java    |   4 +-
 .../enricher/stock/PercentageEnricher.java         |   3 +-
 .../enricher/stock/PropagateToMembers.java         |  92 ++
 .../brooklyn/enricher/stock/Transformer.java       |  50 +-
 .../stock/YamlTimeWeightedDeltaEnricher.java       |   4 +-
 .../enricher/stock/aggregator/AggregationJob.java  |   2 +
 .../stock/aggregator/DashboardAggregator.java      |  10 +-
 .../brooklyn/entity/group/AbstractGroupImpl.java   |  10 +-
 .../brooklyn/entity/group/DynamicClusterImpl.java  |  10 +-
 .../brooklyn/entity/group/DynamicGroupImpl.java    |  10 +-
 .../brooklyn/entity/group/DynamicMultiGroup.java   |   8 +
 .../entity/group/DynamicMultiGroupImpl.java        |  13 +-
 .../brooklyn/entity/group/GroupsChangePolicy.java  | 236 +++++
 .../group/SshCommandMembershipTrackingPolicy.java  |   2 +-
 .../entity/stock/AsyncApplicationImpl.java         |   2 +-
 .../java/org/apache/brooklyn/feed/ssh/SshFeed.java |  34 +-
 .../location/byon/ByonLocationResolver.java        |  10 +-
 .../LocalhostMachineProvisioningLocation.java      |  18 +-
 .../brooklyn/location/ssh/SshMachineLocation.java  |  28 +-
 .../policy/AbstractInvokeEffectorPolicy.java       |   2 +-
 .../policy/InvokeEffectorOnSensorChange.java       |  39 +-
 .../brooklyn/util/core/BrooklynEntityUtils.java    | 106 +++
 .../brooklyn/util/core/ClassLoaderUtils.java       | 117 ++-
 .../apache/brooklyn/util/core/ResourceUtils.java   |  22 +
 .../brooklyn/util/core/config/ConfigBag.java       |  45 +-
 .../util/core/config/ResolvingConfigBag.java       |   4 +-
 .../brooklyn/util/core/crypto/FluentKeySigner.java |  16 +
 .../brooklyn/util/core/file/ArchiveBuilder.java    |   8 +-
 .../brooklyn/util/core/file/ArchiveUtils.java      |   3 +
 .../core/flags/BrooklynTypeNameResolution.java     | 412 +++++++++
 .../brooklyn/util/core/flags/MethodCoercions.java  |  12 +-
 .../brooklyn/util/core/flags/TypeCoercions.java    | 111 ++-
 .../util/core/internal/ssh/SshAbstractTool.java    |  38 +-
 .../internal/ssh/sshj/SshjClientConnection.java    |   2 +-
 .../util/core/internal/ssh/sshj/SshjTool.java      |   8 +
 .../brooklyn/util/core/json/BidiSerialization.java |  25 +-
 .../util/core/json/BrooklynObjectsJsonMapper.java  |  10 +-
 ...blyStrictPreferringFieldsVisibilityChecker.java |   8 +-
 .../util/core/logbook/BrooklynLogEntry.java        | 151 ++++
 .../util/core/logbook/DelegatingLogStore.java      | 129 +++
 .../util/core/logbook/LogBookQueryParams.java      | 124 +++
 .../brooklyn/util/core/logbook/LogStore.java       |  69 ++
 .../brooklyn/util/core/logbook/LogbookConfig.java  |  28 +-
 .../util/core/logbook/file/FileLogStore.java       | 267 ++++++
 .../opensearch/BrooklynOpenSearchModel.java        | 120 +++
 .../logbook/opensearch/OpenSearchLogStore.java     | 320 +++++++
 .../brooklyn/util/core/osgi/BundleMaker.java       |   3 +-
 .../org/apache/brooklyn/util/core/osgi/Osgis.java  |  23 +-
 .../util/core/predicates/DslPredicates.java        | 550 ++++++++++++
 .../util/core/task/BasicExecutionContext.java      | 111 ++-
 .../util/core/task/BasicExecutionManager.java      | 997 +++++++++++++-------
 .../apache/brooklyn/util/core/task/BasicTask.java  |  37 +-
 .../brooklyn/util/core/task/DeferredSupplier.java  |   4 +-
 .../util/core/task/DynamicSequentialTask.java      |  14 +-
 .../core/task/InterruptingImmediateSupplier.java   |   3 +-
 .../brooklyn/util/core/task/ScheduledTask.java     |  21 +-
 .../apache/brooklyn/util/core/task/TaskTags.java   |   3 +-
 .../org/apache/brooklyn/util/core/task/Tasks.java  | 188 ++--
 .../brooklyn/util/core/task/ValueResolver.java     | 277 +++---
 .../ssh/internal/AbstractSshExecTaskFactory.java   |  79 +-
 .../task/ssh/internal/PlainSshExecTaskFactory.java |   3 +
 .../util/core/task/system/ProcessTaskFactory.java  |   3 +-
 .../util/core/task/system/ProcessTaskStub.java     |   5 +-
 .../util/core/task/system/ProcessTaskWrapper.java  |  60 +-
 .../internal/AbstractProcessTaskFactory.java       |   8 +-
 .../system/internal/SystemProcessTaskFactory.java  |   3 +-
 .../brooklyn/util/core/text/TemplateProcessor.java | 296 ++++--
 .../brooklyn/util/core/units/AbstractUnit.java     |  80 ++
 .../core/units/ByteSize.java}                      |  39 +-
 .../util/core/units/DurationOrBoolean.java         |  72 ++
 .../core/units/Frequency.java}                     |  39 +-
 .../org/apache/brooklyn/util/core/units/Range.java |  76 ++
 .../util/core/xstream/HashMultimapConverter.java   | 120 +++
 .../util/core/xstream/LambdaPreventionMapper.java  | 117 +++
 .../util/core/xstream/MutableListConverter.java    |  77 ++
 .../util/core/xstream/MutableSetConverter.java     |  12 +
 .../util/core/xstream/StringKeyMapConverter.java   |  21 +-
 .../brooklyn/util/core/xstream/XmlSerializer.java  |  92 +-
 ...rooklyn.api.internal.ApiObjectsFactoryInterface |   4 +
 ...g.apache.brooklyn.api.location.LocationResolver |   4 +
 ...apache.brooklyn.core.plan.PlanToSpecTransformer |   4 +
 ...brooklyn.core.resolve.entity.EntitySpecResolver |   4 +
 ...lyn.core.typereg.BrooklynCatalogBundleResolver} |   7 +-
 ...ooklyn.core.typereg.BrooklynTypePlanTransformer |   5 +
 .../resources/OSGI-INF/blueprint/blueprint.xml     |  18 +
 core/src/main/resources/catalog.bom                |  68 +-
 .../persist/deserializingClassRenames.properties   |   3 +-
 .../internal/StaticTypePlanTransformer.java        |  19 +-
 .../core/config/ConfigKeyConstraintTest.java       |  41 +-
 .../core/config/ConfigKeyDeprecationTest.java      |  13 +-
 .../MapListAndOtherStructuredConfigKeyTest.java    |  63 +-
 .../apache/brooklyn/core/config/SanitizerTest.java |  32 +-
 .../PropertiesFileExternalConfigSupplierTest.java  |   9 +-
 .../vault/VaultExternalConfigSupplierLiveTest.java |   1 -
 .../core/effector/CompositeEffectorTest.java       |   9 +-
 .../brooklyn/core/effector/ProxyEffectorTest.java  |   6 +-
 .../core/effector/SampleManyTasksEffector.java     |  14 +-
 .../effector/http/HttpCommandEffectorTest.java     |   8 +-
 .../core/entity/ApplicationLoggingTest.java        |  87 +-
 .../brooklyn/core/entity/DynamicEntityTest.java    |  14 +-
 .../brooklyn/core/entity/EntityAssertsTest.java    |   8 +-
 .../brooklyn/core/entity/EntityConfigTest.java     | 263 +++++-
 .../core/entity/EntityInitializersTest.java        |  47 +
 .../brooklyn/core/entity/EntitySpecTest.java       |   3 +
 .../core/entity/OwnedChildrenDeprecatedTest.java   |  38 +-
 .../core/entity/proxying/EntityManagerTest.java    |  75 +-
 .../entity/proxying/InternalEntityFactoryTest.java |  10 +-
 .../brooklyn/core/location/BasicOsDetailsTest.java |  59 ++
 .../core/location/LocationManagementTest.java      |   2 +-
 .../brooklyn/core/location/SimulatedLocation.java  |  18 +-
 .../brooklyn/core/mgmt/DeployFailureTest.java      |   5 +-
 .../core/mgmt/entitlement/EntitlementsTest.java    |  80 ++
 ...va => BrooklynBomOsgiArchiveInstallerTest.java} |  22 +-
 .../ha/HighAvailabilityManagerTestFixture.java     |   4 +-
 .../brooklyn/core/mgmt/ha/HotStandbyTest.java      | 114 ++-
 .../mgmt/internal/EntityExecutionManagerTest.java  | 223 ++++-
 .../core/mgmt/osgi/OsgiStandaloneTest.java         |   5 +-
 .../core/mgmt/osgi/OsgiVersionMoreEntityTest.java  |   2 +-
 .../BrooklynMementoPersisterTestFixture.java       |   2 +-
 .../XmlMementoSerializerPerformanceTest.java       |   5 +-
 .../mgmt/persist/XmlMementoSerializerTest.java     |  36 +-
 .../core/mgmt/rebind/ManagementPlaneIdTest.java    |   6 +-
 .../core/mgmt/rebind/RebindEntityTest.java         |  21 +-
 .../rebind/RebindHistoricSshCommandSensorTest.java |  14 +-
 .../rebind/RebindManagerExceptionHandlerTest.java  |  16 +-
 .../brooklyn/core/mgmt/rebind/RebindOptions.java   |   6 +
 .../core/mgmt/rebind/RebindTestFixture.java        |  16 +-
 .../brooklyn/core/mgmt/rebind/RebindTestUtils.java |  11 +-
 .../transformer/CompoundTransformerTest.java       |   2 +-
 .../core/objs/BasicSpecParameterFromListTest.java  |  29 +
 .../core/policy/basic/BasicPolicyTest.java         |  93 +-
 .../resolve/jackson/BrooklynJacksonTypeTest.java   |  61 ++
 .../BrooklynMiscJacksonSerializationTest.java      | 221 +++++
 ...klynRegisteredTypeJacksonSerializationTest.java | 170 ++++
 .../resolve/jackson/LoggingSerializationTest.java  |  56 ++
 .../core/resolve/jackson/MapperTestFixture.java    | 107 +++
 .../resolve/jackson/PerverseSerializationTest.java | 147 +++
 .../jackson/WrappedValuesSerializationTest.java    | 162 ++++
 .../ssh/SshCommandSensorIntegrationTest.java       |  36 +-
 .../core/test/BrooklynMgmtUnitTestSupport.java     |   2 +
 .../brooklyn/core/test/entity/TestApplication.java |   4 +
 .../core/test/entity/TestApplicationImpl.java      |   2 +-
 .../brooklyn/core/test/entity/TestEntity.java      |   2 +
 .../typereg/ExampleXmlTypePlanTransformer.java     |  22 +-
 .../core/typereg/RegisteredTypeNamingTest.java     |   6 +-
 .../enricher/stock/PropagateToMembersTest.java     | 184 ++++
 .../enricher/stock/TransformingEnricherTest.java   |  39 +-
 .../YamlRollingTimeWindowMeanEnricherTest.java     |  20 +-
 .../stock/YamlTimeWeightedDeltaEnricherTest.java   |  18 +-
 .../entity/group/DynamicMultiGroupRebindTest.java  |  44 +
 .../entity/group/DynamicMultiGroupTest.java        |   4 +
 .../brooklyn/entity/group/SequenceGroupTest.java   |  12 +-
 .../brooklyn/feed/ssh/SshFeedIntegrationTest.java  |   7 +-
 .../location/ssh/SshMachineLocationTest.java       |   6 +-
 ...nvokeEffectorOnSensorChangeIntegrationTest.java |  74 +-
 .../brooklyn/util/core/ClassLoaderUtilsTest.java   |  81 +-
 .../util/core/crypto/SecureKeysAndSignerTest.java  |   2 +-
 .../core/flags/BrooklynTypeNameResolutionTest.java |  62 ++
 .../util/core/internal/TypeCoercionsTest.java      | 120 ++-
 .../util/core/internal/ssh/RecordingSshTool.java   |   8 +-
 .../util/core/logbook/file/FileLogStoreTest.java   | 512 +++++++++++
 .../logbook/opensearch/OpenSearchLogStoreTest.java | 187 ++++
 .../core/predicates/DslPredicateEntityTest.java    | 117 +++
 .../util/core/predicates/DslPredicateTest.java     | 223 +++++
 .../util/core/task/ScheduledExecutionTest.java     | 248 +++--
 .../brooklyn/util/core/task/ValueResolverTest.java |  20 +-
 .../util/core/text/TemplateProcessorTest.java      |  24 +
 .../core/xstream/CompilerCompatibilityTest.java    |   3 +-
 .../util/core/xstream/ConverterTestFixture.java    |  39 +-
 .../core/xstream/HashMultimapConverterTest.java    | 140 +++
 .../core/xstream/TransformedMapConverterTest.java  | 107 +++
 .../util/core/xstream/XmlSerializerTest.java       | 106 ++-
 .../brooklyn/util/core/logbook/file/log-sample.txt |  31 +
 core/src/test/resources/catalog.bom                |   2 +-
 .../test/resources/ssh-command-sensor-command.sh   |   4 +-
 karaf/commands/pom.xml                             |   4 +-
 .../apache/brooklyn/karaf/commands/EntityInfo.java |   2 +-
 karaf/features/README.md                           |  54 ++
 karaf/features/pom.xml                             |  85 +-
 karaf/features/src/main/feature/feature.xml        | 432 ++++++---
 karaf/httpcomponent-extension/pom.xml              |   2 +-
 karaf/init/pom.xml                                 |   2 +-
 .../brooklyn/launcher/osgi/OsgiLauncherImpl.java   | 213 ++++-
 karaf/init/src/main/resources/catalog.bom          |  10 +-
 karaf/jetty-config/pom.xml                         |   2 +-
 karaf/jetty-config/src/main/resources/jetty.xml    |  12 -
 karaf/pom.xml                                      |   9 +-
 karaf/start/pom.xml                                |   2 +-
 launcher-common/pom.xml                            |   2 +-
 .../brooklyn/launcher/common/BasicLauncher.java    |  18 +-
 launcher/pom.xml                                   |  23 +-
 .../apache/brooklyn/launcher/BrooklynLauncher.java |  19 +-
 .../camp/BrooklynCampPlatformLauncher.java         |  20 +-
 .../AbstractBrooklynLauncherRebindTest.java        |   8 +-
 .../BrooklynLauncherHighAvailabilityTest.java      |   6 +-
 .../BrooklynLauncherRebindCatalogOsgiTest.java     |  13 +-
 ...ncherRebindManagementNodeStateListenerTest.java |   2 +-
 .../brooklyn/launcher/BrooklynLauncherTest.java    | 112 ++-
 .../BrooklynLauncherUpgradeCatalogOsgiTest.java    |   6 +-
 .../brooklyn/launcher/BrooklynViewerLauncher.java  |  22 +-
 .../launcher/blueprints/AbstractBlueprintTest.java | 209 ++++-
 .../launcher/blueprints/SimpleBlueprintTest.java   |  48 +
 locations/container/pom.xml                        |  47 +-
 .../brooklyn/container/entity/helm/HelmEntity.java |  93 ++
 .../container/entity/helm/HelmEntityImpl.java      | 364 ++++++++
 .../location/kubernetes/ImageChooser.java          |   6 +-
 .../location/kubernetes/KubernetesCerts.java       |   2 +-
 .../kubernetes/KubernetesClientRegistryImpl.java   |  67 +-
 .../location/kubernetes/KubernetesLocation.java    | 684 +++++++-------
 .../kubernetes/KubernetesLocationConfig.java       |   1 +
 .../machine/KubernetesMachineLocation.java         |   6 +-
 .../location/openshift/OpenShiftLocation.java      |   4 +-
 ...g.apache.brooklyn.api.location.LocationResolver |   4 +
 .../container/entity/helm/HelmEntityLiveTest.java  | 157 ++++
 .../location/kubernetes/ImageChooserTest.java      |  37 +-
 .../kubernetes/KubernetesLocationLiveTest.java     |   4 +-
 .../kubernetes/KubernetesLocationYamlLiveTest.java |  80 +-
 .../test/resources/generic-application.tests.bom   |   2 +-
 .../container/src/test/resources/generic.tests.bom |   2 +-
 .../src/test/resources/nginx-2-deployment.yaml     |  23 +-
 .../src/test/resources/nginx-2-service.yaml        |  14 +-
 locations/jclouds/pom.xml                          |  32 +-
 .../jclouds/DefaultConnectivityResolver.java       |  20 +-
 .../brooklyn/location/jclouds/JcloudsLocation.java | 149 ++-
 .../location/jclouds/JcloudsMachineLocation.java   |  10 +-
 .../jclouds/JcloudsSshMachineLocation.java         |  12 +-
 .../location/jclouds/JcloudsTypeCoercions.java     |   5 +-
 .../brooklyn/location/jclouds/JcloudsUtil.java     |   2 +-
 .../jclouds/api/JcloudsLocationPublic.java         |   2 +-
 .../templates/customize/TemplateOptionsOption.java |   2 +-
 ...g.apache.brooklyn.api.location.LocationResolver |   4 +
 .../core/mgmt/persist/jclouds/BlobStoreTest.java   |   4 +-
 .../JcloudsBlobStoreBasedObjectStoreTest.java      |   6 +-
 .../jclouds/DefaultConnectivityResolverTest.java   |   6 +-
 .../jclouds/JcloudsLocationMetadataTest.java       |   6 +-
 ...tionReachabilityPredicateInstantiationTest.java |   8 +-
 ...cloudsLocationSuspendResumeMachineLiveTest.java |  46 +-
 .../jclouds/JcloudsStubTemplateBuilder.java        |   4 +-
 .../JcloudsTypeCoercionsWithBuilderTest.java       |   2 +-
 .../JcloudsReachableAddressStubbedTest.java        |   2 +-
 .../jclouds/provider/AwsEc2LocationLiveTest.java   |  15 +-
 logging/logback-includes/pom.xml                   |   2 +-
 .../resources/brooklyn/logback-appender-file.xml   |   6 +-
 .../brooklyn/logback-appender-jclouds.xml          |   3 +-
 .../resources/brooklyn/logback-appender-stdout.xml |   4 +-
 .../resources/brooklyn/logback-logger-excludes.xml |  13 +-
 logging/logback-xml/pom.xml                        |   2 +-
 parent/pom.xml                                     | 536 +----------
 policy/pom.xml                                     |   2 +-
 .../action/AbstractScheduledEffectorPolicy.java    |  44 +-
 .../policy/action/PeriodicEffectorPolicy.java      |   1 +
 .../policy/autoscaling/AutoScalerPolicy.java       |  16 +
 .../policy/failover/ElectPrimaryEffector.java      |  19 +-
 .../policy/failover/ElectPrimaryPolicy.java        |  39 +-
 .../policy/failover/PrimaryRunningEnricher.java    |   5 +
 policy/src/main/resources/catalog.bom              |  22 +-
 .../policy/action/PeriodicEffectorPolicyTest.java  |   8 +
 .../policy/enricher/DeltaEnrichersTests.java       |  22 +-
 .../policy/enricher/RollingMeanEnricherTest.java   |   6 +-
 .../RollingTimeWindowMeanEnricherTest.java         |  20 +-
 .../enricher/TimeFractionDeltaEnricherTest.java    |   6 +-
 .../loadbalancing/LoadBalancingModelTest.java      |   2 +-
 .../loadbalancing/LoadBalancingPolicyTest.java     |   4 +-
 pom.xml                                            | 778 ++++++++++++++--
 rest/rest-api/pom.xml                              |  18 +-
 .../org/apache/brooklyn/rest/api/AccessApi.java    |  16 +-
 .../org/apache/brooklyn/rest/api/ActivityApi.java  |  38 +-
 .../org/apache/brooklyn/rest/api/AdjunctApi.java   |  71 +-
 .../apache/brooklyn/rest/api/ApplicationApi.java   | 219 ++++-
 .../org/apache/brooklyn/rest/api/BundleApi.java    | 154 +++-
 .../org/apache/brooklyn/rest/api/CatalogApi.java   | 254 ++++--
 .../org/apache/brooklyn/rest/api/EffectorApi.java  |  12 +-
 .../org/apache/brooklyn/rest/api/EntityApi.java    | 204 ++++-
 .../apache/brooklyn/rest/api/EntityConfigApi.java  |  70 +-
 .../org/apache/brooklyn/rest/api/LocationApi.java  |  44 +-
 .../rest/api/{ScriptApi.java => LogbookApi.java}   |  42 +-
 .../org/apache/brooklyn/rest/api/LogoutApi.java    |  24 +-
 .../org/apache/brooklyn/rest/api/PolicyApi.java    |   2 +-
 .../apache/brooklyn/rest/api/PolicyConfigApi.java  |   2 +-
 .../org/apache/brooklyn/rest/api/ScriptApi.java    |  10 +-
 .../org/apache/brooklyn/rest/api/SensorApi.java    |  66 +-
 .../org/apache/brooklyn/rest/api/ServerApi.java    | 159 +++-
 .../java/org/apache/brooklyn/rest/api/TypeApi.java |  49 +-
 .../org/apache/brooklyn/rest/api/UsageApi.java     |  25 +-
 .../apache/brooklyn/rest/domain/AdjunctDetail.java |  10 +-
 .../apache/brooklyn/rest/domain/BundleSummary.java |  11 +-
 .../rest/domain/HighAvailabilitySummary.java       |   8 +-
 .../brooklyn/rest/domain/RelationSummary.java      |  72 ++
 .../apache/brooklyn/rest/domain/RelationType.java  |  79 ++
 rest/rest-resources/pom.xml                        |  30 +-
 .../org/apache/brooklyn/rest/BrooklynRestApi.java  |  42 +-
 .../org/apache/brooklyn/rest/BrooklynRestApp.java  |   2 +-
 .../apache/brooklyn/rest/BrooklynWebConfig.java    |  29 +-
 .../BrooklynSecurityProviderFilterHelper.java      | 101 ++-
 .../BrooklynSecurityProviderFilterJavax.java       |  35 +-
 .../BrooklynSecurityProviderFilterJersey.java      |  10 +-
 .../brooklyn/rest/filter/CsrfTokenFilter.java      |   9 +-
 .../rest/filter/EntitlementContextFilter.java      |  35 +-
 .../rest/filter/HaHotCheckHelperAbstract.java      |  23 +-
 .../rest/filter/HaHotCheckResourceFilter.java      |  43 +-
 .../rest/filter/LoggingResourceFilter.java         |  29 +-
 .../resources/AbstractBrooklynRestResource.java    |  64 +-
 .../brooklyn/rest/resources/AdjunctResource.java   |  11 +-
 .../brooklyn/rest/resources/ApidocResource.java    |  30 +-
 .../rest/resources/ApplicationResource.java        | 216 +++--
 .../brooklyn/rest/resources/BundleResource.java    | 102 ++-
 .../brooklyn/rest/resources/CatalogResource.java   | 131 ++-
 .../brooklyn/rest/resources/EffectorResource.java  |   6 +-
 .../rest/resources/EntityConfigResource.java       |  56 +-
 .../brooklyn/rest/resources/EntityResource.java    | 133 ++-
 .../brooklyn/rest/resources/LocationResource.java  |   3 +
 .../brooklyn/rest/resources/LogbookResource.java   |  60 ++
 .../brooklyn/rest/resources/PolicyResource.java    |  27 +-
 .../brooklyn/rest/resources/ScriptResource.java    |   2 +-
 .../brooklyn/rest/resources/SensorResource.java    |  24 +-
 .../brooklyn/rest/resources/ServerResource.java    | 232 ++++-
 .../brooklyn/rest/resources/TypeResource.java      |  21 +-
 .../provider/DelegatingSecurityProvider.java       |  29 +-
 .../security/provider/LdapSecurityProvider.java    | 209 ++++-
 .../rest/transform/ApplicationTransformer.java     |   6 +-
 .../transform/HighAvailabilityTransformer.java     |   2 +-
 .../brooklyn/rest/transform/SensorTransformer.java |   3 +-
 .../brooklyn/rest/transform/TaskTransformer.java   |   5 +-
 .../brooklyn/rest/transform/TypeTransformer.java   |  86 +-
 .../brooklyn/rest/util/DefaultExceptionMapper.java |   6 +-
 .../brooklyn/rest/util/EntityAttributesUtils.java  |  49 +
 .../brooklyn/rest/util/EntityRelationUtils.java    |  49 +
 .../rest/util/MultiSessionAttributeAdapter.java    | 356 ++++++--
 .../brooklyn/rest/util/ScannerInjectHelper.java    |   6 +-
 .../brooklyn/rest/util/WebResourceUtils.java       |   5 +-
 .../main/resources/OSGI-INF/blueprint/service.xml  |   2 +
 .../brooklyn/rest/resources/ActivityRestTest.java  |  47 +-
 .../rest/resources/AdjunctResourceTest.java        |  50 +-
 .../rest/resources/ApidocResourceTest.java         |   2 +-
 .../rest/resources/ApplicationResourceTest.java    |  82 +-
 .../rest/resources/BundleAndTypeResourcesTest.java |  41 +-
 .../rest/resources/CatalogResourceTest.java        |  23 +-
 .../rest/resources/EffectorResourceTest.java       |   4 +-
 .../rest/resources/EffectorUtilsRestTest.java      |   2 +-
 .../rest/resources/EntityConfigResourceTest.java   |  76 +-
 .../resources/EntityRelationsResourceTest.java     | 162 ++++
 .../rest/resources/EntityResourceTest.java         |  44 +-
 .../rest/resources/LocationResourceTest.java       |  51 ++
 .../rest/resources/LogbookResourceTest.java        | 219 +++++
 .../rest/resources/SensorResourceTest.java         |  33 +-
 .../provider/LdapSecurityProviderLiveTest.java     |  88 ++
 .../provider/LdapSecurityProviderTest.java         |  55 ++
 .../brooklyn/rest/testing/BrooklynRestApiTest.java |  16 +-
 .../rest/testing/BrooklynRestResourceTest.java     |  25 +-
 .../rest/testing/mocks/RestMockSimpleEntity.java   |   3 +
 .../util/json/BrooklynJacksonSerializerTest.java   | 332 ++++++-
 .../test/resources/localhost.default.location.zip  | Bin 0 -> 19629 bytes
 .../src/test/resources/logbook.log.sample          |   5 +
 rest/rest-server/pom.xml                           |  18 +-
 .../org/apache/brooklyn/rest/RestApiSetup.java     |   2 +-
 .../brooklyn/rest/filter/HaMasterCheckFilter.java  |  21 +-
 rest/rest-server/src/main/webapp/WEB-INF/web.xml   |   1 +
 .../rest/BrooklynRestApiLauncherTestFixture.java   |   5 +
 .../brooklyn/rest/api/ApplicationApiTest.java      |  89 ++
 server-cli/{LICENSE => DEPENDENCIES}               | 953 +++++++++++++++-----
 server-cli/LICENSE                                 | 794 +---------------
 server-cli/NOTICE                                  | 550 +-----------
 server-cli/pom.xml                                 |   9 +-
 .../java/org/apache/brooklyn/cli/AbstractMain.java |  10 +-
 .../org/apache/brooklyn/cli/CloudExplorer.java     |   4 +-
 .../java/org/apache/brooklyn/cli/ItemLister.java   |   4 +
 .../main/java/org/apache/brooklyn/cli/Main.java    |   2 +-
 software/base/pom.xml                              |  14 +-
 .../brooklyn/entity/brooklynnode/BrooklynNode.java |   2 +-
 .../entity/brooklynnode/BrooklynNodeImpl.java      |   4 +-
 .../entity/brooklynnode/BrooklynNodeSshDriver.java |   6 +-
 .../entity/java/JavaSoftwareProcessSshDriver.java  |   2 +-
 .../brooklyn/entity/java/JmxAttributeSensor.java   |  29 +-
 .../apache/brooklyn/entity/java/JmxSupport.java    |   6 +-
 .../brooklyn/entity/java/JmxmpSslSupport.java      |   2 +-
 .../entity/java/VanillaJavaAppSshDriver.java       |   5 +-
 .../brooklyn/entity/machine/AddMachineMetrics.java |   4 +-
 .../base/AbstractSoftwareProcessSshDriver.java     |   6 +-
 .../base/AbstractSoftwareProcessWinRmDriver.java   |  38 +-
 .../SameServerDriverLifecycleEffectorTasks.java    |   3 +-
 ...oftwareProcessDriverLifecycleEffectorTasks.java |  52 +-
 .../entity/software/base/SoftwareProcessImpl.java  |   3 -
 .../lifecycle/MachineLifecycleEffectorTasks.java   | 239 +++--
 .../software/base/lifecycle/ScriptHelper.java      |   6 +-
 .../base/lifecycle/WinRmExecuteHelper.java         |  44 +-
 .../org/apache/brooklyn/feed/jmx/JmxHelper.java    |   7 +
 .../brooklyn/tasks/kubectl/ContainerCommons.java   |  52 ++
 .../tasks/kubectl/ContainerTaskFactory.java        | 139 +++
 .../brooklyn/tasks/kubectl/DockerEffector.java     |  82 ++
 .../brooklyn/tasks/kubectl/DockerSensor.java       | 102 +++
 .../apache/brooklyn/tasks/kubectl/JobBuilder.java  | 400 +++++++++
 ...g.apache.brooklyn.api.location.LocationResolver |   4 +
 ...brooklyn.core.resolve.entity.EntitySpecResolver |   4 +
 software/base/src/main/resources/catalog.bom       |  19 +-
 .../OnTheFlyDynamicLocationPatternRebindTest.java} |   8 +-
 .../OnTheFlyDynamicLocationPatternTest.java}       |   6 +-
 .../{clocker => onthefly}/StubAttributes.java      |   2 +-
 .../{clocker => onthefly}/StubContainer.java       |   2 +-
 .../{clocker => onthefly}/StubContainerImpl.java   |   2 +-
 .../StubContainerLocation.java                     |   2 +-
 .../dynamic/{clocker => onthefly}/StubHost.java    |   2 +-
 .../{clocker => onthefly}/StubHostImpl.java        |   2 +-
 .../{clocker => onthefly}/StubHostLocation.java    |   2 +-
 .../{clocker => onthefly}/StubInfrastructure.java  |   2 +-
 .../StubInfrastructureImpl.java                    |   2 +-
 .../StubInfrastructureLocation.java                |   2 +-
 .../{clocker => onthefly}/StubResolver.java        |   2 +-
 .../{clocker => onthefly}/StubResolverTest.java    |   2 +-
 .../dynamic/{clocker => onthefly}/StubUtils.java   |   2 +-
 .../base/AbstractSoftwareProcessStreamsTest.java   |  35 +-
 .../SoftwareProcessEntityHttpFeedRebindTest.java   |   2 +-
 ...nillaSoftwareProcessStreamsIntegrationTest.java |  14 +-
 .../base/VanillaSoftwareProcessStreamsTest.java    | 146 +++
 .../VanillaWindowsProcessWinrmStreamsLiveTest.java |   4 +-
 .../SoftwareProcessLocationUnmanageTest.java       |   4 +-
 .../base/test/location/WindowsTestFixture.java     |   5 +-
 .../test/mysql/DynamicToyMySqlEntityBuilder.java   |   7 +-
 .../brooklyn/tasks/kubectl/DockerEffectorTest.java | 112 +++
 .../brooklyn/tasks/kubectl/DockerSensorTest.java   | 125 +++
 .../brooklyn/tasks/kubectl/JobBuilderTest.java     | 159 ++++
 .../org/apache/brooklyn/kubectl/sample-both.yaml   |  38 +
 .../brooklyn/kubectl/sample-effector-dev.yaml      |  34 +
 .../apache/brooklyn/kubectl/sample-effector.yaml   |  32 +
 .../org/apache/brooklyn/kubectl/sample-sensor.yaml |  30 +
 software/winrm/pom.xml                             |   7 +-
 .../core/sensor/windows/WinRmCommandSensor.java    |  51 +-
 .../windows/WindowsPerformanceCounterSensors.java  |  23 +-
 .../location/winrm/PlainWinRmExecTaskFactory.java  | 100 +++
 .../location/winrm/WinRmMachineLocation.java       | 147 ++-
 .../location/winrm/WinRmPutTaskFactory.java        | 120 +++
 .../brooklyn/location/winrm/WinRmPutTaskStub.java  |  68 ++
 .../location/winrm/WinRmPutTaskWrapper.java        | 185 ++++
 .../apache/brooklyn/location/winrm/WinRmTasks.java |  57 ++
 .../util/core/internal/winrm/WinRmTool.java        |   4 +-
 .../internal/winrm/winrm4j/PrettyXmlWriter.java    | 146 +++
 .../core/internal/winrm/winrm4j/Winrm4jTool.java   |  38 +-
 .../feed/windows/WinRmCommandSensorTest.java       |  21 +-
 .../brooklyn/feed/windows/WinRmFeedLiveTest.java   |   7 +-
 .../WindowsPerformanceCounterSensorsTest.java      |   6 +-
 .../winrm/winrm4j/PrettyXmlWriterTest.java         | 187 ++++
 test-framework/pom.xml                             |   2 +-
 test-framework/src/main/resources/catalog.bom      |   2 +-
 .../LoopOverGroupMembersTestCaseTest.java          |   7 +-
 .../test/framework/TestEndpointReachableTest.java  |   6 +-
 .../example-catalog-test.bom                       |   2 +-
 .../test-framework-examples/example-catalog.bom    |   2 +-
 test-support/pom.xml                               |   2 +-
 .../java/org/apache/brooklyn/test/LogWatcher.java  |  80 +-
 .../META-INF/services/org.testng.ITestNGListener   |  24 +-
 .../dependencies/osgi/{entities => beans}/pom.xml  |  10 +-
 .../org/apache/brooklyn/test/osgi/SampleBean.java  |  10 +-
 .../osgi/beans/src/main}/resources/catalog.bom     |   8 +-
 .../dependencies/osgi/com-example-entities/pom.xml |   2 +-
 utils/common/dependencies/osgi/entities/pom.xml    |   2 +-
 .../dependencies/osgi/more-entities-v1/pom.xml     |   2 +-
 .../osgi/more-entities-v2-evil-twin/pom.xml        |   2 +-
 .../dependencies/osgi/more-entities-v2/pom.xml     |   2 +-
 utils/common/pom.xml                               |  16 +-
 .../java/org/apache/brooklyn/config/ConfigMap.java |   8 +-
 .../core/validation/BrooklynValidation.java        | 116 +++
 .../java/org/apache/brooklyn/test/Asserts.java     | 129 ++-
 .../util/collections/CollectionFunctionals.java    |  40 +-
 .../brooklyn/util/collections/MutableList.java     |  56 +-
 .../brooklyn/util/collections/MutableMap.java      |  22 +-
 .../brooklyn/util/collections/MutableSet.java      |  12 +-
 .../brooklyn/util/exceptions/Exceptions.java       |   2 +-
 .../util/exceptions/ReferenceWithError.java        |   2 +-
 .../exceptions/RuntimeInterruptedException.java    |  12 +-
 .../brooklyn/util/guava/EmptyImmutableBiMap.java   | 133 +++
 .../java/org/apache/brooklyn/util/guava/Maybe.java | 267 +++++-
 .../org/apache/brooklyn/util/guava/TypeTokens.java | 134 ++-
 .../java/org/apache/brooklyn/util/io/FileUtil.java |  18 +
 .../org/apache/brooklyn/util/javalang/Boxing.java  |   3 +-
 .../brooklyn/util/javalang/JavaClassNames.java     |   3 +-
 .../apache/brooklyn/util/javalang/Reflections.java |  17 +-
 .../javalang/coerce/CommonAdaptorTryCoercions.java |  13 +-
 .../coerce/CommonAdaptorTypeCoercions.java         |  71 +-
 .../coerce/PrimitiveStringTypeCoercions.java       |  66 +-
 .../javalang/coerce/TypeCoercerExtensible.java     |  26 +-
 .../org/apache/brooklyn/util/net/Networking.java   |   4 +-
 .../brooklyn/util/net/UserAndHostAndPort.java      |   2 +-
 .../main/java/org/apache/brooklyn/util/os/Os.java  |  17 +
 .../apache/brooklyn/util/osgi/OsgiActivator.java   |  11 +
 .../apache/brooklyn/util/osgi/VersionedName.java   |   2 +-
 .../org/apache/brooklyn/util/ssh/BashCommands.java |  29 +-
 .../brooklyn/util/stream/InputStreamSource.java    | 109 +++
 .../brooklyn/util/stream/InputStreamSupplier.java  |  51 --
 .../apache/brooklyn/util/stream/StreamGobbler.java |  86 +-
 .../brooklyn/util/text/BrooklynVersionSyntax.java  |   6 +-
 .../apache/brooklyn/util/text/StringFunctions.java |  10 +-
 .../org/apache/brooklyn/util/text/Strings.java     |  81 +-
 .../apache/brooklyn/util/text/WildcardGlobs.java   |   6 +-
 .../org/apache/brooklyn/util/time/Duration.java    |  18 +-
 .../java/org/apache/brooklyn/util/time/Time.java   | 249 +++--
 .../org/apache/brooklyn/util/time/Timestamp.java   |  57 ++
 .../java/org/apache/brooklyn/util/yaml/Yamls.java  |  81 +-
 .../core/validation/BrooklynValidationTest.java    | 152 ++++
 .../collections/CollectionFunctionalsTest.java     |  28 +-
 .../apache/brooklyn/util/guava/TypeTokensTest.java |  47 +
 .../org/apache/brooklyn/util/io/FileUtilTest.java  |  44 +-
 .../javalang/coerce/TypeCoercerExtensibleTest.java |   3 +-
 .../util/javalang/coerce/TypeCoercionsTest.java    |  31 +-
 .../brooklyn/util/maven/MavenArtifactTest.java     |   4 +-
 .../brooklyn/util/net/UserAndHostAndPortTest.java  |   4 +-
 .../brooklyn/util/osgi/OsgiTestResources.java      |   6 +-
 .../brooklyn/util/stream/StreamGobblerTest.java    |  74 +-
 .../util/text/BrooklynVersionSyntaxTest.java       |   5 +-
 .../org/apache/brooklyn/util/text/StringsTest.java |  11 +
 .../apache/brooklyn/util/time/DurationTest.java    |  21 +-
 .../org/apache/brooklyn/util/time/TimeTest.java    |  35 +-
 .../org/apache/brooklyn/util/yaml/YamlsTest.java   |  10 +-
 .../brooklyn/files/testNoJava-0.1.0-SNAPSHOT.jar   | Bin 0 -> 1636 bytes
 .../brooklyn/files/testWithJava-0.1.0-SNAPSHOT.jar | Bin 0 -> 4436 bytes
 .../brooklyn/osgi/brooklyn-osgi-test-a_0.1.0.txt   |   2 +-
 .../brooklyn/osgi/brooklyn-test-osgi-beans.jar     | Bin 0 -> 11696 bytes
 ...st-a_0.1.0.txt => brooklyn-test-osgi-beans.txt} |   8 +-
 .../brooklyn/osgi/brooklyn-test-osgi-entities.txt  |   4 +-
 .../brooklyn-test-osgi-more-entities_0.1.0.txt     |   4 +-
 .../brooklyn-test-osgi-more-entities_0.2.0.txt     |   4 +-
 ...lyn-test-osgi-more-entities_evil-twin_0.2.0.txt |   4 +-
 utils/groovy/pom.xml                               |   2 +-
 utils/jmx/jmxmp-ssl-agent/pom.xml                  |   2 +-
 .../apache/brooklyn/util/jmx/jmxmp/JmxmpAgent.java |   5 +-
 .../brooklyn/util/jmx/jmxmp/JmxmpAgentSslTest.java |   4 +-
 utils/jmx/jmxrmi-agent/pom.xml                     |   2 +-
 utils/rest-swagger/pom.xml                         |  14 +-
 .../rest/apidoc/RestApiResourceScanner.java        | 115 ++-
 utils/rt-felix/pom.xml                             |   6 +-
 .../brooklyn/rt/felix/EmbeddedFelixFramework.java  |  23 +-
 .../org.apache.brooklyn.util.osgi.SystemFramework  |   4 +
 .../rt/felix/EmbeddedFelixFrameworkTest.java       |  15 +-
 utils/test-support/pom.xml                         |   2 +-
 .../brooklyn/test/support/VerboseReporter.java     |  11 +-
 .../resources/brooklyn/logback-appender-file.xml   |   3 +-
 .../src/main/resources/logback-test.xml            |   3 +
 832 files changed, 41278 insertions(+), 11613 deletions(-)

diff --cc camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
index f261bcaba2,ca96826a9b..f094e8a6cc
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
@@@ -79,9 -80,13 +80,14 @@@ public class BrooklynAssemblyTemplateIn
              CampPlatform platform,
              BrooklynClassLoadingContext loader,
              Set<String> encounteredTypeSymbolicNames) {
-         // during catalog install, the ID is an unhelpful random ID. but logging added there now tells us more.
-         // in most cases the ID is meaningful however, and useful for context for subsequent errors.
-         log.debug("CAMP creating application instance for {} ({})", template.getId(), template);
++
+         if (BasicBrooklynCatalog.currentlyResolvingType.get()!=null) {
+             if (log.isTraceEnabled()) {
+                 log.trace("CAMP instantiating application to resolve {} ({} / {})", BasicBrooklynCatalog.currentlyResolvingType.get(), template.getId(), CampResolver.currentlyCreatingSpec.get());
+             }
+         } else {
+             log.debug("CAMP instantiating application for {} ({})", template.getId(), CampResolver.currentlyCreatingSpec.get());
+         }
  
          // AssemblyTemplates created via PDP, _specifying_ then entities to put in
  
diff --cc core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
index 846a2879bf,304f90d93c..ade47e671d
--- 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
@@@ -131,14 -116,15 +116,18 @@@ public class BasicBrooklynCatalog imple
  
      /** Header on bundle indicating it is a wrapped BOM with no other resources */
      public static final String BROOKLYN_WRAPPED_BOM_BUNDLE = "Brooklyn-Wrapped-BOM";
+ 
      @VisibleForTesting
      public static final boolean AUTO_WRAP_CATALOG_YAML_AS_BUNDLE = true;
-     
+ 
+     /** key within brooklyn.catalog containing a map of items used to generate headers if an OSGi bundle is being produced by wrapping the YAML */
+     public static final String CATALOG_OSGI_WRAP_HEADERS = "catalog.osgi.wrap.headers";
+ 
      private static final Logger log = LoggerFactory.getLogger(BasicBrooklynCatalog.class);
  
 +    private static boolean ATTEMPT_INSTANTIATION_WITH_TYPE_PLAN_TRANSFORMERS = true;
 +    private static boolean ATTEMPT_INSTANTIATION_WITH_LEGACY_PLAN_TO_SPEC_CONVERTERS = true;
 +    
      public static class BrooklynLoaderTracker {
          public static final ThreadLocal<BrooklynClassLoadingContext> loader = new ThreadLocal<BrooklynClassLoadingContext>();
          
@@@ -791,8 -751,11 +755,12 @@@
              log.warn("Name property will be ignored due to the existence of displayName and at least one of id, symbolicName");
          }
  
-         log.debug("Processing "+Arrays.asList(id, symbolicName, displayName, name, "anonymous item").stream().filter(Strings::isNonBlank).findFirst()+" for catalog addition");
-         PlanInterpreterGuessingType planInterpreter = new PlanInterpreterGuessingType(null, item, sourceYaml, itemType, libraryBundles, resultLegacyFormat).reconstruct();
+         CharSequence loggedId = Strings.firstNonBlank(id, symbolicName, displayName, "<unidentified>");
+         log.debug("Analyzing item " + loggedId + " for addition to catalog");
+         PlanInterpreterInferringType planInterpreter = new PlanInterpreterInferringType(id, item, sourceYaml, itemType, format,
+                 (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
@@@ -998,10 -969,16 +974,16 @@@
                  sourcePlanYaml = planInterpreter.itemYaml;
              }
              
-             BasicRegisteredType type = createYetUnsavedRegisteredTypeInstance(RegisteredTypeKind.UNRESOLVED, symbolicName, version, 
 -            BasicTypeImplementationPlan plan = new BasicTypeImplementationPlan(format, sourcePlanYaml);
 -            BasicRegisteredType type = (BasicRegisteredType) RegisteredTypes.newInstance(
++
++            BasicRegisteredType type = createYetUnsavedRegisteredTypeInstance(
+                     BrooklynObjectType.of(planInterpreter.catalogItemType).getSpecType()!=null ? RegisteredTypeKind.SPEC
+                             : planInterpreter.catalogItemType==CatalogItemType.BEAN ? RegisteredTypeKind.BEAN
+                             : RegisteredTypeKind.UNRESOLVED,
 -                symbolicName, version, plan,
 -                superTypes, aliases, tags, containingBundle==null ? null : containingBundle.getVersionedName().toString(), 
 -                MutableList.<OsgiBundleWithUrl>copyOf(libraryBundles), 
 -                displayName, description, catalogIconUrl, catalogDeprecated, catalogDisabled);
 -            RegisteredTypes.notePlanEquivalentToThis(type, plan);
++                    symbolicName, version,
 +                    containingBundle, libraryBundles, 
 +                    displayName, description, catalogIconUrl, catalogDeprecated, sourcePlanYaml, 
 +                    tags, aliases, catalogDisabled, superTypes, format);
++
              // record original source in case it was changed
              RegisteredTypes.notePlanEquivalentToThis(type, new BasicTypeImplementationPlan(format, sourceYaml));
              
@@@ -1029,25 -1008,49 +1013,67 @@@
          }
      }
  
 +    private BasicRegisteredType createYetUnsavedRegisteredTypeInstance(
-         RegisteredTypeKind kind,
-         String symbolicName, String version,  
-         ManagedBundle containingBundle, Collection<CatalogBundle> libraryBundles, 
-         String displayName, String description,
-         String catalogIconUrl, final Boolean catalogDeprecated, String sourcePlanYaml, Set<Object> tags, List<String> aliases,
-         Boolean catalogDisabled, MutableList<Object> superTypes, String format) 
-     {
++            RegisteredTypeKind kind,
++            String symbolicName, String version,
++            ManagedBundle containingBundle, Collection<CatalogBundle> libraryBundles,
++            String displayName, String description,
++            String catalogIconUrl, final Boolean catalogDeprecated, String sourcePlanYaml, Set<Object> tags, List<String> aliases,
++            Boolean catalogDisabled, MutableList<Object> superTypes, String format) {
 +        BasicTypeImplementationPlan plan = new BasicTypeImplementationPlan(format, sourcePlanYaml);
 +        BasicRegisteredType type = (BasicRegisteredType) RegisteredTypes.newInstance(
-             kind,
-             symbolicName, version, plan,
-             superTypes, aliases, tags, containingBundle==null ? null : containingBundle.getVersionedName().toString(), 
-             MutableList.<OsgiBundleWithUrl>copyOf(libraryBundles), 
-             displayName, description, catalogIconUrl, catalogDeprecated, catalogDisabled);
++                kind,
++                symbolicName, version, plan,
++                superTypes, aliases, tags, containingBundle == null ? null : containingBundle.getVersionedName().toString(),
++                MutableList.<OsgiBundleWithUrl>copyOf(libraryBundles),
++                displayName, description, catalogIconUrl, catalogDeprecated, catalogDisabled);
 +        RegisteredTypes.notePlanEquivalentToThis(type, plan);
 +        return type;
 +    }
 +
+     private void addLegacyScannedAnnotations(ManagedBundle containingBundle, List<CatalogItemDtoAbstract<?, ?>> resultLegacyFormat, Map<RegisteredType, RegisteredType> resultNewFormat, int depth, Map<Object, Object> catalogMetadata, Collection<CatalogBundle> librariesAddedHereBundles, Collection<CatalogBundle> libraryBundles) {
+         log.warn("Deprecated use of scanJavaAnnotations" + (containingBundle != null ? " in bundle " + containingBundle.getVersionedName() : ""));
+ 
+         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");
+                 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"
+                 if (containingBundle !=null && !containingBundle.getSymbolicName().contains("brooklyn-default-catalog")) {
+                     // a user uplaoded a BOM trying to tell us to do a local java scan; previously supported but becoming unsupported
+                     log.warn("Deprecated use of scanJavaAnnotations in non-Java BOM outwith the default catalog setup");
+                 } else if (depth >0) {
+                     // 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");
+                 }
+                 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 (resultLegacyFormat !=null) {
+                     resultLegacyFormat.addAll( scanResult );
+                 } else {
+                     // not returning a result; we need to add here, as type
+                     for (CatalogItem item: scanResult) {
+                         RegisteredType replacedInstance = mgmt.getTypeRegistry().get(item.getSymbolicName(), item.getVersion());
+                         mgmt.getCatalog().addItem(item);
+                         RegisteredType newInstance = mgmt.getTypeRegistry().get(item.getSymbolicName(), item.getVersion());
+                         updateResultNewFormat(resultNewFormat, replacedInstance, newInstance);
+                     }
+                 }
+             }
+         } else {
+             throw new IllegalArgumentException("Scanning for Java annotations is not supported in BOMs in bundles; "
+                 + "entries should be listed explicitly in the catalog.bom");
+         }
+     }
+ 
      private void updateResultNewFormat(Map<RegisteredType, RegisteredType> resultNewFormat, RegisteredType replacedInstance,
          RegisteredType newInstance) {
          if (resultNewFormat!=null) {
@@@ -1283,26 -1298,179 +1321,179 @@@
              this.itemsDefinedSoFar = itemsDefinedSoFar;
          }
  
-         public PlanInterpreterGuessingType reconstruct() {
-             if (catalogItemType==CatalogItemType.TEMPLATE) {
-                 // template *must* be explicitly defined, and if so, none of the other calls apply
-                 attemptType(CatalogItemType.TEMPLATE, null, true);
-                 
-             } else {
-                 // try all types; attemptTpe will ignore non-matches if catalogItemType is already specified
-                 attemptType(CatalogItemType.ENTITY, "services", true);
-                 attemptType(CatalogItemType.POLICY, POLICIES_KEY, false);
-                 attemptType(CatalogItemType.ENRICHER, ENRICHERS_KEY, false);
-                 attemptType(CatalogItemType.LOCATION, LOCATIONS_KEY, false);
+         public PlanInterpreterInferringType resolve() {
+             try {
+                 currentlyResolvingType.set(Strings.isBlank(itemId) ? itemYaml : itemId);
+ 
+                 Maybe<Object> transformedResult = attemptPlanTranformer();
+                 boolean onlyNewStyleTransformer = format != null || catalogItemType == CatalogItemType.BEAN;
+                 if (transformedResult.isPresent() || onlyNewStyleTransformer) {
+                     planYaml = itemYaml;
+                     resolved = transformedResult.isPresent() || catalogItemType == CatalogItemType.TEMPLATE;
+                     if (!resolved) {
+                         errors.add(Maybe.Absent.getException(transformedResult));
+                     }
+                     if (resolved && catalogItemType != CatalogItemType.BEAN && catalogItemType != CatalogItemType.TEMPLATE &&
+                             (format==null || !"brooklyn-camp".equals(format))) {
+                         // for spec types, _also_ run the legacy resolution because it is better at spotting some types of errors (recursive ones);
+                         // note this code will also run if there was an error when format was specified (other than bean-with-type) and we couldn't determine it was a bean
+                         resolved = false;
+                         attemptLegacySpecTransformersForVariousSpecTypes();
+                     }
+                     return this;
+                 }
+ 
+                 // for now, these are the lowest-priority errors (reported after the others)
+                 transformerErrors.add(((Maybe.Absent) transformedResult).getException());
+ 
+                 if (catalogItemType == CatalogItemType.TEMPLATE) {
+                     // template *must* be explicitly specified as item type, and if so, the "various" methods below don't apply,
+                     // and we always mark it as resolved.  (probably not necessary to do any of the transformers!)
 -                    attemptLegacySpecTransformersForType(null, CatalogItemType.TEMPLATE);
++                    attemptLegacySpecTransformersForType(CatalogItemType.TEMPLATE);
+                     if (!resolved) {
+                         // anything goes, for an explicit template, because we can't easily recurse into the types
+                         planYaml = itemYaml;
+                         resolved = true;
+                     }
+                     return this;
+                 }
+ 
+                 // couldn't resolve it with the plan transformers; retry with legacy "spec" transformers.
+                 // TODO this legacy path is still needed where an entity is declared with nice abbreviated 'type: xxx' syntax, not the full-camp 'services: [ { type: xxx } ]' syntax.
+                 // would be nice to move that logic internally to CAMP and see if we can remove this altogether.
+                 // (see org.apache.brooklyn.camp.brooklyn.spi.creation.CampResolver.createEntitySpecFromServicesBlock )
+                 if (format == null) {
+                     attemptLegacySpecTransformersForVariousSpecTypes();
+                 }
+ 
+                 return this;
+             } finally {
+                 currentlyResolvingType.remove();
              }
-             
-             if (!resolved && catalogItemType==CatalogItemType.TEMPLATE) {
-                 // anything goes, for an explicit template, because we can't easily recurse into the types
-                 planYaml = itemYaml;
-                 resolved = true;
+         }
+ 
+         private void attemptLegacySpecTransformersForVariousSpecTypes() {
 -            attemptLegacySpecTransformersForType(null, CatalogItemType.ENTITY);
++            attemptLegacySpecTransformersForType(CatalogItemType.ENTITY);
+ 
+             List<Exception> oldEntityErrors = MutableList.copyOf(entityErrors);
+             // try with services key
 -            attemptLegacySpecTransformersForType("services", CatalogItemType.ENTITY);
++            attemptLegacySpecTransformersForType(CatalogItemType.ENTITY, "services", false);
+             entityErrors.removeAll(oldEntityErrors);
+             entityErrors.addAll(oldEntityErrors);
+             // errors when wrapped in services block are better currently
+             // as we parse using CAMP and need that
+             // so prefer those for now (may change with YOML)
+ 
 -            attemptLegacySpecTransformersForType(POLICIES_KEY, CatalogItemType.POLICY, true);
 -            attemptLegacySpecTransformersForType(ENRICHERS_KEY, CatalogItemType.ENRICHER, true);
 -            attemptLegacySpecTransformersForType(LOCATIONS_KEY, CatalogItemType.LOCATION, true);
++            attemptLegacySpecTransformersForType(CatalogItemType.POLICY, POLICIES_KEY, true);
++            attemptLegacySpecTransformersForType(CatalogItemType.ENRICHER, ENRICHERS_KEY, true);
++            attemptLegacySpecTransformersForType(CatalogItemType.LOCATION, LOCATIONS_KEY, true);
+         }
+ 
+         boolean suspicionOfABean = false;
+ 
+         private Maybe<Object> attemptPlanTranformer() {
+             MutableSet<Throwable> exceptions = MutableSet.<Throwable>of();
+             try {
+                 suspicionOfABean = false;
+ 
+                 Set<? extends OsgiBundleWithUrl> searchBundles = MutableSet.copyOf(libraryBundles)
+                         .putIfNotNull(containingBundle);
+                 BrooklynClassLoadingContext loader = new OsgiBrooklynClassLoadingContext(mgmt, null, searchBundles);
+                 if (catalogItemType == null) {
+                     // attempt to detect whether it is a bean
+                     Object type = item.get("type");
+                     if (type!=null && type instanceof String) {
+                         TypeToken<?> clz = new BrooklynTypeNameResolver((String)type, loader, false, true)
+                                 .findTypeToken((String) type).orNull();
+                         if (clz!=null) {
+                             if (!BrooklynObject.class.isAssignableFrom(TypeTokens.getRawRawType(clz))) {
+                                 suspicionOfABean = true;
+                             }
+                         }
+                     }
+                 }
+ 
+                 if (constraint==null) {
+                     constraint = RegisteredTypeLoadingContexts.loaderAlreadyEncountered(loader, null, itemId);
+                 } else {
+                     constraint = RegisteredTypeLoadingContexts.withLoader(constraint, loader);
+                     constraint = RegisteredTypeLoadingContexts.withEncounteredItem(constraint, itemId);
+                 }
+ 
+                 Object t = null;
+                 boolean triedBean = false;
+                 // try as bean first if signs are auspicious
+                 if (catalogItemType == CatalogItemType.BEAN || suspicionOfABean) {
+                     try {
+                         triedBean = true;
+                         t = mgmt.getTypeRegistry().createBeanFromPlan(format, itemYaml, constraint, null);
+                         catalogItemType = CatalogItemType.BEAN;
+                     } catch (Exception e) {
+                         Exceptions.propagateIfFatal(e);
+                         exceptions.add(e);
+                     }
+                 }
+ 
+                 // then try as spec unless known to be a bean
+                 if (catalogItemType != CatalogItemType.BEAN && t==null) {
+                     try {
+                         t = mgmt.getTypeRegistry().createSpecFromPlan(format, itemYaml, constraint,
+                                 BrooklynObjectType.of(catalogItemType).getSpecType());
+                         if (catalogItemType == null) {
+                             catalogItemType = CatalogItemType.ofSpecClass(BrooklynObjectType.of(t.getClass()).getSpecType());
+                         }
+                     } catch (Exception e) {
+                         Exceptions.propagateIfFatal(e);
+                         exceptions.add(e);
+                     }
+                 }
+ 
+                 // lastly try as bean if we haven't already and it is not known to be a spec (ie if item type is unknown)
+                 if (catalogItemType==null && t==null && !triedBean) {
+                     try {
+                         triedBean = true;
+                         t = mgmt.getTypeRegistry().createBeanFromPlan(format, itemYaml, constraint, null);
+                         if (format==null && isDubiousBeanType(t)) {
+                             // doesn't look like a bean
+                             // probably we want to set this - but was omitted previously; added 2022-05
+                             t = null;
+                         } else {
+                             catalogItemType = CatalogItemType.BEAN;
+                         }
+                     } catch (Exception e) {
+                         Exceptions.propagateIfFatal(e);
+                         if (!exceptions.isEmpty()
+                                 && Exceptions.getFirstThrowableOfType(exceptions.iterator().next(), UnsupportedTypePlanException.class)!=null
+                                 && Exceptions.getFirstThrowableOfType(e, UnsupportedTypePlanException.class)==null) {
+                             // put it first if spec is unsupported but bean is supported
+                             MutableSet<Throwable> e2 = MutableSet.<Throwable>of(e).putAll(exceptions);
+                             exceptions.clear();
+                             exceptions.addAll(e2);
+                         } else {
+                             exceptions.add(e);
+                         }
+                     }
+                 }
+ 
+                 if (t!=null) {
+                     resolved = true;
+                     return Maybe.of(t);
+                 }
+ 
+ 
+             } catch (Exception e) {
+                 Exceptions.propagateIfFatal(e);
+                 exceptions.add(e);
              }
-             
-             return this;
+ 
+             if (exceptions.isEmpty()) exceptions.add(new IllegalStateException("Type registry creation returned null"));
+ 
+             return Maybe.absent(
+                     () ->
+                         Exceptions.create("Unable to transform definition of "+
+                             (itemId!=null ? itemId : "plan:\n"+itemYaml+"\n"),
+                             exceptions)
+             );
          }
  
          public boolean isResolved() { return resolved; }
@@@ -1321,29 -1496,31 +1519,28 @@@
          public String getPlanYaml() {
              return planYaml;
          }
--        
-         private boolean attemptType(CatalogItemType candidateCiType, String optionalKeyForModifyingYaml, boolean tryWithoutOptionalKey) {
-             if (resolved) {
-                 return false;
-             }
-             if (catalogItemType!=null && catalogItemType!=candidateCiType) {
-                 return false;
-             }
-             
 -        private boolean attemptLegacySpecTransformersForType(String key, CatalogItemType candidateCiType) {
 -            return attemptLegacySpecTransformersForType(key, candidateCiType, false);
 -        }
+ 
 -        private boolean attemptLegacySpecTransformersForType(String key, CatalogItemType candidateCiType, boolean requireKeyAdded) {
++        private boolean attemptLegacySpecTransformersForType(CatalogItemType candidateCiType) {
++            return attemptLegacySpecTransformersForType(candidateCiType, null, false);
++        }
++        private boolean attemptLegacySpecTransformersForType(CatalogItemType candidateCiType, String optionalKeyForModifyingYaml, boolean tryWithoutOptionalKey) {
+             if (resolved) return false;
+             if (catalogItemType!=null && catalogItemType!=candidateCiType) return false;
+ 
 -            final String candidateYaml;
 -            boolean keyAdded = false;
 -            if (key==null) {
 -                candidateYaml = itemYaml;
 -            } else if (item.containsKey(key)) {
 -                candidateYaml = itemYaml;
 -            } else {
 -                candidateYaml = key + ":\n" + makeAsIndentedList(itemYaml);
 -                keyAdded = true;
 +            String candidateYamlWithKeyAdded = null;;
 +            if (optionalKeyForModifyingYaml!=null) {
 +                /* often when added to a catalog we simply say "type: xxx" for the definition;
 +                 * the services: parent key at root (or brooklyn.policies, etc) needed by the camp parser
 +                 * are implicit, and added here */
 +                if (item.containsKey(optionalKeyForModifyingYaml)) {
 +                    optionalKeyForModifyingYaml = null;
 +                    tryWithoutOptionalKey = true;
 +                } else {
 +                    candidateYamlWithKeyAdded = optionalKeyForModifyingYaml + ":\n" + makeAsIndentedList(itemYaml);
 +                }
              }
-             
+ 
              String type = (String) item.get("type");
 -            if (type!=null && requireKeyAdded && !keyAdded) {
 -                return false;
 -            }
 -
              if (itemsDefinedSoFar!=null) {
                  // first look in collected items, if a key is given
                  
@@@ -1361,87 -1538,16 +1558,86 @@@
                  }
              }
              
 +            if (tryWithoutOptionalKey || candidateYamlWithKeyAdded==null) {
 +                if (attemptTypeInstantiation("normal", candidateCiType, itemYaml, false, null, type)) {
 +                    return true;
 +                }
 +                
 +                // also try legacy
 +                if (attemptTypeInstantiation("legacy", candidateCiType, itemYaml, true, null, type)) {
 +                    return true;
 +                }
-                 
 +            }
 +            
 +            if (candidateYamlWithKeyAdded!=null) {
 +                // try with services key (or other key)
 +                
 +                // this gives better errors, so put these first  
 +                // (it is only possible that this block and the above block both run if it is ENTITY type;
 +                // so safe to assume entityErrors here)
 +                MutableList<Exception> oldEntityErrors = MutableList.copyOf(entityErrors);
 +                entityErrors.clear();
 +    
 +                if (attemptTypeInstantiation("normal with key '"+optionalKeyForModifyingYaml+"'", candidateCiType, candidateYamlWithKeyAdded, false, optionalKeyForModifyingYaml, type)) {
 +                    return true;
 +                }
 +                
 +                // try legacy
 +                if (attemptTypeInstantiation("legacy with key '"+optionalKeyForModifyingYaml+"'", candidateCiType, candidateYamlWithKeyAdded, true, optionalKeyForModifyingYaml, type)) {
 +                    return true;
 +                }
 +                
 +                entityErrors.addAll(oldEntityErrors);
 +            }
 +            
 +            return false;
 +        }
 +        
 +        private boolean attemptTypeInstantiation(String context, CatalogItemType candidateCiType, String candidateYaml, boolean tryAsLegacy, String optionalKeyForModifyingYaml, String typeIfOptionalKeySupplied) {
 +            
              // then try parsing plan - this will use loader
 +            // first use transformer approach
              try {
 -                @SuppressWarnings("rawtypes")
 -                CatalogItem itemToAttempt = createItemBuilder(candidateCiType, getIdWithRandomDefault(), DEFAULT_VERSION)
 -                    .plan(candidateYaml)
 -                    .libraries(libraryBundles)
 -                    .build();
 -                @SuppressWarnings("unchecked")
 -                AbstractBrooklynObjectSpec<?, ?> spec = internalCreateSpecLegacy(mgmt, itemToAttempt, MutableSet.<String>of(), true);
 -                if (spec!=null) {
 +                Object itemToAttemptO = null;
 +                Object itemSpecInstantiated = null;
 +                
 +                if (tryAsLegacy) {
 +                    if (ATTEMPT_INSTANTIATION_WITH_LEGACY_PLAN_TO_SPEC_CONVERTERS) {
 +                        // deprecated old style
 +                        @SuppressWarnings("rawtypes")
 +                        CatalogItem itemToAttempt = createItemBuilder(candidateCiType, getIdWithRandomDefault(), DEFAULT_VERSION)
 +                            .plan(candidateYaml)
 +                            .libraries(libraryBundles)
 +                            .build();
 +                        itemToAttemptO = itemToAttempt;
 +                        
 +                        itemSpecInstantiated = internalCreateSpecLegacy(mgmt, itemToAttempt, MutableSet.<String>of(), true);
 +
 +                        if (ATTEMPT_INSTANTIATION_WITH_TYPE_PLAN_TRANSFORMERS) {
 +                            log.warn("Instantiation of this blueprint was only possible with legacy plan-to-spec converter, will likely not be supported in future versions:\n"+candidateYaml);
 +                        }
 +                    }
 +                    
 +                } else {
 +                    if (ATTEMPT_INSTANTIATION_WITH_TYPE_PLAN_TRANSFORMERS) {
 +                        // preferred, new style
 +                        BasicRegisteredType itemToAttempt = createYetUnsavedRegisteredTypeInstance(
 +                            // RegisteredTypeKind
 +                            RegisteredTypeKind.SPEC, getIdWithRandomDefault(), DEFAULT_VERSION,
 +                            /* containing bundle */ null, libraryBundles, 
 +                            // displayName, description, catalogIconUrl, deprecated, yaml
 +                            null, null, null, false, candidateYaml, 
 +                            // tags, aliases, catalogDisabled, superTypes, format 
 +                            null, null, false, MutableList.of(BrooklynObjectType.of(candidateCiType).getInterfaceType()), null
 +                            );
 +                        itemToAttemptO = itemToAttempt;
 +                        
 +                        itemSpecInstantiated = mgmt.getTypeRegistry().create(itemToAttempt, null, null);
 +                    }
 +                    
 +                }
 +                
 +                if (itemSpecInstantiated!=null) {
                      catalogItemType = candidateCiType;
                      planYaml = candidateYaml;
                      resolved = true;
@@@ -1851,11 -1911,15 +2037,17 @@@
              // but do not allow this to run if we are expanding a nested definition as that may fail to find recursive loops
              // (the legacy routines this uses don't support that type of context)
              String yaml = RegisteredTypes.getImplementationDataStringForSpec(typeToValidate);
 +            log.trace("Validating {}: \n{}", typeToValidate, yaml);
 +            
-             PlanInterpreterGuessingType guesser = new PlanInterpreterGuessingType(typeToValidate.getSymbolicName(), Iterables.getOnlyElement( Yamls.parseAll(yaml) ), 
-                 yaml, null, CatalogItemDtoAbstract.parseLibraries( typeToValidate.getLibraries() ), null);
-             guesser.reconstruct();
+             CatalogBundle bundle = typeToValidate.getContainingBundle() != null ? CatalogItemDtoAbstract.parseLibraries(Arrays.asList(typeToValidate.getContainingBundle())).iterator().next() : null;
+             CatalogItemType itemType = boType!=null ? CatalogItemType.ofTargetClass(boType.getInterfaceType()) : null;
+             if (itemType==null && typeToValidate.getKind() == RegisteredTypeKind.BEAN) {
+                 itemType = CatalogItemType.BEAN;
+             }
+             String format = typeToValidate.getPlan().getPlanFormat();
+             PlanInterpreterInferringType guesser = new PlanInterpreterInferringType(typeToValidate.getSymbolicName(), Iterables.getOnlyElement( Yamls.parseAll(yaml) ),
+                 yaml, itemType, format, bundle, CatalogItemDtoAbstract.parseLibraries( typeToValidate.getLibraries() ), constraint, null);
+             guesser.resolve();
              guesserErrors.addAll(guesser.getErrors());
              
              if (guesser.isResolved()) {
@@@ -1889,9 -1952,8 +2081,9 @@@
                  }
                  
                  if (changedSomething) {
 +                    log.debug("Re-resolving "+resultT+" following detection of change");
                      // try again with new plan or supertype info
-                     return resolve(resultT, constraint);
+                     return validateResolve(resultT, constraint);
                      
                  } else if (Objects.equal(boType, BrooklynObjectType.of(ciType))) {
                      if (specError==null) {
@@@ -1915,8 -1977,7 +2107,8 @@@
          if (resultO!=null && resultT!=null) {
              if (resultO instanceof BrooklynObject) {
                  // if it was a bean that points at a BO then switch it to a spec and try to re-validate
 +                log.debug("Re-resolving "+resultT+" following detection of bean where spec was expected");
-                 return resolve(RegisteredTypes.copyResolved(RegisteredTypeKind.SPEC, typeToValidate), constraint);
+                 return validateResolve(RegisteredTypes.copyResolved(RegisteredTypeKind.SPEC, typeToValidate), constraint);
              }
              Class<?> resultS;
              if (resultT.getKind() == RegisteredTypeKind.SPEC) {