Repository: cxf Updated Branches: refs/heads/3.0.x-fixes 1fa100325 -> 337022876
[CXF-6565] Updating DOM4JProvider to support suppressing XML declarations and, optionally, use StaxUtils to write XML Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/33702287 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/33702287 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/33702287 Branch: refs/heads/3.0.x-fixes Commit: 337022876251329e35994f6df2dd2a13eb622f09 Parents: 1fa1003 Author: Sergey Beryozkin <[email protected]> Authored: Thu Aug 27 12:39:49 2015 +0100 Committer: Sergey Beryozkin <[email protected]> Committed: Thu Aug 27 12:40:49 2015 +0100 ---------------------------------------------------------------------- .../cxf/jaxrs/provider/dom4j/DOM4JProvider.java | 29 +++++++++- .../jaxrs/provider/dom4j/DOM4JProviderTest.java | 60 ++++++++++++++++---- 2 files changed, 75 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/33702287/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProvider.java ---------------------------------------------------------------------- diff --git a/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProvider.java b/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProvider.java index f79af23..1a797be 100644 --- a/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProvider.java +++ b/rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProvider.java @@ -37,18 +37,25 @@ import javax.ws.rs.ext.Providers; import org.apache.cxf.jaxrs.provider.AbstractConfigurableProvider; import org.apache.cxf.jaxrs.utils.ExceptionUtils; +import org.apache.cxf.jaxrs.utils.JAXRSUtils; +import org.apache.cxf.message.Message; +import org.apache.cxf.message.MessageUtils; import org.apache.cxf.staxutils.StaxUtils; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.XMLWriter; @Produces({"application/xml", "application/*+xml", "text/xml", "application/json", "application/*+json" }) @Consumes({"application/xml", "application/*+xml", "text/xml", "application/json", "application/*+json" }) public class DOM4JProvider extends AbstractConfigurableProvider implements MessageBodyReader<org.dom4j.Document>, MessageBodyWriter<org.dom4j.Document> { - + public static final String SUPPRESS_XML_DECLARATION = "suppress.xml.declaration"; private static final Class<org.w3c.dom.Document> DOM_DOC_CLS = org.w3c.dom.Document.class; private Providers providers; + private boolean convertAlways; + @Context public void setProviders(Providers providers) { this.providers = providers; @@ -87,8 +94,16 @@ public class DOM4JProvider extends AbstractConfigurableProvider Type type, Annotation[] anns, MediaType mt, MultivaluedMap<String, Object> headers, OutputStream os) throws IOException, WebApplicationException { - if (mt.getSubtype().contains("xml")) { - org.dom4j.io.XMLWriter writer = new org.dom4j.io.XMLWriter(os); + if (!convertAlways && mt.getSubtype().contains("xml")) { + + XMLWriter writer; + if (MessageUtils.getContextualBoolean(getCurrentMessage(), SUPPRESS_XML_DECLARATION, false)) { + OutputFormat format = new org.dom4j.io.OutputFormat(); + format.setSuppressDeclaration(true); + writer = new org.dom4j.io.XMLWriter(os, format); + } else { + writer = new org.dom4j.io.XMLWriter(os); + } writer.write(doc); writer.flush(); } else { @@ -103,6 +118,10 @@ public class DOM4JProvider extends AbstractConfigurableProvider } } + protected Message getCurrentMessage() { + return JAXRSUtils.getCurrentMessage(); + } + private org.w3c.dom.Document convertToDOM(org.dom4j.Document doc) { String xml = doc.asXML(); try { @@ -111,4 +130,8 @@ public class DOM4JProvider extends AbstractConfigurableProvider throw ExceptionUtils.toInternalServerErrorException(ex, null); } } + + public void convertToDOMAlways(boolean convert) { + convertAlways = convert; + } } http://git-wip-us.apache.org/repos/asf/cxf/blob/33702287/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProviderTest.java ---------------------------------------------------------------------- diff --git a/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProviderTest.java b/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProviderTest.java index c6553ea..f4fa478 100644 --- a/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProviderTest.java +++ b/rt/rs/extensions/providers/src/test/java/org/apache/cxf/jaxrs/provider/dom4j/DOM4JProviderTest.java @@ -24,6 +24,7 @@ import java.lang.annotation.Annotation; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; +import javax.ws.rs.ext.Providers; import org.apache.cxf.endpoint.Endpoint; import org.apache.cxf.jaxrs.impl.MetadataMap; @@ -54,7 +55,7 @@ public class DOM4JProviderTest extends Assert { } private org.dom4j.Document readXML(MediaType ct, final String xml) throws Exception { DOM4JProvider p = new DOM4JProvider(); - p.setProviders(new ProvidersImpl(createMessage())); + p.setProviders(new ProvidersImpl(createMessage(false))); org.dom4j.Document dom = p.readFrom(org.dom4j.Document.class, org.dom4j.Document.class, new Annotation[] {}, ct, new MetadataMap<String, String>(), new ByteArrayInputStream(xml.getBytes("UTF-8"))); @@ -65,7 +66,7 @@ public class DOM4JProviderTest extends Assert { public void testReadJSONConvertToXML() throws Exception { final String xml = "{\"a\":{\"b\":2}}"; DOM4JProvider p = new DOM4JProvider(); - p.setProviders(new ProvidersImpl(createMessage())); + p.setProviders(new ProvidersImpl(createMessage(false))); org.dom4j.Document dom = p.readFrom(org.dom4j.Document.class, org.dom4j.Document.class, new Annotation[]{}, MediaType.APPLICATION_JSON_TYPE, new MetadataMap<String, String>(), new ByteArrayInputStream(xml.getBytes("UTF-8"))); @@ -76,24 +77,58 @@ public class DOM4JProviderTest extends Assert { @Test public void testWriteXML() throws Exception { - doTestWriteXML(MediaType.APPLICATION_XML_TYPE); + doTestWriteXML(MediaType.APPLICATION_XML_TYPE, false); } @Test public void testWriteXMLCustomCt() throws Exception { - doTestWriteXML(MediaType.valueOf("application/custom+xml")); + doTestWriteXML(MediaType.valueOf("application/custom+xml"), false); } - private void doTestWriteXML(MediaType ct) throws Exception { + @Test + public void testWriteXMLAsDOMW3C() throws Exception { + doTestWriteXML(MediaType.APPLICATION_XML_TYPE, true); + } + + @Test + public void testWriteXMLSuppressDeclaration() throws Exception { + org.dom4j.Document dom = readXML(MediaType.APPLICATION_XML_TYPE, "<a/>"); + final Message message = createMessage(true); + Providers providers = new ProvidersImpl(message); + DOM4JProvider p = new DOM4JProvider() { + protected Message getCurrentMessage() { + return message; + } + }; + p.setProviders(providers); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + p.writeTo(dom, org.dom4j.Document.class, org.dom4j.Document.class, + new Annotation[]{}, MediaType.APPLICATION_XML_TYPE, new MetadataMap<String, Object>(), bos); + String str = bos.toString(); + assertFalse(str.startsWith("<?xml")); + assertTrue(str.contains("<a/>") || str.contains("<a></a>")); + } + + private void doTestWriteXML(MediaType ct, boolean convert) throws Exception { org.dom4j.Document dom = readXML(ct, "<a/>"); - DOM4JProvider p = new DOM4JProvider(); - p.setProviders(new ProvidersImpl(createMessage())); - + final Message message = createMessage(false); + Providers providers = new ProvidersImpl(message); + DOM4JProvider p = new DOM4JProvider() { + protected Message getCurrentMessage() { + return message; + } + }; + p.setProviders(providers); + p.convertToDOMAlways(convert); ByteArrayOutputStream bos = new ByteArrayOutputStream(); p.writeTo(dom, org.dom4j.Document.class, org.dom4j.Document.class, new Annotation[]{}, ct, new MetadataMap<String, Object>(), bos); String str = bos.toString(); - // starts with the xml PI + if (convert) { + assertFalse(str.startsWith("<?xml")); + } else { + assertTrue(str.startsWith("<?xml")); + } assertTrue(str.contains("<a/>") || str.contains("<a></a>")); } @@ -101,7 +136,7 @@ public class DOM4JProviderTest extends Assert { public void testWriteJSON() throws Exception { org.dom4j.Document dom = readXML(); DOM4JProvider p = new DOM4JProvider(); - p.setProviders(new ProvidersImpl(createMessage())); + p.setProviders(new ProvidersImpl(createMessage(false))); ByteArrayOutputStream bos = new ByteArrayOutputStream(); p.writeTo(dom, org.dom4j.Document.class, org.dom4j.Document.class, @@ -147,11 +182,12 @@ public class DOM4JProviderTest extends Assert { assertEquals("[{\"a\":1}]", str); } - private Message createMessage() { + private Message createMessage(boolean suppress) { ProviderFactory factory = ServerProviderFactory.getInstance(); Message m = new MessageImpl(); m.put("org.apache.cxf.http.case_insensitive_queries", false); Exchange e = new ExchangeImpl(); + e.put(DOM4JProvider.SUPPRESS_XML_DECLARATION, suppress); m.setExchange(e); e.setInMessage(m); Endpoint endpoint = EasyMock.createMock(Endpoint.class); @@ -199,4 +235,6 @@ public class DOM4JProviderTest extends Assert { e.put(Endpoint.class, endpoint); return m; } + + }
