From 73f1b2ebacc5f9fb5fd9d4d1beedbb8aefe2bd62 Mon Sep 17 00:00:00 2001 From: kohsuke Date: Mon, 14 Sep 2009 22:56:08 +0000 Subject: [PATCH] fixed a serialization form of Result so that it works like a value type. See http://d.hatena.ne.jp/masanobuimai/20090911#1252684658 git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@21663 71c3de6d-444a-0410-be80-ed276b4c234a --- core/src/main/java/hudson/util/XStream2.java | 11 +++++ .../test/java/hudson/util/XStream2Test.java | 46 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 core/src/test/java/hudson/util/XStream2Test.java diff --git a/core/src/main/java/hudson/util/XStream2.java b/core/src/main/java/hudson/util/XStream2.java index 12ff7fa528..1b4c1d3f00 100644 --- a/core/src/main/java/hudson/util/XStream2.java +++ b/core/src/main/java/hudson/util/XStream2.java @@ -25,6 +25,8 @@ package hudson.util; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.mapper.Mapper; +import com.thoughtworks.xstream.mapper.MapperWrapper; +import com.thoughtworks.xstream.mapper.ImmutableTypesMapper; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.DataHolder; import com.thoughtworks.xstream.converters.MarshallingContext; @@ -34,6 +36,7 @@ import com.thoughtworks.xstream.io.HierarchicalStreamDriver; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import hudson.model.Hudson; +import hudson.model.Result; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -82,6 +85,14 @@ public class XStream2 extends XStream { registerConverter(new RobustReflectionConverter(getMapper(),new JVM().bestReflectionProvider()),-19); } + @Override + protected MapperWrapper wrapMapper(MapperWrapper next) { + // list up types that should be marshalled out like a value, without referencial integrity tracking. + ImmutableTypesMapper itm = new ImmutableTypesMapper(next); + itm.addImmutableType(Result.class); + return itm; + } + /** * If a class defines a nested {@code ConverterImpl} subclass, use that as a {@link Converter}. */ diff --git a/core/src/test/java/hudson/util/XStream2Test.java b/core/src/test/java/hudson/util/XStream2Test.java new file mode 100644 index 0000000000..add7eacbcd --- /dev/null +++ b/core/src/test/java/hudson/util/XStream2Test.java @@ -0,0 +1,46 @@ +/* + * The MIT License + * + * Copyright (c) 2004-2009, Sun Microsystems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.util; + +import junit.framework.TestCase; +import hudson.model.Result; +import hudson.model.Run; + +/** + * + * @author Kohsuke Kawaguchi + */ +public class XStream2Test extends TestCase { + public static final class Foo { + Result r1,r2; + } + public void testMarshalValue() throws Exception { + Foo f = new Foo(); + f.r1 = f.r2 = Result.FAILURE; + String xml = Run.XSTREAM.toXML(f); + System.out.println(xml); + // we should find two "FAILURE"s as they should be written out twice + assertEquals(3,xml.split("FAILURE").length); + } +}