persist the actual types of relationships if not standard ones

this allows properties etc on extension of relationships to be persisted and rebinded
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/EntityMemento.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/EntityMemento.java
index d073836..c930c91 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/EntityMemento.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/EntityMemento.java
@@ -57,7 +57,7 @@
     /**
      * The ids of the member entities, if this is a Group; otherwise empty.
      * 
-     * @see Group.getMembers()
+     * @see org.apache.brooklyn.api.entity.Group#getMembers
      */
     public List<String> getMembers();
     
diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/Memento.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/Memento.java
index 71fc587..6d6fdb0 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/Memento.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/Memento.java
@@ -86,8 +86,9 @@
     Class<?> getTypeClass();
 
     Collection<Object> getTags();
-    
-    Map<String,Set<String>> getRelations();
+
+    /** Key can be relationship name if a standard one, or an object. */
+    Map<Object,Set<String>> getRelations();
     
     /** Null for {@link Entity}, but important for adjuncts; see {@link EntityAdjunct#getUniqueTag()} */
     String getUniqueTag();
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 df5f9ae..499bef9 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
@@ -84,8 +84,13 @@
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
     protected void addRelations(RebindContext rebindContext, T memento) {
-        for (Map.Entry<String,Set<String>> rEntry : memento.getRelations().entrySet()) {
-            RelationshipType<? extends BrooklynObject, ? extends BrooklynObject> r = EntityRelations.lookup(instance.getManagementContext(), rEntry.getKey());
+        for (Map.Entry<Object,Set<String>> rEntry : memento.getRelations().entrySet()) {
+            RelationshipType<? extends BrooklynObject, ? extends BrooklynObject> r;
+            r = (rEntry.getKey() instanceof RelationshipType)
+                    ? (RelationshipType<? extends BrooklynObject, ? extends BrooklynObject>) rEntry.getKey()
+                    : rEntry.getKey() instanceof String
+                        ? EntityRelations.lookup(instance.getManagementContext(), (String) rEntry.getKey())
+                        : null;
             if (r==null) throw new IllegalStateException("Unsupported relationship -- "+rEntry.getKey() + " -- in "+memento);
             for (String itemId: rEntry.getValue()) {
                 BrooklynObject item = rebindContext.lookup().lookup(null, itemId);
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/AbstractMemento.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/AbstractMemento.java
index 0f398d3..d3f1c85 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/AbstractMemento.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/AbstractMemento.java
@@ -49,7 +49,7 @@
         protected List<String> searchPath;
         protected Map<String, Object> customFields = Maps.newLinkedHashMap();
         protected List<Object> tags = Lists.newArrayList();
-        protected Map<String,Set<String>> relations = Maps.newLinkedHashMap();
+        protected Map<Object,Set<String>> relations = Maps.newLinkedHashMap();
 
         // only supported for EntityAdjuncts
         protected String uniqueTag;
@@ -95,7 +95,7 @@
     protected String catalogItemId;
     private List<String> searchPath = Lists.newArrayList();
     private List<Object> tags;
-    private Map<String,Set<String>> relations;
+    private Map<Object,Set<String>> relations;
     
     // for EntityAdjuncts; not used for entity
     private String uniqueTag;
@@ -178,7 +178,7 @@
     }
 
     @Override
-    public Map<String,Set<String>> getRelations() {
+    public Map<Object,Set<String>> getRelations() {
         return fromPersistedMap(relations);
     }
     
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
index 0506d69..51e3e6f 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
@@ -53,10 +53,12 @@
 import org.apache.brooklyn.core.enricher.AbstractEnricher;
 import org.apache.brooklyn.core.entity.EntityDynamicType;
 import org.apache.brooklyn.core.entity.EntityInternal;
+import org.apache.brooklyn.core.entity.EntityRelations;
 import org.apache.brooklyn.core.feed.AbstractFeed;
 import org.apache.brooklyn.core.location.internal.LocationInternal;
 import org.apache.brooklyn.core.mgmt.persist.BrooklynPersistenceUtils;
 import org.apache.brooklyn.core.mgmt.rebind.AbstractBrooklynObjectRebindSupport;
+import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
 import org.apache.brooklyn.core.objs.BrooklynTypes;
 import org.apache.brooklyn.core.policy.AbstractPolicy;
 import org.apache.brooklyn.util.collections.MutableMap;
@@ -382,7 +384,12 @@
             Set relations = instance.relations().getRelations((RelationshipType)relationship);
             Set<String> relationIds = Sets.newLinkedHashSet();
             for (Object r: relations) relationIds.add( ((BrooklynObject)r).getId() );
-            builder.relations.put(relationship.getRelationshipTypeName(), relationIds);
+
+            // key is string name if known relationship type, otherwise the relationship type object
+            Object relTest = EntityRelations.lookup( ((BrooklynObjectInternal)instance).getManagementContext(), relationship.getRelationshipTypeName() );
+            Object rKey = relationship.equals(relTest) ? relationship.getRelationshipTypeName() : relationship;
+
+            builder.relations.put(rKey, relationIds);
         }
     }