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 <svetoslav.ney...@cloudsoftcorp.com> Authored: Wed Nov 12 19:54:03 2014 +0200 Committer: Svetoslav Neykov <svetoslav.ney...@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;