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 2021/05/27 18:20:52 UTC

[brooklyn-server] branch master updated (f07efeb -> 9221c54)

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 f07efeb  This closes #1176
     new 74f61cf  Added decorateWithHierarchySpecTag(..) method to be used to create spec tags when deployign blueprints
     new aa95afa  Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag
     new daba0bb  added customizable summary
     new 54aa018  Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag
     new 150bee1  Merge branch 'master' into spec-hierarchy-tag
     new 6938a98  Added option to populate the display name with the spec name if missing
     new e184653  Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag
     new 0a33ad6   Added API impl
     new d0d8fdf  Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag
     new 1a2be8d  Made sure there are not plans with duplicate summaries
     new 79b1a83  Added support for SpecTags and creation for types when added to the catalog
     new db93ff8  Added argument for custom summary
     new 77c23ea  Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag
     new fbd7391  Fixed tests and implementation to support other map tags
     new 1c8e7ef  This closes #1175
     new daf623c  fix unneeded (and unavail for me) imports re LDAP
     new 9221c54  fix test

The 17 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:
 .../api/internal/AbstractBrooklynObjectSpec.java   |  5 ++
 .../spi/creation/CampTypePlanTransformer.java      |  4 +-
 .../CatalogYamlEntityOsgiTypeRegistryTest.java     | 33 +++++++-
 .../brooklyn/catalog/CatalogYamlEntityTest.java    |  8 ++
 .../catalog/internal/BasicBrooklynCatalog.java     |  1 +
 .../apache/brooklyn/core/mgmt/BrooklynTags.java    | 94 ++++++++++++++++++++++
 .../core/typereg/AbstractTypePlanTransformer.java  | 22 +++++
 .../typereg/JavaClassNameTypePlanTransformer.java  |  2 +-
 .../brooklyn/core/typereg/RegisteredTypes.java     | 18 ++++-
 .../internal/StaticTypePlanTransformer.java        |  6 +-
 .../typereg/ExampleXmlTypePlanTransformer.java     |  8 +-
 .../org/apache/brooklyn/rest/api/EntityApi.java    | 12 +++
 .../brooklyn/rest/resources/EntityResource.java    |  8 ++
 .../security/provider/LdapSecurityProvider.java    | 14 +---
 .../rest/resources/EntityResourceTest.java         |  1 +
 15 files changed, 213 insertions(+), 23 deletions(-)

[brooklyn-server] 05/17: Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

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 54aa018b8ad118a78364962874716d129bee0768
Merge: aa95afa daba0bb
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Mon May 24 10:57:30 2021 +0100

    Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

 .../org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

[brooklyn-server] 12/17: Added support for SpecTags and creation for types when added to the catalog

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 79b1a83ea6d5aa1cd2cbb72e0338ae1680569a57
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Wed May 26 17:27:44 2021 +0100

    Added support for SpecTags and creation for types when added to the catalog
---
 .../CatalogYamlEntityOsgiTypeRegistryTest.java     | 33 ++++++++++++++++++++++
 .../catalog/internal/BasicBrooklynCatalog.java     |  1 +
 .../brooklyn/core/typereg/RegisteredTypes.java     | 15 +++++++++-
 3 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java
index 7aa4a6a..ab1c46e 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java
@@ -20,7 +20,9 @@ package org.apache.brooklyn.camp.brooklyn.catalog;
 
 import java.util.Map;
 import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.camp.brooklyn.spi.creation.CampTypePlanTransformer;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.core.typereg.RegisteredTypePredicates;
 import org.apache.brooklyn.entity.stock.BasicEntity;
@@ -34,6 +36,9 @@ import org.testng.annotations.Test;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Iterables;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
 /** Variant of parent tests using OSGi, bundles, and type registry, instead of lightweight non-osgi catalog */
 @Test
 public class CatalogYamlEntityOsgiTypeRegistryTest extends CatalogYamlEntityTest {
@@ -210,6 +215,34 @@ public class CatalogYamlEntityOsgiTypeRegistryTest extends CatalogYamlEntityTest
         deleteCatalogRegisteredType(symbolicName);
     }
 
+    @Test
+    public void testAddCatalogItemWithHierarchyTag() throws Exception {
+        String symbolicName = "my.catalog.app.id.load";
+        addCatalogItems(
+                "brooklyn.catalog:",
+                "  id: " + symbolicName,
+                "  version: " + TEST_VERSION,
+                "  tags:",
+                "  - "+ BrooklynTags.YAML_SPEC_HIERARCHY +": ",
+                "           format: " + CampTypePlanTransformer.FORMAT,
+                "           summary:  Plan for " + symbolicName,
+                "           contents:  | " ,
+                "               line 1" ,
+                "               line 2" ,
+                "  itemType: entity",
+                "  item: " + BasicEntity.class.getName());
+
+        RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
+        assertTrue(item.getTags().stream().anyMatch(tag -> tag instanceof BrooklynTags.SpecTag));
+
+        BrooklynTags.SpecTag specTag = (BrooklynTags.SpecTag) item.getTags().stream().filter(x -> x instanceof BrooklynTags.SpecTag).findFirst().orElse(null);
+        assertEquals(specTag.getSpecList().size(), 1);
+        Asserts.assertEquals(((Map<String,String>)specTag.getSpecList().get(0)).get("format"), CampTypePlanTransformer.FORMAT);
+        Asserts.assertEquals(((Map<String,String>)specTag.getSpecList().get(0)).get("summary"), "Plan for " + symbolicName);
+
+        deleteCatalogRegisteredType(symbolicName);
+    }
+
 
     // also runs many other tests from super, here using the osgi/type-registry appraoch
 
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 17bc166..5cf49b4 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
@@ -661,6 +661,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         catalogMetadata.put("tags", MutableSet.copyOf(getFirstAs(parentMetadata, Collection.class, "tags").orNull())
             .putAll(getFirstAs(itemMetadataWithoutItemDef, Collection.class, "tags").orNull()) );
 
