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/13 23:23:47 UTC

[14/18] incubator-brooklyn git commit: Catalog versioning - backwards compatibility from rebind and catalog.xml

Catalog versioning - backwards compatibility from rebind and catalog.xml


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

Branch: refs/heads/master
Commit: 40eee57a1a705caa11e500cf8e24a1aba927d40d
Parents: 65995c6
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Wed Nov 12 19:54:03 2014 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Nov 13 11:49:55 2014 +0200

----------------------------------------------------------------------
 .../main/java/brooklyn/catalog/CatalogItem.java |  6 +-
 .../brooklyn/mementos/CatalogItemMemento.java   |  2 +-
 .../main/java/brooklyn/basic/BrooklynTypes.java |  2 +-
 .../internal/CatalogBundleConverter.java        | 59 ++++++++++++++++++
 .../catalog/internal/CatalogItemDo.java         |  6 ++
 .../internal/CatalogItemDtoAbstract.java        | 29 +++------
 .../catalog/internal/CatalogLibrariesDo.java    |  3 +-
 .../catalog/internal/CatalogLibrariesDto.java   | 14 +++--
 .../catalog/internal/CatalogXmlSerializer.java  |  8 +--
 .../rebind/BasicCatalogItemRebindSupport.java   |  2 +-
 .../rebind/dto/BasicCatalogItemMemento.java     | 39 +++++-------
 .../BrooklynMementoPersisterToObjectStore.java  |  5 +-
 .../CatalogItemLibrariesConverter.java          | 64 ++++++++++++++++++++
 .../rebind/persister/XmlMementoSerializer.java  |  6 ++
 .../persister/XmlMementoSerializerTest.java     |  5 ++
 .../brooklyn/catalog/CatalogYamlEntityTest.java |  2 +-
 16 files changed, 192 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/api/src/main/java/brooklyn/catalog/CatalogItem.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/catalog/CatalogItem.java b/api/src/main/java/brooklyn/catalog/CatalogItem.java
