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:15 UTC

[brooklyn-server] branch master updated (c0e3976129 -> b534ce6545)

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

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


    from c0e3976129 fix failing docker/kubectl cli test
     add e2cf30e1fb refactor catalog instantiation, with better logging
     add e10cf842c1 more logging, and remove deprecated code
     new 48e3cf17f9 Merge branch 'master' into tidy-instantiation
     new 6379e9573e remove redundant non-legacy attempt
     new b534ce6545 Merge branch 'tidy-instantiation'

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../BrooklynAssemblyTemplateInstantiator.java      |   1 +
 .../brooklyn/catalog/CatalogYamlEntityTest.java    |   2 +
 .../catalog/internal/BasicBrooklynCatalog.java     | 215 ++++++++++++++-------
 .../brooklyn/rest/resources/TypeResource.java      |   2 +-
 4 files changed, 154 insertions(+), 66 deletions(-)


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

Posted by he...@apache.org.
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 b534ce654560c628514830f5c2b49773bf45cc6a
Merge: c0e3976129 6379e9573e
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Mon Jun 27 17:48:08 2022 +0100

    Merge branch 'tidy-instantiation'

 .../BrooklynAssemblyTemplateInstantiator.java      |   1 +
 .../brooklyn/catalog/CatalogYamlEntityTest.java    |   2 +
 .../catalog/internal/BasicBrooklynCatalog.java     | 215 ++++++++++++++-------
 .../brooklyn/rest/resources/TypeResource.java      |   2 +-
 4 files changed, 154 insertions(+), 66 deletions(-)


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

