From f9591d9f2da776deb51536dba2e064989dbeda87 Mon Sep 17 00:00:00 2001 From: Svetoslav Neykov Date: Thu, 14 Jan 2016 17:01:38 +0200 Subject: [PATCH] Fix catalog XML deserializing Fixes the serialized XML format so it can be deserialized later. --- .../catalog/internal/CatalogXmlSerializer.java | 3 ++- .../apache/brooklyn/core/mgmt/BrooklynTags.java | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java index 855a753fa9..3cf686e247 100644 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java +++ b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogXmlSerializer.java @@ -36,7 +36,8 @@ public CatalogXmlSerializer() { super(DeserializingClassRenamesProvider.loadDeserializingClassRenames()); xstream.addDefaultImplementation(ArrayList.class, Collection.class); - + + //Doesn't work well for non-standard lists, like Lists.transform results xstream.aliasType("list", List.class); xstream.aliasType("map", Map.class); diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java index e8d791597d..a08eb56a52 100644 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java +++ b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java @@ -19,6 +19,7 @@ package org.apache.brooklyn.core.mgmt; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import org.codehaus.jackson.annotate.JsonIgnore; @@ -85,11 +86,17 @@ public int hashCode() { public static class TraitsTag extends ListTag { public TraitsTag(List> interfaces) { - super(Lists.transform(interfaces, new Function, String>() { - @Override public String apply(Class input) { - return input.getName(); - } - })); + // The transformed list is a view, meaning that it references + // the instances list. This means that it will serialize + // the list of classes along with the anonymous function which + // is not what we want. Force eager evaluation instead, using + // a simple list, supported by {@link CatalogXmlSerializer}. + super(new ArrayList( + Lists.transform(interfaces, new Function, String>() { + @Override public String apply(Class input) { + return input.getName(); + } + }))); } @JsonProperty("traits")