http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlCollapsed.java
----------------------------------------------------------------------
diff --git 
a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlCollapsed.java 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlCollapsed.java
deleted file mode 100755
index f1387bc..0000000
--- a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlCollapsed.java
+++ /dev/null
@@ -1,459 +0,0 @@
-/***************************************************************************************************************************
- * 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 org.apache.juneau.xml;
-
-import static org.apache.juneau.TestUtils.*;
-import static org.apache.juneau.xml.annotation.XmlFormat.*;
-import static org.junit.Assert.*;
-
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.serializer.*;
-import org.apache.juneau.xml.annotation.*;
-import org.junit.*;
-
-@SuppressWarnings({"serial"})
-public class CT_XmlCollapsed {
-
-       
//====================================================================================================
-       // testBasic - @Xml.format=COLLAPSED
-       
//====================================================================================================
-       @Test
-       public void testBasic() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               A t = new A();
-
-               t.f1 = new LinkedList<String>(){{add("f1a");add("f1b");}};
-               t.f2 = new String[]{"f2a","f2b"};
-               t.f3 = new LinkedList<String>(){{add("f3a");add("f3b");}};
-               t.f4 = new String[]{"f4a","f4b"};
-
-               String xml = s.serialize(t);
-               
assertEquals("<object><f1>f1a</f1><f1>f1b</f1><f2>f2a</f2><f2>f2b</f2><xf3>f3a</xf3><xf3>f3b</xf3><xf4>f4a</xf4><xf4>f4b</xf4></object>",
 xml);
-               t = p.parse(xml, A.class);
-               assertEquals("f1a", t.f1.get(0));
-               assertEquals("f2a", t.f2[0]);
-               assertEquals("f3a", t.f3.get(0));
-               assertEquals("f4a", t.f4[0]);
-
-               validateXml(t, s);
-       }
-
-       public static class A {
-
-               @Xml(format=COLLAPSED)
-               public List<String> f1 = new LinkedList<String>();
-
-               @Xml(format=COLLAPSED)
-               public String[] f2 = new String[0];
-
-               @Xml(format=COLLAPSED,childName="xf3")
-               public List<String> f3 = new LinkedList<String>();
-
-               @Xml(format=COLLAPSED,childName="xf4")
-               public String[] f4 =  new String[0];
-       }
-
-       
//====================================================================================================
-       // testUninitializedFields - @Xml.format=COLLAPSED, uninitialized 
fields.
-       
//====================================================================================================
-       @Test
-       public void testUninitializedFields() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               B t = new B();
-
-               t.f1 = new LinkedList<String>(){{add("f1a");add("f1b");}};
-               t.f2 = new String[]{"f2a","f2b"};
-               t.f3 = new LinkedList<String>(){{add("f3a");add("f3b");}};
-               t.f4 = new String[]{"f4a","f4b"};
-
-               String xml = s.serialize(t);
-               
assertEquals("<object><f1>f1a</f1><f1>f1b</f1><f2>f2a</f2><f2>f2b</f2><xf3>f3a</xf3><xf3>f3b</xf3><xf4>f4a</xf4><xf4>f4b</xf4></object>",
 xml);
-               t = p.parse(xml, B.class);
-               assertEquals("f1a", t.f1.get(0));
-               assertEquals("f2a", t.f2[0]);
-               assertEquals("f3a", t.f3.get(0));
-               assertEquals("f4a", t.f4[0]);
-
-               validateXml(t, s);
-       }
-
-       public static class B {
-
-               @Xml(format=COLLAPSED)
-               public List<String> f1;
-
-               @Xml(format=COLLAPSED)
-               public String[] f2;
-
-               @Xml(format=COLLAPSED,childName="xf3")
-               public List<String> f3;
-
-               @Xml(format=COLLAPSED,childName="xf4")
-               public String[] f4;
-       }
-
-       
//====================================================================================================
-       // testInitializedFields - @Xml.format=COLLAPSED, initialized fields.
-       
//====================================================================================================
-       @Test
-       public void testInitializedFields() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               C t = new C();
-
-               t.f1 = new LinkedList<String>(){{add("f1b");}};
-               t.f2 = new String[]{"f2b"};
-               t.f3 = new LinkedList<String>(){{add("f3b");}};
-               t.f4 = new String[]{"f4b"};
-
-               String xml = s.serialize(t);
-               
assertEquals("<object><f1>f1b</f1><f2>f2b</f2><xf3>f3b</xf3><xf4>f4b</xf4></object>",
 xml);
-
-               // Note that existing fields should be reused and appended to.
-               t = p.parse(xml, C.class);
-               assertEquals("f1a", t.f1.get(0));
-               assertEquals("f1b", t.f1.get(1));
-               assertEquals("f2a", t.f2[0]);
-               assertEquals("f2b", t.f2[1]);
-               assertEquals("f3a", t.f3.get(0));
-               assertEquals("f3b", t.f3.get(1));
-               assertEquals("f4a", t.f4[0]);
-               assertEquals("f4b", t.f4[1]);
-
-               validateXml(t, s);
-       }
-
-       public static class C {
-
-               @Xml(format=COLLAPSED)
-               public List<String> f1 = new 
LinkedList<String>(){{add("f1a");}};
-
-               @Xml(format=COLLAPSED)
-               public String[] f2 = {"f2a"};
-
-               @Xml(format=COLLAPSED,childName="xf3")
-               public List<String> f3 = new 
LinkedList<String>(){{add("f3a");}};
-
-               @Xml(format=COLLAPSED,childName="xf4")
-               public String[] f4 = {"f4a"};
-       }
-
-       
//====================================================================================================
-       // testGetters - @Xml.format=COLLAPSED, getters.
-       
//====================================================================================================
-       @Test
-       @SuppressWarnings("synthetic-access")
-       public void testGetters() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               D t = new D();
-
-               t.f1 = new LinkedList<String>(){{add("f1a");}};
-               t.f2 = new String[]{"f2a"};
-               t.f3 = new LinkedList<String>(){{add("f3a");}};
-               t.f4 = new String[]{"f4a"};
-
-               String xml = s.serialize(t);
-               
assertEquals("<object><f1>f1a</f1><f2>f2a</f2><xf3>f3a</xf3><xf4>f4a</xf4></object>",
 xml);
-
-               // Note that existing fields should be reused and appended to.
-               t = p.parse(xml, D.class);
-               assertEquals("f1a", t.f1.get(0));
-               assertEquals("f2a", t.f2[0]);
-               assertEquals("f3a", t.f3.get(0));
-               assertEquals("f4a", t.f4[0]);
-
-               validateXml(t, s);
-       }
-
-       @Bean(properties={"f1","f2","f3","f4"})
-       public static class D {
-
-               private List<String> f1 = new LinkedList<String>(), f3 = new 
LinkedList<String>();
-               private String[] f2, f4;
-
-               @Xml(format=COLLAPSED)
-               public List<String> getF1() {
-                       return f1;
-               }
-
-               @Xml(format=COLLAPSED)
-               public String[] getF2() {
-                       return f2;
-               }
-               public void setF2(String[] f2) {
-                       this.f2 = f2;
-               }
-
-               @Xml(format=COLLAPSED,childName="xf3")
-               public List<String> getF3() {
-                       return f3;
-               }
-
-               @Xml(format=COLLAPSED,childName="xf4")
-               public String[] getF4() {
-                       return f4;
-               }
-               public void setF4(String[] f4) {
-                       this.f4 = f4;
-               }
-       }
-
-       
//====================================================================================================
-       // testNullConstructibleCollectionFields - @Xml.format=COLLAPSED, null 
constructible collection fields.
-       
//====================================================================================================
-       @Test
-       @SuppressWarnings("synthetic-access")
-       public void testNullConstructibleCollectionFields() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               E t = new E();
-
-               t.f1 = new LinkedList<String>(){{add("f1a");}};
-               t.f2 = new LinkedList<String>(){{add("f2a");}};
-
-               String xml = s.serialize(t);
-               assertEquals("<object><f1>f1a</f1><xf2>f2a</xf2></object>", 
xml);
-
-               // Note that existing fields should be reused and appended to.
-               t = p.parse(xml, E.class);
-               assertEquals("f1a", t.f1.get(0));
-               assertEquals("f2a", t.f2.get(0));
-
-               validateXml(t, s);
-       }
-
-       @Bean(properties={"f1","f2"})
-       public static class E {
-
-               private LinkedList<String> f1, f2;
-
-               @Xml(format=COLLAPSED)
-               public LinkedList<String> getF1() {
-                       return f1;
-               }
-               public void setF1(LinkedList<String> f1) {
-                       this.f1 = f1;
-               }
-
-               @Xml(format=COLLAPSED,childName="xf2")
-               public LinkedList<String> getF2() {
-                       return f2;
-               }
-               public void setF2(LinkedList<String> f2) {
-                       this.f2 = f2;
-               }
-       }
-
-
-       
//====================================================================================================
-       // testElementNameOnElementClass - @Xml.format=COLLAPSED, element name 
defined on element class.
-       
//====================================================================================================
-       @Test
-       public void testElementNameOnElementClass() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               Object t1 = FA.newInstance(), t2;
-               String r;
-
-               r = s.serialize(t1);
-               assertEquals("<object><xf1>x1</xf1><xf1>x2</xf1></object>", r);
-               t2 = p.parse(r, FA.class);
-               assertEqualObjects(t1, t2);
-               validateXml(t1, s);
-
-               t1 = FB.newInstance();
-               r = s.serialize(t1);
-               assertEquals("<object><xf1>x1</xf1><xf1>x2</xf1></object>", r);
-               t2 = p.parse(r, FB.class);
-               assertEqualObjects(t1, t2);
-               validateXml(t1, s);
-
-               t1 = FC.newInstance();
-               try {
-                       r = s.serialize(t1);
-                       fail("Exception expected.");
-               } catch (SerializeException e) {
-                       assertEquals("org.apache.juneau.xml.CT_XmlCollapsed$FC: 
Multiple properties found with the name 'xf1'.", e.getLocalizedMessage());
-               }
-       }
-
-       public static class FA {
-
-               @Xml(format=COLLAPSED)
-               public List<F1> f1;
-
-               public static FA newInstance() {
-                       FA t = new FA();
-                       t.f1 = new LinkedList<F1>();
-                       t.f1.add(F1.newInstance("x1"));
-                       t.f1.add(F1.newInstance("x2"));
-                       return t;
-               }
-       }
-
-       public static class FB {
-               @Xml(format=COLLAPSED)
-               public F1[] f1;
-
-               public static FB newInstance() {
-                       FB t = new FB();
-                       t.f1 = new F1[]{
-                               F1.newInstance("x1"),
-                               F1.newInstance("x2")
-                       };
-                       return t;
-               }
-       }
-
-       // Should cause name collision.
-       public static class FC {
-
-               @Xml(format=COLLAPSED)
-               public List<F1> f1;
-
-               @Xml(format=COLLAPSED)
-               public F1[] f2;
-
-               public static FC newInstance() {
-                       FC t = new FC();
-                       return t;
-               }
-       }
-
-       @Xml(name="xf1")
-       public static class F1 {
-
-               @Xml(format=CONTENT)
-               public String text;
-
-               public static F1 newInstance(String text) {
-                       F1 t = new F1();
-                       t.text = text;
-                       return t;
-               }
-       }
-
-
-       
//====================================================================================================
-       // testElementNameOnElementClassOverridden - @Xml.format=COLLAPSED, 
element name defined on element class,
-       //      but overridden by @Xml.childName on property.
-       
//====================================================================================================
-       @Test
-       public void testElementNameOnElementClassOverridden() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               G t = G.newInstance(), t2;
-
-               String xml = s.serialize(t);
-               assertEquals("<object><yf1>x1</yf1><yf1>x2</yf1></object>", 
xml);
-
-               // Note that existing fields should be reused and appended to.
-               t2 = p.parse(xml, G.class);
-               assertEqualObjects(t, t2);
-
-               validateXml(t, s);
-       }
-
-       public static class G {
-
-               @Xml(format=COLLAPSED, childName="yf1")
-               public List<F1> f1;
-
-               public static G newInstance() {
-                       G t = new G();
-                       t.f1 = new LinkedList<F1>();
-                       t.f1.add(F1.newInstance("x1"));
-                       t.f1.add(F1.newInstance("x2"));
-                       return t;
-               }
-       }
-
-
-       
//====================================================================================================
-       // testElementNameOnCollectionClass - @Xml.format=COLLAPSED, element 
name defined on bean class.
-       
//====================================================================================================
-       @Test
-       public void testElementNameOnCollectionClass() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               H t = H.newInstance(), t2;
-
-               String xml = s.serialize(t);
-               assertEquals("<object><xf1>x1</xf1><xf1>x2</xf1></object>", 
xml);
-
-               // Note that existing fields should be reused and appended to.
-               t2 = p.parse(xml, H.class);
-               assertEqualObjects(t, t2);
-
-               validateXml(t, s);
-       }
-
-       public static class H {
-
-               @Xml(format=COLLAPSED)
-               public H1 f1;
-
-               public static H newInstance() {
-                       H t = new H();
-                       t.f1 = new H1();
-                       t.f1.add("x1");
-                       t.f1.add("x2");
-                       return t;
-               }
-       }
-
-       @Xml(childName="xf1")
-       public static class H1 extends LinkedList<String> {
-       }
-
-
-       
//====================================================================================================
-       // testElementNameOnCollectionClassOverridden - @Xml.format=COLLAPSED, 
element name defined on element class,
-       //      but overridden by @Xml.childName on property.
-       
//====================================================================================================
-       @Test
-       public void testElementNameOnCollectionClassOverridden() throws 
Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               XmlParser p = XmlParser.DEFAULT;
-               G t = G.newInstance(), t2;
-
-               String xml = s.serialize(t);
-               assertEquals("<object><yf1>x1</yf1><yf1>x2</yf1></object>", 
xml);
-
-               // Note that existing fields should be reused and appended to.
-               t2 = p.parse(xml, G.class);
-               assertEqualObjects(t, t2);
-
-               validateXml(t, s);
-       }
-
-       public static class I {
-
-               @Xml(format=COLLAPSED, childName="yf1")
-               public H1 f1;
-
-               public static I newInstance() {
-                       I t = new I();
-                       t.f1 = new H1();
-                       t.f1.add("x1");
-                       t.f1.add("x2");
-                       return t;
-               }
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlContent.java
----------------------------------------------------------------------
diff --git 
a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlContent.java 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlContent.java
deleted file mode 100755
index d111b1f..0000000
--- a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlContent.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/***************************************************************************************************************************
- * 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 org.apache.juneau.xml;
-
-import static org.apache.juneau.TestUtils.*;
-import static org.apache.juneau.serializer.SerializerContext.*;
-import static org.apache.juneau.xml.XmlSerializerContext.*;
-import static org.apache.juneau.xml.XmlUtils.*;
-import static org.apache.juneau.xml.annotation.XmlFormat.*;
-import static org.junit.Assert.*;
-
-import java.io.*;
-
-import javax.xml.stream.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.xml.annotation.*;
-import org.junit.*;
-
-public class CT_XmlContent {
-
-       
//--------------------------------------------------------------------------------
-       // Test beans with @Xml(format=CONTENT)
-       
//--------------------------------------------------------------------------------
-       @Test
-       public void testContentFormat() throws Exception {
-               A t = A.newInstance(), t2;
-               XmlSerializer s1 = XmlSerializer.DEFAULT_SIMPLE_SQ,
-                       s2 = new 
XmlSerializer().setProperty(SERIALIZER_quoteChar, 
'\'').setProperty(SERIALIZER_useIndentation, 
true).setProperty(XML_enableNamespaces, false);
-               XmlParser p = XmlParser.DEFAULT;
-               XmlSerializerSession session;
-               String r;
-               StringWriter sw;
-
-               
//----------------------------------------------------------------
-               // Null
-               
//----------------------------------------------------------------
-               t.f2 = null;
-
-               sw = new StringWriter();
-               session = s1.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null);
-               s1.serialize(session, t);
-               r = sw.toString();
-               assertEquals("<A f1='f1'>_x0000_</A>", r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               sw = new StringWriter();
-               session = s2.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null);
-               s2.serialize(session, t);
-               r = sw.toString();
-               assertEquals("<A f1='f1'>\n\t_x0000_\n</A>\n", r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // Normal text
-               
//----------------------------------------------------------------
-               t.f2 = "foobar";
-
-               r = s1.serialize(t);
-               assertEquals("<A f1='f1'>foobar</A>", r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A f1='f1'>\n\tfoobar\n</A>\n", r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // Special characters
-               
//----------------------------------------------------------------
-               t.f2 = "~!@#$%^&*()_+`-={}|[]\\:\";'<>?,.\n\r\t\b";
-
-               r = s1.serialize(t);
-               assertEquals("<A 
f1='f1'>~!@#$%^&amp;*()_+`-={}|[]\\:\";'&lt;&gt;?,.&#x000a;&#x000d;&#x0009;_x0008_</A>",
 r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A 
f1='f1'>\n\t~!@#$%^&amp;*()_+`-={}|[]\\:\";'&lt;&gt;?,.&#x000a;&#x000d;&#x0009;_x0008_\n</A>\n",
 r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // Leading spaces
-               
//----------------------------------------------------------------
-               t.f2 = "  foobar";
-
-               r = s1.serialize(t);
-               assertEquals("<A f1='f1'>_x0020_ foobar</A>", r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A f1='f1'>\n\t_x0020_ foobar\n</A>\n", r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // Trailing spaces
-               
//----------------------------------------------------------------
-               t.f2 = "foobar  ";
-
-               r = s1.serialize(t);
-               assertEquals("<A f1='f1'>foobar _x0020_</A>", r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A f1='f1'>\n\tfoobar _x0020_\n</A>\n", r);
-               t2 = p.parse(r, A.class);
-               assertEqualObjects(t, t2);
-       }
-
-       @Xml(name="A")
-       public static class A {
-               @Xml(format=ATTR) public String f1;
-               @Xml(format=CONTENT) public String f2;
-
-               public static A newInstance() {
-                       A t = new A();
-                       t.f1 = "f1";
-                       t.f2 = null;
-                       return t;
-               }
-       }
-
-       
//--------------------------------------------------------------------------------
-       // Test beans with @Xml(format=XMLCONTENT)
-       
//--------------------------------------------------------------------------------
-       @Test
-       public void testXmlContentFormat() throws Exception {
-               B t = B.newInstance(), t2;
-               XmlSerializer s1 = XmlSerializer.DEFAULT_SIMPLE_SQ,
-                       s2 = new 
XmlSerializer().setProperty(SERIALIZER_quoteChar, 
'\'').setProperty(SERIALIZER_useIndentation, 
true).setProperty(XML_enableNamespaces, false);
-               XmlParser p = XmlParser.DEFAULT;
-               XmlSerializerSession session;
-               String r;
-               StringWriter sw;
-
-               
//----------------------------------------------------------------
-               // Null
-               
//----------------------------------------------------------------
-               t.f2 = null;
-
-               sw = new StringWriter();
-               session = s1.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null);
-               s1.serialize(session, t);
-               r = sw.toString();
-               assertEquals("<A f1='f1'>_x0000_</A>", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               sw = new StringWriter();
-               session = s2.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null);
-               s2.serialize(session, t);
-               r = sw.toString();
-               assertEquals("<A f1='f1'>\n\t_x0000_\n</A>\n", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // Normal text
-               
//----------------------------------------------------------------
-               t.f2 = "foobar";
-
-               r = s1.serialize(t);
-               assertEquals("<A f1='f1'>foobar</A>", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A f1='f1'>\n\tfoobar\n</A>\n", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // Normal XML
-               
//----------------------------------------------------------------
-               t.f2 = "<xxx>foobar<yyy>baz</yyy>foobar</xxx>";
-
-               r = s1.serialize(t);
-               assertEquals("<A 
f1='f1'><xxx>foobar<yyy>baz</yyy>foobar</xxx></A>", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A 
f1='f1'>\n\t<xxx>foobar<yyy>baz</yyy>foobar</xxx>\n</A>\n", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // Normal XML with leading and trailing space
-               
//----------------------------------------------------------------
-               t.f2 = "  <xxx>foobar<yyy>baz</yyy>foobar</xxx>  ";
-
-               r = s1.serialize(t);
-               assertEquals("<A f1='f1'>_x0020_ 
<xxx>foobar<yyy>baz</yyy>foobar</xxx> _x0020_</A>", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A f1='f1'>\n\t_x0020_ 
<xxx>foobar<yyy>baz</yyy>foobar</xxx> _x0020_\n</A>\n", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // XML with attributes
-               
//----------------------------------------------------------------
-               t.f2 = "<xxx x=\"x\">foobar</xxx>";
-
-               r = s1.serialize(t);
-               assertEquals("<A f1='f1'><xxx x=\"x\">foobar</xxx></A>", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A f1='f1'>\n\t<xxx 
x=\"x\">foobar</xxx>\n</A>\n", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               
//----------------------------------------------------------------
-               // XML with embedded entities
-               
//----------------------------------------------------------------
-               t.f2 = "<xxx x=\"x\">foo&lt;&gt;bar</xxx>";
-
-               r = s1.serialize(t);
-               assertEquals("<A f1='f1'><xxx 
x=\"x\">foo&lt;&gt;bar</xxx></A>", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-
-               r = s2.serialize(t);
-               assertEquals("<A f1='f1'>\n\t<xxx 
x=\"x\">foo&lt;&gt;bar</xxx>\n</A>\n", r);
-               t2 = p.parse(r, B.class);
-               assertEqualObjects(t, t2);
-       }
-
-       @Xml(name="A")
-       public static class B {
-               @Xml(format=ATTR) public String f1;
-               @Xml(format=CONTENT, contentHandler=BContentHandler.class) 
public String f2;
-
-               public static B newInstance() {
-                       B t = new B();
-                       t.f1 = "f1";
-                       t.f2 = null;
-                       return t;
-               }
-       }
-
-       public static class BContentHandler implements XmlContentHandler<B> {
-
-               @Override /* XmlContentHandler */
-               public void parse(XMLStreamReader r, B b) throws Exception {
-                       b.f2 = decode(readXmlContents(r).trim());
-               }
-
-               @Override /* XmlContentHandler */
-               public void serialize(XmlWriter w, B b) throws Exception {
-                       w.encodeTextInvalidChars(b.f2);
-               }
-
-       }
-
-       
//--------------------------------------------------------------------------------
-       // Test beans with too many @Xml.format=CONTENT/XMLCONTENT annotations.
-       
//--------------------------------------------------------------------------------
-       @Test
-       public void testBadContent() throws Exception {
-               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
-               try {
-                       s.serialize(new C1());
-                       fail("Exception expected");
-               } catch (Exception e) {
-                       assertTrue(e.getMessage().contains("Multiple instances 
of CONTENT properties defined on class"));
-               }
-               // Run twice to make sure we throw exceptions after the first 
call.
-               try {
-                       s.serialize(new C1());
-                       fail("Exception expected");
-               } catch (Exception e) {
-                       assertTrue(e.getMessage().contains("Multiple instances 
of CONTENT properties defined on class"));
-               }
-       }
-       public static class C1 {
-               @Xml(format=CONTENT) public String f1;
-               @Xml(format=CONTENT) public String f2;
-       }
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlParser.java
----------------------------------------------------------------------
diff --git 
a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlParser.java 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlParser.java
deleted file mode 100755
index 450ea4d..0000000
--- a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CT_XmlParser.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************************************
- * 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 org.apache.juneau.xml;
-
-import static org.apache.juneau.xml.XmlParserContext.*;
-import static org.junit.Assert.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.parser.*;
-import org.junit.*;
-
-public class CT_XmlParser {
-
-       @Test
-       public void testGenericAttributes() throws Exception {
-               String xml = "<A b='1'><c>2</c></A>";
-               ObjectMap m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{b:'1',c:'2'}", m.toString());
-       }
-
-       @Test
-       public void testGenericWithChildElements() throws Exception {
-               String xml;
-               ObjectMap m;
-
-               xml = "<A><B><C>c</C></B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{B:{C:'c'}}", m.toString());
-
-               xml = "<A><B><C1>c1</C1><C2>c2</C2></B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{B:{C1:'c1',C2:'c2'}}", m.toString());
-
-               xml = "<A><B><C><D1>d1</D1><D2>d2</D2></C></B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{B:{C:{D1:'d1',D2:'d2'}}}", m.toString());
-
-               xml = "<A><B><C><D1 d1a='d1av'><E1>e1</E1></D1><D2 
d2a='d2av'><E2>e2</E2></D2></C></B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               
assertEquals("{B:{C:{D1:{d1a:'d1av',E1:'e1'},D2:{d2a:'d2av',E2:'e2'}}}}", 
m.toString());
-
-               xml = "<A><B b='b'><C>c</C></B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{B:{b:'b',C:'c'}}", m.toString());
-
-               xml = "<A><B b='b'>c</B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{B:{b:'b',contents:'c'}}", m.toString());
-
-               xml = "<A><B>b1</B><B>b2</B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{B:['b1','b2']}", m.toString());
-
-               xml = "<A><B><C>c1</C><C>c2</C></B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{B:{C:['c1','c2']}}", m.toString());
-
-               xml = "<A><B v='v1'>b1</B><B v='v2'>b2</B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               
assertEquals("{B:[{v:'v1',contents:'b1'},{v:'v2',contents:'b2'}]}", 
m.toString());
-
-               xml = "<A><B><C v='v1'>c1</C><C v='v2'>c2</C></B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               
assertEquals("{B:{C:[{v:'v1',contents:'c1'},{v:'v2',contents:'c2'}]}}", 
m.toString());
-
-               xml = "<A><B c='c1'><c>c2</c></B></A>";
-               m = XmlParser.DEFAULT.parse(xml, ObjectMap.class);
-               assertEquals("{B:{c:['c1','c2']}}", m.toString());
-       }
-
-       @Test
-       public void testPreserveRootElement() throws Exception {
-               String xml;
-               ObjectMap m;
-               ReaderParser p = new 
XmlParser().setProperty(XML_preserveRootElement, true);
-
-               xml = "<A><B><C>c</C></B></A>";
-               m = p.parse(xml, ObjectMap.class);
-               assertEquals("{A:{B:{C:'c'}}}", m.toString());
-
-               xml = "<A></A>";
-               m = p.parse(xml, ObjectMap.class);
-               assertEquals("{A:{}}", m.toString());
-       }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonParserTest.java
----------------------------------------------------------------------
diff --git 
a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonParserTest.java 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonParserTest.java
new file mode 100755
index 0000000..9432288
--- /dev/null
+++ 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonParserTest.java
@@ -0,0 +1,179 @@
+/***************************************************************************************************************************
+ * 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 org.apache.juneau.xml;
+
+import static org.apache.juneau.BeanContext.*;
+import static org.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.parser.*;
+import org.junit.*;
+
+@SuppressWarnings({"rawtypes","serial"})
+public class CommonParserTest {
+
+       
//====================================================================================================
+       // testFromSerializer
+       
//====================================================================================================
+       @Test
+       public void testFromSerializer() throws Exception {
+               ReaderParser p = XmlParser.DEFAULT;
+
+               Map m = null;
+               m = (Map)p.parse("<object><a type='number'>1</a></object>", 
Object.class);
+               assertEquals(1, m.get("a"));
+               m = (Map)p.parse("<object><a type='number'>1</a><b 
type='string'>foo bar</b></object>", Object.class);
+               assertEquals(1, m.get("a"));
+               assertEquals("foo bar", m.get("b"));
+               m = (Map)p.parse("<object><a type='number'>1</a><b 
type='string'>foo bar</b><c type='boolean'>false</c></object>", Object.class);
+               assertEquals(1, m.get("a"));
+               assertEquals(false, m.get("c"));
+               m = (Map)p.parse("   <object>   <a type='number'>       1       
</a>    <b type='string'>       foo     </b>    <c type='boolean'>      false   
</c>    </object>       ", Object.class);
+               assertEquals(1, m.get("a"));
+               assertEquals("foo", m.get("b"));
+               assertEquals(false, m.get("c"));
+
+               m = (Map)p.parse("<object><x 
type='string'>org.apache.juneau.test.Person</x><addresses 
type='array'><object><x type='string'>org.apache.juneau.test.Address</x><city 
type='string'>city A</city><state type='string'>state A</state><street 
type='string'>street A</street><zip 
type='number'>12345</zip></object></addresses></object>", Object.class);
+               assertEquals("org.apache.juneau.test.Person", m.get("x"));
+               List l = (List)m.get("addresses");
+               assertNotNull(l);
+               m = (Map)l.get(0);
+               assertNotNull(m);
+               assertEquals("org.apache.juneau.test.Address", m.get("x"));
+               assertEquals("city A", m.get("city"));
+               assertEquals("state A", m.get("state"));
+               assertEquals("street A", m.get("street"));
+               assertEquals(12345, m.get("zip"));
+
+               ObjectList jl = (ObjectList)p.parse("<array><object><attribute 
type='string'>value</attribute></object><object><attribute 
type='string'>value</attribute></object></array>", Object.class);
+               assertEquals("value", 
jl.getObjectMap(0).getString("attribute"));
+               assertEquals("value", 
jl.getObjectMap(1).getString("attribute"));
+
+               try {
+                       jl = (ObjectList)p.parse("<array><object><attribute 
type='string'>value</attribute></object><object><attribute 
type='string'>value</attribute></object></array>", Object.class);
+                       assertEquals("value", 
jl.getObjectMap(0).getString("attribute"));
+                       assertEquals("value", 
jl.getObjectMap(1).getString("attribute"));
+               } catch (Exception e) {
+                       fail(e.getLocalizedMessage());
+               }
+
+               A1 t1 = new A1();
+               A2 t2 = new A2();
+               t2.add(new A3("name0","value0"));
+               t2.add(new A3("name1","value1"));
+               t1.list = t2;
+               String r = XmlSerializer.DEFAULT.serialize(t1);
+               t1 = p.parse(r, A1.class);
+               assertEquals("value1", t1.list.get(1).value);
+
+               r = XmlSerializer.DEFAULT.serialize(t1);
+               t1 = p.parse(r, A1.class);
+               assertEquals("value1", t1.list.get(1).value);
+       }
+
+       public static class A1 {
+               public A2 list;
+       }
+
+       public static class A2 extends LinkedList<A3> {
+       }
+
+       public static class A3 {
+               public String name, value;
+               public A3(){}
+               public A3(String name, String value) {
+                       this.name = name;
+                       this.value = value;
+               }
+       }
+
+       
//====================================================================================================
+       // Correct handling of unknown properties.
+       
//====================================================================================================
+       @Test
+       public void testCorrectHandlingOfUnknownProperties() throws Exception {
+               ReaderParser p = new 
XmlParser().setProperty(BEAN_ignoreUnknownBeanProperties, true);
+               B t;
+
+               String in =  
"<object><a>1</a><unknown>foo</unknown><b>2</b></object>";
+               t = p.parse(in, B.class);
+               assertEquals(t.a, 1);
+               assertEquals(t.b, 2);
+
+               in =  "<object><a>1</a><unknown><object><a 
type='string'>foo</a></object></unknown><b>2</b></object>";
+               t = p.parse(in, B.class);
+               assertEquals(t.a, 1);
+               assertEquals(t.b, 2);
+
+
+               try {
+                       p = new XmlParser();
+                       p.parse(in, B.class);
+                       fail("Exception expected");
+               } catch (ParseException e) {}
+       }
+
+       public static class B {
+               public int a, b;
+       }
+
+       
//====================================================================================================
+       // Writing to Collection properties with no setters.
+       
//====================================================================================================
+       @Test
+       public void testCollectionPropertiesWithNoSetters() throws Exception {
+
+               ReaderParser p = XmlParser.DEFAULT;
+
+               String in = "<object><ints 
type='array'><number>1</number><number>2</number><number>3</number></ints><beans
 type='array'><object><a type='number'>1</a><b 
type='number'>2</b></object></beans></object>";
+               C t = p.parse(in, C.class);
+               assertEquals(t.getInts().size(), 3);
+               assertEquals(t.getBeans().get(0).b, 2);
+       }
+
+       public static class C {
+               private Collection<Integer> ints = new LinkedList<Integer>();
+               private List<B> beans = new LinkedList<B>();
+               public Collection<Integer> getInts() {
+                       return ints;
+               }
+               public List<B> getBeans() {
+                       return beans;
+               }
+       }
+
+       
//====================================================================================================
+       // Parser listeners.
+       
//====================================================================================================
+       @Test
+       public void testParserListeners() throws Exception {
+               final List<String> events = new LinkedList<String>();
+               XmlParser p = new 
XmlParser().setProperty(BEAN_ignoreUnknownBeanProperties, true);
+               p.addListener(
+                       new ParserListener() {
+                               @Override /* ParserListener */
+                               public <T> void onUnknownProperty(String 
propertyName, Class<T> beanClass, T bean, int line, int col) {
+                                       events.add(propertyName + "," + line + 
"," + col);
+                               }
+                       }
+               );
+
+               String in = "<object><a type='number'>1</a><unknownProperty 
type='string'>foo</unknownProperty><b type='number'>2</b></object>";
+               p.parse(in, B.class);
+               assertEquals(1, events.size());
+               // XML parser may or may not support line numbers.
+               assertTrue(events.get(0).startsWith("unknownProperty,"));
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonTest.java
----------------------------------------------------------------------
diff --git 
a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonTest.java 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonTest.java
new file mode 100755
index 0000000..886f615
--- /dev/null
+++ b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonTest.java
@@ -0,0 +1,453 @@
+/***************************************************************************************************************************
+ * 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 org.apache.juneau.xml;
+
+import static org.apache.juneau.TestUtils.*;
+import static org.apache.juneau.serializer.SerializerContext.*;
+import static org.apache.juneau.xml.XmlSerializerContext.*;
+import static org.apache.juneau.xml.annotation.XmlFormat.*;
+import static org.junit.Assert.*;
+
+import java.net.*;
+import java.net.URI;
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.testbeans.*;
+import org.apache.juneau.xml.annotation.*;
+import org.junit.*;
+
+@SuppressWarnings({"serial"})
+public class CommonTest {
+
+       
//====================================================================================================
+       // Trim nulls from beans
+       
//====================================================================================================
+       @Test
+       public void testTrimNullsFromBeans() throws Exception {
+               XmlSerializer s = new XmlSerializer.SimpleSq();
+               XmlParser p = new XmlParser();
+               A t1 = A.create(), t2;
+
+               s.setProperty(SERIALIZER_trimNullProperties, false);
+               String r = s.serialize(t1);
+               assertEquals("<object><s1 nil='true'/><s2>s2</s2></object>", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t1, t2);
+
+               s.setProperty(SERIALIZER_trimNullProperties, true);
+               r = s.serialize(t1);
+               assertEquals("<object><s2>s2</s2></object>", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t1, t2);
+       }
+
+       public static class A {
+               public String s1, s2;
+
+               public static A create() {
+                       A t = new A();
+                       t.s2 = "s2";
+                       return t;
+               }
+       }
+
+       
//====================================================================================================
+       // Trim empty maps
+       
//====================================================================================================
+       @Test
+       public void testTrimEmptyMaps() throws Exception {
+               XmlSerializer s = new XmlSerializer.SimpleSq();
+               XmlParser p = XmlParser.DEFAULT;
+               B t1 = B.create(), t2;
+               String r;
+
+               s.setProperty(SERIALIZER_trimEmptyMaps, false);
+               r = s.serialize(t1);
+               assertEquals("<object><f1/><f2><f2a 
nil='true'/><f2b><s2>s2</s2></f2b></f2></object>", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t1, t2);
+
+               s.setProperty(SERIALIZER_trimEmptyMaps, true);
+               r = s.serialize(t1);
+               assertEquals("<object><f2><f2a 
nil='true'/><f2b><s2>s2</s2></f2b></f2></object>", r);
+               t2 = p.parse(r, B.class);
+               assertNull(t2.f1);
+       }
+
+       public static class B {
+               public TreeMap<String,A> f1, f2;
+
+               public static B create() {
+                       B t = new B();
+                       t.f1 = new TreeMap<String,A>();
+                       t.f2 = new 
TreeMap<String,A>(){{put("f2a",null);put("f2b",A.create());}};
+                       return t;
+               }
+       }
+
+       
//====================================================================================================
+       // Trim empty lists
+       
//====================================================================================================
+       @Test
+       public void testTrimEmptyLists() throws Exception {
+               XmlSerializer s = new XmlSerializer.SimpleSq();
+               XmlParser p = XmlParser.DEFAULT;
+               C t1 = C.create(), t2;
+               String r;
+
+               s.setProperty(SERIALIZER_trimEmptyLists, false);
+               r = s.serialize(t1);
+               
assertEquals("<object><f1></f1><f2><null/><object><s2>s2</s2></object></f2></object>",
 r);
+               t2 = p.parse(r, C.class);
+               assertEqualObjects(t1, t2);
+
+               s.setProperty(SERIALIZER_trimEmptyLists, true);
+               r = s.serialize(t1);
+               
assertEquals("<object><f2><null/><object><s2>s2</s2></object></f2></object>", 
r);
+               t2 = p.parse(r, C.class);
+               assertNull(t2.f1);
+       }
+
+       public static class C {
+               public List<A> f1, f2;
+
+               public static C create() {
+                       C t = new C();
+                       t.f1 = new LinkedList<A>();
+                       t.f2 = new 
LinkedList<A>(){{add(null);add(A.create());}};
+                       return t;
+               }
+       }
+
+       
//====================================================================================================
+       // Trim empty arrays
+       
//====================================================================================================
+       @Test
+       public void testTrimEmptyArrays() throws Exception {
+               XmlSerializer s = new XmlSerializer.SimpleSq();
+               XmlParser p = XmlParser.DEFAULT;
+               D t1 = D.create(), t2;
+               String r;
+
+               s.setProperty(SERIALIZER_trimEmptyLists, false);
+               r = s.serialize(t1);
+               
assertEquals("<object><f1></f1><f2><null/><object><s2>s2</s2></object></f2></object>",
 r);
+               t2 = p.parse(r, D.class);
+               assertEqualObjects(t1, t2);
+
+               s.setProperty(SERIALIZER_trimEmptyLists, true);
+               r = s.serialize(t1);
+               
assertEquals("<object><f2><null/><object><s2>s2</s2></object></f2></object>", 
r);
+               t2 = p.parse(r, D.class);
+               assertNull(t2.f1);
+       }
+
+       public static class D {
+               public A[] f1, f2;
+
+               public static D create() {
+                       D t = new D();
+                       t.f1 = new A[]{};
+                       t.f2 = new A[]{null, A.create()};
+                       return t;
+               }
+       }
+
+       
//====================================================================================================
+       // @BeanProperty.properties annotation.
+       
//====================================================================================================
+       @Test
+       public void testBeanPropertyProperties() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               E1 t = new E1();
+               String r = s.serialize(t);
+               assertEquals("<object><x1 
f2='2'><f1>1</f1></x1><x2><f1>1</f1></x2><x3><object 
f2='2'><f1>1</f1></object></x3><x4><object 
f2='2'><f1>1</f1></object></x4><x5><object><f1>1</f1></object></x5><x6><object><f1>1</f1></object></x6></object>",
 r);
+               TestUtils.validateXml(t);
+       }
+
+       public static class E1 {
+               @BeanProperty(properties={"f1","f2"}) public E2 x1 = new E2();
+               @BeanProperty(properties={"f1","f2"}) public 
Map<String,Integer> x2 = new LinkedHashMap<String,Integer>() {{
+                       put("f1",1); put("f3",3);
+               }};
+               @BeanProperty(properties={"f1","f2"}) public E2[] x3 = {new 
E2()};
+               @BeanProperty(properties={"f1","f2"}) public List<E2> x4 = new 
LinkedList<E2>() {{
+                       add(new E2());
+               }};
+               @BeanProperty(properties={"f1"}) public ObjectMap[] x5 = {new 
ObjectMap().append("f1",1).append("f3",3)};
+               @BeanProperty(properties={"f1"}) public List<ObjectMap> x6 = 
new LinkedList<ObjectMap>() {{
+                       add(new ObjectMap().append("f1",1).append("f3",3));
+               }};
+       }
+
+       public static class E2 {
+               public int f1 = 1;
+               @Xml(format=ATTR) public int f2 = 2;
+               public int f3 = 3;
+               @Xml(format=ATTR) public int f4 = 4;
+       }
+
+       
//====================================================================================================
+       // @BeanProperty.properties annotation on list of beans.
+       
//====================================================================================================
+       @Test
+       public void testBeanPropertyPropertiesOnListOfBeans() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               List<Test7b> l = new LinkedList<Test7b>();
+               Test7b t = new Test7b();
+               t.x1.add(new Test7b());
+               l.add(t);
+               String xml = s.serialize(l);
+               
assertEquals("<array><object><x1><object><x2>2</x2></object></x1><x2>2</x2></object></array>",
 xml);
+       }
+
+       public static class Test7b {
+               @BeanProperty(properties={"x2"}) public List<Test7b> x1 = new 
LinkedList<Test7b>();
+               public int x2 = 2;
+       }
+
+       
//====================================================================================================
+       // Test that URLs and URIs are serialized and parsed correctly.
+       
//====================================================================================================
+       @Test
+       public void testURIAttr() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+
+               G t = new G();
+               t.uri = new URI("http://uri";);
+               t.f1 = new URI("http://f1";);
+               t.f2 = new URL("http://f2";);
+
+               String xml = s.serialize(t);
+               t = p.parse(xml, G.class);
+               assertEquals("http://uri";, t.uri.toString());
+               assertEquals("http://f1";, t.f1.toString());
+               assertEquals("http://f2";, t.f2.toString());
+       }
+
+       public static class G {
+               @BeanProperty(beanUri=true) public URI uri;
+               public URI f1;
+               public URL f2;
+       }
+
+       
//====================================================================================================
+       // Test URIs with URI_CONTEXT and URI_AUTHORITY
+       
//====================================================================================================
+       @Test
+       public void testUris() throws Exception {
+               WriterSerializer s = new XmlSerializer.SimpleSq();
+               TestURI t = new TestURI();
+               String r;
+               String expected;
+
+               s.setProperty(SERIALIZER_relativeUriBase, null);
+               r = s.serialize(t);
+               expected = ""
+                       +"<object f0='f0/x0'>"
+                       +"<f1>f1/x1</f1>"
+                       +"<f2>/f2/x2</f2>"
+                       +"<f3>http://www.ibm.com/f3/x3</f3>"
+                       +"<f4>f4/x4</f4>"
+                       +"<f5>/f5/x5</f5>"
+                       +"<f6>http://www.ibm.com/f6/x6</f6>"
+                       +"<f7>http://www.ibm.com/f7/x7</f7>"
+                       +"<f8>f8/x8</f8>"
+                       +"<f9>f9/x9</f9>"
+                       +"<fa>http://www.ibm.com/fa/xa#MY_LABEL</fa>"
+                       
+"<fb>http://www.ibm.com/fb/xb?label=MY_LABEL&amp;foo=bar</fb>"
+                       
+"<fc>http://www.ibm.com/fc/xc?foo=bar&amp;label=MY_LABEL</fc>"
+                       
+"<fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&amp;foo=bar</fd>"
+                       
+"<fe>http://www.ibm.com/fe/xe?foo=bar&amp;label2=MY_LABEL</fe>"
+                       +"</object>";
+               assertEquals(expected, r);
+
+               s.setProperty(SERIALIZER_relativeUriBase, "");  // Same as null.
+               r = s.serialize(t);
+               assertEquals(expected, r);
+
+               s.setProperty(SERIALIZER_relativeUriBase, "/cr");
+               r = s.serialize(t);
+               expected = ""
+                       +"<object f0='/cr/f0/x0'>"
+                       +"<f1>/cr/f1/x1</f1>"
+                       +"<f2>/f2/x2</f2>"
+                       +"<f3>http://www.ibm.com/f3/x3</f3>"
+                       +"<f4>/cr/f4/x4</f4>"
+                       +"<f5>/f5/x5</f5>"
+                       +"<f6>http://www.ibm.com/f6/x6</f6>"
+                       +"<f7>http://www.ibm.com/f7/x7</f7>"
+                       +"<f8>/cr/f8/x8</f8>"
+                       +"<f9>/cr/f9/x9</f9>"
+                       +"<fa>http://www.ibm.com/fa/xa#MY_LABEL</fa>"
+                       
+"<fb>http://www.ibm.com/fb/xb?label=MY_LABEL&amp;foo=bar</fb>"
+                       
+"<fc>http://www.ibm.com/fc/xc?foo=bar&amp;label=MY_LABEL</fc>"
+                       
+"<fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&amp;foo=bar</fd>"
+                       
+"<fe>http://www.ibm.com/fe/xe?foo=bar&amp;label2=MY_LABEL</fe>"
+                       +"</object>";
+               assertEquals(expected, r);
+
+               s.setProperty(SERIALIZER_relativeUriBase, "/cr/");  // Same as 
above
+               r = s.serialize(t);
+               assertEquals(expected, r);
+
+               s.setProperty(SERIALIZER_relativeUriBase, "/");
+               r = s.serialize(t);
+               expected = ""
+                       +"<object f0='/f0/x0'>"
+                       +"<f1>/f1/x1</f1>"
+                       +"<f2>/f2/x2</f2>"
+                       +"<f3>http://www.ibm.com/f3/x3</f3>"
+                       +"<f4>/f4/x4</f4>"
+                       +"<f5>/f5/x5</f5>"
+                       +"<f6>http://www.ibm.com/f6/x6</f6>"
+                       +"<f7>http://www.ibm.com/f7/x7</f7>"
+                       +"<f8>/f8/x8</f8>"
+                       +"<f9>/f9/x9</f9>"
+                       +"<fa>http://www.ibm.com/fa/xa#MY_LABEL</fa>"
+                       
+"<fb>http://www.ibm.com/fb/xb?label=MY_LABEL&amp;foo=bar</fb>"
+                       
+"<fc>http://www.ibm.com/fc/xc?foo=bar&amp;label=MY_LABEL</fc>"
+                       
+"<fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&amp;foo=bar</fd>"
+                       
+"<fe>http://www.ibm.com/fe/xe?foo=bar&amp;label2=MY_LABEL</fe>"
+                       +"</object>";
+               assertEquals(expected, r);
+
+               s.setProperty(SERIALIZER_relativeUriBase, null);
+
+               s.setProperty(SERIALIZER_absolutePathUriBase, "http://foo";);
+               r = s.serialize(t);
+               expected = ""
+                       +"<object f0='f0/x0'>"
+                       +"<f1>f1/x1</f1>"
+                       +"<f2>http://foo/f2/x2</f2>"
+                       +"<f3>http://www.ibm.com/f3/x3</f3>"
+                       +"<f4>f4/x4</f4>"
+                       +"<f5>http://foo/f5/x5</f5>"
+                       +"<f6>http://www.ibm.com/f6/x6</f6>"
+                       +"<f7>http://www.ibm.com/f7/x7</f7>"
+                       +"<f8>f8/x8</f8>"
+                       +"<f9>f9/x9</f9>"
+                       +"<fa>http://www.ibm.com/fa/xa#MY_LABEL</fa>"
+                       
+"<fb>http://www.ibm.com/fb/xb?label=MY_LABEL&amp;foo=bar</fb>"
+                       
+"<fc>http://www.ibm.com/fc/xc?foo=bar&amp;label=MY_LABEL</fc>"
+                       
+"<fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&amp;foo=bar</fd>"
+                       
+"<fe>http://www.ibm.com/fe/xe?foo=bar&amp;label2=MY_LABEL</fe>"
+                       +"</object>";
+               assertEquals(expected, r);
+
+               s.setProperty(SERIALIZER_absolutePathUriBase, "http://foo/";);
+               r = s.serialize(t);
+               assertEquals(expected, r);
+
+               s.setProperty(SERIALIZER_absolutePathUriBase, "");  // Same as 
null.
+               r = s.serialize(t);
+               expected = ""
+                       +"<object f0='f0/x0'>"
+                       +"<f1>f1/x1</f1>"
+                       +"<f2>/f2/x2</f2>"
+                       +"<f3>http://www.ibm.com/f3/x3</f3>"
+                       +"<f4>f4/x4</f4>"
+                       +"<f5>/f5/x5</f5>"
+                       +"<f6>http://www.ibm.com/f6/x6</f6>"
+                       +"<f7>http://www.ibm.com/f7/x7</f7>"
+                       +"<f8>f8/x8</f8>"
+                       +"<f9>f9/x9</f9>"
+                       +"<fa>http://www.ibm.com/fa/xa#MY_LABEL</fa>"
+                       
+"<fb>http://www.ibm.com/fb/xb?label=MY_LABEL&amp;foo=bar</fb>"
+                       
+"<fc>http://www.ibm.com/fc/xc?foo=bar&amp;label=MY_LABEL</fc>"
+                       
+"<fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&amp;foo=bar</fd>"
+                       
+"<fe>http://www.ibm.com/fe/xe?foo=bar&amp;label2=MY_LABEL</fe>"
+                       +"</object>";
+               assertEquals(expected, r);
+       }
+
+       
//====================================================================================================
+       // Validate that you cannot update properties on locked serializer.
+       
//====================================================================================================
+       @Test
+       public void testLockedSerializer() throws Exception {
+               XmlSerializer s = new XmlSerializer().lock();
+               try {
+                       
s.setProperty(XmlSerializerContext.XML_enableNamespaces, true);
+                       fail("Locked exception not thrown");
+               } catch (LockedException e) {}
+               try {
+                       
s.setProperty(SerializerContext.SERIALIZER_addClassAttrs, true);
+                       fail("Locked exception not thrown");
+               } catch (LockedException e) {}
+               try {
+                       
s.setProperty(BeanContext.BEAN_beanMapPutReturnsOldValue, true);
+                       fail("Locked exception not thrown");
+               } catch (LockedException e) {}
+       }
+
+       
//====================================================================================================
+       // Recursion
+       
//====================================================================================================
+       @Test
+       public void testRecursion() throws Exception {
+               XmlSerializer s = new 
XmlSerializer().setProperty(XML_enableNamespaces, false);
+
+               R1 r1 = new R1();
+               R2 r2 = new R2();
+               R3 r3 = new R3();
+               r1.r2 = r2;
+               r2.r3 = r3;
+               r3.r1 = r1;
+
+               // No recursion detection
+               try {
+                       s.serialize(r1);
+                       fail("Exception expected!");
+               } catch (Exception e) {
+                       String msg = e.getLocalizedMessage();
+                       assertTrue(msg.contains("It's recommended you use the 
SerializerContext.SERIALIZER_detectRecursions setting to help locate the 
loop."));
+               }
+
+               // Recursion detection, no ignore
+               s.setProperty(SERIALIZER_detectRecursions, true);
+               try {
+                       s.serialize(r1);
+                       fail("Exception expected!");
+               } catch (Exception e) {
+                       String msg = e.getLocalizedMessage();
+                       
assertTrue(msg.contains("[0]<noname>:org.apache.juneau.xml.CommonTest$R1"));
+                       
assertTrue(msg.contains("->[1]r2:org.apache.juneau.xml.CommonTest$R2"));
+                       
assertTrue(msg.contains("->[2]r3:org.apache.juneau.xml.CommonTest$R3"));
+                       
assertTrue(msg.contains("->[3]r1:org.apache.juneau.xml.CommonTest$R1"));
+               }
+
+               s.setProperty(SERIALIZER_ignoreRecursions, true);
+               
assertEquals("<object><name>foo</name><r2><name>bar</name><r3><name>baz</name></r3></r2></object>",
 s.serialize(r1));
+
+               // Make sure this doesn't blow up.
+               s.getSchemaSerializer().serialize(r1);
+       }
+
+       public static class R1 {
+               public String name = "foo";
+               public R2 r2;
+       }
+       public static class R2 {
+               public String name = "bar";
+               public R3 r3;
+       }
+       public static class R3 {
+               public String name = "baz";
+               public R1 r1;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonXmlTest.java
----------------------------------------------------------------------
diff --git 
a/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonXmlTest.java 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonXmlTest.java
new file mode 100755
index 0000000..c5e4c3b
--- /dev/null
+++ b/org.apache.juneau/src/test/java/org/apache/juneau/xml/CommonXmlTest.java
@@ -0,0 +1,81 @@
+/***************************************************************************************************************************
+ * 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 org.apache.juneau.xml;
+
+import static org.apache.juneau.TestUtils.*;
+import static org.apache.juneau.xml.XmlSerializerContext.*;
+import static org.apache.juneau.xml.annotation.XmlFormat.*;
+import static org.junit.Assert.*;
+
+import java.net.*;
+
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.xml.annotation.*;
+import org.junit.*;
+
+public class CommonXmlTest {
+
+       
//====================================================================================================
+       // Test 18a - @Bean.uri annotation
+       
//====================================================================================================
+       @Test
+       public void testBeanUriAnnotation() throws Exception {
+               XmlParser p = XmlParser.DEFAULT;
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+
+               A t = new A("http://foo";, 123, "bar");
+               String xml = s.serialize(t);
+               assertEquals("<object url='http://foo' 
id='123'><name>bar</name></object>", xml);
+
+               t = p.parse(xml, A.class);
+               assertEquals("http://foo";, t.url.toString());
+               assertEquals(123, t.id);
+               assertEquals("bar", t.name);
+
+               validateXml(t, s);
+       }
+
+       public static class A {
+               @BeanProperty(beanUri=true) public URL url;
+               @Xml(format=ATTR) public int id;
+               public String name;
+               public A() {}
+               public A(String url, int id, String name) throws Exception {
+                       this.url = new URL(url);
+                       this.id = id;
+                       this.name = name;
+               }
+       }
+
+       
//====================================================================================================
+       // Bean.uri annotation, only uri property
+       
//====================================================================================================
+       @Test
+       public void testBeanUriAnnotationOnlyUriProperty() throws Exception {
+               XmlSerializer s = new 
XmlSerializer.Sq().setProperty(XML_addNamespaceUrisToRoot, false);
+
+               B t = new B("http://foo";);
+               String xml = s.serialize(t);
+               assertEquals("<object 
url='http://foo'><url2>http://foo/2</url2></object>", xml);
+       }
+
+       public static class B {
+               @BeanProperty(beanUri=true) public URL url;
+               public URL url2;
+               public B() {}
+               public B(String url) throws Exception {
+                       this.url = new URL(url);
+                       this.url2 = new URL(url+"/2");
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java
----------------------------------------------------------------------
diff --git 
a/org.apache.juneau/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java
new file mode 100755
index 0000000..2bfa4e6
--- /dev/null
+++ 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java
@@ -0,0 +1,459 @@
+/***************************************************************************************************************************
+ * 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 org.apache.juneau.xml;
+
+import static org.apache.juneau.TestUtils.*;
+import static org.apache.juneau.xml.annotation.XmlFormat.*;
+import static org.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.xml.annotation.*;
+import org.junit.*;
+
+@SuppressWarnings({"serial"})
+public class XmlCollapsedTest {
+
+       
//====================================================================================================
+       // testBasic - @Xml.format=COLLAPSED
+       
//====================================================================================================
+       @Test
+       public void testBasic() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               A t = new A();
+
+               t.f1 = new LinkedList<String>(){{add("f1a");add("f1b");}};
+               t.f2 = new String[]{"f2a","f2b"};
+               t.f3 = new LinkedList<String>(){{add("f3a");add("f3b");}};
+               t.f4 = new String[]{"f4a","f4b"};
+
+               String xml = s.serialize(t);
+               
assertEquals("<object><f1>f1a</f1><f1>f1b</f1><f2>f2a</f2><f2>f2b</f2><xf3>f3a</xf3><xf3>f3b</xf3><xf4>f4a</xf4><xf4>f4b</xf4></object>",
 xml);
+               t = p.parse(xml, A.class);
+               assertEquals("f1a", t.f1.get(0));
+               assertEquals("f2a", t.f2[0]);
+               assertEquals("f3a", t.f3.get(0));
+               assertEquals("f4a", t.f4[0]);
+
+               validateXml(t, s);
+       }
+
+       public static class A {
+
+               @Xml(format=COLLAPSED)
+               public List<String> f1 = new LinkedList<String>();
+
+               @Xml(format=COLLAPSED)
+               public String[] f2 = new String[0];
+
+               @Xml(format=COLLAPSED,childName="xf3")
+               public List<String> f3 = new LinkedList<String>();
+
+               @Xml(format=COLLAPSED,childName="xf4")
+               public String[] f4 =  new String[0];
+       }
+
+       
//====================================================================================================
+       // testUninitializedFields - @Xml.format=COLLAPSED, uninitialized 
fields.
+       
//====================================================================================================
+       @Test
+       public void testUninitializedFields() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               B t = new B();
+
+               t.f1 = new LinkedList<String>(){{add("f1a");add("f1b");}};
+               t.f2 = new String[]{"f2a","f2b"};
+               t.f3 = new LinkedList<String>(){{add("f3a");add("f3b");}};
+               t.f4 = new String[]{"f4a","f4b"};
+
+               String xml = s.serialize(t);
+               
assertEquals("<object><f1>f1a</f1><f1>f1b</f1><f2>f2a</f2><f2>f2b</f2><xf3>f3a</xf3><xf3>f3b</xf3><xf4>f4a</xf4><xf4>f4b</xf4></object>",
 xml);
+               t = p.parse(xml, B.class);
+               assertEquals("f1a", t.f1.get(0));
+               assertEquals("f2a", t.f2[0]);
+               assertEquals("f3a", t.f3.get(0));
+               assertEquals("f4a", t.f4[0]);
+
+               validateXml(t, s);
+       }
+
+       public static class B {
+
+               @Xml(format=COLLAPSED)
+               public List<String> f1;
+
+               @Xml(format=COLLAPSED)
+               public String[] f2;
+
+               @Xml(format=COLLAPSED,childName="xf3")
+               public List<String> f3;
+
+               @Xml(format=COLLAPSED,childName="xf4")
+               public String[] f4;
+       }
+
+       
//====================================================================================================
+       // testInitializedFields - @Xml.format=COLLAPSED, initialized fields.
+       
//====================================================================================================
+       @Test
+       public void testInitializedFields() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               C t = new C();
+
+               t.f1 = new LinkedList<String>(){{add("f1b");}};
+               t.f2 = new String[]{"f2b"};
+               t.f3 = new LinkedList<String>(){{add("f3b");}};
+               t.f4 = new String[]{"f4b"};
+
+               String xml = s.serialize(t);
+               
assertEquals("<object><f1>f1b</f1><f2>f2b</f2><xf3>f3b</xf3><xf4>f4b</xf4></object>",
 xml);
+
+               // Note that existing fields should be reused and appended to.
+               t = p.parse(xml, C.class);
+               assertEquals("f1a", t.f1.get(0));
+               assertEquals("f1b", t.f1.get(1));
+               assertEquals("f2a", t.f2[0]);
+               assertEquals("f2b", t.f2[1]);
+               assertEquals("f3a", t.f3.get(0));
+               assertEquals("f3b", t.f3.get(1));
+               assertEquals("f4a", t.f4[0]);
+               assertEquals("f4b", t.f4[1]);
+
+               validateXml(t, s);
+       }
+
+       public static class C {
+
+               @Xml(format=COLLAPSED)
+               public List<String> f1 = new 
LinkedList<String>(){{add("f1a");}};
+
+               @Xml(format=COLLAPSED)
+               public String[] f2 = {"f2a"};
+
+               @Xml(format=COLLAPSED,childName="xf3")
+               public List<String> f3 = new 
LinkedList<String>(){{add("f3a");}};
+
+               @Xml(format=COLLAPSED,childName="xf4")
+               public String[] f4 = {"f4a"};
+       }
+
+       
//====================================================================================================
+       // testGetters - @Xml.format=COLLAPSED, getters.
+       
//====================================================================================================
+       @Test
+       @SuppressWarnings("synthetic-access")
+       public void testGetters() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               D t = new D();
+
+               t.f1 = new LinkedList<String>(){{add("f1a");}};
+               t.f2 = new String[]{"f2a"};
+               t.f3 = new LinkedList<String>(){{add("f3a");}};
+               t.f4 = new String[]{"f4a"};
+
+               String xml = s.serialize(t);
+               
assertEquals("<object><f1>f1a</f1><f2>f2a</f2><xf3>f3a</xf3><xf4>f4a</xf4></object>",
 xml);
+
+               // Note that existing fields should be reused and appended to.
+               t = p.parse(xml, D.class);
+               assertEquals("f1a", t.f1.get(0));
+               assertEquals("f2a", t.f2[0]);
+               assertEquals("f3a", t.f3.get(0));
+               assertEquals("f4a", t.f4[0]);
+
+               validateXml(t, s);
+       }
+
+       @Bean(properties={"f1","f2","f3","f4"})
+       public static class D {
+
+               private List<String> f1 = new LinkedList<String>(), f3 = new 
LinkedList<String>();
+               private String[] f2, f4;
+
+               @Xml(format=COLLAPSED)
+               public List<String> getF1() {
+                       return f1;
+               }
+
+               @Xml(format=COLLAPSED)
+               public String[] getF2() {
+                       return f2;
+               }
+               public void setF2(String[] f2) {
+                       this.f2 = f2;
+               }
+
+               @Xml(format=COLLAPSED,childName="xf3")
+               public List<String> getF3() {
+                       return f3;
+               }
+
+               @Xml(format=COLLAPSED,childName="xf4")
+               public String[] getF4() {
+                       return f4;
+               }
+               public void setF4(String[] f4) {
+                       this.f4 = f4;
+               }
+       }
+
+       
//====================================================================================================
+       // testNullConstructibleCollectionFields - @Xml.format=COLLAPSED, null 
constructible collection fields.
+       
//====================================================================================================
+       @Test
+       @SuppressWarnings("synthetic-access")
+       public void testNullConstructibleCollectionFields() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               E t = new E();
+
+               t.f1 = new LinkedList<String>(){{add("f1a");}};
+               t.f2 = new LinkedList<String>(){{add("f2a");}};
+
+               String xml = s.serialize(t);
+               assertEquals("<object><f1>f1a</f1><xf2>f2a</xf2></object>", 
xml);
+
+               // Note that existing fields should be reused and appended to.
+               t = p.parse(xml, E.class);
+               assertEquals("f1a", t.f1.get(0));
+               assertEquals("f2a", t.f2.get(0));
+
+               validateXml(t, s);
+       }
+
+       @Bean(properties={"f1","f2"})
+       public static class E {
+
+               private LinkedList<String> f1, f2;
+
+               @Xml(format=COLLAPSED)
+               public LinkedList<String> getF1() {
+                       return f1;
+               }
+               public void setF1(LinkedList<String> f1) {
+                       this.f1 = f1;
+               }
+
+               @Xml(format=COLLAPSED,childName="xf2")
+               public LinkedList<String> getF2() {
+                       return f2;
+               }
+               public void setF2(LinkedList<String> f2) {
+                       this.f2 = f2;
+               }
+       }
+
+
+       
//====================================================================================================
+       // testElementNameOnElementClass - @Xml.format=COLLAPSED, element name 
defined on element class.
+       
//====================================================================================================
+       @Test
+       public void testElementNameOnElementClass() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               Object t1 = FA.newInstance(), t2;
+               String r;
+
+               r = s.serialize(t1);
+               assertEquals("<object><xf1>x1</xf1><xf1>x2</xf1></object>", r);
+               t2 = p.parse(r, FA.class);
+               assertEqualObjects(t1, t2);
+               validateXml(t1, s);
+
+               t1 = FB.newInstance();
+               r = s.serialize(t1);
+               assertEquals("<object><xf1>x1</xf1><xf1>x2</xf1></object>", r);
+               t2 = p.parse(r, FB.class);
+               assertEqualObjects(t1, t2);
+               validateXml(t1, s);
+
+               t1 = FC.newInstance();
+               try {
+                       r = s.serialize(t1);
+                       fail("Exception expected.");
+               } catch (SerializeException e) {
+                       
assertEquals("org.apache.juneau.xml.XmlCollapsedTest$FC: Multiple properties 
found with the name 'xf1'.", e.getLocalizedMessage());
+               }
+       }
+
+       public static class FA {
+
+               @Xml(format=COLLAPSED)
+               public List<F1> f1;
+
+               public static FA newInstance() {
+                       FA t = new FA();
+                       t.f1 = new LinkedList<F1>();
+                       t.f1.add(F1.newInstance("x1"));
+                       t.f1.add(F1.newInstance("x2"));
+                       return t;
+               }
+       }
+
+       public static class FB {
+               @Xml(format=COLLAPSED)
+               public F1[] f1;
+
+               public static FB newInstance() {
+                       FB t = new FB();
+                       t.f1 = new F1[]{
+                               F1.newInstance("x1"),
+                               F1.newInstance("x2")
+                       };
+                       return t;
+               }
+       }
+
+       // Should cause name collision.
+       public static class FC {
+
+               @Xml(format=COLLAPSED)
+               public List<F1> f1;
+
+               @Xml(format=COLLAPSED)
+               public F1[] f2;
+
+               public static FC newInstance() {
+                       FC t = new FC();
+                       return t;
+               }
+       }
+
+       @Xml(name="xf1")
+       public static class F1 {
+
+               @Xml(format=CONTENT)
+               public String text;
+
+               public static F1 newInstance(String text) {
+                       F1 t = new F1();
+                       t.text = text;
+                       return t;
+               }
+       }
+
+
+       
//====================================================================================================
+       // testElementNameOnElementClassOverridden - @Xml.format=COLLAPSED, 
element name defined on element class,
+       //      but overridden by @Xml.childName on property.
+       
//====================================================================================================
+       @Test
+       public void testElementNameOnElementClassOverridden() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               G t = G.newInstance(), t2;
+
+               String xml = s.serialize(t);
+               assertEquals("<object><yf1>x1</yf1><yf1>x2</yf1></object>", 
xml);
+
+               // Note that existing fields should be reused and appended to.
+               t2 = p.parse(xml, G.class);
+               assertEqualObjects(t, t2);
+
+               validateXml(t, s);
+       }
+
+       public static class G {
+
+               @Xml(format=COLLAPSED, childName="yf1")
+               public List<F1> f1;
+
+               public static G newInstance() {
+                       G t = new G();
+                       t.f1 = new LinkedList<F1>();
+                       t.f1.add(F1.newInstance("x1"));
+                       t.f1.add(F1.newInstance("x2"));
+                       return t;
+               }
+       }
+
+
+       
//====================================================================================================
+       // testElementNameOnCollectionClass - @Xml.format=COLLAPSED, element 
name defined on bean class.
+       
//====================================================================================================
+       @Test
+       public void testElementNameOnCollectionClass() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               H t = H.newInstance(), t2;
+
+               String xml = s.serialize(t);
+               assertEquals("<object><xf1>x1</xf1><xf1>x2</xf1></object>", 
xml);
+
+               // Note that existing fields should be reused and appended to.
+               t2 = p.parse(xml, H.class);
+               assertEqualObjects(t, t2);
+
+               validateXml(t, s);
+       }
+
+       public static class H {
+
+               @Xml(format=COLLAPSED)
+               public H1 f1;
+
+               public static H newInstance() {
+                       H t = new H();
+                       t.f1 = new H1();
+                       t.f1.add("x1");
+                       t.f1.add("x2");
+                       return t;
+               }
+       }
+
+       @Xml(childName="xf1")
+       public static class H1 extends LinkedList<String> {
+       }
+
+
+       
//====================================================================================================
+       // testElementNameOnCollectionClassOverridden - @Xml.format=COLLAPSED, 
element name defined on element class,
+       //      but overridden by @Xml.childName on property.
+       
//====================================================================================================
+       @Test
+       public void testElementNameOnCollectionClassOverridden() throws 
Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               XmlParser p = XmlParser.DEFAULT;
+               G t = G.newInstance(), t2;
+
+               String xml = s.serialize(t);
+               assertEquals("<object><yf1>x1</yf1><yf1>x2</yf1></object>", 
xml);
+
+               // Note that existing fields should be reused and appended to.
+               t2 = p.parse(xml, G.class);
+               assertEqualObjects(t, t2);
+
+               validateXml(t, s);
+       }
+
+       public static class I {
+
+               @Xml(format=COLLAPSED, childName="yf1")
+               public H1 f1;
+
+               public static I newInstance() {
+                       I t = new I();
+                       t.f1 = new H1();
+                       t.f1.add("x1");
+                       t.f1.add("x2");
+                       return t;
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/xml/XmlContentTest.java
----------------------------------------------------------------------
diff --git 
a/org.apache.juneau/src/test/java/org/apache/juneau/xml/XmlContentTest.java 
b/org.apache.juneau/src/test/java/org/apache/juneau/xml/XmlContentTest.java
new file mode 100755
index 0000000..42fb2b7
--- /dev/null
+++ b/org.apache.juneau/src/test/java/org/apache/juneau/xml/XmlContentTest.java
@@ -0,0 +1,301 @@
+/***************************************************************************************************************************
+ * 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 org.apache.juneau.xml;
+
+import static org.apache.juneau.TestUtils.*;
+import static org.apache.juneau.serializer.SerializerContext.*;
+import static org.apache.juneau.xml.XmlSerializerContext.*;
+import static org.apache.juneau.xml.XmlUtils.*;
+import static org.apache.juneau.xml.annotation.XmlFormat.*;
+import static org.junit.Assert.*;
+
+import java.io.*;
+
+import javax.xml.stream.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.xml.annotation.*;
+import org.junit.*;
+
+public class XmlContentTest {
+
+       
//--------------------------------------------------------------------------------
+       // Test beans with @Xml(format=CONTENT)
+       
//--------------------------------------------------------------------------------
+       @Test
+       public void testContentFormat() throws Exception {
+               A t = A.newInstance(), t2;
+               XmlSerializer s1 = XmlSerializer.DEFAULT_SIMPLE_SQ,
+                       s2 = new 
XmlSerializer().setProperty(SERIALIZER_quoteChar, 
'\'').setProperty(SERIALIZER_useIndentation, 
true).setProperty(XML_enableNamespaces, false);
+               XmlParser p = XmlParser.DEFAULT;
+               XmlSerializerSession session;
+               String r;
+               StringWriter sw;
+
+               
//----------------------------------------------------------------
+               // Null
+               
//----------------------------------------------------------------
+               t.f2 = null;
+
+               sw = new StringWriter();
+               session = s1.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null);
+               s1.serialize(session, t);
+               r = sw.toString();
+               assertEquals("<A f1='f1'>_x0000_</A>", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               sw = new StringWriter();
+               session = s2.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null);
+               s2.serialize(session, t);
+               r = sw.toString();
+               assertEquals("<A f1='f1'>\n\t_x0000_\n</A>\n", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // Normal text
+               
//----------------------------------------------------------------
+               t.f2 = "foobar";
+
+               r = s1.serialize(t);
+               assertEquals("<A f1='f1'>foobar</A>", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A f1='f1'>\n\tfoobar\n</A>\n", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // Special characters
+               
//----------------------------------------------------------------
+               t.f2 = "~!@#$%^&*()_+`-={}|[]\\:\";'<>?,.\n\r\t\b";
+
+               r = s1.serialize(t);
+               assertEquals("<A 
f1='f1'>~!@#$%^&amp;*()_+`-={}|[]\\:\";'&lt;&gt;?,.&#x000a;&#x000d;&#x0009;_x0008_</A>",
 r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A 
f1='f1'>\n\t~!@#$%^&amp;*()_+`-={}|[]\\:\";'&lt;&gt;?,.&#x000a;&#x000d;&#x0009;_x0008_\n</A>\n",
 r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // Leading spaces
+               
//----------------------------------------------------------------
+               t.f2 = "  foobar";
+
+               r = s1.serialize(t);
+               assertEquals("<A f1='f1'>_x0020_ foobar</A>", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A f1='f1'>\n\t_x0020_ foobar\n</A>\n", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // Trailing spaces
+               
//----------------------------------------------------------------
+               t.f2 = "foobar  ";
+
+               r = s1.serialize(t);
+               assertEquals("<A f1='f1'>foobar _x0020_</A>", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A f1='f1'>\n\tfoobar _x0020_\n</A>\n", r);
+               t2 = p.parse(r, A.class);
+               assertEqualObjects(t, t2);
+       }
+
+       @Xml(name="A")
+       public static class A {
+               @Xml(format=ATTR) public String f1;
+               @Xml(format=CONTENT) public String f2;
+
+               public static A newInstance() {
+                       A t = new A();
+                       t.f1 = "f1";
+                       t.f2 = null;
+                       return t;
+               }
+       }
+
+       
//--------------------------------------------------------------------------------
+       // Test beans with @Xml(format=XMLCONTENT)
+       
//--------------------------------------------------------------------------------
+       @Test
+       public void testXmlContentFormat() throws Exception {
+               B t = B.newInstance(), t2;
+               XmlSerializer s1 = XmlSerializer.DEFAULT_SIMPLE_SQ,
+                       s2 = new 
XmlSerializer().setProperty(SERIALIZER_quoteChar, 
'\'').setProperty(SERIALIZER_useIndentation, 
true).setProperty(XML_enableNamespaces, false);
+               XmlParser p = XmlParser.DEFAULT;
+               XmlSerializerSession session;
+               String r;
+               StringWriter sw;
+
+               
//----------------------------------------------------------------
+               // Null
+               
//----------------------------------------------------------------
+               t.f2 = null;
+
+               sw = new StringWriter();
+               session = s1.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null);
+               s1.serialize(session, t);
+               r = sw.toString();
+               assertEquals("<A f1='f1'>_x0000_</A>", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               sw = new StringWriter();
+               session = s2.createSession(sw, new 
ObjectMap("{"+SERIALIZER_trimNullProperties+":false}"), null);
+               s2.serialize(session, t);
+               r = sw.toString();
+               assertEquals("<A f1='f1'>\n\t_x0000_\n</A>\n", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // Normal text
+               
//----------------------------------------------------------------
+               t.f2 = "foobar";
+
+               r = s1.serialize(t);
+               assertEquals("<A f1='f1'>foobar</A>", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A f1='f1'>\n\tfoobar\n</A>\n", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // Normal XML
+               
//----------------------------------------------------------------
+               t.f2 = "<xxx>foobar<yyy>baz</yyy>foobar</xxx>";
+
+               r = s1.serialize(t);
+               assertEquals("<A 
f1='f1'><xxx>foobar<yyy>baz</yyy>foobar</xxx></A>", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A 
f1='f1'>\n\t<xxx>foobar<yyy>baz</yyy>foobar</xxx>\n</A>\n", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // Normal XML with leading and trailing space
+               
//----------------------------------------------------------------
+               t.f2 = "  <xxx>foobar<yyy>baz</yyy>foobar</xxx>  ";
+
+               r = s1.serialize(t);
+               assertEquals("<A f1='f1'>_x0020_ 
<xxx>foobar<yyy>baz</yyy>foobar</xxx> _x0020_</A>", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A f1='f1'>\n\t_x0020_ 
<xxx>foobar<yyy>baz</yyy>foobar</xxx> _x0020_\n</A>\n", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // XML with attributes
+               
//----------------------------------------------------------------
+               t.f2 = "<xxx x=\"x\">foobar</xxx>";
+
+               r = s1.serialize(t);
+               assertEquals("<A f1='f1'><xxx x=\"x\">foobar</xxx></A>", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A f1='f1'>\n\t<xxx 
x=\"x\">foobar</xxx>\n</A>\n", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               
//----------------------------------------------------------------
+               // XML with embedded entities
+               
//----------------------------------------------------------------
+               t.f2 = "<xxx x=\"x\">foo&lt;&gt;bar</xxx>";
+
+               r = s1.serialize(t);
+               assertEquals("<A f1='f1'><xxx 
x=\"x\">foo&lt;&gt;bar</xxx></A>", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+
+               r = s2.serialize(t);
+               assertEquals("<A f1='f1'>\n\t<xxx 
x=\"x\">foo&lt;&gt;bar</xxx>\n</A>\n", r);
+               t2 = p.parse(r, B.class);
+               assertEqualObjects(t, t2);
+       }
+
+       @Xml(name="A")
+       public static class B {
+               @Xml(format=ATTR) public String f1;
+               @Xml(format=CONTENT, contentHandler=BContentHandler.class) 
public String f2;
+
+               public static B newInstance() {
+                       B t = new B();
+                       t.f1 = "f1";
+                       t.f2 = null;
+                       return t;
+               }
+       }
+
+       public static class BContentHandler implements XmlContentHandler<B> {
+
+               @Override /* XmlContentHandler */
+               public void parse(XMLStreamReader r, B b) throws Exception {
+                       b.f2 = decode(readXmlContents(r).trim());
+               }
+
+               @Override /* XmlContentHandler */
+               public void serialize(XmlWriter w, B b) throws Exception {
+                       w.encodeTextInvalidChars(b.f2);
+               }
+
+       }
+
+       
//--------------------------------------------------------------------------------
+       // Test beans with too many @Xml.format=CONTENT/XMLCONTENT annotations.
+       
//--------------------------------------------------------------------------------
+       @Test
+       public void testBadContent() throws Exception {
+               XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+               try {
+                       s.serialize(new C1());
+                       fail("Exception expected");
+               } catch (Exception e) {
+                       assertTrue(e.getMessage().contains("Multiple instances 
of CONTENT properties defined on class"));
+               }
+               // Run twice to make sure we throw exceptions after the first 
call.
+               try {
+                       s.serialize(new C1());
+                       fail("Exception expected");
+               } catch (Exception e) {
+                       assertTrue(e.getMessage().contains("Multiple instances 
of CONTENT properties defined on class"));
+               }
+       }
+       public static class C1 {
+               @Xml(format=CONTENT) public String f1;
+               @Xml(format=CONTENT) public String f2;
+       }
+}

Reply via email to