index d06a682..d3824fd 100644
--- a/api/src/main/java/brooklyn/catalog/CatalogItem.java
+++ b/api/src/main/java/brooklyn/catalog/CatalogItem.java
@@ -47,7 +47,7 @@ public interface CatalogItem<T,SpecT> extends BrooklynObject, Rebindable {
 
     @Deprecated
     public static interface CatalogItemLibraries {
-        Collection<CatalogBundle> getBundles();
+        Collection<String> getBundles();
     }
 
     public CatalogItemType getCatalogItemType();
@@ -65,6 +65,10 @@ public interface CatalogItem<T,SpecT> extends BrooklynObject, Rebindable {
     @Deprecated
     public String getName();
 
+    /** @deprecated since 0.7.0. Use {@link #getSymbolicName} */
+    @Deprecated
+    public String getRegisteredTypeName();
+
     @Nullable public String getDescription();
 
     @Nullable public String getIconUrl();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java b/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java
index d3163e5..36d497d 100644
--- a/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java
+++ b/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java
@@ -36,7 +36,7 @@ public interface CatalogItemMemento extends Memento {
 
     String getJavaType();
 
-    Collection<CatalogItem.CatalogBundle> getBundles();
+    Collection<CatalogItem.CatalogBundle> getLibraries();
 
     CatalogItem.CatalogItemType getCatalogItemType();
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/basic/BrooklynTypes.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/basic/BrooklynTypes.java b/core/src/main/java/brooklyn/basic/BrooklynTypes.java
index 1a0049c..483cc2b 100644
--- a/core/src/main/java/brooklyn/basic/BrooklynTypes.java
+++ b/core/src/main/java/brooklyn/basic/BrooklynTypes.java
@@ -90,7 +90,7 @@ public class BrooklynTypes {
         if (Entity.class.isAssignableFrom(brooklynClass)) {
             type = new ImmutableEntityType((Class<? extends Entity>)brooklynClass);
         } else if (Location.class.isAssignableFrom(brooklynClass)) {
-            type = new ImmutableEntityType((Class)brooklynClass);
+            type = new ImmutableEntityType((Class<? extends Entity>)brooklynClass);
         } else if (Policy.class.isAssignableFrom(brooklynClass)) {
             type = new PolicyDynamicType((Class<? extends Policy>)brooklynClass); // TODO immutable?
         } else if (Enricher.class.isAssignableFrom(brooklynClass)) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/catalog/internal/CatalogBundleConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogBundleConverter.java b/core/src/main/java/brooklyn/catalog/internal/CatalogBundleConverter.java
new file mode 100644
index 0000000..fe77d02
--- /dev/null
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogBundleConverter.java
@@ -0,0 +1,59 @@
+/*
+ * 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.catalog.internal;
+
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.converters.reflection.ReflectionConverter;
+import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.mapper.Mapper;
+
+
+@Deprecated
+public class CatalogBundleConverter implements Converter {
+
+    private ReflectionConverter delegateConverter;
+
+    public CatalogBundleConverter(Mapper mapper, ReflectionProvider reflectionProvider) {
+        this.delegateConverter = new ReflectionConverter(mapper, reflectionProvider);
+    }
+
+    @Override
+    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
+        return type == CatalogBundleDto.class;
+    }
+
+    @Override
+    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
+        context.convertAnother(source, delegateConverter);
+    }
+
+    @Override
+    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
+        if (reader.hasMoreChildren()) {
+            return context.convertAnother(context.currentObject(), CatalogBundleDto.class, delegateConverter);
+        } else {
+            return new CatalogBundleDto(null, null, reader.getValue());
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
index 0b25785..f40a49b 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java
@@ -77,6 +77,12 @@ public class CatalogItemDo<T,SpecT> implements CatalogItem<T,SpecT> {
         return getDisplayName();
     }
 
+    @Deprecated
+    @Override
+    public String getRegisteredTypeName() {
+        return getSymbolicName();
+    }
+
     @Override
     public String getDisplayName() {
         return itemDto.getDisplayName();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
index f10aee1..9b434cc 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java
@@ -50,12 +50,7 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
     private @SetFromFlag String symbolicName;
     private @SetFromFlag String version = BasicBrooklynCatalog.NO_VERSION;
 
-    /**@deprecated since 0.7.0, left for deserialization backwards compatibility */
-    private @Deprecated @SetFromFlag String registeredTypeName;
-
     private @SetFromFlag String displayName;
-    /**@deprecated since 0.7.0, left for deserialization backwards compatibility */
-    private @Deprecated @SetFromFlag String name;
     private @SetFromFlag String description;
     private @SetFromFlag String iconUrl;
 
@@ -64,9 +59,7 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
     private @Deprecated @SetFromFlag String type;
     private @SetFromFlag String planYaml;
 
-    private @SetFromFlag Collection<CatalogBundle> bundles;
-    /**@deprecated since 0.7.0, left for deserialization backwards compatibility */
-    private @Deprecated @SetFromFlag CatalogLibrariesDto libraries;
+    private @SetFromFlag Collection<CatalogBundle> libraries;
     private @SetFromFlag Set<Object> tags = Sets.newLinkedHashSet();
 
     @Override
@@ -90,10 +83,14 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
         return getDisplayName();
     }
 
+    @Deprecated
+    public String getRegisteredTypeName() {
+        return getSymbolicName();
+    }
+
     @Override
     public String getDisplayName() {
-        if (displayName != null) return displayName;
-        return name;
+        return displayName;
     }
 
     @Override
@@ -109,7 +106,6 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
     @Override
     public String getSymbolicName() {
         if (symbolicName != null) return symbolicName;
-        if (registeredTypeName != null) return registeredTypeName;
         return getJavaType();
     }
 
@@ -127,12 +123,9 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
 
     @Nonnull
     @Override
-    @SuppressWarnings("deprecation")
     public Collection<CatalogBundle> getLibraries() {
-        if (bundles != null) {
-            return ImmutableList.copyOf(bundles);
-        } else if (libraries != null && libraries.getBundles() != null) {
-            return ImmutableList.copyOf(libraries.getBundles());
+        if (libraries != null) {
+            return ImmutableList.copyOf(libraries);
         } else {
             return Collections.emptyList();
         }
@@ -172,7 +165,6 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
     @Override
     public void setDisplayName(String newName) {
         this.displayName = newName;
-        this.name = null;
     }
 
     @Override
@@ -263,7 +255,6 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
 
     protected void setSymbolicName(String symbolicName) {
         this.symbolicName = symbolicName;
-        this.registeredTypeName = null;
     }
 
     protected void setVersion(String version) {
@@ -288,7 +279,7 @@ public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynO
     }
 
     protected void setLibraries(Collection<CatalogBundle> libraries) {
-        this.bundles = libraries;
+        this.libraries = libraries;
     }
 
     protected void setTags(Set<Object> tags) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java b/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java
index 1fda2d7..2589cb2 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java
@@ -21,7 +21,6 @@ package brooklyn.catalog.internal;
 import java.util.Collection;
 
 import brooklyn.catalog.CatalogItem;
-import brooklyn.catalog.CatalogItem.CatalogBundle;
 
 import com.google.common.base.Preconditions;
 
@@ -36,7 +35,7 @@ public class CatalogLibrariesDo implements CatalogItem.CatalogItemLibraries {
     }
 
     @Override
-    public Collection<CatalogBundle> getBundles() {
+    public Collection<String> getBundles() {
         return librariesDto.getBundles();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java b/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java
index 8403876..dea135b 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDto.java
@@ -20,23 +20,29 @@ package brooklyn.catalog.internal;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.concurrent.CopyOnWriteArrayList;
 
 import brooklyn.catalog.CatalogItem;
-import brooklyn.catalog.CatalogItem.CatalogBundle;
 
 import com.google.common.collect.ImmutableList;
 
 @Deprecated
 public class CatalogLibrariesDto implements CatalogItem.CatalogItemLibraries {
 
-    private Collection<CatalogBundle> bundles = new CopyOnWriteArrayList<CatalogBundle>();
+    private final Collection<String> bundles;
+
+    public CatalogLibrariesDto() {
+        this.bundles = Collections.emptyList();
+    }
+
+    public CatalogLibrariesDto(Collection<String> bundles) {
+        this.bundles = bundles;
+    }
 
     /**
      * @return An immutable copy of the bundle URLs referenced by this object
      */
     @Override
-    public Collection<CatalogBundle> getBundles() {
+    public Collection<String> getBundles() {
         if (bundles == null) {
             // can be null on deserialization
             return Collections.emptyList();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/catalog/internal/CatalogXmlSerializer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogXmlSerializer.java b/core/src/main/java/brooklyn/catalog/internal/CatalogXmlSerializer.java
index 8871edf..46c014f 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogXmlSerializer.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogXmlSerializer.java
@@ -50,17 +50,17 @@ public class CatalogXmlSerializer extends XmlSerializer<Object> {
         xstream.aliasType("entity", CatalogEntityItemDto.class);
         xstream.aliasType("policy", CatalogPolicyItemDto.class);
 
-        xstream.aliasAttribute(CatalogItemDtoAbstract.class, "javaType", "type");
+        xstream.aliasField("registeredType", CatalogItemDtoAbstract.class, "symbolicName");
         xstream.aliasAttribute(CatalogItemDtoAbstract.class, "displayName", "name");
+        xstream.useAttributeFor(CatalogItemDtoAbstract.class, "type");
         xstream.useAttributeFor(CatalogItemDtoAbstract.class, "version");
+        xstream.aliasType("bundle", CatalogBundleDto.class);
+        xstream.registerConverter(new CatalogBundleConverter(xstream.getMapper(), xstream.getReflectionProvider()));
 
         xstream.useAttributeFor(CatalogClasspathDto.class, "scan");
         xstream.addImplicitCollection(CatalogClasspathDto.class, "entries", "entry", String.class);
         xstream.registerConverter(new EnumCaseForgivingSingleValueConverter(CatalogScanningModes.class));
 
-        xstream.aliasType("libraries", CatalogLibrariesDto.class);
-        xstream.addImplicitCollection(CatalogLibrariesDto.class, "bundles", "bundle", CatalogBundleDto.class);
-
         // Note: the management context is being omitted because it is unnecessary for
         // representations of catalogues generated with this serializer.
         xstream.omitField(AbstractBrooklynObject.class, "managementContext");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java b/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java
index 61b9511..8ef2931 100644
--- a/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java
+++ b/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java
@@ -48,7 +48,7 @@ public class BasicCatalogItemRebindSupport extends AbstractBrooklynObjectRebindS
                 .put("description", memento.getDescription())
                 .put("iconUrl", memento.getIconUrl())
                 .put("version", memento.getVersion())
-                .put("bundles", memento.getBundles())
+                .put("libraries", memento.getLibraries())
                 .put("planYaml", memento.getPlanYaml())
                 .build(), instance);
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java b/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java
index b32e841..5c07c65 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java
@@ -25,14 +25,14 @@ import java.util.Map;
 
 import org.codehaus.jackson.annotate.JsonAutoDetect;
 
-import com.google.common.base.Joiner;
-import com.google.common.base.Objects;
-
 import brooklyn.catalog.CatalogItem;
-import brooklyn.catalog.CatalogItem.CatalogBundle;
 import brooklyn.catalog.internal.BasicBrooklynCatalog;
+import brooklyn.catalog.internal.CatalogUtils;
 import brooklyn.mementos.CatalogItemMemento;
 
+import com.google.common.base.Joiner;
+import com.google.common.base.Objects;
+
 @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
 public class BasicCatalogItemMemento extends AbstractMemento implements CatalogItemMemento, Serializable {
 
@@ -112,7 +112,7 @@ public class BasicCatalogItemMemento extends AbstractMemento implements CatalogI
             javaType = other.getJavaType();
             version = other.getVersion();
             planYaml = other.getPlanYaml();
-            libraries = other.getBundles();
+            libraries = other.getLibraries();
             catalogItemType = other.getCatalogItemType();
             catalogItemJavaType = other.getCatalogItemJavaType();
             specType = other.getSpecType();
@@ -130,12 +130,7 @@ public class BasicCatalogItemMemento extends AbstractMemento implements CatalogI
     private String javaType;
     private String version;
     private String planYaml;
-    //Keep libraries for deserialization compatibility and
-    //introduce bundles to hold the new libraries type from
-    //catalog item
-    private Collection<CatalogItem.CatalogBundle> bundles;
-    @SuppressWarnings("deprecation")
-    private CatalogItem.CatalogItemLibraries libraries;
+    private Collection<CatalogItem.CatalogBundle> libraries;
     private CatalogItem.CatalogItemType catalogItemType;
     private Class<?> catalogItemJavaType;
     private Class<?> specType;
@@ -150,8 +145,7 @@ public class BasicCatalogItemMemento extends AbstractMemento implements CatalogI
         this.iconUrl = builder.iconUrl;
         this.version = builder.version;
         this.planYaml = builder.planYaml;
-        this.bundles = builder.libraries;
-        this.libraries = null;
+        this.libraries = builder.libraries;
         this.catalogItemJavaType = builder.catalogItemJavaType;
         this.catalogItemType = builder.catalogItemType;
         this.specType = builder.specType;
@@ -159,6 +153,11 @@ public class BasicCatalogItemMemento extends AbstractMemento implements CatalogI
     }
 
     @Override
+    public String getId() {
+        return CatalogUtils.getVersionedId(getSymbolicName(), getVersion());
+    }
+
+    @Override
     public String getDescription() {
         return description;
     }
@@ -193,16 +192,8 @@ public class BasicCatalogItemMemento extends AbstractMemento implements CatalogI
     }
 
     @Override
-    public Collection<CatalogItem.CatalogBundle> getBundles() {
-        if (bundles != null) {
-            return bundles;
-        } else if (libraries != null) {
-            @SuppressWarnings("deprecation")
-            Collection<CatalogBundle> b = libraries.getBundles();
-            return b;
-        } else {
-            return null;
-        }
+    public Collection<CatalogItem.CatalogBundle> getLibraries() {
+        return libraries;
     }
 
     @Override
@@ -241,7 +232,7 @@ public class BasicCatalogItemMemento extends AbstractMemento implements CatalogI
                 .add("iconUrl", getIconUrl())
                 .add("version", getVersion())
                 .add("planYaml", getPlanYaml())
-                .add("bundles", getBundles())
+                .add("libraries", getLibraries())
                 .add("catalogItemJavaType", getCatalogItemJavaType())
                 .add("catalogItemType", getCatalogItemType())
                 .add("javaType", getJavaType())

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/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 38cc12d..de691e0 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/BrooklynMementoPersisterToObjectStore.java
@@ -248,8 +248,9 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
                 }
                 
                 String xmlId = (String) XmlUtil.xpath(contents, "/"+type.toCamelCase()+"/id");
-                if (!Objects.equal(id, xmlId))
-                    LOG.warn("ID mismatch on "+type.toCamelCase()+", "+id+" from path, "+xmlId+" from xml");
+                String safeXmlId = Strings.makeValidFilename(xmlId);
+                if (!Objects.equal(id, safeXmlId))
+                    LOG.warn("ID mismatch on "+type.toCamelCase()+", "+id+" from path, "+safeXmlId+" from xml");
                 
                 builder.put(type, xmlId, contents);
             }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/entity/rebind/persister/CatalogItemLibrariesConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/CatalogItemLibrariesConverter.java b/core/src/main/java/brooklyn/entity/rebind/persister/CatalogItemLibrariesConverter.java
new file mode 100644
index 0000000..ea0399b
--- /dev/null
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/CatalogItemLibrariesConverter.java
@@ -0,0 +1,64 @@
+/*
+ * 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.persister;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import brooklyn.catalog.CatalogItem.CatalogBundle;
+import brooklyn.catalog.CatalogItem.CatalogItemLibraries;
+import brooklyn.catalog.internal.CatalogBundleDto;
+
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+
+@Deprecated
+public class CatalogItemLibrariesConverter implements Converter {
+
+    @Override
+    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
+        return CatalogItemLibraries.class.isAssignableFrom(type) ||
+                Collection.class.isAssignableFrom(type);
+    }
+
+    @Override
+    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
+        context.convertAnother(source);
+    }
+
+    @Override
+    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
+        Object obj = context.convertAnother(context.currentObject(), context.getRequiredType());
+        if (CatalogItemLibraries.class.isAssignableFrom(context.getRequiredType())) {
+            CatalogItemLibraries libs = (CatalogItemLibraries)obj;
+            Collection<String> bundles = libs.getBundles();
+            Collection<CatalogBundle> libraries = new ArrayList<CatalogBundle>(bundles.size());
+            for (String url : bundles) {
+                libraries.add(new CatalogBundleDto(null, null, url));
+            }
+            return libraries;
+        } else {
+            return obj;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java b/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
index a179479..533cfd2 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
@@ -28,6 +28,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.catalog.CatalogItem;
+import brooklyn.catalog.internal.CatalogBundleDto;
 import brooklyn.entity.Effector;
 import brooklyn.entity.Entity;
 import brooklyn.entity.Feed;
@@ -90,6 +91,7 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento
         xstream.alias("enricher", BasicEnricherMemento.class);
         xstream.alias("configKey", BasicConfigKey.class);
         xstream.alias("catalogItem", BasicCatalogItemMemento.class);
+        xstream.alias("bundle", CatalogBundleDto.class);
         xstream.alias("attributeSensor", BasicAttributeSensor.class);
 
         xstream.alias("effector", Effector.class);
@@ -112,6 +114,10 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento
         xstream.registerConverter(new ManagementContextConverter());
         
         xstream.registerConverter(new TaskConverter(xstream.getMapper()));
+    
+        //For compatibility with existing persistence stores content.
+        xstream.aliasField("registeredTypeName", BasicCatalogItemMemento.class, "symbolicName");
+        xstream.registerLocalConverter(BasicCatalogItemMemento.class, "libraries", new CatalogItemLibrariesConverter());
     }
     
     // Warning: this is called in the super-class constuctor, so before this constructor!

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java b/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
index 7ae59f6..38a0456 100644
--- a/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
+++ b/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
@@ -20,6 +20,10 @@ package brooklyn.entity.rebind.persister;
 
 import static org.testng.Assert.assertEquals;
 
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.nio.charset.Charset;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
@@ -51,6 +55,7 @@ import brooklyn.test.entity.TestEntity;
 import brooklyn.util.collections.MutableList;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.collections.MutableSet;
+import brooklyn.util.stream.Streams;
 
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/40eee57a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
index 4ce917b..a980fc4 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
@@ -25,7 +25,7 @@ import io.brooklyn.camp.brooklyn.AbstractYamlTest;
 
 import java.util.Collection;
 
-import org.junit.Assert;
+import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import brooklyn.catalog.BrooklynCatalog;