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/28 15:15:16 UTC
[brooklyn-server] 04/07: Merge branch 'master' into depth-tags
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 0d6852920bb7fdc31d3160a08d4a63042ec05589
Merge: 0adb476 dd07beb
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri May 28 14:48:17 2021 +0100
Merge branch 'master' into depth-tags
Resolve the catalog yaml spec tags
.../brooklyn/catalog/CatalogYamlEntityTest.java | 8 ++++++-
.../apache/brooklyn/core/mgmt/BrooklynTags.java | 22 +++++++++++++------
.../core/typereg/AbstractTypePlanTransformer.java | 18 +++++++++-------
.../brooklyn/rest/transform/TypeTransformer.java | 25 ++++++++++++++++++----
4 files changed, 54 insertions(+), 19 deletions(-)
diff --cc camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
index e45bae4,6658654..f99eb5c
--- 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
@@@ -265,9 -271,9 +271,9 @@@ public class CatalogYamlEntityTest exte
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));
- BrooklynTags.SpecTag specTag = (BrooklynTags.SpecTag) entity.tags().getTags().stream().filter(tag -> tag instanceof BrooklynTags.SpecTag).findAny().orElse(null);
+ BrooklynTags.SpecHierarchyTag specTag = BrooklynTags.findSpecHierarchyTag(entity.tags().getTags());
+ Assert.assertNotNull(specTag);
- assertEquals(specTag.getSpecList().size(), 2);
+ assertEquals(specTag.getSpecList().size(), 3);
deleteCatalogRegisteredType(referencedSymbolicName);
deleteCatalogRegisteredType(referrerSymbolicName);
diff --cc core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
index c8a76d9,d5ce619..3eefe5d
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java
@@@ -18,15 -18,13 +18,12 @@@
*/
package org.apache.brooklyn.core.mgmt;
+import com.google.common.reflect.TypeToken;
import java.io.Serializable;
--import java.util.ArrayList;
--import java.util.List;
-import java.util.ListIterator;
--import java.util.Map;
++import java.util.*;
import com.google.common.base.MoreObjects;
- import java.util.Set;
+import org.apache.brooklyn.core.resolve.jackson.BeanWithTypeUtils;
import org.apache.brooklyn.util.collections.MutableList;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@@ -44,11 -39,8 +41,11 @@@ import org.slf4j.LoggerFactory
@Beta
public class BrooklynTags {
+ private static final Logger LOG = LoggerFactory.getLogger(BrooklynTags.class);
+
public static final String YAML_SPEC_KIND = "yaml_spec";
-- public static final String YAML_SPEC_HIERARCHY = "yaml_spec_hierarchy";
++ public static final String YAML_SPEC_HIERARCHY = "yaml_spec_hierarchy"; // TODO rename spec_hierarchy, have spec_source for catalog which gets removed
+ public static final String DEPTH_IN_ANCESTOR = "depth_in_ancestor";
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";
@@@ -181,98 -85,16 +178,99 @@@
}
}
- public static class SpecTag implements Serializable {
+ public static class SpecHierarchyTag implements Serializable, HasKind {
private static final long serialVersionUID = 3805124696862755492L;
+ public static final String KIND = YAML_SPEC_HIERARCHY;
+
+ public static class SpecSummary implements Serializable {
+ @JsonProperty
+ public final String summary;
+ @JsonProperty
+ public final String format;
+ @JsonProperty
+ public final Object contents;
+
++ private SpecSummary() { this(null, null, null); }; //for JSON
+ public SpecSummary(String summary, String format, Object contents) {
+ this.summary = summary;
+ this.format = format;
+ this.contents = contents;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ SpecSummary that = (SpecSummary) o;
+ return java.util.Objects.equals(summary, that.summary) && java.util.Objects.equals(format, that.format) && java.util.Objects.equals(contents, that.contents);
+ }
+
+ @Override
+ public int hashCode() {
+ return java.util.Objects.hash(summary, format, contents);
+ }
+
+ @Override
+ public String toString() {
+ return "SpecSummary{" +
+ "summary='" + summary + '\'' +
+ ", format='" + format + '\'' +
+ ", contents=" + contents +
+ '}';
+ }
+ }
+
+ public static Builder builder() { return new Builder(); }
+ public static Builder builder(SpecSummary base) { return new Builder(base); }
+
+ public static class Builder {
+ private String summary;
+ private String format;
+ private Object contents;
+
+ private Builder() {}
+ private Builder(SpecSummary base) {
+ summary = base.summary;
+ format = base.format;
+ contents = base.contents;
+ }
+
+ public Builder summary(final String summary) {
+ this.summary = summary;
+ return this;
+ }
+
+ public Builder format(final String format) {
+ this.format = format;
+ return this;
+ }
+
+ public Builder contents(final Object contents) {
+ this.contents = contents;
+ return this;
+ }
+
+
+ public SpecSummary buildSpecSummary() {
+ return new SpecSummary(summary, format, contents);
+ }
+
+ public SpecHierarchyTag buildSpecHierarchyTag() {
+ return new SpecHierarchyTag(BrooklynTags.YAML_SPEC_HIERARCHY, MutableList.of(buildSpecSummary()));
+ }
+ }
+
@JsonProperty
- final String kind;
+ String kind;
@JsonProperty
- final List<Object> specList;
+ List<SpecSummary> specList;
+
+ // for JSON
+ private SpecHierarchyTag() {}
- public SpecTag(@JsonProperty("kind")String kind, @JsonProperty("specList")List<Object> specList) {
+ private SpecHierarchyTag(String kind, List<SpecSummary> specList) {
this.kind = kind;
this.specList = specList;
}
@@@ -307,20 -129,45 +305,32 @@@
return specList;
}
- public void push(SpecTag currentSpecTag) {
- List<Object> specs = currentSpecTag.getSpecList();
- ListIterator<Object> li = specs.listIterator(specs.size());
- while (li.hasPrevious()) {
- specList.add(0, li.previous());
- }
- }
- }
-
- 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 void push(SpecSummary newFirstSpecTag) {
+ // usually the list has a single element here, if
+ specList.add(0, newFirstSpecTag);
}
-
- public HierarchySpecTagBuilder summary(final String summary) {
- this.summary = summary;
- return this;
+ public void push(SpecHierarchyTag newFirstSpecs) {
+ // usually the list has a single element here, if
- newFirstSpecs.getSpecList().forEach(this::push);
++ List<SpecSummary> l = MutableList.copyOf(newFirstSpecs.getSpecList());
++ Collections.reverse(l);
++ l.forEach(this::push);
}
- public HierarchySpecTagBuilder contents(final Object contents) {
- this.contents = contents;
- return this;
+ public SpecSummary pop() {
+ if (getSpecList().isEmpty()) return null;
+ return getSpecList().remove(0);
}
-
- public SpecTag build() {
- return new SpecTag(BrooklynTags.YAML_SPEC_HIERARCHY, MutableList.of(
- MutableMap.of(
- "format", format,
- "summary", summary,
- "contents", contents
- )
- ));
++ public boolean modifyHeadSummary(java.util.function.Function<String, String> previousSummaryModification) {
++ if (!getSpecList().isEmpty() && previousSummaryModification!=null) {
++ SpecSummary oldHead = pop();
++ SpecSummary newPrevHead = SpecHierarchyTag.builder(oldHead).summary(
++ previousSummaryModification.apply(oldHead.summary)).buildSpecSummary();
++ push(newPrevHead);
++ return true;
++ }
++ return false;
+ }
}
public static class ListTag<T> {
diff --cc core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
index ad27456,393614d..e97ac0f
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java
@@@ -167,52 -161,30 +167,54 @@@ public abstract class AbstractTypePlanT
protected abstract Object createBean(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception;
- 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()
+ protected AbstractBrooklynObjectSpec<?,?> decorateWithHierarchySpecTag(AbstractBrooklynObjectSpec<?, ?> spec, RegisteredType type,
+ final String format, @Nullable final String summary,
+ @Nullable Function<String,String> previousSummaryModification) {
+ final String specSummary = Strings.isNonBlank(summary)
+ ? summary
+ : format + " plan" +
+ (Strings.isNonBlank(type.getSymbolicName())
- ? "for type "+type.getSymbolicName()
++ ? " for type "+type.getSymbolicName()
+ : Strings.isNonBlank(type.getDisplayName())
- ? "for "+type.getDisplayName()
++ ? " for "+type.getDisplayName()
+ : "");
+
+ BrooklynTags.SpecHierarchyTag.Builder currentSpecTagBuilder = BrooklynTags.SpecHierarchyTag.builder()
.format(format)
.summary(specSummary)
- .contents(type.getPlan().getPlanData())
- .build();
+ .contents(type.getPlan().getPlanData());
- Object rtSpecTag = type.getTags().stream().filter(tag -> tag instanceof BrooklynTags.SpecTag).findAny().orElse(null);
- if(rtSpecTag != null) {
- currentSpecTag.push((BrooklynTags.SpecTag)rtSpecTag);
+ SpecHierarchyTag specTag = BrooklynTags.findSpecHierarchyTag(spec.getTags());
+ if (specTag != null) {
- if (!specTag.getSpecList().isEmpty() && previousSummaryModification!=null) {
- SpecSummary oldHead = specTag.pop();
- SpecSummary newPrevHead = SpecHierarchyTag.builder(oldHead).summary(
- previousSummaryModification.apply(oldHead.summary)).buildSpecSummary();
- specTag.push(newPrevHead);
- }
++ specTag.modifyHeadSummary(previousSummaryModification);
+ specTag.push(currentSpecTagBuilder.buildSpecSummary());
+ } else {
+ specTag = currentSpecTagBuilder.buildSpecHierarchyTag();
+ spec.tag(specTag);
}
- 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);
++ // TODO rename key as spec_sources
++ SpecSummary source = BrooklynTags.findSingleKeyMapValue(BrooklynTags.YAML_SPEC_HIERARCHY, SpecSummary.class, type.getTags());
++ if (source != null) {
++ specTag.modifyHeadSummary(s -> "Converted for catalog to "+s);
++ specTag.push(source);
+ }
++
+ if (spec instanceof EntitySpec) {
+ addDepthTagsWhereMissing( ((EntitySpec<?>)spec).getChildren(), 1 );
+ }
+
return spec;
}
-
+
+ protected void addDepthTagsWhereMissing(List<EntitySpec<?>> children, int depth) {
+ children.forEach(c -> {
+ Integer existingDepth = BrooklynTags.getDepthInAncestorTag(c.getTags());
+ if (existingDepth==null) {
+ c.tag(MutableMap.of(BrooklynTags.DEPTH_IN_ANCESTOR, depth));
+ addDepthTagsWhereMissing(c.getChildren(), depth+1);
+ }
+ });
+ }
+
}
diff --cc rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TypeTransformer.java
index 2eb5c35,741c887..84f38b5
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TypeTransformer.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TypeTransformer.java
@@@ -18,6 -18,6 +18,7 @@@
*/
package org.apache.brooklyn.rest.transform;
++import org.apache.brooklyn.core.mgmt.BrooklynTags.SpecHierarchyTag;
import static org.apache.brooklyn.rest.util.WebResourceUtils.serviceUriBuilder;
import java.net.URI;
@@@ -98,6 -98,19 +99,22 @@@ public class TypeTransformer
result.setExtraField("iconUrlSource", item.getIconUrl());
}
}
+
+ // adding tag type spec hierarchy using hierarchy tag
- BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder()
++ SpecHierarchyTag currentSpecTag = SpecHierarchyTag.builder()
+ .format(StringUtils.isBlank(item.getPlan().getPlanFormat()) ? CampTypePlanTransformer.FORMAT : item.getPlan().getPlanFormat())
+ // the default type implementation is camp in this location, but hierarchy tag provides the original implementation, so it takes precedence.
+ .summary((StringUtils.isBlank(item.getPlan().getPlanFormat()) ? CampTypePlanTransformer.FORMAT : item.getPlan().getPlanFormat()) + " implementation")
+ .contents(item.getPlan().getPlanData())
- .build();
- BrooklynTags.SpecTag specTag = BrooklynTags.findHierarchySpecTag(BrooklynTags.YAML_SPEC_HIERARCHY, item.getTags());
++ .buildSpecHierarchyTag();
++
++ SpecHierarchyTag specTag = BrooklynTags.findSpecHierarchyTag(item.getTags());
+ if(specTag!= null){
++ currentSpecTag.modifyHeadSummary(s -> "Converted to "+s);
+ currentSpecTag.push(specTag);
+ }
++
+ result.setExtraField("specList", currentSpecTag.getSpecList());
if (detail) {
if (RegisteredTypes.isSubtypeOf(item, Entity.class)) {