/******************************************************************************* * 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.wink.server.internal.providers.entity; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.MediaType; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.namespace.QName; import org.apache.wink.common.annotations.Asset; import org.apache.wink.common.internal.providers.entity.xml.JAXBArrayXmlProvider; import org.apache.wink.common.internal.providers.entity.xml.JAXBCollectionXmlProvider; import org.apache.wink.common.model.atom.AtomFeed; import org.apache.wink.common.model.atom.ObjectFactory; import org.apache.wink.server.internal.servlet.MockServletInvocationTest; import org.apache.wink.test.mock.MockRequestConstructor; import org.apache.wink.test.mock.TestUtils; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; public class JAXBCollectionXMLProviderTest extends MockServletInvocationTest { public static final String SOURCE_REQUEST = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><feeds><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:ns2=\"http://a9.com/-/spec/opensearch/1.1/\" xmlns:ns3=\"http://www.w3.org/1999/xhtml\"><id>0</id></feed><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:ns2=\"http://a9.com/-/spec/opensearch/1.1/\" xmlns:ns3=\"http://www.w3.org/1999/xhtml\"><id>1</id></feed><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:ns2=\"http://a9.com/-/spec/opensearch/1.1/\" xmlns:ns3=\"http://www.w3.org/1999/xhtml\"><id>2</id></feed></feeds>"; public static final byte[] SOURCE_REQUEST_BYTES = SOURCE_REQUEST.getBytes(); public static final String SOURCE_RESPONSE = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><feeds><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:ns2=\"http://a9.com/-/spec/opensearch/1.1/\" xmlns:ns3=\"http://www.w3.org/1999/xhtml\"><id>010</id></feed><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:ns2=\"http://a9.com/-/spec/opensearch/1.1/\" xmlns:ns3=\"http://www.w3.org/1999/xhtml\"><id>110</id></feed><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:ns2=\"http://a9.com/-/spec/opensearch/1.1/\" xmlns:ns3=\"http://www.w3.org/1999/xhtml\"><id>210</id></feed></feeds>"; public static final String JAXBXmlType_REQUEST = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><JAXBXmlTypes><JAXBXmlType><id>0</id><name>0</name></JAXBXmlType><JAXBXmlType><id>1</id><name>1</name></JAXBXmlType><JAXBXmlType><id>2</id><name>2</name></JAXBXmlType></JAXBXmlTypes>"; public static final byte[] JAXBXmlType_REQUEST_BYTES = JAXBXmlType_REQUEST.getBytes(); public static final String JAXBXmlType_RESPONSE = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><JAXBXmlTypes><JAXBXmlType><id>ID0</id><name>NAME0</name></JAXBXmlType><JAXBXmlType><id>ID1</id><name>NAME1</name></JAXBXmlType><JAXBXmlType><id>ID2</id><name>NAME2</name></JAXBXmlType></JAXBXmlTypes>"; public static final String JAXBXmlRootElement_REQUEST = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><JAXBXmlRootElements><JAXBXmlRootElement><id>0</id><name>0</name></JAXBXmlRootElement><JAXBXmlRootElement><id>1</id><name>1</name></JAXBXmlRootElement><JAXBXmlRootElement><id>2</id><name>2</name></JAXBXmlRootElement></JAXBXmlRootElements>"; public static final byte[] JAXBXmlRootElement_BYTES = JAXBXmlRootElement_REQUEST.getBytes(); public static final String JAXBXmlRootElement_RESPONSE = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><JAXBXmlRootElements><JAXBXmlRootElement><id>ID0</id><name>NAME0</name></JAXBXmlRootElement><JAXBXmlRootElement><id>ID1</id><name>NAME1</name></JAXBXmlRootElement><JAXBXmlRootElement><id>ID2</id><name>NAME2</name></JAXBXmlRootElement></JAXBXmlRootElements>"; @Override protected Class<?>[] getClasses() { return new Class<?>[] {Resource.class}; } @Path("jaxbresource") public static class Resource { @POST @Path("jaxbelement") public List<JAXBElement<AtomFeed>> createWrapped(List<JAXBElement<AtomFeed>> feedList) { List<JAXBElement<AtomFeed>> wrappedFeeds = new ArrayList<JAXBElement<AtomFeed>>(); for (JAXBElement<AtomFeed> feed : feedList) { AtomFeed atomFeed = new AtomFeed(); atomFeed.setId(feed.getValue().getId() + 10); JAXBElement<AtomFeed> wrappedFeed = new ObjectFactory().createFeed(atomFeed); wrappedFeeds.add(wrappedFeed); } return wrappedFeeds; } @POST @Path("xmlrootwithfactorycollection") public List<AtomFeed> createBareCollection(List<AtomFeed> feedList) { List<AtomFeed> feeds = new ArrayList<AtomFeed>(); for (AtomFeed feed : feedList) { AtomFeed atomFeed = new AtomFeed(); atomFeed.setId(feed.getId() + 10); feeds.add(atomFeed); } return feeds; } @POST @Path("xmlrootwithfactoryarray") public AtomFeed[] createBareArray(AtomFeed[] feedList) { List<AtomFeed> feeds = new ArrayList<AtomFeed>(); for (AtomFeed feed : feedList) { AtomFeed atomFeed = new AtomFeed(); atomFeed.setId(feed.getId() + 10); feeds.add(atomFeed); } return feeds.toArray(new AtomFeed[] {}); } @POST @Path("xmltypecollection") public List<JAXBElement<JAXBXmlType>> createxmltypeCollection(List<JAXBXmlType> resource) { List<JAXBElement<JAXBXmlType>> ret = new ArrayList<JAXBElement<JAXBXmlType>>(); JAXBXmlType s = null; for (JAXBXmlType type : resource) { s = new JAXBXmlType(); s.setId("ID" + type.getId()); s.setName("NAME" + type.getName()); JAXBElement<JAXBXmlType> element = new JAXBElement<JAXBXmlType>(new QName("JAXBXmlType"), JAXBXmlType.class, s); ret.add(element); } return ret; } @POST @Path("xmltypearray") public JAXBXmlType[] createxmltypeArray(JAXBXmlType[] resource) { JAXBXmlType[] ret = new JAXBXmlType[resource.length]; JAXBXmlType s = null; int i = 0; for (JAXBXmlType type : resource) { s = new JAXBXmlType(); s.setId("ID" + type.getId()); s.setName("NAME" + type.getId()); ret[i++] = s; } return ret; } @POST @Path("xmlrootnofactorycollection") public List<JAXBXmlRootElement> createXmlRoot(List<JAXBXmlRootElement> resource) { List<JAXBXmlRootElement> ret = new ArrayList<JAXBXmlRootElement>(); JAXBXmlRootElement s = null; for (int i = 0; i < resource.size(); ++i) { s = new JAXBXmlRootElement(); s.setId("ID" + resource.get(i).getId()); s.setName("NAME" + resource.get(i).getName()); ret.add(s); } return ret; } @POST @Path("xmlrootnofactoryarray") public JAXBXmlRootElement[] createXmlRoot(JAXBXmlRootElement[] resource) { JAXBXmlRootElement[] ret = new JAXBXmlRootElement[resource.length]; JAXBXmlRootElement s = null; for (int i = 0; i < resource.length; ++i) { s = new JAXBXmlRootElement(); s.setId("ID" + resource[i].getId()); s.setName("NAME" + resource[i].getName()); ret[i] = s; } return ret; } @GET @Path("xmltypenofactorycollection") public List<JAXBXmlType> getXmltypeNoFactoryCollection() { List<JAXBXmlType> ret = new ArrayList<JAXBXmlType>(); JAXBXmlType s = null; for (int i = 0; i < 3; ++i) { s = new JAXBXmlType(); s.setId("ID" + i); s.setName("NAME" + i); ret.add(s); } return ret; } @GET @Path("xmltypenofactoryarray") public JAXBXmlType[] getXmltypeNoFactoryArray() { List<JAXBXmlType> ret = new ArrayList<JAXBXmlType>(); JAXBXmlType s = null; for (int i = 0; i < 3; ++i) { s = new JAXBXmlType(); s.setId("ID" + i); s.setName("NAME" + i); ret.add(s); } return ret.toArray(new JAXBXmlType[] {}); } @POST @Path("xmlassetcollection") public List<TestAsset> getAsset(List<TestAsset> asset) { return asset; } } @Asset public static class TestAsset { JAXBXmlType xml; @Produces(MediaType.TEXT_XML) public JAXBXmlType getJAXB() { return xml; } @Consumes(MediaType.TEXT_XML) public void setJAXB(JAXBXmlType jaxbObject) { xml = jaxbObject; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "JAXBXmlType", propOrder = {"id", "name"}) public static class JAXBXmlType { @XmlElement(required = true) private String id; @XmlElement(required = true) private String name; public JAXBXmlType() { } public void setId(String id) { this.id = id; } public String getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "JAXBXmlRootElement", propOrder = {"id", "name"}) @XmlRootElement(name = "JAXBXmlRootElement") public static class JAXBXmlRootElement { @XmlElement(required = true) private String id; @XmlElement(required = true) private String name; public JAXBXmlRootElement() { } public void setId(String id) { this.id = id; } public String getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } } public void testJAXBCollectionXMLProviderIsReadableCollection() throws Exception { JAXBCollectionXmlProvider provider = new JAXBCollectionXmlProvider(); GenericEntity<List<AtomFeed>> type1 = new GenericEntity<List<AtomFeed>>(new ArrayList<AtomFeed>()) { }; assertTrue(provider.isReadable(type1.getRawType(), type1.getType(), null, new MediaType("text", "xml"))); assertTrue(provider.isReadable(type1.getRawType(), type1.getType(), null, new MediaType("application", "xml"))); assertTrue(provider.isReadable(type1.getRawType(), type1.getType(), null, new MediaType("application", "atom+xml"))); assertTrue(provider.isReadable(type1.getRawType(), type1.getType(), null, new MediaType("application", "atomsvc+xml"))); GenericEntity<List<JAXBElement<AtomFeed>>> type2 = new GenericEntity<List<JAXBElement<AtomFeed>>>(new ArrayList<JAXBElement<AtomFeed>>()) { }; assertTrue(provider.isReadable(type2.getRawType(), type2.getType(), null, new MediaType("text", "xml"))); assertTrue(provider.isReadable(type2.getRawType(), type2.getType(), null, new MediaType("application", "xml"))); assertTrue(provider.isReadable(type2.getRawType(), type2.getType(), null, new MediaType("application", "atom+xml"))); assertTrue(provider.isReadable(type2.getRawType(), type2.getType(), null, new MediaType("application", "atomsvc+xml"))); GenericEntity<List<String>> type3 = new GenericEntity<List<String>>(new ArrayList<String>()) { }; assertFalse(provider.isReadable(type3.getRawType(), type3.getType(), null, new MediaType("text", "xml"))); assertFalse(provider.isReadable(type3.getRawType(), type3.getType(), null, new MediaType("application", "xml"))); assertFalse(provider.isReadable(type3.getRawType(), type3.getType(), null, new MediaType("application", "atom+xml"))); assertFalse(provider.isReadable(type3.getRawType(), type3.getType(), null, new MediaType("application", "atomsvc+xml"))); } public void testJAXBCollectionXMLProviderIsReadableArray() throws Exception { JAXBArrayXmlProvider provider = new JAXBArrayXmlProvider(); assertTrue(provider.isReadable(AtomFeed[].class, AtomFeed[].class, null, new MediaType("text", "xml"))); assertTrue(provider.isReadable(AtomFeed[].class, AtomFeed[].class, null, new MediaType("application", "xml"))); assertTrue(provider.isReadable(AtomFeed[].class, AtomFeed[].class, null, new MediaType("application", "atom+xml"))); assertTrue(provider.isReadable(AtomFeed[].class, AtomFeed[].class, null, new MediaType("application", "atomsvc+xml"))); assertFalse(provider.isReadable(JAXBElement[].class, JAXBElement[].class, null, new MediaType("text", "xml"))); assertFalse(provider.isReadable(JAXBElement[].class, JAXBElement[].class, null, new MediaType("application", "xml"))); assertFalse(provider.isReadable(JAXBElement[].class, JAXBElement[].class, null, new MediaType("application", "atom+xml"))); assertFalse(provider.isReadable(JAXBElement[].class, JAXBElement[].class, null, new MediaType("application", "atomsvc+xml"))); assertFalse(provider.isReadable(String[].class, String[].class, null, new MediaType("text", "xml"))); assertFalse(provider.isReadable(String[].class, String[].class, null, new MediaType("application", "xml"))); assertFalse(provider.isReadable(String[].class, String[].class, null, new MediaType("application", "atom+xml"))); assertFalse(provider.isReadable(String[].class, String[].class, null, new MediaType("application", "atomsvc+xml"))); } public void testJAXBCollectionXMLProviderIsWritableCollection() throws Exception { JAXBCollectionXmlProvider provider = new JAXBCollectionXmlProvider(); GenericEntity<List<AtomFeed>> type1 = new GenericEntity<List<AtomFeed>>(new ArrayList<AtomFeed>()) { }; assertTrue(provider.isWriteable(type1.getRawType(), type1.getType(), null, new MediaType("text", "xml"))); assertTrue(provider.isWriteable(type1.getRawType(), type1.getType(), null, new MediaType("application", "xml"))); assertTrue(provider.isWriteable(type1.getRawType(), type1.getType(), null, new MediaType("application", "atom+xml"))); assertTrue(provider.isWriteable(type1.getRawType(), type1.getType(), null, new MediaType("application", "atomsvc+xml"))); GenericEntity<List<JAXBElement<AtomFeed>>> type2 = new GenericEntity<List<JAXBElement<AtomFeed>>>(new ArrayList<JAXBElement<AtomFeed>>()) { }; assertTrue(provider.isWriteable(type2.getRawType(), type2.getType(), null, new MediaType("text", "xml"))); assertTrue(provider.isWriteable(type2.getRawType(), type2.getType(), null, new MediaType("application", "xml"))); assertTrue(provider.isWriteable(type2.getRawType(), type2.getType(), null, new MediaType("application", "atom+xml"))); assertTrue(provider.isWriteable(type2.getRawType(), type2.getType(), null, new MediaType("application", "atomsvc+xml"))); GenericEntity<List<String>> type3 = new GenericEntity<List<String>>(new ArrayList<String>()) { }; assertFalse(provider.isWriteable(type3.getRawType(), type3.getType(), null, new MediaType("text", "xml"))); assertFalse(provider.isWriteable(type3.getRawType(), type3.getType(), null, new MediaType("application", "xml"))); assertFalse(provider.isWriteable(type3.getRawType(), type3.getType(), null, new MediaType("application", "atom+xml"))); assertFalse(provider.isWriteable(type3.getRawType(), type3.getType(), null, new MediaType("application", "atomsvc+xml"))); } public void testJAXBCollectionXMLProviderIsWritableArray() throws Exception { JAXBArrayXmlProvider provider = new JAXBArrayXmlProvider(); assertTrue(provider.isWriteable(AtomFeed[].class, AtomFeed[].class, null, new MediaType("text", "xml"))); assertTrue(provider.isWriteable(AtomFeed[].class, AtomFeed[].class, null, new MediaType("application", "xml"))); assertTrue(provider.isWriteable(AtomFeed[].class, AtomFeed[].class, null, new MediaType("application", "atom+xml"))); assertTrue(provider.isWriteable(AtomFeed[].class, AtomFeed[].class, null, new MediaType("application", "atomsvc+xml"))); assertFalse(provider.isWriteable(JAXBElement[].class, JAXBElement[].class, null, new MediaType("text", "xml"))); assertFalse(provider.isWriteable(JAXBElement[].class, JAXBElement[].class, null, new MediaType("application", "xml"))); assertFalse(provider.isWriteable(JAXBElement[].class, JAXBElement[].class, null, new MediaType("application", "atom+xml"))); assertFalse(provider.isWriteable(JAXBElement[].class, JAXBElement[].class, null, new MediaType("application", "atomsvc+xml"))); assertFalse(provider.isWriteable(String[].class, String[].class, null, new MediaType("text", "xml"))); assertFalse(provider.isWriteable(String[].class, String[].class, null, new MediaType("application", "xml"))); assertFalse(provider.isWriteable(String[].class, String[].class, null, new MediaType("application", "atom+xml"))); assertFalse(provider.isWriteable(String[].class, String[].class, null, new MediaType("application", "atomsvc+xml"))); } public void testJAXBElementCollection() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("POST", "/jaxbresource/jaxbelement", "text/xml", "text/xml", SOURCE_REQUEST_BYTES); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); // nested elements may or may not have a namespace prefix, so... String xml = invoke.getContentAsString(); Pattern myPattern = Pattern.compile("feeds><\\w*?:?feed"); Matcher matcher = myPattern.matcher(xml); matcher.find(); // +6 to skip the "feeds>" String feedString = xml.substring(matcher.start() + 6, matcher.end()); String[] elements = getElementsFromList("<feeds>", "</feeds>", feedString, invoke.getContentAsString()); assertEquals(4, elements.length); AtomFeed feed = null; for (int i = 1; i < elements.length; ++i) { feed = (AtomFeed)((JAXBElement<?>)unmarshallElement(AtomFeed.class, feedString + elements[i])) .getValue(); assertEquals("" + (i - 1) + "10", feed.getId()); } } public void testJAXBObjectCollection() throws Exception { MockHttpServletRequest request = MockRequestConstructor .constructMockRequest("POST", "/jaxbresource/xmlrootwithfactorycollection", "text/xml", "text/xml", SOURCE_REQUEST_BYTES); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); // nested elements may or may not have a namespace prefix, so... String xml = invoke.getContentAsString(); Pattern myPattern = Pattern.compile("feeds><\\w*?:?feed"); Matcher matcher = myPattern.matcher(xml); matcher.find(); // +6 to skip the "feeds>" String feedString = xml.substring(matcher.start() + 6, matcher.end()); String[] elements = getElementsFromList("<feeds>", "</feeds>", feedString, invoke.getContentAsString()); assertEquals(4, elements.length); AtomFeed feed = null; for (int i = 1; i < elements.length; ++i) { feed = (AtomFeed)((JAXBElement<?>)unmarshallElement(AtomFeed.class, feedString + elements[i])) .getValue(); assertEquals("" + (i - 1) + "10", feed.getId()); } } public void testJAXBObjectArray() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("POST", "/jaxbresource/xmlrootwithfactoryarray", "text/xml", "text/xml", SOURCE_REQUEST_BYTES); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); // nested elements may or may not have a namespace prefix, so... String xml = invoke.getContentAsString(); Pattern myPattern = Pattern.compile("feeds><\\w*?:?feed"); Matcher matcher = myPattern.matcher(xml); matcher.find(); // +6 to skip the "feeds>" String feedString = xml.substring(matcher.start() + 6, matcher.end()); String[] elements = getElementsFromList("<feeds>", "</feeds>", feedString, invoke.getContentAsString()); assertEquals(4, elements.length); AtomFeed feed = null; for (int i = 1; i < elements.length; ++i) { feed = (AtomFeed)((JAXBElement<?>)unmarshallElement(AtomFeed.class, feedString + elements[i])) .getValue(); assertEquals("" + (i - 1) + "10", feed.getId()); } } public void testXMLTypeNoFactoryCollection() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("GET", "/jaxbresource/xmltypenofactorycollection", "text/xml", "text/xml", null); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); String msg = TestUtils.diffIgnoreUpdateWithAttributeQualifier(JAXBXmlType_RESPONSE, invoke .getContentAsString()); assertNull(msg, msg); } public void testXMLTypeNoFactoryArray() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("GET", "/jaxbresource/xmltypenofactoryarray", "text/xml", "text/xml", null); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); String msg = TestUtils.diffIgnoreUpdateWithAttributeQualifier(JAXBXmlType_RESPONSE, invoke .getContentAsString()); assertNull(msg, msg); } public void testXMLTypeCollection() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("POST", "/jaxbresource/xmltypecollection", "text/xml", "text/xml", JAXBXmlType_REQUEST_BYTES); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); System.out.println(invoke.getContentAsString()); String msg = TestUtils.diffIgnoreUpdateWithAttributeQualifier(JAXBXmlType_RESPONSE, invoke .getContentAsString()); assertNull(msg, msg); } public void testXMLTypeArray() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("POST", "/jaxbresource/xmltypearray", "text/xml", "text/xml", JAXBXmlType_REQUEST_BYTES); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); String msg = TestUtils.diffIgnoreUpdateWithAttributeQualifier(JAXBXmlType_RESPONSE, invoke .getContentAsString()); assertNull(msg, msg); } public void testXmlRootCollection() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("POST", "/jaxbresource/xmlrootnofactorycollection", "text/xml", "text/xml", JAXBXmlRootElement_BYTES); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); String msg = TestUtils.diffIgnoreUpdateWithAttributeQualifier(JAXBXmlRootElement_RESPONSE, invoke .getContentAsString()); assertNull(msg, msg); } public void testXmlRootArray() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("POST", "/jaxbresource/xmlrootnofactoryarray", "text/xml", "text/xml", JAXBXmlRootElement_BYTES); MockHttpServletResponse invoke = invoke(request); assertEquals(200, invoke.getStatus()); String msg = TestUtils.diffIgnoreUpdateWithAttributeQualifier(JAXBXmlRootElement_RESPONSE, invoke .getContentAsString()); assertNull(msg, msg); } private static String[] getElementsFromList(String rootStartTag, String rootEndTag, String elementStart, String content) { assertTrue(content.indexOf(rootStartTag) != -1); assertTrue(content.indexOf(rootEndTag) != -1); content = content.substring(content.indexOf(rootStartTag) + rootStartTag.length(), content .indexOf(rootEndTag)); return content.split(elementStart); } private static Object unmarshallElement(Class<?> type, String response) throws JAXBException { JAXBContext context = JAXBContext.newInstance(type); Unmarshaller unmarshaller = context.createUnmarshaller(); return unmarshaller.unmarshal(new ByteArrayInputStream(response.getBytes())); } }