blob: 3ddcc14c8119113a49a785629896e38a22b15a0a [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed 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 drt.drtcases;
import com.mytest.IntEnum;
import com.mytest.IntegerEnum;
import com.mytest.ModeEnum;
import com.mytest.MyClass;
import com.mytest.MySubClass;
import com.mytest.MySubSubClass;
import com.mytest.SimpleContentExample;
import com.mytest.YourClass;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.xmlbeans.BindingContext;
import org.apache.xmlbeans.BindingContextFactory;
import org.apache.xmlbeans.EncodingStyle;
import org.apache.xmlbeans.GDuration;
import org.apache.xmlbeans.Marshaller;
import org.apache.xmlbeans.ObjectFactory;
import org.apache.xmlbeans.SchemaTypeSystem;
import org.apache.xmlbeans.SoapMarshaller;
import org.apache.xmlbeans.SoapUnmarshaller;
import org.apache.xmlbeans.Unmarshaller;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlCalendar;
import org.apache.xmlbeans.XmlError;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.impl.binding.compile.Schema2Java;
import org.apache.xmlbeans.impl.common.StaxHelper;
import org.apache.xmlbeans.impl.common.XmlReaderToWriter;
import org.apache.xmlbeans.impl.common.XmlStreamUtils;
import org.apache.xmlbeans.impl.marshal.BindingContextFactoryImpl;
import org.apache.xmlbeans.impl.marshal.util.ArrayUtils;
import org.apache.xmlbeans.impl.tool.PrettyPrinter;
import org.apache.xmlbeans.impl.xb.xsdschema.SchemaDocument;
import org.w3c.dom.Document;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class MarshalTests extends TestCase
{
private static final boolean VERBOSE = false;
//must be in sync with binding config file
private static final BigInteger DEFAULT_BIG_INT =
new BigInteger("876587658765876587658765876587658765");
private static final String XSD_URI = "http://www.w3.org/2001/XMLSchema";
private static final String SOAPENC_URI = "http://schemas.xmlsoap.org/soap/encoding/";
private static final QName DFLT_ELEM_NAME = new QName("java:com.mytest", "load");
private static final QName MYCLASS_NAME = new QName("java:com.mytest", "MyClass");
private static final QName DUMMY_QNAME = new QName("foo", "bar");
private static final QName ANY_TYPE_NAME = new QName(XSD_URI, "anyType");
public MarshalTests(String name)
{
super(name);
}
public static Test suite()
{
return new TestSuite(MarshalTests.class);
}
//does not test any xmlbeans code, but rather a quick sanity check
//of the current jsr 173 impl
public void testAStream()
throws Exception
{
String doc = "<a x='y'>food</a>";
StringReader sr = new StringReader(doc);
final XMLStreamReader reader =
StaxHelper.newXMLInputFactory().createXMLStreamReader(sr);
dumpReader(reader);
}
//does not test any xmlbeans code, but rather a quick sanity check
//of the current jsr 173 impl
public void testAStreamWriter()
throws Exception
{
StringWriter sw = new StringWriter();
final XMLStreamWriter writer =
StaxHelper.newXMLOutputFactory().createXMLStreamWriter(sw);
writer.writeStartDocument();
writer.writeStartElement("dummy");
final String uri = "uri";
final String prefix = "prefix";
final String lname = "lname";
writer.writeStartElement(prefix, lname, uri);
writer.writeNamespace(prefix, uri);
writer.writeEndElement();
boolean writeit = false;
if (writer.getPrefix(uri) == null) {
writeit = true;
}
writer.writeStartElement(prefix, lname, uri);
if (writeit) {
writer.writeNamespace(prefix, uri);
}
writer.writeEndElement();
writer.writeEndElement(); //dummy
writer.writeEndDocument();
writer.close();
sw.close();
final String DOC = sw.getBuffer().toString();
inform("DOC W: " + DOC);
StringReader sr = new StringReader(DOC);
final XMLStreamReader reader =
StaxHelper.newXMLInputFactory().createXMLStreamReader(sr);
dumpReader(reader, true);
}
public void testManySimpleTypesUnmarshall()
throws Exception
{
testSimpleTypeUnmarshal(Boolean.TRUE, "boolean");
testSimpleTypeUnmarshal(new Byte((byte)125), "byte");
testSimpleTypeUnmarshal(new Short((short)5543), "short");
testSimpleTypeUnmarshal(new Integer(55434535), "int");
testSimpleTypeUnmarshal(new Long(554345354445555555L), "long");
testSimpleTypeUnmarshal(new BigInteger("55434535443332323245555555"), "integer");
testSimpleTypeUnmarshal(new BigInteger("55434535443332323245555555"), "positiveInteger");
testSimpleTypeUnmarshal(new BigInteger("55434535443332323245555555"), "nonNegativeInteger");
testSimpleTypeUnmarshal(new BigInteger("-55434535443332323245555555"), "negativeInteger");
testSimpleTypeUnmarshal(new BigInteger("-55434535443332323245555555"), "nonPositiveInteger");
testSimpleTypeUnmarshal(new BigInteger("5543453555"), "unsignedLong");
testSimpleTypeUnmarshal(new Long("5543453555"), "unsignedInt");
testSimpleTypeUnmarshal(new Integer("62121"), "unsignedShort");
testSimpleTypeUnmarshal(new Short("254"), "unsignedByte");
testSimpleTypeUnmarshal(new BigDecimal("43434343342.233434342"), "decimal");
testSimpleTypeUnmarshal(new Float(54.5423f), "float");
testSimpleTypeUnmarshal(new Double(23432.43234), "double");
testSimpleTypeUnmarshal(new GDuration("P1Y2M3DT10H30M"), "duration");
testStringTypeUnmarshal("anySimpleType");
testStringTypeUnmarshal("string");
testStringTypeUnmarshal("normalizedString");
testStringTypeUnmarshal("token");
testStringTypeUnmarshal("language");
testStringTypeUnmarshal("Name");
testStringTypeUnmarshal("NCName");
testStringTypeUnmarshal("NMTOKEN");
testStringTypeUnmarshal("ID");
testStringTypeUnmarshal("IDREF");
testStringTypeUnmarshal("ENTITY");
testStringTypeUnmarshal("anyURI");
testStringTypeUnmarshal("NOTATION");
Calendar c = Calendar.getInstance();
testSimpleTypeUnmarshal(c, "2002-03-06T08:04:39.265Z", "dateTime");
final byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6};
testSimpleTypeUnmarshal(bytes, "AQIDBAUG", "base64Binary");
testSimpleTypeUnmarshal(bytes, "010203040506", "hexBinary");
final String[] strs = new String[]{"foo", "bar"};
testSimpleTypeUnmarshal(strs, "foo bar", "ENTITIES");
testSimpleTypeUnmarshal(strs, "foo bar", "IDREFS");
testSimpleTypeUnmarshal(strs, "foo bar", "NMTOKENS");
testSimpleTypeUnmarshal("basic", "basic", SOAPENC_URI, "string");
testSimpleTypeUnmarshal(new Integer("123"), "123", SOAPENC_URI, "int");
}
private void testStringTypeUnmarshal(String xsd_type)
throws Exception
{
testSimpleTypeUnmarshal("test_" + xsd_type, xsd_type);
}
public void testManySimpleTypesMarshall()
throws Exception
{
testSimpleTypeMarshal(Boolean.TRUE, "boolean");
testSimpleTypeMarshal(new Byte((byte)125), "byte");
testSimpleTypeMarshal(new Short((short)5543), "short");
testSimpleTypeMarshal(new Integer(55434535), "int");
testSimpleTypeMarshal(new Integer(75434535), "int", "int");
testSimpleTypeMarshal(new Long(554345354445555555L), "long");
testSimpleTypeMarshal(new BigInteger("55434535443332323245555555"), "integer");
testSimpleTypeMarshal(new BigDecimal("43434343342.233434342"), "decimal");
testSimpleTypeMarshal(new Float(5555.5555f), "float");
testSimpleTypeMarshal(new Double(1231.444), "double");
testSimpleTypeMarshal(new URI("http://www.apache.org/"), "anyURI");
testSimpleTypeMarshal(new GDuration("P1Y2M3DT10H30M"), "duration");
testSimpleTypeMarshal("some text here", "string");
testSimpleTypeMarshal(" ", "string");
testSimpleTypeMarshal("", "string");
testSimpleTypeMarshal("aToken", "token");
testSimpleTypeMarshal(" ", "string");
testSimpleTypeMarshal(new QName("someuri", "somelname"), "QName");
testSimpleTypeMarshal(new QName("nakedlname"), "QName");
final byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6};
testSimpleTypeMarshal(bytes, "base64Binary");
testSimpleTypeMarshal(bytes, "hexBinary");
}
//only works for values where .toString() is equivalent to marshalling
public void testSimpleTypeUnmarshal(Object expected, String xsd_type)
throws Exception
{
testSimpleTypeUnmarshal(expected, expected.toString(), xsd_type);
}
public void testSimpleTypeUnmarshal(Object expected,
String lexval,
String xsd_type)
throws Exception
{
testSimpleTypeUnmarshal(expected, lexval, XSD_URI, xsd_type);
}
public void testSimpleTypeUnmarshal(Object expected,
String lexval,
String type_uri,
String xsd_type)
throws Exception
{
BindingContext bindingContext = getBuiltinBindingContext();
String xmldoc = "<a" +
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" +
" xmlns:xs='" +
type_uri +
"' xsi:type='xs:" +
xsd_type + "' >" + lexval + "</a>";
StringReader stringReader = new StringReader(xmldoc);
XMLStreamReader xrdr =
StaxHelper.newXMLInputFactory().createXMLStreamReader(stringReader);
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
Unmarshaller umctx =
bindingContext.createUnmarshaller();
Object obj = umctx.unmarshal(xrdr, options);
reportErrors(errors, "SimpleType error. lexical=" + lexval);
Assert.assertTrue(errors.isEmpty());
//special case date/time tests.
//we really need more robust testing here.
if (expected instanceof Calendar) {
XmlCalendar got = (XmlCalendar)obj;
String got_lex = got.toString();
Assert.assertEquals(lexval, got_lex);
} else if (expected.getClass().isArray()) {
final boolean eq = ArrayUtils.arrayEquals(expected, obj);
final String s = "arrays not equal. " +
"expected " + ArrayUtils.arrayToString(expected) +
" got " + ArrayUtils.arrayToString(obj);
Assert.assertTrue(s, eq);
} else {
Assert.assertEquals(expected, obj);
}
// inform("OK for " + expected);
}
private void reportErrors(Collection errors, final String prefix)
{
for (Iterator itr = errors.iterator(); itr.hasNext();) {
XmlError xmlError = (XmlError)itr.next();
error(prefix + " " + xmlError);
}
}
public void testSimpleTypeMarshal(Object orig, String xsd_type)
throws Exception
{
final String java_type = orig.getClass().getName();
testSimpleTypeMarshal(orig, xsd_type, java_type);
}
public void testSimpleTypeMarshal(Object orig, String xsd_type,
final String java_type)
throws Exception
{
BindingContext bindingContext =
BindingContextFactory.newInstance().createBindingContext();
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
final XMLStreamReader reader =
ctx.marshalType(orig,
// new QName("uri", "lname"),
new QName("lname"),
new QName(XSD_URI, xsd_type),
java_type, options);
inform("==================OBJ: " + orig);
dumpReader(reader);
reportErrors(errors, "simpleTypeMarshal");
Assert.assertTrue(errors.isEmpty());
}
public void testSimplePolymorphicTypeMarshal()
throws Exception
{
BindingContext bindingContext =
BindingContextFactory.newInstance().createBindingContext();
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
String our_obj = "hello";
final QName schemaType = new QName(XSD_URI, "anyType");
final String javaType = Object.class.getName();
final XMLStreamReader reader =
ctx.marshalType(our_obj,
new QName("lname"),
schemaType,
javaType, options);
inform("==================POLYOBJ: " + our_obj);
final boolean dump = false;
if (dump) {
dumpReader(reader);
} else {
Unmarshaller um =
bindingContext.createUnmarshaller();
Assert.assertNotNull(um);
Object out = um.unmarshalType(reader, schemaType, javaType, options);
Assert.assertEquals(our_obj, out);
reportErrors(errors, "poly-marshal");
Assert.assertTrue(errors.isEmpty());
}
}
public void testByNameMarshal()
throws Exception
{
com.mytest.MyClass mc = new com.mytest.MyClass();
mc.setMyatt("attval");
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(99999.777f);
myelt.setMyFloat(5555.4444f);
// myelt.setMyClass(new com.mytest.MyClass());
myelt.setWrappedArrayOne(new String[]{"a", null, "b"});
MySubClass sub = new MySubClass();
sub.setBigInt(new BigInteger("23522352235223522352"));
myelt.setMySubClass(sub);
// sub.setIsSetBigInt(false); //TESTING;
// sub.setBigInt(null);
// sub.setIsSetBigInt(true); //TESTING;
myelt.setMyClass(sub);
SimpleContentExample se = new SimpleContentExample();
se.setFloatAttOne(44.33f);
se.setSimpleContent("someSimpleContentOkay");
myelt.setSimpleContentExample(se);
myelt.setModeEnum(ModeEnum.On);
mc.setMyelt(myelt);
myelt.setStringArray(new String[]{"one", "two", "three"});
myelt.setMyClassArray(new MyClass[]{sub, new MyClass(),
//this type is not in our binding file,
//but we should then treat is as its the parent type
new MySubSubClass(),
sub});
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
final XMLStreamReader reader =
ctx.marshalType(mc, DFLT_ELEM_NAME,
MYCLASS_NAME,
mc.getClass().getName(), options);
//
// final XMLStreamReader reader =
// ctx.marshalType(sub, new QName("java:com.mytest", "sub-test"),
// new QName("java:com.mytest", "MySubClass"),
// "MyClass", null);
inform("=======IN-OBJA: " + mc);
dumpReader(reader);
reportErrors(errors, "byname-marshal");
Assert.assertTrue(errors.isEmpty());
}
public void testByNameMarshalSoap()
throws Exception
{
final boolean verbose = false;
com.mytest.MyClass mc = new com.mytest.MyClass();
mc.setMyatt("attval");
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(99999.777f);
myelt.setMyFloat(5555.4444f);
QName qn = new QName("foo", "bar");
myelt.setQn(qn);
myelt.setQn2(qn);
myelt.setWrappedArrayOne(new String[]{"a", "a", "b"});
MySubClass sub = new MySubClass();
sub.setBigInt(new BigInteger("23522352235223522352"));
myelt.setMySubClass(sub);
myelt.setMyClass(sub);
sub.setMyelt(myelt); //cycle
myelt.setMyBoss(myelt); //cycle: self reference
SimpleContentExample se = new SimpleContentExample();
se.setFloatAttOne(44.33f);
se.setSimpleContent("someSimpleContentOkay");
myelt.setSimpleContentExample(se);
myelt.setModeEnum(ModeEnum.On);
mc.setMyelt(myelt);
myelt.setStringArray(new String[]{"a", "b", "c"});
myelt.setMyClassArray(new MyClass[]{sub, new MyClass(),
//this type is not in our binding file,
//but we should then treat is as its the parent type
new MySubSubClass(),
sub});
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
final SoapMarshaller ctx =
bindingContext.createSoapMarshaller(EncodingStyle.SOAP11);
Assert.assertNotNull(ctx);
final XMLStreamReader reader =
ctx.marshalType(mc, DFLT_ELEM_NAME,
MYCLASS_NAME,
mc.getClass().getName(), options);
dumpReader(reader, verbose);
reportErrors(errors, "byname-marshal-soap");
Assert.assertTrue(errors.isEmpty());
inform("===========final id objs coming next===========", verbose);
final Iterator itr = ctx.marshalReferenced(options);
while (itr.hasNext()) {
final XMLStreamReader rdr = (XMLStreamReader)itr.next();
inform("got rdr: " + System.identityHashCode(rdr), verbose);
dumpReader(rdr, verbose);
rdr.close();
}
}
public void testByNameMarshalSoapViaWriter()
throws Exception
{
final Collection errors = new LinkedList();
final String xmldoc = createSoapExampleXmlString(new MyClass(), errors);
inform("=======SOAPOUT-XML:\n" +
PrettyPrinter.indent(xmldoc));
reportErrors(errors, "byname-marshal-soap-writer");
Assert.assertTrue(errors.isEmpty());
}
public void testByNameSoapUnmarshal()
throws Exception
{
final boolean verbose = false;
final Collection errors = new LinkedList();
final MyClass source_mc = new MyClass();
final String xmldoc = createSoapExampleXmlString(source_mc, errors);
reportErrors(errors, "byname-marshal-soap-writer");
Assert.assertTrue(errors.isEmpty());
BindingContext bindingContext =
getBindingContext(getBindingConfigDocument());
XmlOptions opts = new XmlOptions();
opts.setLoadLineNumbers();
final Document document = (Document) XmlObject.Factory.parse( sXml, opts ).getDomNode();
if (verbose) {
final XMLStreamReader tmp_stream = XmlBeans.nodeToXmlStreamReader(document);
dumpReader(tmp_stream, true);
tmp_stream.close();
}
final SoapUnmarshaller um =
bindingContext.createSoapUnmarshaller(EncodingStyle.SOAP11, document);
final XMLStreamReader xrdr = XmlBeans.nodeToXmlStreamReader(document);
// {
// while(xrdr.hasNext()) {
// System.out.println("## AT " + XmlStreamUtils.printEvent(xrdr));
// final int e = xrdr.next();
// }
// if (System.currentTimeMillis() > 1) {
// throw new AssertionError("STOP!");
// }
// }
while (!xrdr.isStartElement()) {
xrdr.next();
}
xrdr.next();
//now at Dummy node
while (!xrdr.isStartElement()) {
xrdr.next();
}
//now at actual type
xrdr.require(XMLStreamReader.START_ELEMENT,
DFLT_ELEM_NAME.getNamespaceURI(),
DFLT_ELEM_NAME.getLocalPart());
final Object obj = um.unmarshalType(xrdr, MYCLASS_NAME,
MyClass.class.getName(), null);
inform("GOT OBJ: " + obj.getClass(), verbose);
MyClass mc = (MyClass)obj;
final YourClass myelt = mc.getMyelt();
Assert.assertNotNull(myelt);
Assert.assertEquals(myelt.getBools(), source_mc.getMyelt().getBools());
Assert.assertTrue(Arrays.equals(myelt.getWrappedArrayOne(),
source_mc.getMyelt().getWrappedArrayOne()));
Assert.assertEquals(DUMMY_QNAME, myelt.getQn2());
Assert.assertEquals(myelt.getQn(), myelt.getQn2());
Assert.assertTrue(myelt.getMySubClass() == myelt.getMyClass());
Assert.assertTrue(myelt.getMyBoss() == myelt);
Assert.assertTrue(myelt.objectArray[3] == myelt.objectArray[4]);
Assert.assertTrue(myelt.objectArray[3] == myelt.objectArray);
Assert.assertSame(myelt.objectArray[0], myelt.objectArray[1]);
Assert.assertNull(myelt.objectArray[5]);
MySubClass sub = (MySubClass)myelt.objectArray[8];
Assert.assertEquals(BigInteger.ONE, sub.getBigInt());
Assert.assertTrue(myelt.objectArrayTwo[1] == myelt.objectArray);
Assert.assertTrue(myelt.objectArrayTwo[2] == myelt.objectArrayTwo);
xrdr.close();
}
public void testAnyTypeSoapUnmarshal()
throws Exception
{
final boolean verbose = false;
final Collection errors = new LinkedList();
final MyClass source_mc = new MyClass();
BindingContext bindingContext =
getBindingContext(getBindingConfigDocument());
//////////////////////////////////////////////
final XmlOptions options = new XmlOptions();
options.setErrorListener(errors);
final SoapMarshaller ctx =
bindingContext.createSoapMarshaller(EncodingStyle.SOAP11);
Assert.assertNotNull(ctx);
StringWriter sw = new StringWriter();
XMLStreamWriter xml_out =
StaxHelper.newXMLOutputFactory().createXMLStreamWriter(sw);
xml_out.writeStartDocument();
xml_out.writeStartElement("DUMMY_ROOT");
xml_out.writeNamespace("xs", XSD_URI);
xml_out.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xml_out.writeNamespace("jt", "java:com.mytest");
ctx.marshalType(xml_out, source_mc, DFLT_ELEM_NAME,
ANY_TYPE_NAME,
Object.class.getName(), options);
xml_out.writeComment("ids are coming next");
ctx.marshalReferenced(xml_out, options);
xml_out.writeEndElement();
xml_out.writeEndDocument();
xml_out.close();
sw.close();
final String xmldoc = sw.getBuffer().toString();
//////////////////////////////////////////////
reportErrors(errors, "byname-marshal-soap-writer");
Assert.assertTrue(errors.isEmpty());
XmlOptions opts = new XmlOptions();
opts.setLoadLineNumbers();
final Document document = (Document) XmlObject.Factory.parse(xmldoc, opts).getDomNode();
if (verbose) {
final XMLStreamReader tmp_stream = XmlBeans.nodeToXmlStreamReader(document);
dumpReader(tmp_stream, true);
tmp_stream.close();
}
final SoapUnmarshaller um =
bindingContext.createSoapUnmarshaller(EncodingStyle.SOAP11, document);
final XMLStreamReader xrdr = XmlBeans.nodeToXmlStreamReader(document);
while (!xrdr.isStartElement()) {
xrdr.next();
}
xrdr.next();
//now at Dummy node
while (!xrdr.isStartElement()) {
xrdr.next();
}
//now at actual type
xrdr.require(XMLStreamReader.START_ELEMENT,
DFLT_ELEM_NAME.getNamespaceURI(),
DFLT_ELEM_NAME.getLocalPart());
final Object obj = um.unmarshalType(xrdr, ANY_TYPE_NAME,
Object.class.getName(), null);
inform("GOT OBJ: " + obj.getClass(), verbose);
Assert.assertTrue(obj instanceof MyClass);
xrdr.close();
}
//note that mc obj will be changed
private String createSoapExampleXmlString(MyClass mc,
final Collection errors)
throws Exception
{
mc.setMyatt("attval");
YourClass myelt = new YourClass();
myelt.setAttrib(99999.777f);
myelt.setMyFloat(5555.4444f);
myelt.setQn(DUMMY_QNAME);
myelt.setQn2(DUMMY_QNAME);
myelt.setWrappedArrayOne(new String[]{"a", "a", "b4", "b4", "a"});
MySubClass sub = new MySubClass();
sub.setBigInt(new BigInteger("23522352235223522352"));
sub.quadStringArray = MySubClass.newQuadStringArray();
myelt.setMySubClass(sub);
myelt.setMyClass(sub);
sub.setMyelt(myelt); //cycle
myelt.setMyBoss(myelt); //cycle: self reference
SimpleContentExample se = new SimpleContentExample();
se.setFloatAttOne(44.33f);
se.setSimpleContent("someSimpleContentOkay");
myelt.setSimpleContentExample(se);
myelt.setModeEnum(ModeEnum.On);
mc.setMyelt(myelt);
myelt.setStringArray(new String[]{"a", "b", "c", "a", "a", "b"});
myelt.setMyClassArray(new MyClass[]{sub,
new MyClass(),
mc,
sub});
final MySubSubClass subsub = new MySubSubClass();
subsub.setBigInt(BigInteger.ONE);
final Object[] obj_array = new Object[]{"a",
"a",
myelt,
null,
null,
null,
new Integer(5),
null,
subsub,
};
obj_array[3] = obj_array;
obj_array[4] = obj_array;
myelt.objectArray = obj_array;
final Object[] obj_array2 = new Object[4];
obj_array2[0] = "a";
obj_array2[1] = obj_array;
obj_array2[2] = obj_array2;
obj_array2[3] = null;
myelt.objectArrayTwo = obj_array2;
obj_array[7] = obj_array2;
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
final XmlOptions options = new XmlOptions();
options.setErrorListener(errors);
final SoapMarshaller ctx =
bindingContext.createSoapMarshaller(EncodingStyle.SOAP11);
Assert.assertNotNull(ctx);
StringWriter sw = new StringWriter();
XMLStreamWriter xml_out =
StaxHelper.newXMLOutputFactory().createXMLStreamWriter(sw);
xml_out.writeStartDocument();
xml_out.writeStartElement("DUMMY_ROOT");
// xml_out.writeDefaultNamespace("java:com.mytest");
xml_out.writeNamespace("xs", XSD_URI);
xml_out.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xml_out.writeNamespace("jt", "java:com.mytest");
ctx.marshalType(xml_out, mc, DFLT_ELEM_NAME,
MYCLASS_NAME,
mc.getClass().getName(), options);
// xml_out.writeComment("simple string");
// ctx.marshalType(xml_out, "TEST1", new QName("someuri", "str"),
// new QName(XSD_URI, "string"),
// String.class.getName(), options);
//
xml_out.writeComment("ids are coming next");
ctx.marshalReferenced(xml_out, options);
xml_out.writeEndElement();
xml_out.writeEndDocument();
xml_out.close();
sw.close();
return sw.getBuffer().toString();
}
public void testWrappedArray()
throws Exception
{
String[] strs = new String[]{"aa", null, "bb", "cc"};
final String java_type = strs.getClass().getName();
strs = null; // testing...
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
final QName element_name = new QName("java:com.mytest", "string-array");
final QName schema_type = new QName("java:com.mytest", "ArrayOfString");
final XMLStreamReader reader =
ctx.marshalType(strs, element_name, schema_type, java_type, options);
inform("=======WRAPPED-ARRAY-OBJ: " + strs);
// dumpReader(reader);
reportErrors(errors, "wrapped-array");
Assert.assertTrue(errors.isEmpty());
final Unmarshaller um = bindingContext.createUnmarshaller();
Object retval = um.unmarshalType(reader, schema_type, java_type, options);
reportErrors(errors, "wrapped-array2");
Assert.assertTrue(errors.isEmpty());
Assert.assertTrue("expected " + ArrayUtils.arrayToString(strs) +
" got " + ArrayUtils.arrayToString(retval),
ArrayUtils.arrayEquals(strs, retval));
}
public void DISABLED_testInitPerf()
throws Exception
{
final File conf = getBindingConfigDocument();
final int trials = 2;
final BindingContextFactory context_factory = BindingContextFactory.newInstance();
BindingContext bindingContext = null;
final long before_millis = System.currentTimeMillis();
for (int i = 0; i < trials; i++) {
bindingContext =
((BindingContextFactoryImpl)context_factory).createBindingContextFromConfig(conf);
if (bindingContext == null) {
throw new Exception("bad news");
}
}
final long after_millis = System.currentTimeMillis();
final long diff = (after_millis - before_millis);
boolean verbose = true;
inform("INIT-milliseconds: " + diff + " trials: " + trials, verbose);
inform("INIT-milliseconds PER trial: " + (diff / (double)trials), verbose);
}
public void testByNameMarshalViaWriter()
throws Exception
{
com.mytest.MyClass mc = new com.mytest.MyClass();
mc.setMyatt("attval");
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(99999.777f);
myelt.setMyFloat(5555.4444f);
// myelt.setMyClass(new com.mytest.MyClass());
// myelt.setMyClass(new com.mytest.MySubSubClass());
myelt.setMyClass(new com.mytest.MySubClass());
mc.setMyelt(myelt);
myelt.setModeEnum(ModeEnum.Off);
// myelt.setQn(new QName("someURI", "somePart"));
myelt.setQn(new QName("java:com.mytest2", "somePart"));
final SimpleContentExample sce = new SimpleContentExample();
sce.setFloatAttOne(5.43234f);
sce.setSimpleContent("SIMPLE_CONTENT");
myelt.setSimpleContentExample(sce);
myelt.setStringArray(new String[]{"one", "two", "three"});
myelt.setSimpleStringArray(myelt.getStringArray());
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
StringWriter sw = new StringWriter();
XMLStreamWriter w = StaxHelper.newXMLOutputFactory().createXMLStreamWriter(sw);
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
final QName elem_name = DFLT_ELEM_NAME;
final QName type_name = MYCLASS_NAME;
ctx.marshalType(w, mc,
elem_name,
type_name,
mc.getClass().getName(), options);
w.close();
sw.close();
inform("=======IN-OBJ: " + mc);
inform("=======OUT-XML:\n" + PrettyPrinter.indent(sw.getBuffer().toString()));
reportErrors(errors, "byname-writer");
Assert.assertTrue(errors.isEmpty());
StringReader sr = new StringReader(sw.getBuffer().toString());
XMLStreamReader rdr =
StaxHelper.newXMLInputFactory().createXMLStreamReader(sr);
while (!rdr.isStartElement()) {
rdr.next();
}
Unmarshaller umctx = bindingContext.createUnmarshaller();
Object out_obj = umctx.unmarshalType(rdr, type_name, mc.getClass().getName(), options);
reportErrors(errors, "byname-doc-writer");
Assert.assertTrue(errors.isEmpty());
if (!mc.equals(out_obj)) {
inform("IN : " + mc, true);
inform("OUT: " + out_obj, true);
}
Assert.assertEquals(mc, out_obj);
}
public void testByNameDocMarshalViaWriter()
throws Exception
{
com.mytest.MyClass mc = new com.mytest.MyClass();
mc.setMyatt("attval");
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(99999.777f);
myelt.setMyFloat(5555.4444f);
// myelt.setMyClass(new com.mytest.MyClass());
myelt.setMyClass(null);
mc.setMyelt(myelt);
myelt.setStringArray(new String[]{"one", "two", "three"});
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
StringWriter sw = new StringWriter();
XMLStreamWriter w = StaxHelper.newXMLOutputFactory().createXMLStreamWriter(sw);
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
ctx.marshal(w, mc, options);
//now unmarshall from String and compare objects...
StringReader sr = new StringReader(sw.getBuffer().toString());
XMLStreamReader rdr =
StaxHelper.newXMLInputFactory().createXMLStreamReader(sr);
Unmarshaller umctx = bindingContext.createUnmarshaller();
Object out_obj = umctx.unmarshal(rdr, options);
reportErrors(errors, "byname-doc-writer");
Assert.assertTrue(errors.isEmpty());
Assert.assertEquals(mc, out_obj);
}
public void testByNameMarshalElementViaWriter()
throws Exception
{
com.mytest.MyClass mc = new com.mytest.MyClass();
mc.setMyatt("attval");
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(99999.777f);
myelt.setMyFloat(5555.4444f);
// myelt.setMyClass(new com.mytest.MyClass());
// myelt.setMyClass(new com.mytest.MySubSubClass());
mc.setMyelt(myelt);
myelt.setStringArray(new String[]{"one", "two", "three"});
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
StringWriter sw = new StringWriter();
XMLStreamWriter w = StaxHelper.newXMLOutputFactory().createXMLStreamWriter(sw);
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
final QName elem_name = DFLT_ELEM_NAME;
ctx.marshalElement(w,
mc,
elem_name,
mc.getClass().getName(),
options);
//now unmarshall from String and compare objects...
StringReader sr = new StringReader(sw.getBuffer().toString());
XMLStreamReader rdr =
StaxHelper.newXMLInputFactory().createXMLStreamReader(sr);
Unmarshaller umctx = bindingContext.createUnmarshaller();
while (!rdr.isStartElement()) {
rdr.next();
}
Object out_obj = umctx.unmarshalElement(rdr, elem_name,
mc.getClass().getName(),
options);
reportErrors(errors, "marsh-elem");
Assert.assertEquals(mc, out_obj);
Assert.assertTrue(errors.isEmpty());
}
public void testByNameDocMarshalViaOutputStream()
throws Exception
{
com.mytest.MyClass mc = new com.mytest.MyClass();
mc.setMyatt("attval");
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(99999.777f);
myelt.setMyFloat(5555.4444f);
// myelt.setMyClass(new com.mytest.MyClass());
// myelt.setMyClass(null);
// myelt.setMyClass(new com.mytest.MySubSubClass());
myelt.setMyClass(new com.mytest.MySubClass());
mc.setMyelt(myelt);
myelt.setStringArray(new String[]{"one", "two", "three"});
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
final String encoding = "UTF-16";
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
options.setCharacterEncoding(encoding);
options.setSavePrettyPrint();
options.setSavePrettyPrintIndent(2);
options.setValidateOnSet();
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
ctx.marshal(baos, mc, options);
baos.close();
final byte[] buf = baos.toByteArray();
inform("16Doc=" + new String(buf, encoding));
//now unmarshall from String and compare objects...
Unmarshaller umctx = bindingContext.createUnmarshaller();
final ByteArrayInputStream bais = new ByteArrayInputStream(buf);
Object out_obj = umctx.unmarshal(bais, options);
reportErrors(errors, "marsh-outstream");
if (!mc.equals(out_obj)) {
inform("\nIN : " + mc, true);
inform("OUT: " + out_obj, true);
}
Assert.assertEquals(mc, out_obj);
Assert.assertTrue(errors.isEmpty());
}
public void testByNameDocMarshalViaOutputStreamToFile()
throws Exception
{
com.mytest.MyClass mc = new com.mytest.MyClass();
mc.setMyatt("attval");
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(99999.777f);
myelt.setMyFloat(5555.4444f);
// myelt.setMyClass(new com.mytest.MyClass());
// myelt.setMyClass(null);
// myelt.setMyClass(new com.mytest.MySubSubClass());
myelt.setMyClass(new com.mytest.MySubClass());
mc.setMyelt(myelt);
myelt.setStringArray(new String[]{"one", "two", "three"});
myelt.objectArray = new Object[]{"hi", new Integer(5)};
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
final File tmpfile = File.createTempFile("xbeans-marshal-test", ".xml");
FileOutputStream fos = new FileOutputStream(tmpfile);
final XmlOptions options = new XmlOptions();
Collection errors = new LinkedList();
options.setErrorListener(errors);
options.setSavePrettyPrint();
options.setSavePrettyPrintIndent(2);
options.setValidateOnSet();
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
// ctx.marshal(fos, mc);
ctx.marshal(fos, mc, options);
fos.close();
//now unmarshall from file and compare objects...
Unmarshaller umctx = bindingContext.createUnmarshaller();
final FileInputStream output = new FileInputStream(tmpfile);
Object out_obj = umctx.unmarshal(output, options);
reportErrors(errors, "marsh-outstream");
if (!mc.equals(out_obj)) {
inform("\nIN : " + mc, true);
inform("OUT: " + out_obj, true);
}
Assert.assertEquals(mc, out_obj);
Assert.assertTrue(errors.isEmpty());
output.close();
}
public void testRoundtripPerf()
throws Exception
{
//crank up these numbers to see real perf testing
//the test still has some value aside from perf
//in that it can test large stack depths.
final int trials = 3;
// final int trials = 10000;
final int depth = 7;
final int boolean_array_size = 5;
Random rnd = new Random();
com.mytest.MyClass top_obj = new com.mytest.MyClass();
com.mytest.MyClass curr = top_obj;
boolean[] bools = createRandomBooleanArray(rnd, boolean_array_size);
SimpleContentExample sce = new SimpleContentExample();
sce.setFloatAttOne(-4.234f);
sce.setSimpleContent("simple simple simple");
for (int i = 0; i < depth; i++) {
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setSimpleContentExample(sce);
myelt.setAttrib(rnd.nextFloat());
myelt.setMyFloat(rnd.nextFloat());
myelt.setBooleanArray(bools);
myelt.setWrappedArrayOne(new String[]{"W1" + rnd.nextInt(), null, "W2" + rnd.nextInt()});
myelt.setWrappedArrayTwo(null);
myelt.setModeEnum(ModeEnum.Off);
myelt.setIntegerEnum(IntegerEnum.value2);
myelt.setIntEnum(IntEnum.value3);
final com.mytest.MyClass my_c = new com.mytest.MyClass();
myelt.setMyClass(my_c);
curr.setMyelt(myelt);
curr.setMyatt("STR" + rnd.nextInt());
curr = my_c;
}
inform("top_perf_obj = " + top_obj);
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
final String javaType = "com.mytest.MyClass";
final QName schemaType = MYCLASS_NAME;
final QName elem_name = DFLT_ELEM_NAME;
final String class_name = top_obj.getClass().getName();
Object out_obj = null;
final long before_millis = System.currentTimeMillis();
final XmlOptions options = new XmlOptions();
final LinkedList errors = new LinkedList();
options.setErrorListener(errors);
final Marshaller ctx =
bindingContext.createMarshaller();
final Unmarshaller umctx = bindingContext.createUnmarshaller();
for (int i = 0; i < trials; i++) {
errors.clear();
Assert.assertNotNull(ctx);
final XMLStreamReader reader =
ctx.marshalType(top_obj, elem_name,
schemaType,
class_name, options);
// //DEBUG!!!
// if (System.currentTimeMillis() > 1) {
// dumpReader(reader);
// return;
// }
out_obj = umctx.unmarshalType(reader, schemaType, javaType, options);
}
final long after_millis = System.currentTimeMillis();
final long diff = (after_millis - before_millis);
inform(" perf_out_obj = " + top_obj);
reportErrors(errors, "perf");
Assert.assertTrue(errors.isEmpty());
Assert.assertEquals(top_obj, out_obj);
inform("milliseconds: " + diff + " trials: " + trials);
inform("milliseconds PER trial: " + (diff / (double)trials));
}
public void testThreadedRoundtripPerf()
throws Exception
{
//crank up these numbers to see real perf testing
//the test still has some value aside from perf
//in that it can test large stack depths.
final int trials = getTrials(30);
final int depth = 12;
final int thread_cnt = 3;
final int boolean_array_size = 30;
Random rnd = new Random();
com.mytest.MyClass top_obj = new com.mytest.MyClass();
com.mytest.MyClass curr = top_obj;
boolean[] bools = createRandomBooleanArray(rnd, boolean_array_size);
for (int i = 0; i < depth; i++) {
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(rnd.nextFloat());
myelt.setMyFloat(rnd.nextFloat());
myelt.setBooleanArray(bools);
final com.mytest.MyClass my_c = new com.mytest.MyClass();
myelt.setMyClass(my_c);
curr.setMyelt(myelt);
curr.setMyatt("STR" + rnd.nextInt());
curr = my_c;
}
//inform("top_obj = " + top_obj);
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
final String javaType = "com.mytest.MyClass";
final QName schemaType = MYCLASS_NAME;
final QName elem_name = DFLT_ELEM_NAME;
final String class_name = top_obj.getClass().getName();
final Marshaller msh = bindingContext.createMarshaller();
Assert.assertNotNull(msh);
final Unmarshaller umsh = bindingContext.createUnmarshaller();
Assert.assertNotNull(umsh);
Object out_obj = null;
final XmlOptions options = new XmlOptions();
final LinkedList errors = new LinkedList();
options.setErrorListener(errors);
final long before_millis = System.currentTimeMillis();
RoundTripRunner[] runners = new RoundTripRunner[thread_cnt];
for (int i = 0; i < thread_cnt; i++) {
runners[i] = new RoundTripRunner(top_obj, msh, umsh, elem_name,
schemaType, class_name, javaType, options, trials);
}
inform("starting " + thread_cnt + " threads...");
for (int i = 0; i < thread_cnt; i++) {
runners[i].start();
}
inform("trials=" + trials + "\tjoining " + thread_cnt + " threads...");
for (int i = 0; i < thread_cnt; i++) {
runners[i].join();
}
inform("joined " + thread_cnt + " threads.");
final long after_millis = System.currentTimeMillis();
final long diff = (after_millis - before_millis);
// inform(" perf_out_obj = " + top_obj);
reportErrors(errors, "thread-perf");
Assert.assertTrue(errors.isEmpty());
//Assert.assertEquals(top_obj, out_obj);
inform("milliseconds: " + diff + " trials: " + trials +
" threads=" + thread_cnt);
inform("milliseconds PER trial: " + (diff / (double)trials));
inform("milliseconds PER roundtrip: " + (diff / ((double)trials * thread_cnt)));
}
private static int getTrials(int default_val)
{
String prop = "drtcases.MarshalTests.trials";
String val = System.getProperty(prop);
if (val == null) return default_val;
int t = Integer.parseInt(val);
assert t > 0;
return t;
}
private static Object doRoundTrip(MyClass top_obj,
final Marshaller msh,
final Unmarshaller umsh,
final QName elem_name,
final QName schemaType,
final String class_name,
final String javaType,
final XmlOptions options)
throws XmlException
{
Object out_obj;
final XMLStreamReader reader =
msh.marshalType(top_obj, elem_name,
schemaType,
class_name, options);
out_obj = umsh.unmarshalType(reader, schemaType, javaType);
return out_obj;
}
private static class RoundTripRunner extends Thread
{
private final MyClass top_obj;
private final Marshaller msh;
private final Unmarshaller umsh;
private final QName elem_name;
private final QName schemaType;
private final String class_name;
private final String javaType;
private final XmlOptions options;
private final int trials;
public RoundTripRunner(MyClass top_obj,
Marshaller msh,
Unmarshaller umsh,
QName elem_name,
QName schemaType,
String class_name,
String javaType,
XmlOptions options,
int trials)
{
this.top_obj = top_obj;
this.msh = msh;
this.umsh = umsh;
this.elem_name = elem_name;
this.schemaType = schemaType;
this.class_name = class_name;
this.javaType = javaType;
this.options = options;
this.trials = trials;
}
public void run()
{
final int t = trials;
try {
Object out_obj = null;
for (int i = 0; i < t; i++) {
out_obj = doRoundTrip(top_obj, msh,
umsh, elem_name,
schemaType, class_name,
javaType, options);
}
Assert.assertEquals(top_obj, out_obj);
}
catch (XmlException xe) {
throw new AssertionError(xe);
}
}
}
private boolean[] createRandomBooleanArray(Random rnd, int size)
{
boolean[] a = new boolean[size];
for (int i = 0; i < size; i++) {
a[i] = rnd.nextBoolean();
}
return a;
}
public void testJavaToSchemaToJava()
throws Exception
{
Random rnd = new Random();
com.mytest.MyClass top_obj = new com.mytest.MyClass();
com.mytest.YourClass myelt = new com.mytest.YourClass();
myelt.setAttrib(rnd.nextFloat());
myelt.setMyFloat(rnd.nextFloat());
final com.mytest.MyClass my_c = new com.mytest.MyClass();
// myelt.setMyClass(my_c);
myelt.setMyClass(null);
top_obj.setMyelt(myelt);
// curr.setMyatt("STR" + rnd.nextInt());
top_obj.setMyatt(null);
// top_obj.setMyatt("someVALUE");
inform("top_obj = " + top_obj);
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
//TODO: remove hard coded values
final String javaType = "com.mytest.MyClass";
final QName schemaType = MYCLASS_NAME;
final QName elem_name = DFLT_ELEM_NAME;
final String class_name = top_obj.getClass().getName();
Object out_obj = null;
final XmlOptions options = new XmlOptions();
final ArrayList errors = new ArrayList();
options.setErrorListener(errors);
Marshaller ctx =
bindingContext.createMarshaller();
Assert.assertNotNull(ctx);
final XMLStreamReader reader =
ctx.marshalType(top_obj, elem_name,
schemaType,
class_name, options);
Unmarshaller umctx =
bindingContext.createUnmarshaller();
out_obj = umctx.unmarshalType(reader, schemaType, javaType, options);
inform(" out_obj = " + top_obj);
reportErrors(errors, "j2s2j");
Assert.assertEquals(top_obj, out_obj);
Assert.assertTrue(errors.isEmpty());
}
private static void dumpReader(final XMLStreamReader reader)
throws XMLStreamException, XmlException, IOException
{
dumpReader(reader, VERBOSE);
}
private static void dumpReader(final XMLStreamReader reader, boolean verbose)
throws XMLStreamException, XmlException, IOException
{
final boolean write_doc = true;
if (write_doc) {
StringWriter sw = new StringWriter();
XMLStreamWriter xsw =
StaxHelper.newXMLOutputFactory().createXMLStreamWriter(sw);
XmlReaderToWriter.writeAll(reader, xsw);
xsw.close();
if (verbose) {
final String xmldoc = sw.getBuffer().toString();
inform("DOC:", verbose);
inform(PrettyPrinter.indent(xmldoc), verbose);
}
} else {
int i = 0;
if (verbose)
inform((i++) + "\tSTATE: " +
XmlStreamUtils.printEvent(reader), verbose);
while (reader.hasNext()) {
final int state = reader.next();
if (verbose)
inform((i++) + "\tSTATE: " +
XmlStreamUtils.printEvent(reader), verbose);
}
}
}
public void testByNameBeanUnmarshal()
throws Exception
{
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
File doc = TestEnv.xbeanCase("marshal/doc2.xml");
final XMLInputFactory xmlInputFactory = StaxHelper.newXMLInputFactory();
XMLStreamReader xrdr =
xmlInputFactory.createXMLStreamReader(doc.toURL().toString(),
new FileInputStream(doc));
final XmlOptions options = new XmlOptions();
ObjectFactory of = new YourClass();
options.setUnmarshalInitialObjectFactory(of);
final LinkedList errors = new LinkedList();
options.setErrorListener(errors);
Unmarshaller um_ctx =
bindingContext.createUnmarshaller();
Object obj = um_ctx.unmarshal(xrdr, options);
inform("doc2-obj = " + obj);
reportErrors(errors, "byname-um");
Assert.assertTrue(errors.isEmpty());
}
public void testByNameBeanUnmarshalErrors()
throws Exception
{
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
File doc = TestEnv.xbeanCase("marshal/doc3.xml");
final XMLInputFactory xmlInputFactory = StaxHelper.newXMLInputFactory();
XMLStreamReader xrdr =
xmlInputFactory.createXMLStreamReader(new FileReader(doc));
final XmlOptions options = new XmlOptions();
final LinkedList errors = new LinkedList();
options.setErrorListener(errors);
Unmarshaller um_ctx =
bindingContext.createUnmarshaller();
Object obj = um_ctx.unmarshal(xrdr, options);
//even with some errors, we should get an object
Assert.assertTrue(obj != null);
inform("doc3-obj = " + obj);
for (Iterator itr = errors.iterator(); itr.hasNext();) {
XmlError xmlError = (XmlError)itr.next();
inform("doc3-ERROR: " + xmlError);
}
Assert.assertTrue(errors.size() > 0);
}
public void testByNameBeanUnmarshalFromInputStream()
throws Exception
{
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
File doc = TestEnv.xbeanCase("marshal/doc2.xml");
final XmlOptions options = new XmlOptions();
final LinkedList errors = new LinkedList();
options.setErrorListener(errors);
Unmarshaller um_ctx =
bindingContext.createUnmarshaller();
Object obj = um_ctx.unmarshal(new FileInputStream(doc), options);
inform("doc2-obj = " + obj);
reportErrors(errors, "doc2-err");
Assert.assertTrue(errors.isEmpty());
}
public void testByNameBeanUnmarshalType()
throws Exception
{
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
final File doc = TestEnv.xbeanCase("marshal/doc.xml");
final String javaType = "com.mytest.MyClass";
final QName schemaType = MYCLASS_NAME;
final XMLInputFactory xmlInputFactory = StaxHelper.newXMLInputFactory();
XMLStreamReader xrdr =
xmlInputFactory.createXMLStreamReader(new FileReader(doc));
final XmlOptions xmlOptions = new XmlOptions();
Collection errors = new LinkedList();
xmlOptions.setErrorListener(errors);
Unmarshaller ctx = bindingContext.createUnmarshaller();
//this is not very safe but it should work...
while (!xrdr.isStartElement()) {
xrdr.next();
}
Object obj = ctx.unmarshalType(xrdr, schemaType, javaType, xmlOptions);
for (Iterator itr = errors.iterator(); itr.hasNext();) {
inform("ERROR: " + itr.next());
}
inform("+++++TYPE obj = " + obj);
MyClass mc = (MyClass)obj;
MySubClass first = (MySubClass)mc.getMyelt().getMyClassArray()[0];
Assert.assertEquals(DEFAULT_BIG_INT, first.getBigInt());
reportErrors(errors, "dco-err");
Assert.assertTrue(errors.isEmpty());
}
public void testPerfByNameBeanUnmarshall()
throws Exception
{
BindingContext bindingContext = getBindingContext(getBindingConfigDocument());
//File doc = TestEnv.xbeanCase("marshal/doc2.xml");
File doc = TestEnv.xbeanCase("marshal/bigdoc.xml");
final FileReader fileReader = new FileReader(doc);
CharArrayWriter cw = new CharArrayWriter();
bufferedStreamCopy(fileReader, cw);
final char[] chars = cw.toCharArray();
final CharArrayReader cr = new CharArrayReader(chars);
final int trials = 5;
final XMLInputFactory xmlInputFactory = StaxHelper.newXMLInputFactory();
final XmlOptions xmlOptions = new XmlOptions();
final long before_millis = System.currentTimeMillis();
for (int i = 0; i < trials; i++) {
cr.reset();
XMLStreamReader xrdr =
xmlInputFactory.createXMLStreamReader(cr);
Unmarshaller umctx =
bindingContext.createUnmarshaller();
Object obj = umctx.unmarshal(xrdr, xmlOptions);
if ((i % 1000) == 0) {
String s = obj.toString().substring(0, 70);
inform("i=" + i + "\tobj = " + s + "...");
}
}
final long after_millis = System.currentTimeMillis();
final long diff = (after_millis - before_millis);
inform("milliseconds: " + diff + " trials: " + trials);
inform("milliseconds PER trial: " + (diff / (double)trials));
}
public void testUnmarshalValidation()
throws Exception
{
final File schema = TestEnv.xbeanCase("marshal/example.xsd");
final File instance = TestEnv.xbeanCase("marshal/example_instance.xml");
Assert.assertTrue(schema.exists());
Assert.assertTrue(instance.exists());
final SchemaDocument xsd_obj =
(SchemaDocument)XmlObject.Factory.parse(schema);
final XmlObject[] schemas = new XmlObject[]{xsd_obj};
final XmlOptions opts = new XmlOptions();
opts.setCompileDownloadUrls();
SchemaTypeSystem sts = XmlBeans.compileXsd(schemas,
XmlBeans.getBuiltinTypeSystem(),
opts);
Schema2Java s2j = new Schema2Java(sts);
s2j.includeSchema(xsd_obj, schema.getName());
final File tmpfile = File.createTempFile("marshalTests", "-tylar");
if (!tmpfile.delete()) {
throw new AssertionError("delete failed on " + tmpfile);
}
final boolean ok = tmpfile.mkdirs();
Assert.assertTrue("mkdir" + tmpfile + " failed", ok);
s2j.bindAsExplodedTylar(tmpfile);
final URL tylar_url = tmpfile.toURL();
//add tylar to classpath so we can load classes out of it
final Thread thread = Thread.currentThread();
final ClassLoader curr_cl = thread.getContextClassLoader();
final URLClassLoader cl =
new URLClassLoader(new URL[]{tylar_url}, curr_cl);
thread.setContextClassLoader(cl);
try {
final BindingContextFactory bcf = BindingContextFactory.newInstance();
final BindingContext binding_context =
bcf.createBindingContext(cl);
final Unmarshaller um = binding_context.createUnmarshaller();
InputStream is = new FileInputStream(instance);
XmlOptions opts_validation_on = new XmlOptions();
opts_validation_on.setUnmarshalValidate();
final List errors = new ArrayList();
opts_validation_on.setErrorListener(errors);
final Object obj = um.unmarshal(is, opts_validation_on);
Assert.assertNotNull(obj);
inform("address=" + obj);
is.close();
reportErrors(errors);
Assert.assertTrue(errors.isEmpty());
//now try unmarshalType...
final FileInputStream fis = new FileInputStream(instance);
final XMLStreamReader rdr =
StaxHelper.newXMLInputFactory().createXMLStreamReader(fis);
QName schema_type = new QName("http://nosuch.domain.name", "USAddress");
String java_type = obj.getClass().getName();
//not super robust but this should work for valid xml
while (!rdr.isStartElement()) {
rdr.next();
}
um.unmarshalType(rdr, schema_type, java_type, opts_validation_on);
rdr.close();
fis.close();
reportErrors(errors);
Assert.assertTrue(errors.isEmpty());
// -- this is currently broken --
//now lets try validating our stream over objects
final Marshaller marshaller = binding_context.createMarshaller();
final XmlOptions empty_opts = new XmlOptions();
final XMLStreamReader obj_rdr =
marshaller.marshal(obj, empty_opts);
inform("VALIDATION-OBJ: " + obj);
final Object obj2 = um.unmarshal(obj_rdr, opts_validation_on);
inform("obj2=" + obj2);
obj_rdr.close();
reportErrors(errors);
//TODO: fix this use case
//Assert.assertTrue(errors.isEmpty());
// depends on reasonable equals methods which we do not have yet
//Assert.assertEquals(obj, obj2);
}
finally {
thread.setContextClassLoader(curr_cl);
}
}
private static void reportErrors(List errors)
{
if (!errors.isEmpty()) {
for (Iterator itr = errors.iterator(); itr.hasNext();) {
Object err = itr.next();
inform("validation-error: " + err);
}
}
}
protected static void bufferedStreamCopy(Reader in, Writer out)
throws IOException
{
int charsRead;
char[] buf = new char[1024];
while ((charsRead = in.read(buf)) != -1) {
out.write(buf, 0, charsRead);
}
}
private File getBindingConfigDocument()
{
File loc = TestEnv.xbeanCase("marshal/example_config.xml");
return loc;
}
public static void main(String args[])
{
junit.textui.TestRunner.run(suite());
}
private static BindingContext getBuiltinBindingContext()
throws XmlException, IOException
{
return BindingContextFactory.newInstance().createBindingContext();
}
private static BindingContext getBindingContext(File bcdoc)
throws XmlException, IOException
{
return ((BindingContextFactoryImpl)BindingContextFactory.newInstance()).
createBindingContextFromConfig(bcdoc);
}
private static void inform(String msg)
{
inform(msg, VERBOSE);
}
private static void inform(String msg, boolean verbose)
{
if (verbose) System.out.println(msg);
}
private static void say(String msg)
{
System.out.println(msg);
}
private static void error(String msg)
{
System.out.println(msg);
}
}