Create entity.enrichers() and entity.policies() - deprecate methods Entity.*enricher*() and Entity.*policy*(), instead to use those on EnricherSupport / PolicySupport. - added to EntityInternal.enrichers()/policies() the methods removeAllEnrichers() and removeAllPolicies(). - deprecate those last methods of EntityLocal - deprecate EntityLocal
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/e48bdaa7 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/e48bdaa7 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/e48bdaa7 Branch: refs/heads/master Commit: e48bdaa73ab7cd85ac3b1aa42b6f1637c6dab0f9 Parents: 3e46621 Author: Aled Sage <[email protected]> Authored: Mon Sep 21 08:51:18 2015 +0100 Committer: Aled Sage <[email protected]> Committed: Wed Sep 23 10:32:55 2015 +0100 ---------------------------------------------------------------------- .../org/apache/brooklyn/api/entity/Entity.java | 78 +++++- .../apache/brooklyn/api/entity/EntityLocal.java | 8 + .../brooklyn/core/entity/AbstractEntity.java | 255 ++++++++++++++----- .../brooklyn/core/entity/EntityInternal.java | 27 ++ 4 files changed, 305 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e48bdaa7/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java b/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java index 8388d28..4df913b 100644 --- a/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java +++ b/api/src/main/java/org/apache/brooklyn/api/entity/Entity.java @@ -160,12 +160,18 @@ public interface Entity extends BrooklynObject { /** * @return an immutable thread-safe view of the policies. + * + * @deprecated since 0.9.0; see {@link PolicySupport#getPolicies()} */ + @Deprecated Collection<Policy> getPolicies(); /** * @return an immutable thread-safe view of the enrichers. + * + * @deprecated since 0.9.0; see {@link EnricherSupport#getEnrichers()} */ + @Deprecated Collection<Enricher> getEnrichers(); /** @@ -240,34 +246,52 @@ public interface Entity extends BrooklynObject { /** * Adds the given policy to this entity. Also calls policy.setEntity if available. + * + * @deprecated since 0.9.0; see {@link PolicySupport#addPolicy(Policy)} */ + @Deprecated void addPolicy(Policy policy); /** * Adds the given policy to this entity. Also calls policy.setEntity if available. + * + * @deprecated since 0.9.0; see {@link PolicySupport#addPolicy(PolicySpec)} */ + @Deprecated <T extends Policy> T addPolicy(PolicySpec<T> enricher); /** * Removes the given policy from this entity. * @return True if the policy existed at this entity; false otherwise + * + * @deprecated since 0.9.0; see {@link PolicySupport#removePolicy(Policy)} */ + @Deprecated boolean removePolicy(Policy policy); /** * Adds the given enricher to this entity. Also calls enricher.setEntity if available. + * + * @deprecated since 0.9.0; see {@link EnricherSupport#addEnricher(Enricher)} */ + @Deprecated void addEnricher(Enricher enricher); /** * Adds the given enricher to this entity. Also calls enricher.setEntity if available. + * + * @deprecated since 0.9.0; see {@link EnricherSupport#addEnricher(EnricherSpec)} */ + @Deprecated <T extends Enricher> T addEnricher(EnricherSpec<T> enricher); /** * Removes the given enricher from this entity. * @return True if the policy enricher at this entity; false otherwise + * + * @deprecated since 0.9.0; see {@link EnricherSupport#removeEnricher(Enricher)} */ + @Deprecated boolean removeEnricher(Enricher enricher); /** @@ -278,7 +302,11 @@ public interface Entity extends BrooklynObject { SensorSupport sensors(); SubscriptionSupport subscriptions(); - + + PolicySupport policies(); + + EnricherSupport enrichers(); + @Beta public interface SensorSupport { @@ -364,4 +392,52 @@ public interface Entity extends BrooklynObject { @Beta boolean unsubscribe(Entity producer, SubscriptionHandle handle); } + + @Beta + public interface PolicySupport { + /** + * @return an immutable thread-safe view of the policies. + */ + Collection<Policy> getPolicies(); + + /** + * Adds the given policy to this entity. Also calls policy.setEntity if available. + */ + void addPolicy(Policy policy); + + /** + * Adds the given policy to this entity. Also calls policy.setEntity if available. + */ + <T extends Policy> T addPolicy(PolicySpec<T> enricher); + + /** + * Removes the given policy from this entity. + * @return True if the policy existed at this entity; false otherwise + */ + boolean removePolicy(Policy policy); + } + + @Beta + public interface EnricherSupport { + /** + * @return an immutable thread-safe view of the enrichers. + */ + Collection<Enricher> getEnrichers(); + + /** + * Adds the given enricher to this entity. Also calls enricher.setEntity if available. + */ + void addEnricher(Enricher enricher); + + /** + * Adds the given enricher to this entity. Also calls enricher.setEntity if available. + */ + <T extends Enricher> T addEnricher(EnricherSpec<T> enricher); + + /** + * Removes the given enricher from this entity. + * @return True if the policy enricher at this entity; false otherwise + */ + boolean removeEnricher(Enricher enricher); + } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e48bdaa7/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java b/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java index c0b7a42..0ecc73a 100644 --- a/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java +++ b/api/src/main/java/org/apache/brooklyn/api/entity/EntityLocal.java @@ -43,6 +43,8 @@ import com.google.common.base.Function; * of sub-types. * FIXME Add {@link setAttribute(AttributeSensorAndConfigKey<?,T>)} back in if/when move it back, * or if we extract an interface for AttributeSensorAndConfigKey. + * + * @deprecated since 0.9.0; use {@link Entity} or {@link org.apache.brooklyn.core.entity.EntityInternal} */ public interface EntityLocal extends Entity { @@ -166,13 +168,19 @@ public interface EntityLocal extends Entity { /** * Removes all policy from this entity. * @return True if any policies existed at this entity; false otherwise + * + * @deprecated since 0.9.0; see {@link PolicySupportInternal#removeAllPolicies()}, e.g. {@code ((EntityInternal)entity).policies().removeAllPolicies()} */ + @Deprecated boolean removeAllPolicies(); /** * Removes all enricher from this entity. * Use with caution as some entities automatically register enrichers; this will remove those enrichers as well. * @return True if any enrichers existed at this entity; false otherwise + * + * @deprecated since 0.9.0; see {@link EnricherSupportInternal#removeAllEnrichers()}, e.g. {@code ((EntityInternal)entity).enrichers().removeAllEnrichers()} */ + @Deprecated boolean removeAllEnrichers(); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e48bdaa7/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java index 7a626a4..13079d3 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java @@ -198,8 +198,8 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E private Reference<String> iconUrl = new BasicReference<String>(); Map<String,Object> presentationAttributes = Maps.newLinkedHashMap(); - Collection<AbstractPolicy> policies = Lists.newCopyOnWriteArrayList(); - Collection<AbstractEnricher> enrichers = Lists.newCopyOnWriteArrayList(); + private Collection<AbstractPolicy> policiesInternal = Lists.newCopyOnWriteArrayList(); + private Collection<AbstractEnricher> enrichersInternal = Lists.newCopyOnWriteArrayList(); Collection<Feed> feeds = Lists.newCopyOnWriteArrayList(); // FIXME we do not currently support changing parents, but to implement a cluster that can shrink we need to support at least @@ -221,7 +221,11 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E private final BasicSensorSupport sensors = new BasicSensorSupport(); private final BasicSubscriptionSupport subscriptions = new BasicSubscriptionSupport(); - + + private final BasicPolicySupport policies = new BasicPolicySupport(); + + private final BasicEnricherSupport enrichers = new BasicEnricherSupport(); + /** * The config values of this entity. Updating this map should be done * via getConfig/setConfig. @@ -1522,82 +1526,212 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E // -------- POLICIES -------------------- + @Override + @Beta + // the concrete type rather than an interface is returned because Groovy subclasses + // complain (incorrectly) if we return PolicySupportInternal + // TODO revert to PolicySupportInternal when groovy subclasses work without this (eg new groovy version) + public BasicPolicySupport policies() { + return policies; + } + + @Override + @Beta + // the concrete type rather than an interface is returned because Groovy subclasses + // complain (incorrectly) if we return EnricherSupportInternal + // TODO revert to EnricherSupportInternal when groovy subclasses work without this (eg new groovy version) + public BasicEnricherSupport enrichers() { + return enrichers; + } + + /** + * Direct use of this class is strongly discouraged. It will become private in a future release, + * once {@link #policies()} is reverted to return {@link {PolicySupportInternal} instead of + * {@link BasicPolicySupport}. + */ + @Beta + // TODO revert to private when config() is reverted to return SensorSupportInternal + public class BasicPolicySupport implements PolicySupportInternal { + + @Override + public Collection<Policy> getPolicies() { + return ImmutableList.<Policy>copyOf(policiesInternal); + } + + @Override + public void addPolicy(Policy policy) { + Policy old = findApparentlyEqualAndWarnIfNotSameUniqueTag(policiesInternal, policy); + if (old!=null) { + LOG.debug("Removing "+old+" when adding "+policy+" to "+AbstractEntity.this); + removePolicy(old); + } + + CatalogUtils.setCatalogItemIdOnAddition(AbstractEntity.this, policy); + policiesInternal.add((AbstractPolicy)policy); + ((AbstractPolicy)policy).setEntity(AbstractEntity.this); + + getManagementSupport().getEntityChangeListener().onPolicyAdded(policy); + emit(AbstractEntity.POLICY_ADDED, new PolicyDescriptor(policy)); + } + + @Override + public <T extends Policy> T addPolicy(PolicySpec<T> spec) { + T policy = getManagementContext().getEntityManager().createPolicy(spec); + addPolicy(policy); + return policy; + } + + @Override + public boolean removePolicy(Policy policy) { + ((AbstractPolicy)policy).destroy(); + boolean changed = policiesInternal.remove(policy); + + if (changed) { + getManagementSupport().getEntityChangeListener().onPolicyRemoved(policy); + emit(AbstractEntity.POLICY_REMOVED, new PolicyDescriptor(policy)); + } + return changed; + } + + @Override + public boolean removeAllPolicies() { + boolean changed = false; + for (Policy policy : policiesInternal) { + removePolicy(policy); + changed = true; + } + return changed; + } + } + + /** + * Direct use of this class is strongly discouraged. It will become private in a future release, + * once {@link #enrichers()} is reverted to return {@link EnricherSupportInternal} instead of + * {@link BasicEnricherSupport}. + */ + @Beta + // TODO revert to private when config() is reverted to return SensorSupportInternal + public class BasicEnricherSupport implements EnricherSupportInternal { + @Override + public Collection<Enricher> getEnrichers() { + return ImmutableList.<Enricher>copyOf(enrichersInternal); + } + + @Override + public <T extends Enricher> T addEnricher(EnricherSpec<T> spec) { + T enricher = getManagementContext().getEntityManager().createEnricher(spec); + addEnricher(enricher); + return enricher; + } + + @Override + public void addEnricher(Enricher enricher) { + Enricher old = findApparentlyEqualAndWarnIfNotSameUniqueTag(enrichersInternal, enricher); + if (old!=null) { + LOG.debug("Removing "+old+" when adding "+enricher+" to "+AbstractEntity.this); + removeEnricher(old); + } + + CatalogUtils.setCatalogItemIdOnAddition(AbstractEntity.this, enricher); + enrichersInternal.add((AbstractEnricher) enricher); + ((AbstractEnricher)enricher).setEntity(AbstractEntity.this); + + getManagementSupport().getEntityChangeListener().onEnricherAdded(enricher); + // TODO Could add equivalent of AbstractEntity.POLICY_ADDED for enrichers; no use-case for that yet + } + + @Override + public boolean removeEnricher(Enricher enricher) { + ((AbstractEnricher)enricher).destroy(); + boolean changed = enrichersInternal.remove(enricher); + + if (changed) { + getManagementSupport().getEntityChangeListener().onEnricherRemoved(enricher); + } + return changed; + + } + + @Override + public boolean removeAllEnrichers() { + boolean changed = false; + for (AbstractEnricher enricher : enrichersInternal) { + changed = removeEnricher(enricher) || changed; + } + return changed; + } + } + + /** + * @deprecated since 0.9.0; see {@link BasicPolicySupport#getPolicies()}; e.g. {@code policies().getPolicies()} + */ @Override + @Deprecated public Collection<Policy> getPolicies() { - return ImmutableList.<Policy>copyOf(policies); + return policies().getPolicies(); } + /** + * @deprecated since 0.9.0; see {@link BasicPolicySupport#addPolicy(Policy)}; e.g. {@code policies().addPolicy(policy)} + */ @Override + @Deprecated public void addPolicy(Policy policy) { - Policy old = findApparentlyEqualAndWarnIfNotSameUniqueTag(policies, policy); - if (old!=null) { - LOG.debug("Removing "+old+" when adding "+policy+" to "+this); - removePolicy(old); - } - - CatalogUtils.setCatalogItemIdOnAddition(this, policy); - policies.add((AbstractPolicy)policy); - ((AbstractPolicy)policy).setEntity(this); - - getManagementSupport().getEntityChangeListener().onPolicyAdded(policy); - emit(AbstractEntity.POLICY_ADDED, new PolicyDescriptor(policy)); + policies().addPolicy(policy); } + /** + * @deprecated since 0.9.0; see {@link BasicPolicySupport#addPolicy(PolicySpec)}; e.g. {@code policies().addPolicy(spec)} + */ @Override + @Deprecated public <T extends Policy> T addPolicy(PolicySpec<T> spec) { - T policy = getManagementContext().getEntityManager().createPolicy(spec); - addPolicy(policy); - return policy; + return policies().addPolicy(spec); } + /** + * @deprecated since 0.9.0; see {@link BasicEnricherSupport#; e.g. {@code enrichers().addEnricher(spec)} + */ @Override + @Deprecated public <T extends Enricher> T addEnricher(EnricherSpec<T> spec) { - T enricher = getManagementContext().getEntityManager().createEnricher(spec); - addEnricher(enricher); - return enricher; + return enrichers().addEnricher(spec); } + /** + * @deprecated since 0.9.0; see {@link BasicPolicySupport#removePolicy(Policy)}; e.g. {@code policies().removePolicy(policy)} + */ @Override + @Deprecated public boolean removePolicy(Policy policy) { - ((AbstractPolicy)policy).destroy(); - boolean changed = policies.remove(policy); - - if (changed) { - getManagementSupport().getEntityChangeListener().onPolicyRemoved(policy); - emit(AbstractEntity.POLICY_REMOVED, new PolicyDescriptor(policy)); - } - return changed; + return policies().removePolicy(policy); } + /** + * @deprecated since 0.9.0; see {@link BasicPolicySupport#removeAllPolicies()}; e.g. {@code policies().removeAllPolicies()} + */ @Override + @Deprecated public boolean removeAllPolicies() { - boolean changed = false; - for (Policy policy : policies) { - removePolicy(policy); - changed = true; - } - return changed; + return policies().removeAllPolicies(); } + /** + * @deprecated since 0.9.0; see {@link BasicEnricherSupport#getEnrichers()}; e.g. {@code enrichers().getEnrichers()} + */ @Override + @Deprecated public Collection<Enricher> getEnrichers() { - return ImmutableList.<Enricher>copyOf(enrichers); + return enrichers().getEnrichers(); } + /** + * @deprecated since 0.9.0; see {@link BasicEnricherSupport#addEnricher(Enricher)}; e.g. {@code enrichers().addEnricher(enricher)} + */ @Override + @Deprecated public void addEnricher(Enricher enricher) { - Enricher old = findApparentlyEqualAndWarnIfNotSameUniqueTag(enrichers, enricher); - if (old!=null) { - LOG.debug("Removing "+old+" when adding "+enricher+" to "+this); - removeEnricher(old); - } - - CatalogUtils.setCatalogItemIdOnAddition(this, enricher); - enrichers.add((AbstractEnricher) enricher); - ((AbstractEnricher)enricher).setEntity(this); - - getManagementSupport().getEntityChangeListener().onEnricherAdded(enricher); - // TODO Could add equivalent of AbstractEntity.POLICY_ADDED for enrichers; no use-case for that yet + enrichers().addEnricher(enricher); } private <T extends EntityAdjunct> T findApparentlyEqualAndWarnIfNotSameUniqueTag(Collection<? extends T> items, T newItem) { @@ -1677,25 +1811,22 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E return null; } + /** + * @deprecated since 0.9.0; see {@link BasicEnricherSupport#removeEnricher(Enricher)}; e.g. {@code enrichers().removeEnricher(enricher)} + */ @Override + @Deprecated public boolean removeEnricher(Enricher enricher) { - ((AbstractEnricher)enricher).destroy(); - boolean changed = enrichers.remove(enricher); - - if (changed) { - getManagementSupport().getEntityChangeListener().onEnricherRemoved(enricher); - } - return changed; - + return enrichers().removeEnricher(enricher); } + /** + * @deprecated since 0.9.0; see {@link BasicEnricherSupport#removeAllEnrichers()}; e.g. {@code enrichers().removeAllEnrichers()} + */ @Override + @Deprecated public boolean removeAllEnrichers() { - boolean changed = false; - for (AbstractEnricher enricher : enrichers) { - changed = removeEnricher(enricher) || changed; - } - return changed; + return enrichers().removeAllEnrichers(); } // -------- FEEDS -------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e48bdaa7/core/src/main/java/org/apache/brooklyn/core/entity/EntityInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/EntityInternal.java b/core/src/main/java/org/apache/brooklyn/core/entity/EntityInternal.java index 1ebcaf1..04fa88b 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/EntityInternal.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/EntityInternal.java @@ -192,10 +192,18 @@ public interface EntityInternal extends BrooklynObjectInternal, EntityLocal, Reb */ void requestPersist(); + @Override SensorSupportInternal sensors(); + @Override SubscriptionSupportInternal subscriptions(); + @Override + PolicySupportInternal policies(); + + @Override + EnricherSupportInternal enrichers(); + @Beta public interface SensorSupportInternal extends Entity.SensorSupport { /** @@ -237,4 +245,23 @@ public interface EntityInternal extends BrooklynObjectInternal, EntityLocal, Reb public interface SubscriptionSupportInternal extends Entity.SubscriptionSupport { SubscriptionContext getSubscriptionContext(); } + + @Beta + public interface PolicySupportInternal extends Entity.PolicySupport { + /** + * Removes all policy from this entity. + * @return True if any policies existed at this entity; false otherwise + */ + boolean removeAllPolicies(); + } + + @Beta + public interface EnricherSupportInternal extends Entity.EnricherSupport { + /** + * Removes all enricher from this entity. + * Use with caution as some entities automatically register enrichers; this will remove those enrichers as well. + * @return True if any enrichers existed at this entity; false otherwise + */ + boolean removeAllEnrichers(); + } }
