remove generics on BrooklynObject internal hierarchy simplifies things a lot without much work needed to cast or add correct-generic-type methods so that API is natural.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/890c5c04 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/890c5c04 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/890c5c04 Branch: refs/heads/master Commit: 890c5c046d22612969ccb8876a070a4b15ccb316 Parents: ed113a3 Author: Alex Heneveld <[email protected]> Authored: Tue Oct 27 12:33:47 2015 +0000 Committer: Alex Heneveld <[email protected]> Committed: Tue Oct 27 12:33:47 2015 +0000 ---------------------------------------------------------------------- .../org/apache/brooklyn/api/entity/Entity.java | 1 + .../apache/brooklyn/api/location/Location.java | 4 ++++ .../org/apache/brooklyn/api/policy/Policy.java | 4 ++++ .../apache/brooklyn/api/sensor/Enricher.java | 3 +++ .../org/apache/brooklyn/api/sensor/Feed.java | 4 ++++ .../core/catalog/internal/CatalogItemDo.java | 2 +- .../internal/CatalogItemDtoAbstract.java | 2 +- .../core/enricher/AbstractEnricher.java | 8 +++++++- .../brooklyn/core/entity/AbstractEntity.java | 8 +++++++- .../brooklyn/core/entity/EntityInternal.java | 5 ++++- .../brooklyn/core/entity/EntityRelations.java | 14 +++++++------ .../apache/brooklyn/core/feed/AbstractFeed.java | 8 +++++++- .../core/location/AbstractLocation.java | 8 +++++++- .../access/PortForwardManagerClient.java | 2 +- .../location/internal/LocationInternal.java | 5 ++++- .../AbstractBrooklynObjectRebindSupport.java | 4 ++-- .../core/objs/AbstractBrooklynObject.java | 21 +++++++------------- .../core/objs/AbstractEntityAdjunct.java | 8 ++++---- .../brooklyn/core/objs/BrooklynDynamicType.java | 4 ++-- .../core/objs/BrooklynObjectInternal.java | 4 ++-- .../brooklyn/core/policy/AbstractPolicy.java | 8 +++++++- .../relations/AbstractBasicRelationSupport.java | 8 ++++++++ 22 files changed, 95 insertions(+), 40 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 3b333e0..3bca701 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 @@ -308,6 +308,7 @@ public interface Entity extends BrooklynObject { GroupSupport groups(); + @Override RelationSupport<Entity> relations(); @Beta http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/api/src/main/java/org/apache/brooklyn/api/location/Location.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/location/Location.java b/api/src/main/java/org/apache/brooklyn/api/location/Location.java index 84e371b..3ef9251 100644 --- a/api/src/main/java/org/apache/brooklyn/api/location/Location.java +++ b/api/src/main/java/org/apache/brooklyn/api/location/Location.java @@ -131,4 +131,8 @@ public interface Location extends Serializable, BrooklynObject { * @throws NullPointerException if extensionType is null */ <T> T getExtension(Class<T> extensionType); + + @Override + RelationSupport<Location> relations(); + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/api/src/main/java/org/apache/brooklyn/api/policy/Policy.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/policy/Policy.java b/api/src/main/java/org/apache/brooklyn/api/policy/Policy.java index 0235bac..5b1e2fa 100644 --- a/api/src/main/java/org/apache/brooklyn/api/policy/Policy.java +++ b/api/src/main/java/org/apache/brooklyn/api/policy/Policy.java @@ -73,4 +73,8 @@ public interface Policy extends EntityAdjunct, Rebindable, Configurable { @Override @Beta RebindSupport<PolicyMemento> getRebindSupport(); + + @Override + RelationSupport<Policy> relations(); + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/api/src/main/java/org/apache/brooklyn/api/sensor/Enricher.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/sensor/Enricher.java b/api/src/main/java/org/apache/brooklyn/api/sensor/Enricher.java index 7d34e6c..3fde2a5 100644 --- a/api/src/main/java/org/apache/brooklyn/api/sensor/Enricher.java +++ b/api/src/main/java/org/apache/brooklyn/api/sensor/Enricher.java @@ -55,4 +55,7 @@ public interface Enricher extends EntityAdjunct, Rebindable, Configurable { @Beta RebindSupport<EnricherMemento> getRebindSupport(); + @Override + RelationSupport<Enricher> relations(); + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/api/src/main/java/org/apache/brooklyn/api/sensor/Feed.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/sensor/Feed.java b/api/src/main/java/org/apache/brooklyn/api/sensor/Feed.java index b07b5e3..d50e092 100644 --- a/api/src/main/java/org/apache/brooklyn/api/sensor/Feed.java +++ b/api/src/main/java/org/apache/brooklyn/api/sensor/Feed.java @@ -67,4 +67,8 @@ public interface Feed extends EntityAdjunct, Rebindable { @Override @Beta RebindSupport<FeedMemento> getRebindSupport(); + + @Override + RelationSupport<Feed> relations(); + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 a3ae36e..fedc37e 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 @@ -33,7 +33,7 @@ import org.apache.brooklyn.core.relations.EmptyRelationSupport; import com.google.common.base.Preconditions; -public class CatalogItemDo<T,SpecT> implements CatalogItem<T,SpecT>, BrooklynObjectInternal<CatalogItem<T,SpecT>,CatalogItemDo<T,SpecT>> { +public class CatalogItemDo<T,SpecT> implements CatalogItem<T,SpecT>, BrooklynObjectInternal { protected final CatalogDo catalog; protected final CatalogItemDtoAbstract<T,SpecT> itemDto; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 078cd27..47ce81d 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 @@ -44,7 +44,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; -public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynObject<CatalogItem<T, SpecT>, CatalogItemDtoAbstract<T, SpecT>> implements CatalogItem<T, SpecT> { +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/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/enricher/AbstractEnricher.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/enricher/AbstractEnricher.java b/core/src/main/java/org/apache/brooklyn/core/enricher/AbstractEnricher.java index 2597baa..5471c78 100644 --- a/core/src/main/java/org/apache/brooklyn/core/enricher/AbstractEnricher.java +++ b/core/src/main/java/org/apache/brooklyn/core/enricher/AbstractEnricher.java @@ -43,7 +43,7 @@ import com.google.common.collect.Maps; /** * Base {@link Enricher} implementation; all enrichers should extend this or its children */ -public abstract class AbstractEnricher extends AbstractEntityAdjunct<Enricher,AbstractEnricher> implements Enricher { +public abstract class AbstractEnricher extends AbstractEntityAdjunct implements Enricher { public static final ConfigKey<Boolean> SUPPRESS_DUPLICATES = ConfigKeys.newBooleanConfigKey("enricher.suppressDuplicates", "Whether duplicate values published by this enricher should be suppressed"); @@ -70,6 +70,12 @@ public abstract class AbstractEnricher extends AbstractEntityAdjunct<Enricher,Ab return new BasicEnricherRebindSupport(this); } + @SuppressWarnings("unchecked") + @Override + public RelationSupportInternal<Enricher> relations() { + return (RelationSupportInternal<Enricher>) super.relations(); + } + @Override public EnricherType getEnricherType() { return enricherType.getSnapshot(); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 5b52321..c75c908 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 @@ -141,7 +141,7 @@ import com.google.common.collect.Sets; * The legacy (pre 0.5) mechanism for creating entities is for others to call the constructor directly. * This is now deprecated. */ -public abstract class AbstractEntity extends AbstractBrooklynObject<Entity,EntityInternal> implements EntityLocal, EntityInternal { +public abstract class AbstractEntity extends AbstractBrooklynObject implements EntityLocal, EntityInternal { private static final Logger LOG = LoggerFactory.getLogger(AbstractEntity.class); @@ -2082,5 +2082,11 @@ public abstract class AbstractEntity extends AbstractBrooklynObject<Entity,Entit super.onTagsChanged(); getManagementSupport().getEntityChangeListener().onTagsChanged(); } + + @SuppressWarnings("unchecked") + @Override + public RelationSupportInternal<Entity> relations() { + return (RelationSupportInternal<Entity>) super.relations(); + } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 af81c21..4056eca 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 @@ -46,7 +46,7 @@ import com.google.common.annotations.Beta; * for the brooklyn framework only). */ @Beta -public interface EntityInternal extends BrooklynObjectInternal<Entity,EntityInternal>, EntityLocal, Rebindable { +public interface EntityInternal extends BrooklynObjectInternal, EntityLocal, Rebindable { void addLocations(Collection<? extends Location> locations); @@ -175,6 +175,9 @@ public interface EntityInternal extends BrooklynObjectInternal<Entity,EntityInte @Beta RebindSupport<EntityMemento> getRebindSupport(); + @Override + RelationSupportInternal<Entity> relations(); + /** * Can be called to request that the entity be persisted. * This persistence may happen asynchronously, or may not happen at all if persistence is disabled. http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java b/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java index 7dfa93e..4621a76 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/EntityRelations.java @@ -137,24 +137,26 @@ public class EntityRelations<T extends BrooklynObject> { @SuppressWarnings({ "rawtypes", "unchecked" }) public static <T extends BrooklynObject> Set<Relationship<? super T,? extends BrooklynObject>> getRelationships(T source) { - return ((BrooklynObjectInternal)source).relations().getLocalBackingStore().getRelationships(); + return (Set) ((BrooklynObjectInternal)source).relations().getLocalBackingStore().getRelationships(); } @SuppressWarnings({ "rawtypes", "unchecked" }) public static <T extends BrooklynObject,U extends BrooklynObject> Set<U> getRelations(Relationship<? super T,U> relationship, T source) { - return ((BrooklynObjectInternal)source).relations().getLocalBackingStore().getRelations(relationship); + return (Set) ((BrooklynObjectInternal)source).relations().getLocalBackingStore().getRelations((Relationship)relationship); } @SuppressWarnings({ "rawtypes", "unchecked" }) public static <T extends BrooklynObject,U extends BrooklynObject> void add(T source, Relationship<? super T,? super U> relationship, U target) { - ((BrooklynObjectInternal)source).relations().getLocalBackingStore().add(relationship, target); - ((BrooklynObjectInternal)target).relations().getLocalBackingStore().add(relationship.getInverseRelationship(), source); + ((BrooklynObjectInternal)source).relations().getLocalBackingStore().add((Relationship)relationship, target); + if (relationship.getInverseRelationship()!=null) + ((BrooklynObjectInternal)target).relations().getLocalBackingStore().add((Relationship)relationship.getInverseRelationship(), source); } @SuppressWarnings({ "rawtypes", "unchecked" }) public static <T extends BrooklynObject,U extends BrooklynObject> void remove(T source, Relationship<? super T,? super U> relationship, U target) { - ((BrooklynObjectInternal)source).relations().getLocalBackingStore().remove(relationship, target); - ((BrooklynObjectInternal)target).relations().getLocalBackingStore().remove(relationship.getInverseRelationship(), source); + ((BrooklynObjectInternal)source).relations().getLocalBackingStore().remove((Relationship)relationship, target); + if (relationship.getInverseRelationship()!=null) + ((BrooklynObjectInternal)target).relations().getLocalBackingStore().remove((Relationship)relationship.getInverseRelationship(), source); } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java b/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java index 64320cd..5b057dd 100644 --- a/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java +++ b/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java @@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory; * These generally poll or subscribe to get sensor values for an entity. * They make it easy to poll over http, jmx, etc. */ -public abstract class AbstractFeed extends AbstractEntityAdjunct<Feed,AbstractFeed> implements Feed { +public abstract class AbstractFeed extends AbstractEntityAdjunct implements Feed { private static final Logger log = LoggerFactory.getLogger(AbstractFeed.class); @@ -208,6 +208,12 @@ public abstract class AbstractFeed extends AbstractEntityAdjunct<Feed,AbstractFe return new BasicFeedRebindSupport(this); } + @SuppressWarnings("unchecked") + @Override + public RelationSupportInternal<Feed> relations() { + return (RelationSupportInternal<Feed>) super.relations(); + } + @Override protected void onChanged() { // TODO Auto-generated method stub http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java b/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java index 996b1a0..c14472d 100644 --- a/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java +++ b/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java @@ -94,7 +94,7 @@ import com.google.common.reflect.TypeToken; * * Override {@link #configure(Map)} to add special initialization logic. */ -public abstract class AbstractLocation extends AbstractBrooklynObject<Location,LocationInternal> implements LocationInternal, HasHostGeoInfo, Configurable { +public abstract class AbstractLocation extends AbstractBrooklynObject implements LocationInternal, HasHostGeoInfo, Configurable { private static final long serialVersionUID = -7495805474138619830L; @@ -755,6 +755,12 @@ public abstract class AbstractLocation extends AbstractBrooklynObject<Location,L return new BasicLocationRebindSupport(this); } + @SuppressWarnings("unchecked") + @Override + public RelationSupportInternal<Location> relations() { + return (RelationSupportInternal<Location>) super.relations(); + } + @Override public boolean hasExtension(Class<?> extensionType) { return extensions.get().containsKey(checkNotNull(extensionType, "extensionType")); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 d312f53..f2b9662 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 @@ -394,7 +394,7 @@ public class PortForwardManagerClient implements PortForwardManager { } @Override - public RelationSupport<?> relations() { + public RelationSupport<Location> relations() { return getDelegate().relations(); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationInternal.java b/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationInternal.java index fe9f669..5c83f2d 100644 --- a/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationInternal.java +++ b/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationInternal.java @@ -35,7 +35,7 @@ import com.google.common.annotations.Beta; /** * Information about locations private to Brooklyn. */ -public interface LocationInternal extends BrooklynObjectInternal<Location,LocationInternal>, Location { +public interface LocationInternal extends BrooklynObjectInternal, Location { @Beta public static final ConfigKey<String> ORIGINAL_SPEC = ConfigKeys.newStringConfigKey("spec.original", "The original spec used to instantiate a location"); @@ -89,5 +89,8 @@ public interface LocationInternal extends BrooklynObjectInternal<Location,Locati @Beta RebindSupport<LocationMemento> getRebindSupport(); + @Override + RelationSupportInternal<Location> relations(); + ManagementContext getManagementContext(); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java index 414cdbe..b56d8c6 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/AbstractBrooklynObjectRebindSupport.java @@ -40,9 +40,9 @@ public abstract class AbstractBrooklynObjectRebindSupport<T extends Memento> imp private static final Logger LOG = LoggerFactory.getLogger(AbstractBrooklynObjectRebindSupport.class); - private final AbstractBrooklynObject<?,?> instance; + private final AbstractBrooklynObject instance; - public AbstractBrooklynObjectRebindSupport(AbstractBrooklynObject<?,?> instance) { + public AbstractBrooklynObjectRebindSupport(AbstractBrooklynObject instance) { this.instance = instance; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 a0e02c5..d6ed647 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 @@ -24,7 +24,6 @@ import java.util.Set; import org.apache.brooklyn.api.internal.ApiObjectsFactory; import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.api.objs.BrooklynObject; import org.apache.brooklyn.core.entity.AbstractEntity; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl; @@ -41,7 +40,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -public abstract class AbstractBrooklynObject<PublicSelfType extends BrooklynObject,InternalSelfType extends BrooklynObjectInternal<PublicSelfType,InternalSelfType>> implements BrooklynObjectInternal<PublicSelfType,InternalSelfType> { +public abstract class AbstractBrooklynObject implements BrooklynObjectInternal { private static final Logger log = LoggerFactory.getLogger(AbstractBrooklynObject.class); @@ -57,18 +56,11 @@ public abstract class AbstractBrooklynObject<PublicSelfType extends BrooklynObje @SetFromFlag(value = "tags") private final Set<Object> tags = Sets.newLinkedHashSet(); - private RelationSupportInternal<PublicSelfType> relations = new ByObjectBasicRelationSupport<PublicSelfType>(getPublicThis(), new RelationChangedCallback()); + @SuppressWarnings({ "rawtypes", "unchecked" }) + private RelationSupportInternal relations = new ByObjectBasicRelationSupport(this, new RelationChangedCallback()); private volatile ManagementContext managementContext; - @SuppressWarnings("unchecked") - /** returns this cast to T, e.g. EntityInternal */ - protected InternalSelfType getThis() { return (InternalSelfType)this; } - - /** returns this cast to PublicT, e.g. Entity */ - @SuppressWarnings("unchecked") - protected PublicSelfType getPublicThis() { return (PublicSelfType)this; } - public abstract void setDisplayName(String newName); public AbstractBrooklynObject() { @@ -98,7 +90,7 @@ public abstract class AbstractBrooklynObject<PublicSelfType extends BrooklynObje * @deprecated since 0.7.0; only used for legacy brooklyn types where constructor is called directly */ @Deprecated - protected InternalSelfType configure() { + protected BrooklynObjectInternal configure() { return configure(Collections.emptyMap()); } @@ -117,7 +109,7 @@ public abstract class AbstractBrooklynObject<PublicSelfType extends BrooklynObje * @deprecated since 0.7.0; only used for legacy brooklyn types where constructor is called directly */ @Deprecated - protected abstract InternalSelfType configure(Map<?, ?> flags); + protected abstract BrooklynObjectInternal configure(Map<?, ?> flags); protected boolean isLegacyConstruction() { return _legacyConstruction; @@ -257,8 +249,9 @@ public abstract class AbstractBrooklynObject<PublicSelfType extends BrooklynObje } } + // XXX always override to get casting correct @Override - public RelationSupportInternal<PublicSelfType> relations() { + public RelationSupportInternal<?> relations() { return relations; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 9089095..d3bd9a8 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 @@ -67,7 +67,7 @@ import com.google.common.collect.Maps; /** * Common functionality for policies and enrichers */ -public abstract class AbstractEntityAdjunct<PublicSelfType extends BrooklynObject,InternalSelfType extends AbstractEntityAdjunct<PublicSelfType,InternalSelfType>> extends AbstractBrooklynObject<PublicSelfType,InternalSelfType> implements BrooklynObjectInternal<PublicSelfType,InternalSelfType>, EntityAdjunct, Configurable { +public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject implements BrooklynObjectInternal, EntityAdjunct, Configurable { private static final Logger log = LoggerFactory.getLogger(AbstractEntityAdjunct.class); private boolean _legacyNoConstructionInit; @@ -121,7 +121,7 @@ public abstract class AbstractEntityAdjunct<PublicSelfType extends BrooklynObjec _legacyNoConstructionInit = (properties != null) && Boolean.TRUE.equals(properties.get("noConstructionInit")); if (isLegacyConstruction()) { - InternalSelfType checkWeGetThis = configure(properties); + AbstractEntityAdjunct checkWeGetThis = configure(properties); assert this.equals(checkWeGetThis) : this+" configure method does not return itself; returns "+checkWeGetThis+" instead of "+this; boolean deferConstructionChecks = (properties.containsKey("deferConstructionChecks") && TypeCoercions.coerce(properties.get("deferConstructionChecks"), Boolean.class)); @@ -137,7 +137,7 @@ public abstract class AbstractEntityAdjunct<PublicSelfType extends BrooklynObjec @Override @Deprecated @SuppressWarnings({ "unchecked", "rawtypes" }) - public InternalSelfType configure(Map flags) { + public AbstractEntityAdjunct configure(Map flags) { // TODO only set on first time through boolean isFirstTime = true; @@ -178,7 +178,7 @@ public abstract class AbstractEntityAdjunct<PublicSelfType extends BrooklynObjec } } - return (InternalSelfType) this; + return this; } /** http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynDynamicType.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynDynamicType.java b/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynDynamicType.java index d7c73dd..3642448 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynDynamicType.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynDynamicType.java @@ -55,7 +55,7 @@ import com.google.common.collect.Lists; * for this reason it does *not* implement BrooklynType, but * callers can call {@link #getSnapshot()} to get a snapshot such instance. */ -public abstract class BrooklynDynamicType<T extends BrooklynObject, AbstractT extends AbstractBrooklynObject<T,?>> { +public abstract class BrooklynDynamicType<T extends BrooklynObject, AbstractT extends AbstractBrooklynObject> { private static final Logger LOG = LoggerFactory.getLogger(BrooklynDynamicType.class); @@ -144,7 +144,7 @@ public abstract class BrooklynDynamicType<T extends BrooklynObject, AbstractT ex * Prefers keys which overwrite other keys, and prefers keys which are lower in the hierarchy; * logs warnings if there are two conflicting keys which don't have an overwriting relationship. */ - protected static void buildConfigKeys(Class<? extends BrooklynObject> clazz, AbstractBrooklynObject<?,?> optionalInstance, + protected static void buildConfigKeys(Class<? extends BrooklynObject> clazz, AbstractBrooklynObject optionalInstance, Map<String, FieldAndValue<ConfigKey<?>>> configKeys) { ListMultimap<String,FieldAndValue<ConfigKey<?>>> configKeysAll = ArrayListMultimap.<String, FieldAndValue<ConfigKey<?>>>create(); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/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 658a9da..2da7463 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 @@ -31,7 +31,7 @@ import org.apache.brooklyn.util.guava.Maybe; import com.google.common.annotations.Beta; -public interface BrooklynObjectInternal<PublicSelfType extends BrooklynObject, InternalSelfType extends BrooklynObjectInternal<PublicSelfType,InternalSelfType>> extends BrooklynObject, Rebindable { +public interface BrooklynObjectInternal extends BrooklynObject, Rebindable { void setCatalogItemId(String id); @@ -124,7 +124,7 @@ public interface BrooklynObjectInternal<PublicSelfType extends BrooklynObject, I public void unsubscribeAll(); } - RelationSupportInternal<PublicSelfType> relations(); + RelationSupportInternal<?> relations(); public interface RelationSupportInternal<T extends BrooklynObject> extends BrooklynObject.RelationSupport<T> { @Beta http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/policy/AbstractPolicy.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/policy/AbstractPolicy.java b/core/src/main/java/org/apache/brooklyn/core/policy/AbstractPolicy.java index 3cb39e9..3af8176 100644 --- a/core/src/main/java/org/apache/brooklyn/core/policy/AbstractPolicy.java +++ b/core/src/main/java/org/apache/brooklyn/core/policy/AbstractPolicy.java @@ -37,7 +37,7 @@ import com.google.common.base.Objects; /** * Base {@link Policy} implementation; all policies should extend this or its children */ -public abstract class AbstractPolicy extends AbstractEntityAdjunct<Policy,AbstractPolicy> implements Policy, Configurable { +public abstract class AbstractPolicy extends AbstractEntityAdjunct implements Policy, Configurable { @SuppressWarnings("unused") private static final Logger log = LoggerFactory.getLogger(AbstractPolicy.class); @@ -109,6 +109,12 @@ public abstract class AbstractPolicy extends AbstractEntityAdjunct<Policy,Abstra return new BasicPolicyRebindSupport(this); } + @SuppressWarnings("unchecked") + @Override + public RelationSupportInternal<Policy> relations() { + return (RelationSupportInternal<Policy>) super.relations(); + } + @Override public String toString() { return Objects.toStringHelper(getClass()) http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/890c5c04/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java b/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java index 3694fa8..6483e97 100644 --- a/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java +++ b/core/src/main/java/org/apache/brooklyn/core/relations/AbstractBasicRelationSupport.java @@ -26,6 +26,14 @@ import org.apache.brooklyn.core.objs.BrooklynObjectInternal.RelationSupportInter import brooklyn.basic.relations.Relationship; +/** This abstract impl delegates to {@link EntityRelations} for all changes, routing through a local backing store. + * This allows us to make the changes in both directions simultaneously when a relationship is bi-directional, + * and should facilitate changing a backing datastore or remote instances when that is supported. + * <p> + * Currently it can be implemented without it, simplifying things a bit (avoiding the double dispatch) + * apart from the {@link #add(Relationship, BrooklynObject)} method triggering the reverse addition + * if it isn't already present. TBD which is better (and the internal call to get the backing store is + * marked as Beta). */ public abstract class AbstractBasicRelationSupport<SourceType extends BrooklynObject> implements RelationSupportInternal<SourceType> { final SourceType source;
