You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sv...@apache.org on 2015/10/27 15:48:27 UTC

[5/8] incubator-brooklyn git commit: remove generics on BrooklynObject internal hierarchy

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 <al...@cloudsoftcorp.com>
Authored: Tue Oct 27 12:33:47 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
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;