Add nested catalog item ids to AbstractBrooklynObjectSpec.
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/7e883226 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/7e883226 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/7e883226 Branch: refs/heads/master Commit: 7e88322634490f7d29a9cd9f9977a2b9a111e6a3 Parents: 5d0fe63 Author: Geoff Macartney <[email protected]> Authored: Mon Sep 19 14:22:43 2016 +0100 Committer: Geoff Macartney <[email protected]> Committed: Thu Apr 20 11:18:42 2017 +0100 ---------------------------------------------------------------------- .../internal/AbstractBrooklynObjectSpec.java | 44 ++++++++++++++++++-- .../brooklyn/spi/creation/CampResolver.java | 2 +- .../brooklyn/catalog/CatalogYamlEntityTest.java | 4 +- 3 files changed, 43 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7e883226/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java ---------------------------------------------------------------------- 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 c3d45af..95f791b 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 @@ -22,9 +22,12 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.io.Serializable; import java.lang.reflect.Modifier; +import java.util.ArrayDeque; import java.util.Collections; +import java.util.Deque; import java.util.List; import java.util.Map; +import java.util.Queue; import java.util.Set; import org.apache.brooklyn.api.mgmt.EntityManager; @@ -65,7 +68,7 @@ public abstract class AbstractBrooklynObjectSpec<T,SpecT extends AbstractBrookly private final Class<? extends T> type; private String displayName; - private String catalogItemId; + private Deque<String> catalogItemIdStack = new ArrayDeque<>(); private Set<Object> tags = MutableSet.of(); private List<SpecParameter<?>> parameters = ImmutableList.of(); @@ -103,7 +106,23 @@ public abstract class AbstractBrooklynObjectSpec<T,SpecT extends AbstractBrookly // if that behaviour is desired, the child should be refactored to be its own item in the catalog BOM // (or TODO we add a separate field to record other catalog item IDs that could be applied for searching, see below) public SpecT catalogItemId(String val) { - catalogItemId = val; + catalogItemIdStack.clear(); + return nestCatalogItemId(val); + } + + /** + * Adds (stacks) the catalog item id of a wrapping specification. + * Does nothing if the value is null. + * + * Used when we to collect nested item ID's so that *all* can be searched. + * e.g. if R3 references R2 which references R1 any one of these might supply config keys + * referencing resources or types in their local bundles. + */ + @Beta + public SpecT nestCatalogItemId(String val) { + if (null != val) { + catalogItemIdStack.addFirst(val); + } return self(); } // TODO in many places (callers to this method) we prefer a wrapper item ID; @@ -119,7 +138,7 @@ public abstract class AbstractBrooklynObjectSpec<T,SpecT extends AbstractBrookly return self(); } - + public SpecT tag(Object tag) { tags.add(tag); return self(); @@ -192,7 +211,24 @@ public abstract class AbstractBrooklynObjectSpec<T,SpecT extends AbstractBrookly } public final String getCatalogItemId() { - return catalogItemId; + if (catalogItemIdStack.size() != 0) { + return catalogItemIdStack.getFirst(); + } + return null; + } + + /** + * Get immutable list of ids of this object's catalog item and its nested catalog items. + * e.g. if the catalog item is defined as + * <pre> + * items: + * - id: X + * item: Y + * </pre> + * then the list will contain X, Y. + */ + public final List<String> getNestedCatalogItemIds() { + return ImmutableList.copyOf(catalogItemIdStack); } public final Set<Object> getTags() { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7e883226/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java index d8c4194..39f77e0 100644 --- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java +++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java @@ -115,7 +115,7 @@ class CampResolver { throw new IllegalStateException("Creating spec from "+item+", got "+spec.getType()+" which is incompatible with expected "+expectedType); } - spec.catalogItemIdIfNotNull(item.getId()); + spec.nestCatalogItemId(item.getId()); if (!spec.getFlags().containsKey("iconUrl") && item.getIconUrl()!=null) { spec.configure("iconUrl", item.getIconUrl()); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7e883226/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java ---------------------------------------------------------------------- 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 5e31142..dff6689 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 @@ -636,8 +636,8 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { Entity app = createAndStartApplication(yaml); Entity entity = app.getChildren().iterator().next(); - // Fails - assertEquals(entity.getCatalogItemId(), ver(symbolicNameInner)); + assertEquals(entity.getCatalogItemId(), ver(symbolicNameOuter)); + // TODO check nested ids deleteCatalogEntity(symbolicNameInner); deleteCatalogEntity(symbolicNameOuter);
