You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/11/04 15:29:56 UTC

[02/18] git commit: Look in parent entities when looking for a context catalog id to load classes from.

Look in parent entities when looking for a context catalog id to load classes from.


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/405842d2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/405842d2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/405842d2

Branch: refs/heads/master
Commit: 405842d20aa11d83fe91734ba61b80106f1383bd
Parents: b454beb
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Wed Oct 29 17:34:00 2014 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Wed Oct 29 17:34:00 2014 +0200

----------------------------------------------------------------------
 .../mementos/BrooklynMementoManifest.java       | 14 +++--
 .../entity/rebind/RebindManagerImpl.java        | 39 ++++++++------
 .../rebind/dto/BrooklynMementoManifestImpl.java | 35 +++---------
 .../rebind/dto/EntityMementoManifestImpl.java   | 56 ++++++++++++++++++++
 .../AbstractBrooklynMementoPersister.java       |  2 +-
 .../BrooklynMementoPersisterInMemory.java       |  4 +-
 .../BrooklynMementoPersisterToMultiFile.java    |  4 +-
 .../BrooklynMementoPersisterToObjectStore.java  |  5 +-
 .../entity/rebind/RebindPolicyTest.java         |  2 +-
 .../main/java/brooklyn/util/text/Strings.java   | 10 ++++
 10 files changed, 117 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java b/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java
index f8a40a6..418c59b 100644
--- a/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java
+++ b/api/src/main/java/brooklyn/mementos/BrooklynMementoManifest.java
@@ -22,7 +22,7 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.Map;
 
