/* * Copyright (C) 2005 Joe Walnes. * Copyright (C) 2006, 2007 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 20. June 2005 by Joe Walnes */ package com.thoughtworks.acceptance; import com.thoughtworks.acceptance.objects.StandardObject; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.mapper.Mapper; import com.thoughtworks.xstream.mapper.MapperWrapper; public class OmitFieldsTest extends AbstractAcceptanceTest { public static class Thing extends StandardObject { transient String alwaysIgnore; String sometimesIgnore; String neverIgnore; } public void testTransientFieldsAreOmittedByDefault() { Thing in = new Thing(); in.alwaysIgnore = "a"; in.sometimesIgnore = "b"; in.neverIgnore = "c"; String expectedXml = "" + "<thing>\n" + " <sometimesIgnore>b</sometimesIgnore>\n" + " <neverIgnore>c</neverIgnore>\n" + "</thing>"; xstream.alias("thing", Thing.class); String actualXml = xstream.toXML(in); assertEquals(expectedXml, actualXml); Thing out = (Thing)xstream.fromXML(actualXml); assertEquals(null, out.alwaysIgnore); assertEquals("b", out.sometimesIgnore); assertEquals("c", out.neverIgnore); } public void testAdditionalFieldsCanBeExplicitlyOmittedThroughFacade() { Thing in = new Thing(); in.alwaysIgnore = "a"; in.sometimesIgnore = "b"; in.neverIgnore = "c"; String expectedXml = "" // + "<thing>\n" // + " <neverIgnore>c</neverIgnore>\n" // + "</thing>"; xstream.alias("thing", Thing.class); xstream.omitField(Thing.class, "sometimesIgnore"); String actualXml = xstream.toXML(in); assertEquals(expectedXml, actualXml); Thing out = (Thing)xstream.fromXML(actualXml); assertEquals(null, out.alwaysIgnore); assertEquals(null, out.sometimesIgnore); assertEquals("c", out.neverIgnore); } public static class DerivedThing extends Thing { String derived; } public void testInheritedFieldsCanBeExplicitlyOmittedThroughFacade() { DerivedThing in = new DerivedThing(); in.alwaysIgnore = "a"; in.sometimesIgnore = "b"; in.neverIgnore = "c"; in.derived = "d"; String expectedXml = "" + "<thing>\n" + " <neverIgnore>c</neverIgnore>\n" + " <derived>d</derived>\n" + "</thing>"; xstream.alias("thing", DerivedThing.class); xstream.omitField(Thing.class, "sometimesIgnore"); String actualXml = xstream.toXML(in); assertEquals(expectedXml, actualXml); DerivedThing out = (DerivedThing)xstream.fromXML(actualXml); assertEquals(null, out.alwaysIgnore); assertEquals(null, out.sometimesIgnore); assertEquals("c", out.neverIgnore); assertEquals("d", out.derived); } public static class AnotherThing extends StandardObject { String stuff; String cheese; String myStuff; String myCheese; } public void testFieldsCanBeIgnoredUsingCustomStrategy() { AnotherThing in = new AnotherThing(); in.stuff = "a"; in.cheese = "b"; in.myStuff = "c"; in.myCheese = "d"; String expectedXml = "" + "<thing>\n" + " <stuff>a</stuff>\n" + " <cheese>b</cheese>\n" + "</thing>"; class OmitFieldsWithMyPrefixMapper extends MapperWrapper { public OmitFieldsWithMyPrefixMapper(Mapper wrapped) { super(wrapped); } public boolean shouldSerializeMember(Class definedIn, String fieldName) { return !fieldName.startsWith("my"); } } xstream = new XStream() { protected MapperWrapper wrapMapper(MapperWrapper next) { return new OmitFieldsWithMyPrefixMapper(next); } }; xstream.alias("thing", AnotherThing.class); String actualXml = xstream.toXML(in); assertEquals(expectedXml, actualXml); AnotherThing out = (AnotherThing)xstream.fromXML(actualXml); assertEquals("a", out.stuff); assertEquals("b", out.cheese); assertEquals(null, out.myStuff); assertEquals(null, out.myCheese); } public void testDeletedElementCanBeOmitted() { String expectedXml = "" + "<thing>\n" + " <meanwhileDeletedIgnore>c</meanwhileDeletedIgnore>\n" + " <sometimesIgnore>b</sometimesIgnore>\n" + " <neverIgnore>c</neverIgnore>\n" + "</thing>"; xstream.alias("thing", Thing.class); xstream.omitField(Thing.class, "meanwhileDeletedIgnore"); Thing out = (Thing)xstream.fromXML(expectedXml); assertEquals("b", out.sometimesIgnore); assertEquals("c", out.neverIgnore); } public void testDeletedAttributeCanBeOmitted() { String expectedXml = "" + "<thing meanwhileDeletedIgnore='c'>\n" + " <sometimesIgnore>b</sometimesIgnore>\n" + " <neverIgnore>c</neverIgnore>\n" + "</thing>"; xstream.alias("thing", Thing.class); xstream.omitField(Thing.class, "meanwhileDeletedIgnore"); Thing out = (Thing)xstream.fromXML(expectedXml); assertEquals("b", out.sometimesIgnore); assertEquals("c", out.neverIgnore); } public void testAttributeCanBeOmitted() { String expectedXml = "<thing neverIgnore=\"c\"/>"; xstream.alias("thing", Thing.class); xstream.useAttributeFor(String.class); xstream.omitField(Thing.class, "sometimesIgnore"); Thing in = new Thing(); in.alwaysIgnore = "a"; in.sometimesIgnore = "b"; in.neverIgnore = "c"; assertEquals(expectedXml, xstream.toXML(in)); Thing out = (Thing)xstream.fromXML(expectedXml); assertNull(out.sometimesIgnore); assertEquals("c", out.neverIgnore); } static class ThingAgain extends Thing { String sometimesIgnore; void setHidden(String s) { super.sometimesIgnore = s; } } // TODO: XSTR-457 public void todoTestAnOmittedFieldMakesADefinedInAttributeSuperfluous() { ThingAgain in = new ThingAgain(); in.alwaysIgnore = "a"; in.setHidden("b"); in.neverIgnore = "c"; in.sometimesIgnore = "d"; xstream.alias("thing", ThingAgain.class); xstream.omitField(ThingAgain.class, "sometimesIgnore"); String expectedXml = "" + "<thing>\n" + " <sometimesIgnore>b</sometimesIgnore>\n" + " <neverIgnore>c</neverIgnore>\n" + "</thing>"; String actualXml = xstream.toXML(in); assertEquals(expectedXml, actualXml); ThingAgain out = (ThingAgain)xstream.fromXML(expectedXml); assertNull(out.sometimesIgnore); out.alwaysIgnore = "a"; out.sometimesIgnore = "d"; assertEquals(in, out); } }