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 <[email protected]>
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) {

Reply via email to