You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2015/08/27 13:40:19 UTC

cxf git commit: [CXF-6565] Updating DOM4JProvider to support suppressing XML declarations and, optionally, use StaxUtils to write XML

Repository: cxf
Updated Branches:
  refs/heads/master 1df8753ff -> 3dca45675


[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/3dca4567
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/3dca4567
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/3dca4567

Branch: refs/heads/master
Commit: 3dca456756b176e072dd5bf37a30887600bf3aca
Parents: 1df8753
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Thu Aug 27 12:39:49 2015 +0100
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Thu Aug 27 12:39: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/3dca4567/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/3dca4567/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;
     }
+            
+    
 }