Posted by he...@apache.org.
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) {


[brooklyn-server] 02/03: remove redundant non-legacy attempt

Posted by he...@apache.org.
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 6379e9573e6156ed5d591fd0668b2e5f94d8075e
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Mon Jun 27 17:09:36 2022 +0100

    remove redundant non-legacy attempt
    
    introduced a while ago in this branch, but meanwhile inserted earlier in the process
---
 .../catalog/internal/BasicBrooklynCatalog.java     | 138 +++++++--------------
 1 file changed, 45 insertions(+), 93 deletions(-)

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 ade47e671d..acd86db3cf 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
@@ -125,7 +125,6 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
 
     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 {
@@ -1325,7 +1324,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
             try {
                 currentlyResolvingType.set(Strings.isBlank(itemId) ? itemYaml : itemId);
 
-                Maybe<Object> transformedResult = attemptPlanTranformer();
+                Maybe<Object> transformedResult = attemptPlanTransformer();
                 boolean onlyNewStyleTransformer = format != null || catalogItemType == CatalogItemType.BEAN;
                 if (transformedResult.isPresent() || onlyNewStyleTransformer) {
                     planYaml = itemYaml;
@@ -1377,22 +1376,22 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
 
             List<Exception> oldEntityErrors = MutableList.copyOf(entityErrors);
             // try with services key
-            attemptLegacySpecTransformersForType(CatalogItemType.ENTITY, "services", false);
+            attemptLegacySpecTransformersForType(CatalogItemType.ENTITY, "services");
             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(CatalogItemType.POLICY, POLICIES_KEY, true);
-            attemptLegacySpecTransformersForType(CatalogItemType.ENRICHER, ENRICHERS_KEY, true);
-            attemptLegacySpecTransformersForType(CatalogItemType.LOCATION, LOCATIONS_KEY, true);
+            attemptLegacySpecTransformersForType(CatalogItemType.POLICY, POLICIES_KEY);
+            attemptLegacySpecTransformersForType(CatalogItemType.ENRICHER, ENRICHERS_KEY);
+            attemptLegacySpecTransformersForType(CatalogItemType.LOCATION, LOCATIONS_KEY);
         }
 
         boolean suspicionOfABean = false;
 
-        private Maybe<Object> attemptPlanTranformer() {
-            MutableSet<Throwable> exceptions = MutableSet.<Throwable>of();
+        private Maybe<Object> attemptPlanTransformer() {
+            MutableSet<Throwable> exceptions = MutableSet.of();
             try {
                 suspicionOfABean = false;
 
@@ -1402,7 +1401,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                 if (catalogItemType == null) {
                     // attempt to detect whether it is a bean
                     Object type = item.get("type");
-                    if (type!=null && type instanceof String) {
+                    if (type instanceof String) {
                         TypeToken<?> clz = new BrooklynTypeNameResolver((String)type, loader, false, true)
                                 .findTypeToken((String) type).orNull();
                         if (clz!=null) {
@@ -1521,24 +1520,28 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         }
 
         private boolean attemptLegacySpecTransformersForType(CatalogItemType candidateCiType) {
-            return attemptLegacySpecTransformersForType(candidateCiType, null, false);
+            return attemptLegacySpecTransformersForType(candidateCiType, null);
         }
-        private boolean attemptLegacySpecTransformersForType(CatalogItemType candidateCiType, String optionalKeyForModifyingYaml, boolean tryWithoutOptionalKey) {
+        private boolean attemptLegacySpecTransformersForType(CatalogItemType candidateCiType, String optionalKeyForModifyingYaml) {
             if (resolved) return false;
             if (catalogItemType!=null && catalogItemType!=candidateCiType) return false;
 
-            String candidateYamlWithKeyAdded = null;;
+            String candidateYamlWithKeyAdded = null;
+            boolean legacyModeForOriginalBlueprint;
             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;
+                    legacyModeForOriginalBlueprint = true;
                 } else {
                     candidateYamlWithKeyAdded = optionalKeyForModifyingYaml + ":\n" + makeAsIndentedList(itemYaml);
+                    legacyModeForOriginalBlueprint = false;
                 }
-            }
+            } else {
+                legacyModeForOriginalBlueprint = true;
+            };
 
             String type = (String) item.get("type");
             if (itemsDefinedSoFar!=null) {
@@ -1558,13 +1561,9 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                 }
             }
             
-            if (tryWithoutOptionalKey || candidateYamlWithKeyAdded==null) {
-                if (attemptTypeInstantiation("normal", candidateCiType, itemYaml, false, null, type)) {
-                    return true;
-                }
-                
+            if (legacyModeForOriginalBlueprint) {
                 // also try legacy
-                if (attemptTypeInstantiation("legacy", candidateCiType, itemYaml, true, null, type)) {
+                if (attemptLegacyTypeInstantiation("legacy", candidateCiType, itemYaml, null, type)) {
                     return true;
                 }
             }
@@ -1578,12 +1577,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                 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)) {
+                if (attemptLegacyTypeInstantiation("legacy with key '"+optionalKeyForModifyingYaml+"'", candidateCiType, candidateYamlWithKeyAdded, optionalKeyForModifyingYaml, type)) {
                     return true;
                 }
                 
@@ -1593,7 +1587,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
             return false;
         }
         
-        private boolean attemptTypeInstantiation(String context, CatalogItemType candidateCiType, String candidateYaml, boolean tryAsLegacy, String optionalKeyForModifyingYaml, String typeIfOptionalKeySupplied) {
+        private boolean attemptLegacyTypeInstantiation(String context, CatalogItemType candidateCiType, String candidateYaml, String optionalKeyForModifyingYaml, String typeIfOptionalKeySupplied) {
             
             // then try parsing plan - this will use loader
             // first use transformer approach
@@ -1601,42 +1595,20 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                 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 (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);
+
+                    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);
                 }
-                
+
                 if (itemSpecInstantiated!=null) {
                     catalogItemType = candidateCiType;
                     planYaml = candidateYaml;
@@ -1676,35 +1648,18 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                     String cutDownYaml = optionalKeyForModifyingYaml + ":\n" + makeAsIndentedList("type: "+typeIfOptionalKeySupplied);
                     
                     Object cutdownSpecInstantiated = null;
-                    if (tryAsLegacy) {
-                        if (ATTEMPT_INSTANTIATION_WITH_LEGACY_PLAN_TO_SPEC_CONVERTERS) {
-                            @SuppressWarnings("rawtypes")
-                            CatalogItem itemToAttempt = createItemBuilder(candidateCiType, getIdWithRandomDefault(), DEFAULT_VERSION)
-                                    .plan(cutDownYaml)
-                                    .libraries(libraryBundles)
-                                    .build();
-                            cutdownSpecInstantiated = internalCreateSpecLegacy(mgmt, itemToAttempt, MutableSet.<String>of(), true);
-                            if (ATTEMPT_INSTANTIATION_WITH_TYPE_PLAN_TRANSFORMERS) {
-                                log.warn("Instantiation of this cut-down 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.SPEC, getIdWithRandomDefault(), DEFAULT_VERSION,
-                                /* containing bundle */ null, 
-                                libraryBundles, 
-                                // displayName, description, catalogIconUrl, deprecated, yaml
-                                null, null, null, false, cutDownYaml, 
-                                // tags, aliases, catalogDisabled, superTypes, format 
-                                null, null, false, MutableList.of(BrooklynObjectType.of(candidateCiType).getInterfaceType()), null);
-
-                            cutdownSpecInstantiated = mgmt.getTypeRegistry().create(itemToAttempt, null, null);
-                        }
+                    if (ATTEMPT_INSTANTIATION_WITH_LEGACY_PLAN_TO_SPEC_CONVERTERS) {
+                        @SuppressWarnings("rawtypes")
+                        CatalogItem itemToAttempt = createItemBuilder(candidateCiType, getIdWithRandomDefault(), DEFAULT_VERSION)
+                                .plan(cutDownYaml)
+                                .libraries(libraryBundles)
+                                .build();
+                        cutdownSpecInstantiated = internalCreateSpecLegacy(mgmt, itemToAttempt, MutableSet.<String>of(), true);
+
+                        log.warn("Instantiation of this cut-down blueprint was only possible with legacy plan-to-spec converter, will likely not be supported in future versions:\n"+candidateYaml);
                     }
-                    
+
                     if (cutdownSpecInstantiated!=null) {
                         log.debug("Instantiation of this blueprint was only possible using cut-down syntax; assuming dependencies on other items. May resolve subsequently or may cause errors when used:\n"+candidateYaml);
                         
@@ -1721,10 +1676,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
                     Exceptions.propagateIfFatal(e);
                 }
             }
-            // FIXME we should lookup type in the catalog on its own, then infer the type from that,
-            // and give proper errors (right now e.g. if there are no transformers then we bail out 
-            // with very little information)
-            
+
             return false;
         }