+
         // brooklyn.libraries we treat specially, to append the list, with the child's list preferred in classloading order
         // `libraries` is supported in some places as a legacy syntax; it should always be `brooklyn.libraries` for new apps
         // TODO in 0.8.0 require brooklyn.libraries, don't allow "libraries" on its own
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
index 5792248..e58d34d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
@@ -333,7 +333,20 @@ public class RegisteredTypes {
     @Beta
     public static RegisteredType addTag(RegisteredType type, Object tag) {
         if (tag!=null) {
-            ((BasicRegisteredType)type).tags.add( tag );
+            if (tag instanceof Map) {
+                Map<String,Object> mapTag = (Map<String,Object>) tag;
+                if(mapTag.containsKey(BrooklynTags.YAML_SPEC_HIERARCHY)) {
+                    Map<String,String> hierarchySpecTag = (Map<String,String>) mapTag.get(BrooklynTags.YAML_SPEC_HIERARCHY);
+                    BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder()
+                            .format(hierarchySpecTag.get("format"))
+                            .summary(hierarchySpecTag.get("summary"))
+                            .contents(hierarchySpecTag.get("contents"))
+                            .build();
+                    ((BasicRegisteredType)type).tags.add( currentSpecTag );
+                }
+            } else {
+                ((BasicRegisteredType) type).tags.add(tag);
+            }
         }
         return type;
     }

[brooklyn-server] 15/17: This closes #1175

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 1c8e7ef722114e6355cffb79446225cccf390bc4
Merge: f07efeb fbd7391
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu May 27 18:34:40 2021 +0100

    This closes #1175

 .../api/internal/AbstractBrooklynObjectSpec.java   |  5 ++
 .../spi/creation/CampTypePlanTransformer.java      |  4 +-
 .../CatalogYamlEntityOsgiTypeRegistryTest.java     | 33 +++++++-
 .../brooklyn/catalog/CatalogYamlEntityTest.java    |  8 ++
 .../catalog/internal/BasicBrooklynCatalog.java     |  1 +
 .../apache/brooklyn/core/mgmt/BrooklynTags.java    | 94 ++++++++++++++++++++++
 .../core/typereg/AbstractTypePlanTransformer.java  | 22 +++++
 .../typereg/JavaClassNameTypePlanTransformer.java  |  2 +-
 .../brooklyn/core/typereg/RegisteredTypes.java     | 18 ++++-
 .../internal/StaticTypePlanTransformer.java        |  6 +-
 .../typereg/ExampleXmlTypePlanTransformer.java     |  8 +-
 .../org/apache/brooklyn/rest/api/EntityApi.java    | 12 +++
 .../brooklyn/rest/resources/EntityResource.java    |  8 ++
 .../rest/resources/EntityResourceTest.java         |  4 +-
 14 files changed, 210 insertions(+), 15 deletions(-)

[brooklyn-server] 10/17: Made sure there are not plans with duplicate summaries

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 1a2be8d1a1dd6f4cfbd795ac93d276065e750951
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Tue May 25 17:19:36 2021 +0100

    Made sure there are not plans with duplicate summaries
---
 .../apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java    | 2 ++
 .../org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java   | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
index 57e18ad..96e91f6 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
@@ -266,6 +266,8 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
 
         // tests that the plan tag was set
         assertTrue(entity.tags().getTags().stream().anyMatch(tag -> tag instanceof BrooklynTags.SpecTag));
+        BrooklynTags.SpecTag specTag = (BrooklynTags.SpecTag) entity.tags().getTags().stream().filter(tag -> tag instanceof BrooklynTags.SpecTag).findAny().orElse(null);
+        assertEquals(specTag.getSpecList().size(), 2);
 
         deleteCatalogRegisteredType(referencedSymbolicName);
         deleteCatalogRegisteredType(referrerSymbolicName);
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
index 3a28a87..5b051e8 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
@@ -164,7 +164,7 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
     protected AbstractBrooklynObjectSpec<?,?> decorateWithHierarchySpecTag(AbstractBrooklynObjectSpec<?, ?> spec, RegisteredType type, final String format) {
         BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder()
                 .format(format)
-                .summary(format + " plan for " + (Strings.isNonBlank(type.getDisplayName())? type.getDisplayName() : spec.getDisplayName()))
+                .summary(format + " plan for " + (Strings.isNonBlank(type.getSymbolicName())? type.getSymbolicName() : type.getDisplayName()))
                 .contents(type.getPlan().getPlanData())
                 .build();
 

[brooklyn-server] 11/17: Added argument for custom summary

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 db93ff862b0e6821df8cf50fc255131c5802e755
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Wed May 26 15:22:38 2021 +0100

    Added argument for custom summary
---
 .../camp/brooklyn/spi/creation/CampTypePlanTransformer.java       | 2 +-
 .../apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java | 8 ++++++--
 .../brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java   | 2 +-
 .../brooklyn/core/catalog/internal/StaticTypePlanTransformer.java | 4 ++--
 .../brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java      | 2 +-
 5 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
index 8dc8508..b76cd19 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
@@ -106,7 +106,7 @@ public class CampTypePlanTransformer extends AbstractTypePlanTransformer {
     @Override
     protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
         try {
-            return decorateWithHierarchySpecTag(new CampResolver(mgmt, type, context).createSpec(), type, FORMAT);
+            return decorateWithHierarchySpecTag(new CampResolver(mgmt, type, context).createSpec(), type, FORMAT, null);
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
             String message = null;
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
index 5b051e8..acff741 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
@@ -161,10 +161,14 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
 
     protected abstract Object createBean(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception;
 
-    protected AbstractBrooklynObjectSpec<?,?> decorateWithHierarchySpecTag(AbstractBrooklynObjectSpec<?, ?> spec, RegisteredType type, final String format) {
+    protected AbstractBrooklynObjectSpec<?,?> decorateWithHierarchySpecTag(AbstractBrooklynObjectSpec<?, ?> spec, RegisteredType type, final String format, final String summary) {
+        final String specSummary = Strings.isBlank(summary)
+                ? format + " plan for " + (Strings.isNonBlank(type.getSymbolicName())? type.getSymbolicName() : type.getDisplayName())
+                : summary;
+
         BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder()
                 .format(format)
-                .summary(format + " plan for " + (Strings.isNonBlank(type.getSymbolicName())? type.getSymbolicName() : type.getDisplayName()))
+                .summary(specSummary)
                 .contents(type.getPlan().getPlanData())
                 .build();
 
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java
index 196a254..6bfe0a7 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java
@@ -65,7 +65,7 @@ public class JavaClassNameTypePlanTransformer extends AbstractTypePlanTransforme
     @SuppressWarnings({ "unchecked" })
     @Override
     protected AbstractBrooklynObjectSpec<?,?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
-        return  decorateWithHierarchySpecTag(RegisteredTypes.newSpecInstance(mgmt, (Class<? extends BrooklynObject>) getType(type, context)), type, FORMAT);
+        return  decorateWithHierarchySpecTag(RegisteredTypes.newSpecInstance(mgmt, (Class<? extends BrooklynObject>) getType(type, context)), type, FORMAT, null);
     }
 
     @Override
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java
index ff3ec69..2524564 100644
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java
+++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java
@@ -93,9 +93,9 @@ public class StaticTypePlanTransformer extends AbstractTypePlanTransformer {
     @Override
     protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
         if (REGISTERED_SPECS.containsKey(type.getSymbolicName()))
-            return decorateWithHierarchySpecTag(get(type.getSymbolicName()), type, FORMAT);
+            return decorateWithHierarchySpecTag(get(type.getSymbolicName()), type, FORMAT, null );
         if (type.getPlan().getPlanData()!=null && REGISTERED_SPECS.containsKey(type.getPlan().getPlanData()))
-            return decorateWithHierarchySpecTag(get((String)type.getPlan().getPlanData()), type, FORMAT);
+            return decorateWithHierarchySpecTag(get((String)type.getPlan().getPlanData()), type, FORMAT, null);
         return null;
     }
 
diff --git a/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
index b82031c..be3bd54 100644
--- a/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
+++ b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
@@ -69,7 +69,7 @@ public class ExampleXmlTypePlanTransformer extends AbstractTypePlanTransformer {
     @Override
     protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
         return decorateWithHierarchySpecTag(toEntitySpec(parseXml((String)type.getPlan().getPlanData()),
-            isApplicationExpected(type, context) ? 0 : 1), type, "example-xml");
+            isApplicationExpected(type, context) ? 0 : 1), type, "example-xml", null);
     }
 
     private static boolean isApplicationExpected(RegisteredType type, RegisteredTypeLoadingContext context) {

[brooklyn-server] 04/17: Merge branch 'master' into spec-hierarchy-tag

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 150bee1b3c12028fd2dba6bf68e15738a8a34fa9
Merge: daba0bb 32730a7
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Mon May 24 10:39:20 2021 +0100

    Merge branch 'master' into spec-hierarchy-tag

 DEPENDENCIES                                       | 172 ++++-------
 .../apache/brooklyn/api/mgmt/EntityManager.java    |  32 +-
 .../BrooklynComponentTemplateResolver.java         |  88 ++++--
 .../spi/creation/BrooklynEntityMatcher.java        |   2 +-
 .../spi/creation/EntitySpecConfiguration.java      |   2 +-
 .../brooklyn/spi/dsl/BrooklynDslInterpreter.java   |   4 +-
 .../spi/dsl/DslDeferredPropertyAccess.java         |  83 +++--
 .../spi/dsl/methods/BrooklynDslCommon.java         |  52 +++-
 .../brooklyn/spi/dsl/methods/DslComponent.java     |  98 +++++-
 .../camp/brooklyn/spi/dsl/parse/DslParser.java     |   4 +-
 .../camp/brooklyn/AbstractWindowsYamlTest.java     |   2 +-
 .../camp/brooklyn/ConfigParametersYamlTest.java    |   1 +
 .../camp/brooklyn/WindowsYamlLiveTest.java         | 201 +++++--------
 .../CatalogYamlEntityOsgiTypeRegistryTest.java     |  27 +-
 core/pom.xml                                       |   9 -
 .../org/apache/brooklyn/core/BrooklynVersion.java  |   2 +-
 .../catalog/internal/BasicBrooklynCatalog.java     |   6 +-
 .../brooklyn/core/config/ConfigConstraints.java    | 122 ++++----
 .../core/config/ConstraintViolationException.java  | 190 +++++++++++-
 .../apache/brooklyn/core/config/MapConfigKey.java  |  30 +-
 .../vault/VaultExternalConfigSupplier.java         |  53 +++-
 .../vault/VaultUserPassExternalConfigSupplier.java |  16 +-
 .../internal/AbstractCollectionConfigKey.java      |  17 +-
 .../config/internal/AbstractConfigMapImpl.java     |  37 ++-
 .../core/enricher/EnricherDynamicType.java         |   2 +-
 .../brooklyn/core/entity/AbstractApplication.java  |   6 +-
 .../brooklyn/core/entity/AbstractEntity.java       |  24 +-
 .../brooklyn/core/entity/EntityDynamicType.java    |  14 +-
 .../core/entity/internal/ConfigUtilsInternal.java  |  55 ++++
 .../location/internal/LocationDynamicType.java     |   2 +-
 .../brooklyn/core/mgmt/BrooklynTaskTags.java       |  25 +-
 .../mgmt/internal/AbstractManagementContext.java   |  10 +-
 .../mgmt/internal/BrooklynGarbageCollector.java    |   5 +-
 .../mgmt/internal/EntityManagementSupport.java     |  78 +++--
 .../core/mgmt/internal/EntityManagerInternal.java  |  13 +-
 .../core/mgmt/internal/LocalEntityManager.java     | 102 ++++---
 .../mgmt/internal/NonDeploymentEntityManager.java  |  13 +-
 .../org/apache/brooklyn/core/objs/AdjunctType.java |  62 +---
 .../brooklyn/core/objs/BasicSpecParameter.java     |   6 +-
 .../brooklyn/core/objs/BrooklynDynamicType.java    |  40 ++-
 .../core/objs/proxy/InternalEntityFactory.java     | 144 +++++----
 .../brooklyn/core/policy/PolicyDynamicType.java    |   2 +-
 .../resolve/jackson/AsPropertyIfAmbiguous.java     |  21 +-
 .../jackson/BrooklynJacksonSerializationUtils.java |  21 ++
 .../brooklyn/entity/group/DynamicClusterImpl.java  |   6 +-
 .../LocalhostMachineProvisioningLocation.java      |   8 +
 .../apache/brooklyn/util/core/ResourceUtils.java   |  10 +
 .../brooklyn/util/core/osgi/BundleMaker.java       |   3 +-
 .../brooklyn/util/core/task/ValueResolver.java     |  10 +
 .../core/config/ConfigKeyConstraintTest.java       |  34 +++
 .../MapListAndOtherStructuredConfigKeyTest.java    |  35 ++-
 .../PropertiesFileExternalConfigSupplierTest.java  |   5 -
 .../vault/VaultExternalConfigSupplierLiveTest.java |   1 -
 .../brooklyn/core/entity/EntityAssertsTest.java    |   8 +-
 .../brooklyn/core/entity/EntityConfigTest.java     |   6 +-
 .../core/entity/proxying/EntityManagerTest.java    |  75 ++++-
 .../entity/proxying/InternalEntityFactoryTest.java |  10 +-
 .../brooklyn/core/mgmt/DeployFailureTest.java      |   5 +-
 .../brooklyn/core/mgmt/ha/HotStandbyTest.java      |  53 ++--
 .../core/mgmt/osgi/OsgiVersionMoreEntityTest.java  |   2 +-
 karaf/features/src/main/feature/feature.xml        |  17 +-
 .../resources/brooklyn/logback-logger-excludes.xml |   9 +-
 parent/pom.xml                                     |   3 +-
 pom.xml                                            |  18 +-
 .../org/apache/brooklyn/rest/api/BundleApi.java    |  20 +-
 .../org/apache/brooklyn/rest/api/EntityApi.java    |   9 +
 .../brooklyn/rest/domain/RelationSummary.java      |  72 +++++
 .../apache/brooklyn/rest/domain/RelationType.java  |  79 +++++
 .../BrooklynSecurityProviderFilterHelper.java      |  25 +-
 .../BrooklynSecurityProviderFilterJavax.java       |  25 +-
 .../rest/resources/ApplicationResource.java        |   5 +-
 .../brooklyn/rest/resources/BundleResource.java    |  24 +-
 .../brooklyn/rest/resources/EntityResource.java    |  22 +-
 .../brooklyn/rest/resources/TypeResource.java      |   9 +-
 .../security/provider/LdapSecurityProvider.java    |  73 ++++-
 .../brooklyn/rest/transform/TypeTransformer.java   |  10 +-
 .../brooklyn/rest/util/DefaultExceptionMapper.java |   6 +-
 .../brooklyn/rest/util/EntityRelationUtils.java    |  49 +++
 .../rest/util/MultiSessionAttributeAdapter.java    | 112 ++++---
 .../rest/resources/ApplicationResourceTest.java    |  11 -
 .../rest/resources/BundleAndTypeResourcesTest.java |  10 +-
 .../resources/EntityRelationsResourceTest.java     | 162 ++++++++++
 .../rest/resources/LocationResourceTest.java       |  48 ++-
 .../provider/LdapSecurityProviderTest.java         |  73 +++++
 .../rest/testing/BrooklynRestResourceTest.java     |  11 +
 .../test/resources/localhost.default.location.zip  | Bin 0 -> 19629 bytes
 server-cli/DEPENDENCIES                            | 168 ++++-------
 .../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   |  20 +-
 ...nillaSoftwareProcessStreamsIntegrationTest.java |   2 +-
 .../base/VanillaSoftwareProcessStreamsTest.java    | 142 +++++++++
 .../VanillaWindowsProcessWinrmStreamsLiveTest.java |   4 +-
 .../location/winrm/PlainWinRmExecTaskFactory.java  |  70 +----
 .../internal/winrm/winrm4j/FilteringXmlWriter.java | 335 ---------------------
 .../internal/winrm/winrm4j/PrettyXmlWriter.java    |  92 +++---
 .../internal/winrm/winrm4j/ErrorXmlWriterTest.java | 109 -------
 .../winrm/winrm4j/PrettyXmlWriterTest.java         |  21 +-
 .../java/org/apache/brooklyn/config/ConfigMap.java |   8 +-
 .../java/org/apache/brooklyn/test/Asserts.java     |  71 ++++-
 .../org/apache/brooklyn/util/text/Strings.java     |  17 ++
 .../org/apache/brooklyn/util/text/StringsTest.java |  11 +
 115 files changed, 2663 insertions(+), 1515 deletions(-)

[brooklyn-server] 16/17: fix unneeded (and unavail for me) imports re LDAP

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 daf623c3ea19d07e11370ae89e8da84270144e47
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu May 27 18:52:34 2021 +0100

    fix unneeded (and unavail for me) imports re LDAP
---
 .../rest/security/provider/LdapSecurityProvider.java       | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/security/provider/LdapSecurityProvider.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/security/provider/LdapSecurityProvider.java
index 75e1a97..ceb15d5 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/security/provider/LdapSecurityProvider.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/security/provider/LdapSecurityProvider.java
@@ -18,35 +18,29 @@
  */
 package org.apache.brooklyn.rest.security.provider;
 
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
 import java.util.Arrays;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.function.Supplier;
-
 import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.directory.InitialDirContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.rest.BrooklynWebConfig;
-import org.apache.brooklyn.rest.util.MultiSessionAttributeAdapter;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.text.Strings;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import sun.util.resources.cldr.dav.LocaleNames_dav;
-
 /**
  * A {@link SecurityProvider} implementation that relies on LDAP to authenticate.
  *

[brooklyn-server] 13/17: Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

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 77c23ea5d07133ace3d742ee6f17ee6a127b6964
Merge: 79b1a83 db93ff8
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Wed May 26 17:28:06 2021 +0100

    Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

 .../camp/brooklyn/spi/creation/CampTypePlanTransformer.java       | 2 +-
 .../apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java | 8 ++++++--
 .../brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java   | 2 +-
 .../brooklyn/core/catalog/internal/StaticTypePlanTransformer.java | 4 ++--
 .../brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java      | 2 +-
 5 files changed, 11 insertions(+), 7 deletions(-)

[brooklyn-server] 08/17: Added API impl

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 0a33ad619955a1402f39b22dcea99b22e6940eb9
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Tue May 25 09:27:24 2021 +0100

     Added API impl
---
 .../java/org/apache/brooklyn/core/mgmt/BrooklynTags.java     |  8 ++++++++
 .../main/java/org/apache/brooklyn/rest/api/EntityApi.java    | 12 ++++++++++++
 .../org/apache/brooklyn/rest/resources/EntityResource.java   |  8 ++++++++
 .../apache/brooklyn/rest/resources/EntityResourceTest.java   |  4 ++--
 4 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
index ff165e1..11264ed 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
@@ -245,6 +245,14 @@ public class BrooklynTags {
         return null;
     }
 
+    public  static SpecTag findHierarchySpecTag(String kind, Iterable<Object> tags) {
+        for (Object object: tags) {
+            if (object instanceof SpecTag && kind.equals((((SpecTag) object).kind)))
+                return (SpecTag) object;
+        }
+        return null;
+    }
+
     public static List<NamedStringTag> findAll(String kind, Iterable<Object> tags) {
         List<NamedStringTag> result = MutableList.of();
         for (Object object: tags) {
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
index 5bbd5b3..f51c854 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
@@ -252,4 +252,16 @@ public interface EntityApi {
             @PathParam("application") String application,
             @ApiParam(value = "Entity ID or name", required = true)
             @PathParam("entity") String entity);
+
+    @GET
+    @Path("/{entity}/speclist")
+    @ApiOperation(value = "Get the list of YAML spec used to create the entity, if available")
+    @ApiResponses(value = {
+            @ApiResponse(code = 404, message = "Application or entity missing")
+    })
+    public List<Object> getSpecList(
+            @ApiParam(value = "Application ID or name", required = true)
+            @PathParam("application") String application,
+            @ApiParam(value = "Entity ID or name", required = true)
+            @PathParam("entity") String entity);
 }
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
index fdd5ea7..7bd5797 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java
@@ -55,6 +55,7 @@ import org.apache.brooklyn.rest.transform.TaskTransformer;
 import org.apache.brooklyn.rest.util.EntityRelationUtils;
 import org.apache.brooklyn.rest.util.WebResourceUtils;
 import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
@@ -311,4 +312,11 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
             return null;
         return (String) WebResourceUtils.getValueForDisplay(spec.getContents(), false, true);
     }
+
+    @Override
+    public List<Object>  getSpecList(String applicationId, String entityId) {
+        Entity entity = brooklyn().getEntity(applicationId, entityId);
+        BrooklynTags.SpecTag specTag =  BrooklynTags.findHierarchySpecTag(BrooklynTags.YAML_SPEC_HIERARCHY, entity.tags().getTags());
+        return (List<Object>) resolving( specTag.getSpecList()).preferJson(true).resolve();
+    }
 }
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
index 62ee189..6485c43 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
@@ -114,11 +114,11 @@ public class EntityResourceTest extends BrooklynRestResourceTest {
         // Retrieve the yaml spec, and confirm it is as expected (not wrapped in quotes, and treating \n sensibly)
         Response response;
         if (acceptMimeType != null) {
-            response = client().path("/applications/" + appName + "/entities/" + appName + "/spec")
+            response = client().path("/applications/" + appName + "/entities/" + appName + "/speclist")
                     .accept(acceptMimeType)
                     .get();
         } else {
-            response = client().path("/applications/" + appName + "/entities/" + appName + "/spec")
+            response = client().path("/applications/" + appName + "/entities/" + appName + "/speclist")
                     .get();
         }
         String data = response.readEntity(String.class);

[brooklyn-server] 06/17: Added option to populate the display name with the spec name if missing

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 6938a98a7e2c216d43deedc9797669456a77e08e
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Mon May 24 11:55:44 2021 +0100

    Added option to populate the display name with the spec name if missing
---
 .../org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
index 1e44e18..3a28a87 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
@@ -164,7 +164,7 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
     protected AbstractBrooklynObjectSpec<?,?> decorateWithHierarchySpecTag(AbstractBrooklynObjectSpec<?, ?> spec, RegisteredType type, final String format) {
         BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder()
                 .format(format)
-                .summary(format + " plan for " + type.getDisplayName())
+                .summary(format + " plan for " + (Strings.isNonBlank(type.getDisplayName())? type.getDisplayName() : spec.getDisplayName()))
                 .contents(type.getPlan().getPlanData())
                 .build();
 

[brooklyn-server] 17/17: fix test

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 9221c54432bf07736e7662602796e3e6319ffb3e
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Thu May 27 19:20:40 2021 +0100

    fix test
---
 .../java/org/apache/brooklyn/rest/resources/EntityResourceTest.java  | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
index 6485c43..59af350 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java
@@ -114,13 +114,14 @@ public class EntityResourceTest extends BrooklynRestResourceTest {
         // Retrieve the yaml spec, and confirm it is as expected (not wrapped in quotes, and treating \n sensibly)
         Response response;
         if (acceptMimeType != null) {
-            response = client().path("/applications/" + appName + "/entities/" + appName + "/speclist")
+            response = client().path("/applications/" + appName + "/entities/" + appName + "/spec")
                     .accept(acceptMimeType)
                     .get();
         } else {
-            response = client().path("/applications/" + appName + "/entities/" + appName + "/speclist")
+            response = client().path("/applications/" + appName + "/entities/" + appName + "/spec")
                     .get();
         }
+        HttpAsserts.assertHealthyStatusCode(response.getStatus());
         String data = response.readEntity(String.class);
 
         assertEquals(data.trim(), yaml.trim());

[brooklyn-server] 02/17: Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

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 aa95afaebc598656e1d3c7ea0219e9b78bcbee0b
Merge: 5947556 74f61cf
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Mon May 24 09:32:45 2021 +0100

    Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

 .../api/internal/AbstractBrooklynObjectSpec.java   |  5 ++
 .../spi/creation/CampTypePlanTransformer.java      |  4 +-
 .../brooklyn/catalog/CatalogYamlEntityTest.java    |  6 ++
 .../apache/brooklyn/core/mgmt/BrooklynTags.java    | 86 ++++++++++++++++++++++
 .../core/typereg/AbstractTypePlanTransformer.java  | 18 +++++
 .../typereg/JavaClassNameTypePlanTransformer.java  |  2 +-
 .../internal/StaticTypePlanTransformer.java        |  6 +-
 .../typereg/ExampleXmlTypePlanTransformer.java     |  8 +-
 8 files changed, 126 insertions(+), 9 deletions(-)

[brooklyn-server] 07/17: Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

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 e1846532cf13e28ca2b19782a1a09138f77893f5
Merge: 54aa018 6938a98
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Mon May 24 11:56:48 2021 +0100

    Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

 .../spi/dsl/DslDeferredPropertyAccess.java         |  8 ++++++
 .../apache/brooklyn/core/config/MapConfigKey.java  | 30 +++++++++++++++++-----
 .../internal/AbstractCollectionConfigKey.java      | 17 +++++++-----
 .../core/typereg/AbstractTypePlanTransformer.java  |  2 +-
 .../brooklyn/util/core/task/ValueResolver.java     |  7 +++++
 .../MapListAndOtherStructuredConfigKeyTest.java    | 17 ++++++++++++
 6 files changed, 68 insertions(+), 13 deletions(-)

[brooklyn-server] 14/17: Fixed tests and implementation to support other map tags

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 fbd7391d3be027ef23c5b7a27caf0b3883e9fb4e
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Wed May 26 17:59:26 2021 +0100

    Fixed tests and implementation to support other map tags
---
 .../brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java  | 4 +---
 .../java/org/apache/brooklyn/core/typereg/RegisteredTypes.java   | 9 ++++-----
 2 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java
index ab1c46e..a0c193e 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityOsgiTypeRegistryTest.java
@@ -29,7 +29,6 @@ import org.apache.brooklyn.entity.stock.BasicEntity;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.CollectionFunctionals;
 import org.apache.brooklyn.util.osgi.VersionedName;
-import org.apache.brooklyn.util.text.StringEscapes.JavaStringEscapes;
 import org.apache.brooklyn.util.yaml.Yamls;
 import org.testng.annotations.Test;
 
@@ -233,13 +232,12 @@ public class CatalogYamlEntityOsgiTypeRegistryTest extends CatalogYamlEntityTest
                 "  item: " + BasicEntity.class.getName());
 
         RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, TEST_VERSION);
-        assertTrue(item.getTags().stream().anyMatch(tag -> tag instanceof BrooklynTags.SpecTag));
 
+        assertTrue(item.getTags().stream().anyMatch(tag -> tag instanceof BrooklynTags.SpecTag));
         BrooklynTags.SpecTag specTag = (BrooklynTags.SpecTag) item.getTags().stream().filter(x -> x instanceof BrooklynTags.SpecTag).findFirst().orElse(null);
         assertEquals(specTag.getSpecList().size(), 1);
         Asserts.assertEquals(((Map<String,String>)specTag.getSpecList().get(0)).get("format"), CampTypePlanTransformer.FORMAT);
         Asserts.assertEquals(((Map<String,String>)specTag.getSpecList().get(0)).get("summary"), "Plan for " + symbolicName);
-
         deleteCatalogRegisteredType(symbolicName);
     }
 
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
index e58d34d..838879e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
@@ -25,12 +25,10 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.StreamSupport;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.collect.Iterators;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
@@ -61,6 +59,7 @@ import org.apache.brooklyn.util.text.NaturalOrderComparator;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.text.VersionComparator;
 import org.apache.brooklyn.util.yaml.Yamls;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -333,14 +332,14 @@ public class RegisteredTypes {
     @Beta
     public static RegisteredType addTag(RegisteredType type, Object tag) {
         if (tag!=null) {
-            if (tag instanceof Map) {
+            if (tag instanceof Map &&( (Map<String,Object>) tag).containsKey(BrooklynTags.YAML_SPEC_HIERARCHY)) {
                 Map<String,Object> mapTag = (Map<String,Object>) tag;
                 if(mapTag.containsKey(BrooklynTags.YAML_SPEC_HIERARCHY)) {
                     Map<String,String> hierarchySpecTag = (Map<String,String>) mapTag.get(BrooklynTags.YAML_SPEC_HIERARCHY);
                     BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder()
                             .format(hierarchySpecTag.get("format"))
-                            .summary(hierarchySpecTag.get("summary"))
-                            .contents(hierarchySpecTag.get("contents"))
+                            .summary(StringUtils.isNotBlank(hierarchySpecTag.get("summary"))? hierarchySpecTag.get("summary") : "Plan for " + type.getSymbolicName())
+                            .contents(StringUtils.isNotBlank(hierarchySpecTag.get("contents"))? hierarchySpecTag.get("contents") : "n/a")
                             .build();
                     ((BasicRegisteredType)type).tags.add( currentSpecTag );
                 }

[brooklyn-server] 03/17: added customizable summary

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 daba0bbd4b0e730bf278d5cbb5984d145552782b
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Mon May 24 10:38:41 2021 +0100

    added customizable summary
---
 .../org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
index 3278aa7..1e44e18 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
@@ -164,7 +164,7 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
     protected AbstractBrooklynObjectSpec<?,?> decorateWithHierarchySpecTag(AbstractBrooklynObjectSpec<?, ?> spec, RegisteredType type, final String format) {
         BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder()
                 .format(format)
-                .summary("CAMP plan for " + type.getDisplayName())
+                .summary(format + " plan for " + type.getDisplayName())
                 .contents(type.getPlan().getPlanData())
                 .build();
 

[brooklyn-server] 09/17: Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

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 d0d8fdf8715df71e72f44567a81057a50c49ebeb
Merge: e184653 0a33ad6
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Tue May 25 09:27:50 2021 +0100

    Merge branch 'spec-hierarchy-tag' of github.com:iuliana/brooklyn-server into spec-hierarchy-tag

 .../java/org/apache/brooklyn/core/mgmt/BrooklynTags.java     |  8 ++++++++
 .../main/java/org/apache/brooklyn/rest/api/EntityApi.java    | 12 ++++++++++++
 .../org/apache/brooklyn/rest/resources/EntityResource.java   |  8 ++++++++
 .../apache/brooklyn/rest/resources/EntityResourceTest.java   |  4 ++--
 4 files changed, 30 insertions(+), 2 deletions(-)

[brooklyn-server] 01/17: Added decorateWithHierarchySpecTag(..) method to be used to create spec tags when deployign blueprints

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 74f61cf98fe5d892d3542a33b95e6cee09ca26bd
Author: iuliana <iu...@cloudsoft.io>
AuthorDate: Fri May 21 16:32:18 2021 +0100

    Added decorateWithHierarchySpecTag(..) method to be used to create spec tags when deployign blueprints
---
 .../api/internal/AbstractBrooklynObjectSpec.java   |  5 ++
 .../spi/creation/CampTypePlanTransformer.java      |  4 +-
 .../brooklyn/catalog/CatalogYamlEntityTest.java    |  6 ++
 .../apache/brooklyn/core/mgmt/BrooklynTags.java    | 86 ++++++++++++++++++++++
 .../core/typereg/AbstractTypePlanTransformer.java  | 18 +++++
 .../typereg/JavaClassNameTypePlanTransformer.java  |  2 +-
 .../internal/StaticTypePlanTransformer.java        |  6 +-
 .../typereg/ExampleXmlTypePlanTransformer.java     |  8 +-
 8 files changed, 126 insertions(+), 9 deletions(-)

diff --git a/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java b/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java
index f6ee41a..8cd4e60 100644
--- a/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java
+++ b/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.google.common.base.Predicate;
 import org.apache.brooklyn.api.mgmt.EntityManager;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.objs.BrooklynObject;
@@ -296,6 +297,10 @@ public abstract class AbstractBrooklynObjectSpec<T, SpecT extends AbstractBrookl
         return ImmutableSet.copyOf(tags);
     }
 
+    public final Object getTag(Predicate<Object> predicate) {
+        return tags.stream().filter(predicate::apply).findAny().orElse(null);
+    }
+
     /**
      * A list of configuration options that the entity supports.
      */
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
index 9170083..8dc8508 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
@@ -20,6 +20,7 @@ package org.apache.brooklyn.camp.brooklyn.spi.creation;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.function.BiFunction;
 
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
@@ -27,6 +28,7 @@ import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.RegisteredType.TypeImplementationPlan;
 import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
 import org.apache.brooklyn.core.typereg.*;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
@@ -104,7 +106,7 @@ public class CampTypePlanTransformer extends AbstractTypePlanTransformer {
     @Override
     protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
         try {
-            return new CampResolver(mgmt, type, context).createSpec();
+            return decorateWithHierarchySpecTag(new CampResolver(mgmt, type, context).createSpec(), type, FORMAT);
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
             String message = null;
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
index 7340640..57e18ad 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
@@ -22,7 +22,10 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import com.google.common.base.Throwables;
 import java.util.Collection;
 import java.util.Set;
+
+import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.core.entity.Dumper;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
 import org.apache.brooklyn.util.collections.MutableSet;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
@@ -261,6 +264,9 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
         Entity entity = Iterables.getOnlyElement(app.getChildren());
         assertEquals(entity.getEntityType().getName(), TestEntity.class.getName());
 
+        // tests that the plan tag was set
+        assertTrue(entity.tags().getTags().stream().anyMatch(tag -> tag instanceof BrooklynTags.SpecTag));
+
         deleteCatalogRegisteredType(referencedSymbolicName);
         deleteCatalogRegisteredType(referrerSymbolicName);
     }
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
index e0cc2d6..ff165e1 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
@@ -21,7 +21,9 @@ package org.apache.brooklyn.core.mgmt;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
+import com.google.common.base.MoreObjects;
 import org.apache.brooklyn.util.collections.MutableList;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -30,12 +32,14 @@ import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
+import org.apache.brooklyn.util.collections.MutableMap;
 
 /** @since 0.7.0 some strongly typed tags for reference; note these may migrate elsewhere! */
 @Beta
 public class BrooklynTags {
 
     public static final String YAML_SPEC_KIND = "yaml_spec";
+    public static final String YAML_SPEC_HIERARCHY = "yaml_spec_hierarchy";
     public static final String NOTES_KIND = "notes";
     public static final String OWNER_ENTITY_ID = "owner_entity_id";
     public static final String ICON_URL = "icon_url";
@@ -80,6 +84,88 @@ public class BrooklynTags {
         }
     }
 
+    public static class SpecTag implements Serializable {
+        private static final long serialVersionUID = 3805124696862755492L;
+
+        @JsonProperty
+        final String kind;
+
+        @JsonProperty
+        final List<Object> specList;
+
+        public SpecTag(@JsonProperty("kind")String kind, @JsonProperty("specList")List<Object> specList) {
+            this.kind = kind;
+            this.specList = specList;
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                    .omitNullValues()
+                    .add("kind", kind)
+                    .add("specList", specList)
+                    .toString();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            SpecTag specTag = (SpecTag) o;
+            return Objects.equal(kind, specTag.kind) && Objects.equal(specList, specTag.specList) ;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hashCode(kind, specList);
+        }
+
+        public String getKind() {
+            return kind;
+        }
+
+        public List<Object> getSpecList() {
+            return specList;
+        }
+
+        public void push(SpecTag currentSpecTag) {
+            // usually the list has a single element here, if
+            currentSpecTag.getSpecList().forEach(e -> specList.add(0, e));
+        }
+    }
+
+    public static class HierarchySpecTagBuilder {
+        private String format;
+        private String summary;
+        private Object contents;
+
+        public HierarchySpecTagBuilder format(final String format) {
+            this.format = format;
+            return this;
+        }
+
+        public HierarchySpecTagBuilder summary(final String summary) {
+            this.summary = summary;
+            return this;
+        }
+
+        public HierarchySpecTagBuilder contents(final Object contents) {
+            this.contents = contents;
+            return this;
+        }
+
+
+        public SpecTag build() {
+            return new SpecTag(BrooklynTags.YAML_SPEC_HIERARCHY, MutableList.of(
+                    MutableMap.of(
+                            "format", format,
+                            "summary", summary,
+                            "contents", contents
+                    )
+            ));
+        }
+    }
+
     public static class ListTag<T> {
         @JsonIgnore
         final List<T> list;
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
index d1e28ac..3278aa7 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
@@ -25,6 +25,7 @@ import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
@@ -159,5 +160,22 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra
     protected abstract AbstractBrooklynObjectSpec<?,?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception;
 
     protected abstract Object createBean(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception;
+
+    protected AbstractBrooklynObjectSpec<?,?> decorateWithHierarchySpecTag(AbstractBrooklynObjectSpec<?, ?> spec, RegisteredType type, final String format) {
+        BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder()
+                .format(format)
+                .summary("CAMP plan for " + type.getDisplayName())
+                .contents(type.getPlan().getPlanData())
+                .build();
+
+        Object specTagObj =  spec.getTag(tag -> tag instanceof BrooklynTags.SpecTag);
+        if(specTagObj != null) {
+            BrooklynTags.SpecTag specTag = (BrooklynTags.SpecTag) specTagObj;
+            specTag.push(currentSpecTag);
+        } else {
+            spec.tag(currentSpecTag);
+        }
+        return spec;
+    }
     
 }
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java
index 53cb84a..196a254 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java
@@ -65,7 +65,7 @@ public class JavaClassNameTypePlanTransformer extends AbstractTypePlanTransforme
     @SuppressWarnings({ "unchecked" })
     @Override
     protected AbstractBrooklynObjectSpec<?,?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
-        return RegisteredTypes.newSpecInstance(mgmt, (Class<? extends BrooklynObject>) getType(type, context));
+        return  decorateWithHierarchySpecTag(RegisteredTypes.newSpecInstance(mgmt, (Class<? extends BrooklynObject>) getType(type, context)), type, FORMAT);
     }
 
     @Override
diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java
index af1ab0b..ff3ec69 100644
--- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java
+++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java
@@ -93,9 +93,9 @@ public class StaticTypePlanTransformer extends AbstractTypePlanTransformer {
     @Override
     protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
         if (REGISTERED_SPECS.containsKey(type.getSymbolicName()))
-            return get(type.getSymbolicName());
+            return decorateWithHierarchySpecTag(get(type.getSymbolicName()), type, FORMAT);
         if (type.getPlan().getPlanData()!=null && REGISTERED_SPECS.containsKey(type.getPlan().getPlanData()))
-            return get((String)type.getPlan().getPlanData());
+            return decorateWithHierarchySpecTag(get((String)type.getPlan().getPlanData()), type, FORMAT);
         return null;
     }
 
@@ -108,6 +108,4 @@ public class StaticTypePlanTransformer extends AbstractTypePlanTransformer {
     public static AbstractBrooklynObjectSpec<?, ?> get(String typeName) {
         return REGISTERED_SPECS.get(typeName);
     }
-
-
 }
diff --git a/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
index c058d7b..b82031c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
+++ b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java
@@ -41,8 +41,10 @@ import org.w3c.dom.Node;
  * how implementations are meant to be written. */
 public class ExampleXmlTypePlanTransformer extends AbstractTypePlanTransformer {
 
+    public static final String FORMAT = "example-xml";
+
     protected ExampleXmlTypePlanTransformer() {
-        super("example-xml", "Example XML", "Illustration of writing a transformer");
+        super(FORMAT, "Example XML", "Illustration of writing a transformer");
     }
 
     @Override
@@ -66,8 +68,8 @@ public class ExampleXmlTypePlanTransformer extends AbstractTypePlanTransformer {
 
     @Override
     protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
-        return toEntitySpec(parseXml((String)type.getPlan().getPlanData()), 
-            isApplicationExpected(type, context) ? 0 : 1);
+        return decorateWithHierarchySpecTag(toEntitySpec(parseXml((String)type.getPlan().getPlanData()),
+            isApplicationExpected(type, context) ? 0 : 1), type, "example-xml");
     }
 
     private static boolean isApplicationExpected(RegisteredType type, RegisteredTypeLoadingContext context) {