@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2009 the original author or authors .
* Copyright 2002 - 2011 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -16,11 +16,22 @@
@@ -16,11 +16,22 @@
package org.springframework.oxm.castor ;
import java.io.StringWriter ;
import java.util.Arrays ;
import java.util.HashMap ;
import java.util.Map ;
import javax.xml.transform.sax.SAXResult ;
import javax.xml.transform.stream.StreamResult ;
import static org.easymock.EasyMock.* ;
import static org.junit.Assert.assertTrue ;
import org.custommonkey.xmlunit.NamespaceContext ;
import org.custommonkey.xmlunit.SimpleNamespaceContext ;
import org.custommonkey.xmlunit.XMLUnit ;
import org.custommonkey.xmlunit.XpathEngine ;
import org.junit.Assert ;
import org.junit.Ignore ;
import org.junit.Test ;
import org.w3c.dom.Document ;
import org.w3c.dom.NodeList ;
import org.xml.sax.Attributes ;
import org.xml.sax.ContentHandler ;
@ -28,11 +39,68 @@ import org.springframework.core.io.ClassPathResource;
@@ -28,11 +39,68 @@ import org.springframework.core.io.ClassPathResource;
import org.springframework.oxm.AbstractMarshallerTests ;
import org.springframework.oxm.Marshaller ;
import static org.custommonkey.xmlunit.XMLAssert.* ;
import static org.easymock.EasyMock.* ;
/ * *
* Tests the { @link CastorMarshaller } class .
*
* @author Arjen Poutsma
* @author Jakub Narloch
* /
public class CastorMarshallerTests extends AbstractMarshallerTests {
/ * *
* Represents the expected result that doesn ' t contain the xml declaration .
* /
private static final String DOCUMENT_EXPECTED_STRING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<tns:flights xmlns:tns=\"http://samples.springframework.org/flight\">" +
"<tns:flight><tns:number>42</tns:number></tns:flight></tns:flights>" ;
/ * *
* Represents the expected result that doesn ' t contain the xml namespaces .
* /
private static final String SUPPRESSED_NAMESPACE_EXPECTED_STRING =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><flights><flight><number>42</number></flight></flights>" ;
/ * *
* Represents the expected result with modified root element name .
* /
private static final String ROOT_ELEMENT_EXPECTED_STRING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<tns:canceledFlights xmlns:tns=\"http://samples.springframework.org/flight\">" +
"<tns:flight><tns:number>42</tns:number></tns:flight></tns:canceledFlights>" ;
/ * *
* Represents the expected result with ' xsi : type ' attribute .
* /
private static final String XSI_EXPECTED_STRING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<objects><castor-object xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xsi:type=\"java:org.springframework.oxm.castor.CastorObject\">" +
"<name>test</name><value>8</value></castor-object></objects>" ;
/ * *
* Represents the expected result with suppressed ' xsi : type ' attribute .
* /
private static final String SUPPRESSED_XSI_EXPECTED_STRING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<objects><castor-object><name>test</name><value>8</value></castor-object></objects>" ;
/ * *
* Represents the expected result with ' xsi : type ' attribute for root element .
* /
private static final String ROOT_WITH_XSI_EXPECTED_STRING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<objects xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xsi:type=\"java:java.util.Arrays$ArrayList\">" +
"<castor-object xsi:type=\"java:org.springframework.oxm.castor.CastorObject\">" +
"<name>test</name><value>8</value></castor-object></objects>" ;
/ * *
* Represents the expected result without ' xsi : type ' attribute for root element .
* /
private static final String ROOT_WITHOUT_XSI_EXPECTED_STRING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<objects><castor-object xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xsi:type=\"java:org.springframework.oxm.castor.CastorObject\">" +
"<name>test</name><value>8</value></castor-object></objects>" ;
@Override
protected Marshaller createMarshaller ( ) throws Exception {
CastorMarshaller marshaller = new CastorMarshaller ( ) ;
@ -77,8 +145,185 @@ public class CastorMarshallerTests extends AbstractMarshallerTests {
@@ -77,8 +145,185 @@ public class CastorMarshallerTests extends AbstractMarshallerTests {
@Test
public void supports ( ) throws Exception {
assertTrue ( "CastorMarshaller does not support Flights" , marshaller . supports ( Flights . class ) ) ;
assertTrue ( "CastorMarshaller does not support Flight" , marshaller . supports ( Flight . class ) ) ;
Assert . assertTrue ( "CastorMarshaller does not support Flights" , marshaller . supports ( Flights . class ) ) ;
Assert . assertTrue ( "CastorMarshaller does not support Flight" , marshaller . supports ( Flight . class ) ) ;
}
/ * *
* Tests the marshal result when the { @link CastorMarshaller # setSuppressNamespaces ( boolean ) } is set to
* < code > true < / code > .
*
* @throws Exception if any error occurs during test
* /
@Test
public void testSuppressNamespacesTrue ( ) throws Exception {
getCastorMarshaller ( ) . setSuppressNamespaces ( true ) ;
String result = marshalFlights ( ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , SUPPRESSED_NAMESPACE_EXPECTED_STRING , result ) ;
}
/ * *
* Tests the marshal result when the { @link CastorMarshaller # setSuppressNamespaces ( boolean ) } is set to
* < code > false < / code > .
*
* @throws Exception if any error occurs during test
* /
@Test
public void testSuppressNamespacesFalse ( ) throws Exception {
getCastorMarshaller ( ) . setSuppressNamespaces ( false ) ;
String result = marshalFlights ( ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , EXPECTED_STRING , result ) ;
}
@Test
@Ignore ( "Not working yet" )
public void testSuppressXsiTypeTrue ( ) throws Exception {
CastorObject castorObject = createCastorObject ( ) ;
getCastorMarshaller ( ) . setSuppressXsiType ( true ) ;
getCastorMarshaller ( ) . setRootElement ( "objects" ) ;
String result = marshal ( Arrays . asList ( castorObject ) ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , SUPPRESSED_XSI_EXPECTED_STRING , result ) ;
}
@Test
@Ignore ( "Not working yet" )
public void testSuppressXsiTypeFalse ( ) throws Exception {
CastorObject castorObject = createCastorObject ( ) ;
getCastorMarshaller ( ) . setSuppressXsiType ( false ) ;
getCastorMarshaller ( ) . setRootElement ( "objects" ) ;
String result = marshal ( Arrays . asList ( castorObject ) ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , XSI_EXPECTED_STRING , result ) ;
}
@Test
public void testMarshalAsDocumentTrue ( ) throws Exception {
getCastorMarshaller ( ) . setMarshalAsDocument ( true ) ;
String result = marshalFlights ( ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , DOCUMENT_EXPECTED_STRING , result ) ;
Assert . assertTrue ( "Result doesn't contain xml declaration." ,
result . contains ( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" ) ) ;
}
@Test
public void testMarshalAsDocumentFalse ( ) throws Exception {
getCastorMarshaller ( ) . setMarshalAsDocument ( true ) ;
String result = marshalFlights ( ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , EXPECTED_STRING , result ) ;
Assert . assertFalse ( "Result contains xml declaration." , result . matches ( "<\\?\\s*xml" ) ) ;
}
@Test
public void testRootElement ( ) throws Exception {
getCastorMarshaller ( ) . setRootElement ( "canceledFlights" ) ;
String result = marshalFlights ( ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , ROOT_ELEMENT_EXPECTED_STRING , result ) ;
}
@Test
public void testNoNamespaceSchemaLocation ( ) throws Exception {
String noNamespaceSchemaLocation = "flights.xsd" ;
getCastorMarshaller ( ) . setNoNamespaceSchemaLocation ( noNamespaceSchemaLocation ) ;
String result = marshalFlights ( ) ;
assertXpathEvaluatesTo ( "The xsi:noNamespaceSchemaLocation hasn't been written or has invalid value." ,
noNamespaceSchemaLocation , "/tns:flights/@xsi:noNamespaceSchemaLocation" , result ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , EXPECTED_STRING , result ) ;
}
@Test
public void testSchemaLocation ( ) throws Exception {
String schemaLocation = "flights.xsd" ;
getCastorMarshaller ( ) . setSchemaLocation ( schemaLocation ) ;
String result = marshalFlights ( ) ;
assertXpathEvaluatesTo ( "The xsi:noNamespaceSchemaLocation hasn't been written or has invalid value." ,
schemaLocation , "/tns:flights/@xsi:schemaLocation" , result ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , EXPECTED_STRING , result ) ;
}
@Test
@Ignore ( "Not working yet" )
public void testUseXsiTypeAsRootTrue ( ) throws Exception {
CastorObject castorObject = createCastorObject ( ) ;
getCastorMarshaller ( ) . setSuppressXsiType ( false ) ;
getCastorMarshaller ( ) . setUseXSITypeAtRoot ( true ) ;
getCastorMarshaller ( ) . setRootElement ( "objects" ) ;
String result = marshal ( Arrays . asList ( castorObject ) ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , ROOT_WITH_XSI_EXPECTED_STRING , result ) ;
}
@Test
@Ignore ( "Not working yet" )
public void testUseXsiTypeAsRootFalse ( ) throws Exception {
CastorObject castorObject = createCastorObject ( ) ;
getCastorMarshaller ( ) . setSuppressXsiType ( false ) ;
getCastorMarshaller ( ) . setUseXSITypeAtRoot ( false ) ;
getCastorMarshaller ( ) . setRootElement ( "objects" ) ;
String result = marshal ( Arrays . asList ( castorObject ) ) ;
assertXMLEqual ( "Marshaller wrote invalid result" , ROOT_WITHOUT_XSI_EXPECTED_STRING , result ) ;
}
private CastorMarshaller getCastorMarshaller ( ) {
return ( CastorMarshaller ) marshaller ;
}
private String marshal ( Object object ) throws Exception {
StringWriter writer = new StringWriter ( ) ;
StreamResult result = new StreamResult ( writer ) ;
getCastorMarshaller ( ) . marshal ( object , result ) ;
return writer . toString ( ) ;
}
private String marshalFlights ( ) throws Exception {
return marshal ( flights ) ;
}
/ * *
* Asserts the values of xpath expression evaluation is exactly the same as expected value . < / p > The xpath may contain
* the xml namespace prefixes , since namespaces from flight example are being registered .
*
* @param msg the error message that will be used in case of test failure
* @param expected the expected value
* @param xpath the xpath to evaluate
* @param xmlDoc the xml to use
* @throws Exception if any error occurs during xpath evaluation
* /
private void assertXpathEvaluatesTo ( String msg , String expected , String xpath , String xmlDoc ) throws Exception {
Map < String , String > namespaces = new HashMap < String , String > ( ) ;
namespaces . put ( "tns" , "http://samples.springframework.org/flight" ) ;
namespaces . put ( "xsi" , "http://www.w3.org/2001/XMLSchema-instance" ) ;
NamespaceContext ctx = new SimpleNamespaceContext ( namespaces ) ;
XpathEngine engine = XMLUnit . newXpathEngine ( ) ;
engine . setNamespaceContext ( ctx ) ;
Document doc = XMLUnit . buildControlDocument ( xmlDoc ) ;
NodeList node = engine . getMatchingNodes ( xpath , doc ) ;
assertEquals ( msg , expected , node . item ( 0 ) . getNodeValue ( ) ) ;
}
/ * *
* Creates a instance of { @link CastorObject } for testing .
*
* @return a instance of { @link CastorObject }
* /
private CastorObject createCastorObject ( ) {
CastorObject castorObject = new CastorObject ( ) ;
castorObject . setName ( "test" ) ;
castorObject . setValue ( 8 ) ;
return castorObject ;
}
}