Add catalog item super id support.
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/8c442729 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/8c442729 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/8c442729 Branch: refs/heads/master Commit: 8c4427299f77de91258d8d653d8d6d1e75644328 Parents: 7e88322 Author: Geoff Macartney <[email protected]> Authored: Tue Sep 20 11:16:36 2016 +0100 Committer: Geoff Macartney <[email protected]> Committed: Thu Apr 20 11:18:42 2017 +0100 ---------------------------------------------------------------------- .../internal/AbstractBrooklynObjectSpec.java | 4 +- .../brooklyn/api/objs/BrooklynObject.java | 13 +++++++ .../core/catalog/internal/CatalogItemDo.java | 16 ++++++++ .../internal/CatalogItemDtoAbstract.java | 2 + .../core/catalog/internal/CatalogUtils.java | 4 +- .../access/PortForwardManagerClient.java | 7 ++++ .../core/mgmt/rebind/RebindIteration.java | 1 + .../core/objs/AbstractBrooklynObject.java | 41 ++++++++++++++++++-- .../core/objs/AbstractEntityAdjunct.java | 8 ++-- .../core/objs/BrooklynObjectInternal.java | 4 ++ .../core/objs/proxy/InternalEntityFactory.java | 5 ++- .../objs/proxy/InternalLocationFactory.java | 2 +- .../core/objs/proxy/InternalPolicyFactory.java | 4 +- .../util/core/ClassLoaderUtilsTest.java | 2 +- 14 files changed, 96 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/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 95f791b..048a440 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 @@ -218,7 +218,7 @@ public abstract class AbstractBrooklynObjectSpec<T,SpecT extends AbstractBrookly } /** - * Get immutable list of ids of this object's catalog item and its nested catalog items. + * An immutable list of ids of this object's catalog item and its defining catalog items. * e.g. if the catalog item is defined as * <pre> * items: @@ -227,7 +227,7 @@ public abstract class AbstractBrooklynObjectSpec<T,SpecT extends AbstractBrookly * </pre> * then the list will contain X, Y. */ - public final List<String> getNestedCatalogItemIds() { + public final List<String> getCatalogItemSuperIds() { return ImmutableList.copyOf(catalogItemIdStack); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java b/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java index b42bc58..6167288 100644 --- a/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java +++ b/api/src/main/java/org/apache/brooklyn/api/objs/BrooklynObject.java @@ -18,6 +18,7 @@ */ package org.apache.brooklyn.api.objs; +import java.util.List; import java.util.Map; import java.util.Set; @@ -57,6 +58,18 @@ public interface BrooklynObject extends Identifiable, Configurable { * Callers can set an explicit catalog item ID if inferencing is not correct. */ String getCatalogItemId(); + + /** + * An immutable list of ids of this object's catalog item and its defining 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. + */ + List<String> getCatalogItemSuperIds(); /** * Tags are arbitrary objects which can be attached to an entity for subsequent reference. http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java index 1766ad7..6699e39 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java @@ -19,6 +19,7 @@ package org.apache.brooklyn.core.catalog.internal; import java.util.Collection; +import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -131,6 +132,21 @@ public class CatalogItemDo<T,SpecT> implements CatalogItem<T,SpecT>, BrooklynObj } @Override + public void setCatalogItemIds(List<String> ids) { + itemDto.setCatalogItemIds(ids); + } + + @Override + public List<String> getCatalogItemSuperIds() { + return itemDto.getCatalogItemSuperIds(); + } + + @Override + public void nestCatalogItemId(String id) { + itemDto.nestCatalogItemId(id); + } + + @Override public String getJavaType() { return itemDto.getJavaType(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java index df0d2e4..41ed6a1 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java @@ -45,6 +45,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; +// TODO add support for nested catalog items, implement nestCatalogItemId in terms of symbolicName/Version +// TODO also getCatalogItemSuperIds. public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynObject implements CatalogItem<T, SpecT> { private static Logger LOG = LoggerFactory.getLogger(CatalogItemDtoAbstract.class); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java index 8b7555b..42e8766 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java @@ -20,9 +20,11 @@ package org.apache.brooklyn.core.catalog.internal; import java.util.Collection; import java.util.Iterator; +import java.util.ListIterator; import javax.annotation.Nullable; +import com.google.common.collect.Lists; import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle; @@ -191,7 +193,7 @@ public class CatalogUtils { if (log.isDebugEnabled()) BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(entity), "Catalog item addition: "+entity+" from "+entity.getCatalogItemId()+" applying its catalog item ID to "+itemBeingAdded); - ((BrooklynObjectInternal)itemBeingAdded).setCatalogItemId(entity.getCatalogItemId()); + ((BrooklynObjectInternal)itemBeingAdded).setCatalogItemIds(entity.getCatalogItemSuperIds()); } else { if (!itemBeingAdded.getCatalogItemId().equals(entity.getCatalogItemId())) { // not a problem, but something to watch out for http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java b/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java index b0baa01..1fb6ef5 100644 --- a/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java +++ b/core/src/main/java/org/apache/brooklyn/core/location/access/PortForwardManagerClient.java @@ -19,6 +19,7 @@ package org.apache.brooklyn.core.location.access; import java.util.Collection; +import java.util.List; import java.util.Map; import org.apache.brooklyn.api.entity.Entity; @@ -26,6 +27,7 @@ import org.apache.brooklyn.api.location.Location; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.config.ConfigKey.HasConfigKey; +import org.apache.brooklyn.core.location.AbstractLocation; import org.apache.brooklyn.util.exceptions.Exceptions; import com.google.common.base.Preconditions; @@ -387,6 +389,11 @@ public class PortForwardManagerClient implements PortForwardManager { } @Override + public List<String> getCatalogItemSuperIds() { + return getDelegate().getCatalogItemSuperIds(); + } + + @Override public TagSupport tags() { return getDelegate().tags(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java index 6df8232..0585f9b 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java @@ -931,6 +931,7 @@ public abstract class RebindIteration { protected void setCatalogItemId(BrooklynObject item, String catalogItemId) { if (catalogItemId!=null) { + // TODO add support for nested catalog superids here. ((BrooklynObjectInternal)item).setCatalogItemId(catalogItemId); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java index d435135..fdfc624 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractBrooklynObject.java @@ -18,10 +18,22 @@ */ package org.apache.brooklyn.core.objs; +import java.util.ArrayDeque; import java.util.Collections; +import java.util.Deque; +import java.util.List; import java.util.Map; import java.util.Set; +import com.google.common.collect.ImmutableList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + import org.apache.brooklyn.api.internal.ApiObjectsFactory; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.core.entity.AbstractEntity; @@ -50,7 +62,7 @@ public abstract class AbstractBrooklynObject implements BrooklynObjectInternal { @SetFromFlag("id") private String id = Identifiers.makeRandomLowercaseId(10); - private String catalogItemId; + private Deque<String> catalogItemIdStack = new ArrayDeque<>(); /** callers (only in TagSupport) should synchronize on this for all access */ @SetFromFlag("tags") @@ -83,7 +95,7 @@ public abstract class AbstractBrooklynObject implements BrooklynObjectInternal { // correct behaviour should be to inherit context's search path, perhaps, though maybe that's better done as spec? // in any case, should not define it as _the_ catalog item ID; also see assignment based on parent // in CatalogUtils.setCatalogItemIdOnAddition - catalogItemId = ApiObjectsFactory.get().getCatalogItemIdFromContext(); + setCatalogItemId(ApiObjectsFactory.get().getCatalogItemIdFromContext()); // rely on sub-class to call configure(properties), because otherwise its fields will not have been initialised } @@ -190,12 +202,33 @@ public abstract class AbstractBrooklynObject implements BrooklynObjectInternal { @Override public void setCatalogItemId(String id) { - this.catalogItemId = id; + catalogItemIdStack.clear(); + nestCatalogItemId(id); + } + + @Override + public void setCatalogItemIds(List<String> ids) { + catalogItemIdStack.clear(); + catalogItemIdStack.addAll(ids); + } + + @Override + public void nestCatalogItemId(String id) { + if (null != id) { + catalogItemIdStack.addFirst(id); + } + } + + public List<String> getCatalogItemSuperIds() { + return ImmutableList.copyOf(catalogItemIdStack); } @Override public String getCatalogItemId() { - return catalogItemId; + if (catalogItemIdStack.size() != 0) { + return catalogItemIdStack.getFirst(); + } + return null; } protected void onTagsChanged() { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java index 21956f8..c9bdc35 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java @@ -288,7 +288,7 @@ public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject imple doReconfigureConfig(key, (T)val); } } - + @Override protected <T> void onConfigChanged(ConfigKey<T> key, Object val) { onChanged(); @@ -308,7 +308,7 @@ public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject imple protected ExecutionContext getContext() { return AbstractEntityAdjunct.this.execution; } - + @Override protected AbstractConfigMapImpl<?> getConfigsInternal() { return configsInternal; @@ -342,7 +342,7 @@ public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject imple public <T> T setConfig(ConfigKey<T> key, T val) { return config().set(key, val); } - + /** * Invoked whenever a config change is applied after management is started. * Default implementation throws an exception to disallow the change. @@ -379,7 +379,7 @@ public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject imple this.entity = entity; this.execution = ((EntityInternal) entity).getExecutionContext(); if (entity!=null && getCatalogItemId() == null) { - setCatalogItemId(entity.getCatalogItemId()); + setCatalogItemIds(entity.getCatalogItemSuperIds()); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java b/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java index 3fc2c99..4dcbf1a 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java @@ -18,6 +18,7 @@ */ package org.apache.brooklyn.core.objs; +import java.util.List; import java.util.Map; import org.apache.brooklyn.api.mgmt.rebind.RebindSupport; @@ -37,6 +38,9 @@ import com.google.common.annotations.Beta; public interface BrooklynObjectInternal extends BrooklynObject, Rebindable { void setCatalogItemId(String id); + void setCatalogItemIds(List<String> id); + + void nestCatalogItemId(String id); // subclasses typically apply stronger typing @Override http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalEntityFactory.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalEntityFactory.java b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalEntityFactory.java index 6090c5b..77dfcf4 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalEntityFactory.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalEntityFactory.java @@ -33,6 +33,7 @@ import org.apache.brooklyn.api.entity.EntityLocal; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.entity.EntityTypeRegistry; import org.apache.brooklyn.api.entity.Group; +import org.apache.brooklyn.api.location.Location; import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.api.objs.SpecParameter; import org.apache.brooklyn.api.policy.Policy; @@ -246,7 +247,7 @@ public class InternalEntityFactory extends InternalFactory { ((AbstractEntity)entity).setDisplayName(spec.getDisplayName()); if (spec.getCatalogItemId()!=null) { - ((AbstractEntity)entity).setCatalogItemId(spec.getCatalogItemId()); + ((AbstractEntity)entity).setCatalogItemIds(spec.getCatalogItemSuperIds()); } entity.tags().addTags(spec.getTags()); @@ -344,7 +345,7 @@ public class InternalEntityFactory extends InternalFactory { // are already accessible through the REST API. LocationSpec<?> taggedSpec = LocationSpec.create(locationSpec) .tag(BrooklynTags.newOwnerEntityTag(entity.getId())); - ((AbstractEntity)entity).addLocations(MutableList.of( + ((AbstractEntity)entity).addLocations(MutableList.<Location>of( managementContext.getLocationManager().createLocation(taggedSpec))); } ((AbstractEntity)entity).addLocations(spec.getLocations()); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java index 4ba0658..57098b3 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java @@ -118,7 +118,7 @@ public class InternalLocationFactory extends InternalFactory { ((AbstractLocation)loc).setDisplayName(spec.getDisplayName()); if (spec.getCatalogItemId()!=null) { - ((AbstractLocation)loc).setCatalogItemId(spec.getCatalogItemId()); + ((AbstractLocation)loc).setCatalogItemIds(spec.getCatalogItemSuperIds()); } loc.tags().addTags(spec.getTags()); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalPolicyFactory.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalPolicyFactory.java b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalPolicyFactory.java index 2fc91ef..fd444a0 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalPolicyFactory.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalPolicyFactory.java @@ -107,7 +107,7 @@ public class InternalPolicyFactory extends InternalFactory { ((AbstractPolicy)pol).setDisplayName(spec.getDisplayName()); } if (spec.getCatalogItemId()!=null) { - ((AbstractPolicy)pol).setCatalogItemId(spec.getCatalogItemId()); + ((AbstractPolicy)pol).setCatalogItemIds(spec.getCatalogItemSuperIds()); } pol.tags().addTags(spec.getTags()); @@ -148,7 +148,7 @@ public class InternalPolicyFactory extends InternalFactory { ((AbstractEnricher)enricher).setDisplayName(spec.getDisplayName()); if (spec.getCatalogItemId()!=null) { - ((AbstractEnricher)enricher).setCatalogItemId(spec.getCatalogItemId()); + ((AbstractEnricher)enricher).setCatalogItemIds(spec.getCatalogItemSuperIds()); } enricher.tags().addTags(spec.getTags()); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c442729/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java b/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java index cee97ee..a6e75e2 100644 --- a/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java +++ b/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java @@ -325,7 +325,7 @@ public class ClassLoaderUtilsTest { .plan("{\"services\":[{\"type\": \"" + clazz.getName() + "\"}]}") .build(); mgmt.getCatalog().addItem(item); - ((EntityInternal)entity).setCatalogItemId(item.getId()); + ((EntityInternal)entity).setCatalogItemIds(item.getCatalogItemSuperIds()); return entity; }