-import brooklyn.util.guava.Maybe;
+import brooklyn.entity.trait.Identifiable;
 
 /**
  * Represents a manifest of the entities etc in the overall memento.
@@ -30,10 +30,14 @@ import brooklyn.util.guava.Maybe;
  * @author aled
  */
 public interface BrooklynMementoManifest extends Serializable {
-
-    public Map<String, String> getEntityIdToType();
-
-    public Map<String, Maybe<String>> getEntityIdToContextCatalogItemId();
+    public interface EntityMementoManifest extends Identifiable{
+        public String getId();
+        public String getType();
+        public String getParent();
+        public String getContextCatalogItemId();
+    }
+
+    public Map<String, EntityMementoManifest> getEntityIdToManifest();
 
     public Map<String, String> getLocationIdToType();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
index 8eee9eb..2691a5b 100644
--- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java
@@ -73,6 +73,7 @@ import brooklyn.management.internal.ManagementContextInternal;
 import brooklyn.management.internal.ManagementTransitionInfo.ManagementTransitionMode;
 import brooklyn.mementos.BrooklynMemento;
 import brooklyn.mementos.BrooklynMementoManifest;
+import brooklyn.mementos.BrooklynMementoManifest.EntityMementoManifest;
 import brooklyn.mementos.BrooklynMementoPersister;
 import brooklyn.mementos.BrooklynMementoPersister.LookupContext;
 import brooklyn.mementos.BrooklynMementoRawData;
@@ -90,7 +91,6 @@ import brooklyn.util.collections.MutableMap;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.exceptions.RuntimeInterruptedException;
 import brooklyn.util.flags.FlagUtils;
-import brooklyn.util.guava.Maybe;
 import brooklyn.util.javalang.Reflections;
 import brooklyn.util.task.BasicExecutionContext;
 import brooklyn.util.task.ScheduledTask;
@@ -622,18 +622,18 @@ public class RebindManagerImpl implements RebindManager {
             }
             
             // Instantiate entities
-            LOG.debug("RebindManager instantiating entities: {}", mementoManifest.getEntityIdToType().keySet());
-            for (Map.Entry<String, String> entry : mementoManifest.getEntityIdToType().entrySet()) {
+            LOG.debug("RebindManager instantiating entities: {}", mementoManifest.getEntityIdToManifest().keySet());
+            for (Map.Entry<String, EntityMementoManifest> entry : mementoManifest.getEntityIdToManifest().entrySet()) {
                 String entityId = entry.getKey();
-                String entityType = entry.getValue();
-                Maybe<String> contextCatalogItemId = mementoManifest.getEntityIdToContextCatalogItemId().get(entityId);
+                EntityMementoManifest entityManifest = entry.getValue();
+                String contextCatalogItemId = findContextCatalogItemId(mementoManifest.getEntityIdToManifest(), entityManifest);
                 if (LOG.isTraceEnabled()) LOG.trace("RebindManager instantiating entity {}", entityId);
                 
                 try {
-                    Entity entity = newEntity(entityId, entityType, getEntityLoadingContext(entityId, contextCatalogItemId, classLoader, rebindContext));
+                    Entity entity = newEntity(entityId, entityManifest.getType(), getLoadingContextFromCatalogItemId(contextCatalogItemId, classLoader, rebindContext));
                     rebindContext.registerEntity(entityId, entity);
                 } catch (Exception e) {
-                    exceptionHandler.onCreateFailed(BrooklynObjectType.ENTITY, entityId, entityType, e);
+                    exceptionHandler.onCreateFailed(BrooklynObjectType.ENTITY, entityId, entityManifest.getType(), e);
                 }
             }
             
@@ -918,31 +918,38 @@ public class RebindManagerImpl implements RebindManager {
         }
     }
     
-    private BrooklynClassLoadingContext getEntityLoadingContext(String entityId, Maybe<String> contextCatalogItemId, ClassLoader classLoader, RebindContextImpl rebindContext) {
-        return getLoadingContextFromCatalogItemId(contextCatalogItemId, classLoader, rebindContext);
+    private String findContextCatalogItemId(Map<String, EntityMementoManifest> entityIdToManifest, EntityMementoManifest entityManifest) {
+        EntityMementoManifest ptr = entityManifest;
+        while (ptr != null) {
+            if (ptr.getContextCatalogItemId() != null) {
+                return ptr.getContextCatalogItemId();
+            }
+            ptr = entityIdToManifest.get(ptr.getParent());
+        }
+        return null;
     }
 
     private BrooklynClassLoadingContext getPolicyLoadingContext(String policyId, BrooklynMemento memento, ClassLoader classLoader, RebindContextImpl rebindContext) {
         PolicyMemento policyMemento = memento.getPolicyMemento(policyId);
-        Maybe<String> contextCatalogItemId = getContextCatalogItemIdFromTags(policyMemento.getTags());
+        String contextCatalogItemId = getContextCatalogItemIdFromTags(policyMemento.getTags());
         return getLoadingContextFromCatalogItemId(contextCatalogItemId, classLoader, rebindContext);
     }
 
-    private Maybe<String> getContextCatalogItemIdFromTags(Collection<Object> tags) {
+    private String getContextCatalogItemIdFromTags(Collection<Object> tags) {
         for (Object obj : tags) {
             if (obj instanceof NamedStringTag) {
                 NamedStringTag tag = (NamedStringTag) obj;
                 if (BrooklynTags.CONTEXT_CATALOG_ITEM_ID_KIND.equals(tag.getKind())) {
-                    return Maybe.of(tag.getContents());
+                    return tag.getContents();
                 }
             }
         }
-        return Maybe.absent();
+        return null;
     }
 
-    private BrooklynClassLoadingContext getLoadingContextFromCatalogItemId(Maybe<String> catalogItemId, ClassLoader classLoader, RebindContext rebindContext) {
-        if (catalogItemId.isPresent()) {
-            CatalogItem<?, ?> catalogItem = rebindContext.getCatalogItem(catalogItemId.get());
+    private BrooklynClassLoadingContext getLoadingContextFromCatalogItemId(String catalogItemId, ClassLoader classLoader, RebindContext rebindContext) {
+        if (catalogItemId != null) {
+            CatalogItem<?, ?> catalogItem = rebindContext.getCatalogItem(catalogItemId);
             if (catalogItem != null) {
                 return CatalogUtils.newClassLoadingContext(managementContext, catalogItem);
             } else {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java
index 6c0fb4e..2b52003 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoManifestImpl.java
@@ -25,7 +25,6 @@ import java.util.Map;
 
 import brooklyn.mementos.BrooklynMementoManifest;
 import brooklyn.mementos.CatalogItemMemento;
-import brooklyn.util.guava.Maybe;
 
 import com.google.common.collect.Maps;
 
@@ -39,8 +38,7 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser
     
     public static class Builder {
         protected String brooklynVersion;
-        protected final Map<String, String> entityIdToType = Maps.newConcurrentMap();
-        protected final Map<String, Maybe<String>> entityIdToContextCatalogItemId = Maps.newConcurrentMap();
+        protected final Map<String, EntityMementoManifest> entityIdToManifest = Maps.newConcurrentMap();
         protected final Map<String, String> locationIdToType = Maps.newConcurrentMap();
         protected final Map<String, String> policyIdToType = Maps.newConcurrentMap();
         protected final Map<String, String> enricherIdToType = Maps.newConcurrentMap();
@@ -50,20 +48,10 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser
         public Builder brooklynVersion(String val) {
             brooklynVersion = val; return this;
         }
-        public Builder entity(String id, String type, String catalogItemId) {
-            entityIdToType.put(id, type);
-            Maybe<String> catalogItemIdOption;
-            if (catalogItemId != null) {
-                catalogItemIdOption = Maybe.of(catalogItemId);
-            } else {
-                catalogItemIdOption = Maybe.absent();
-            }
-            entityIdToContextCatalogItemId.put(id, catalogItemIdOption);
+        public Builder entity(String id, String type, String parent, String catalogItemId) {
+            entityIdToManifest.put(id, new EntityMementoManifestImpl(id, type, parent, catalogItemId));
             return this;
         }
-        public Builder entities(Map<String, String> vals) {
-            entityIdToType.putAll(vals); return this;
-        }
         public Builder location(String id, String type) {
             locationIdToType.put(id, type); return this;
         }
@@ -100,8 +88,7 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser
         }
     }
 
-    private final Map<String, String> entityIdToType;
-    private final Map<String, Maybe<String>> entityIdToContextCatalogItemId;
+    private final Map<String, EntityMementoManifest> entityIdToManifest;
     private final Map<String, String> locationIdToType;
     private final Map<String, String> policyIdToType;
     private final Map<String, String> enricherIdToType;
@@ -109,8 +96,7 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser
     private Map<String, CatalogItemMemento> catalogItems;
     
     private BrooklynMementoManifestImpl(Builder builder) {
-        entityIdToType = builder.entityIdToType;
-        entityIdToContextCatalogItemId = builder.entityIdToContextCatalogItemId;
+        entityIdToManifest = builder.entityIdToManifest;
         locationIdToType = builder.locationIdToType;
         policyIdToType = builder.policyIdToType;
         enricherIdToType = builder.enricherIdToType;
@@ -119,13 +105,8 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser
     }
 
     @Override
-    public Map<String, String> getEntityIdToType() {
-        return Collections.unmodifiableMap(entityIdToType);
-    }
-
-    @Override
-    public Map<String, Maybe<String>> getEntityIdToContextCatalogItemId() {
-        return Collections.unmodifiableMap(entityIdToContextCatalogItemId);
+    public Map<String, EntityMementoManifest> getEntityIdToManifest() {
+        return Collections.unmodifiableMap(entityIdToManifest);
     }
 
     @Override
@@ -165,7 +146,7 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser
 
     @Override
     public boolean isEmpty() {
-        return entityIdToType.isEmpty() &&
+        return entityIdToManifest.isEmpty() &&
                 locationIdToType.isEmpty() &&
                 policyIdToType.isEmpty() &&
                 enricherIdToType.isEmpty() &&

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java b/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java
new file mode 100644
index 0000000..bfec2ca
--- /dev/null
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/EntityMementoManifestImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package brooklyn.entity.rebind.dto;
+
+import brooklyn.mementos.BrooklynMementoManifest.EntityMementoManifest;
+
+public class EntityMementoManifestImpl implements EntityMementoManifest {
+    private String id;
+    private String type;
+    private String parentId;
+    private String contextCatalogItemId;
+
+    public EntityMementoManifestImpl(String id, String type, String parentId, String contextCatalogItemId) {
+        this.id = id;
+        this.type = type;
+        this.parentId = parentId;
+        this.contextCatalogItemId = contextCatalogItemId;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    @Override
+    public String getParent() {
+        return parentId;
+    }
+
+    @Override
+    public String getContextCatalogItemId() {
+        return contextCatalogItemId;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java b/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
index ff75aa9..9758213 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/AbstractBrooklynMementoPersister.java
@@ -56,7 +56,7 @@ public abstract class AbstractBrooklynMementoPersister implements BrooklynMement
     public BrooklynMementoManifest loadMementoManifest(RebindExceptionHandler exceptionHandler) {
         BrooklynMementoManifestImpl.Builder builder = BrooklynMementoManifestImpl.builder();
         for (EntityMemento entity : memento.getEntityMementos().values()) {
-            builder.entity(entity.getId(), entity.getType(), getContextCatalogItemId(entity.getTags()));
+            builder.entity(entity.getId(), entity.getType(), entity.getParent(), getContextCatalogItemId(entity.getTags()));
         }
         for (LocationMemento entity : memento.getLocationMementos().values()) {
             builder.location(entity.getId(), entity.getType());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java
index 0fdd64b..847dfa7 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterInMemory.java
@@ -42,6 +42,7 @@ import brooklyn.location.Location;
 import brooklyn.management.ManagementContext;
 import brooklyn.mementos.BrooklynMemento;
 import brooklyn.mementos.BrooklynMementoManifest;
+import brooklyn.mementos.BrooklynMementoManifest.EntityMementoManifest;
 import brooklyn.policy.Enricher;
 import brooklyn.policy.Policy;
 import brooklyn.util.collections.MutableList;
@@ -124,7 +125,8 @@ public class BrooklynMementoPersisterInMemory extends AbstractBrooklynMementoPer
                     @Override public Entity lookupEntity(String id) {
                         List<Class<?>> types = MutableList.<Class<?>>builder()
                                 .add(Entity.class, EntityInternal.class, EntityProxy.class)
-                                .add(loadClass(manifest.getEntityIdToType().get(id)))
+                                //TODO Doesn't support loading from catalog item osgi bundles
+                                .add(loadClass(manifest.getEntityIdToManifest().get(id).getType()))
                                 .build();
                         return (Entity) java.lang.reflect.Proxy.newProxyInstance(
                                 classLoader,

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
index eb67ee7..cdd87b8 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToMultiFile.java
@@ -48,6 +48,7 @@ import brooklyn.mementos.EntityMemento;
 import brooklyn.mementos.LocationMemento;
 import brooklyn.mementos.PolicyMemento;
 import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.text.Strings;
 import brooklyn.util.time.Duration;
 import brooklyn.util.time.Time;
 import brooklyn.util.xstream.XmlUtil;
@@ -194,8 +195,9 @@ public class BrooklynMementoPersisterToMultiFile implements BrooklynMementoPersi
                     String contents = readFile(file);
                     String id = (String) XmlUtil.xpath(contents, "/entity/id");
                     String type = (String) XmlUtil.xpath(contents, "/entity/type");
+                    String parentId = (String) XmlUtil.xpath(contents, "/entity/parent");
                     String contextCatalogItemId = (String) XmlUtil.xpath(contents, "/entity/tags/" + NamedStringTag.class.getName().replace("$", "_-") + "[kind='" + BrooklynTags.CONTEXT_CATALOG_ITEM_ID_KIND + "']/contents");
-                    builder.entity(id, type, contextCatalogItemId);
+                    builder.entity(id, type, Strings.emptyToNull(parentId), Strings.emptyToNull(contextCatalogItemId));
                 } catch (Exception e) {
                     exceptionHandler.onLoadMementoFailed(BrooklynObjectType.ENTITY, "File "+file, e);
                 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
index 6d86a35..09f58b7 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
@@ -254,8 +254,9 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
                     case ENTITY:
                         String id = (String) XmlUtil.xpath(contents, "/entity/id");
                         String objType = (String) XmlUtil.xpath(contents, "/entity/type");
+                        String parentId = (String) XmlUtil.xpath(contents, "/entity/parent");
                         String contextCatalogItemId = (String) XmlUtil.xpath(contents, "/entity/tags/" + NamedStringTag.class.getName().replace("$", "_-") + "[kind='" + BrooklynTags.CONTEXT_CATALOG_ITEM_ID_KIND + "']/contents");
-                        builder.entity(id, objType, Strings.isEmpty(contextCatalogItemId) ? null : contextCatalogItemId);
+                        builder.entity(id, objType, Strings.emptyToNull(parentId), Strings.emptyToNull(contextCatalogItemId));
                         break;
                     case LOCATION:
                         id = (String) XmlUtil.xpath(contents, "/location/id");
@@ -303,7 +304,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("Loaded memento manifest; took {}; {} entities, {} locations, {} policies, {} enrichers, {} feeds, {} catalog items, from {}", new Object[]{
-                     Time.makeTimeStringRounded(stopwatch.elapsed(TimeUnit.MILLISECONDS)), result.getEntityIdToType().size(), 
+                     Time.makeTimeStringRounded(stopwatch.elapsed(TimeUnit.MILLISECONDS)), result.getEntityIdToManifest().size(), 
                      result.getLocationIdToType().size(), result.getPolicyIdToType().size(), result.getEnricherIdToType().size(), 
                      result.getFeedIdToType().size(), result.getCatalogItemMementos().size(),
                      objectStore.getSummaryName() });

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/core/src/test/java/brooklyn/entity/rebind/RebindPolicyTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindPolicyTest.java b/core/src/test/java/brooklyn/entity/rebind/RebindPolicyTest.java
index 9e550ed..ef27a94 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RebindPolicyTest.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RebindPolicyTest.java
@@ -141,7 +141,7 @@ public class RebindPolicyTest extends RebindTestFixtureWithApp {
         RebindTestUtils.waitForPersisted(origApp);
         
         BrooklynMementoManifest manifest = loadMementoManifest();
-        assertFalse(manifest.getEntityIdToType().containsKey(entity.getId()));
+        assertFalse(manifest.getEntityIdToManifest().containsKey(entity.getId()));
         assertFalse(manifest.getPolicyIdToType().containsKey(policy.getId()));
         assertFalse(manifest.getEnricherIdToType().containsKey(enricher.getId()));
         assertFalse(manifest.getLocationIdToType().containsKey(loc.getId()));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/405842d2/utils/common/src/main/java/brooklyn/util/text/Strings.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/text/Strings.java b/utils/common/src/main/java/brooklyn/util/text/Strings.java
index 4c275c9..6e3ec06 100644
--- a/utils/common/src/main/java/brooklyn/util/text/Strings.java
+++ b/utils/common/src/main/java/brooklyn/util/text/Strings.java
@@ -833,4 +833,14 @@ public class Strings {
         return replaceAllRegex(x, "\\s+", whitespaceReplacement);
     }
 
+    /**
+     * @return null if var is null or empty string, otherwise return var
+     */
+    public static String emptyToNull(String var) {
+        if (isNonEmpty(var)) {
+            return var;
+        } else {
+            return null;
+        }
+    }
 }