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);
}
}