[CXF-7020]explicity create woodstox event factory as fallback if 
XMLEventFactory.newInstance fail

(cherry picked from commit e95788590cd036ecbda0283f493845feb5e11ba4)


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/964244cb
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/964244cb
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/964244cb

Branch: refs/heads/3.0.x-fixes
Commit: 964244cbbe4e1df918243bcd66a6f23e67b52d0f
Parents: 90c5e9a
Author: Freeman Fang <freeman.f...@gmail.com>
Authored: Wed Aug 24 17:15:39 2016 +0800
Committer: Daniel Kulp <dk...@apache.org>
Committed: Fri Oct 14 13:03:16 2016 -0400

----------------------------------------------------------------------
 .../org/apache/cxf/staxutils/StaxUtils.java     |  6 +++++
 .../apache/cxf/staxutils/WoodstoxHelper.java    |  6 +++++
 .../interceptor/ReadHeadersInterceptor.java     | 25 +++++++++++++-------
 3 files changed, 29 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/964244cb/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java 
b/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
index a7060e6..2f52784 100644
--- a/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
+++ b/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
@@ -44,6 +44,7 @@ import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.Location;
 import javax.xml.stream.StreamFilter;
+import javax.xml.stream.XMLEventFactory;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLResolver;
@@ -352,6 +353,11 @@ public final class StaxUtils {
     private static XMLInputFactory createWoodstoxFactory() {
         return WoodstoxHelper.createInputFactory();
     }
+    
+    public static XMLEventFactory createWoodstoxEventFactory() {
+        return WoodstoxHelper.createEventFactory();
+    }
+    
     private static boolean setRestrictionProperties(XMLInputFactory factory) {
         //For now, we can only support Woodstox 4.2.x and newer as none of the 
other
         //stax parsers support these settings

http://git-wip-us.apache.org/repos/asf/cxf/blob/964244cb/core/src/main/java/org/apache/cxf/staxutils/WoodstoxHelper.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/staxutils/WoodstoxHelper.java 
b/core/src/main/java/org/apache/cxf/staxutils/WoodstoxHelper.java
index 73f4852..8b901bc 100644
--- a/core/src/main/java/org/apache/cxf/staxutils/WoodstoxHelper.java
+++ b/core/src/main/java/org/apache/cxf/staxutils/WoodstoxHelper.java
@@ -19,9 +19,11 @@
 
 package org.apache.cxf.staxutils;
 
+import javax.xml.stream.XMLEventFactory;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 
+import com.ctc.wstx.stax.WstxEventFactory;
 import com.ctc.wstx.stax.WstxInputFactory;
 import org.codehaus.stax2.XMLStreamReader2;
 
@@ -36,6 +38,10 @@ final class WoodstoxHelper {
     public static XMLInputFactory createInputFactory() {
         return new WstxInputFactory();
     }
+    
+    public static XMLEventFactory createEventFactory() {
+        return new WstxEventFactory();
+    }
 
     public static void setProperty(XMLStreamReader reader, String p, Object v) 
{
         ((XMLStreamReader2)reader).setProperty(p, v);

http://git-wip-us.apache.org/repos/asf/cxf/blob/964244cb/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
----------------------------------------------------------------------
diff --git 
a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
 
b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
index 7b18d1c..b742dd9 100644
--- 
a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
+++ 
b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
@@ -318,7 +318,7 @@ public class ReadHeadersInterceptor extends 
AbstractSoapInterceptor {
      * out while parsing the stream).
      */
     private static class HeadersProcessor {
-        private static final XMLEventFactory FACTORY = 
XMLEventFactory.newInstance();
+        private static XMLEventFactory eventFactory;
         private final String ns;
         private final String header;
         private final String body;
@@ -332,6 +332,15 @@ public class ReadHeadersInterceptor extends 
AbstractSoapInterceptor {
         private QName lastStartElementQName;
         private String envelopePrefix;
         private String bodyPrefix;
+        
+        static {
+            try {
+                eventFactory = XMLEventFactory.newInstance();
+            } catch (Throwable t) {
+                //explicity create woodstox event factory as last try
+                eventFactory = StaxUtils.createWoodstoxEventFactory();
+            }
+        }
 
         public HeadersProcessor(SoapVersion version) {
             this.header = version.getHeader().getLocalPart();
@@ -348,14 +357,14 @@ public class ReadHeadersInterceptor extends 
AbstractSoapInterceptor {
                 switch (event) {
                 case XMLStreamConstants.START_ELEMENT:
                     read++;
-                    addEvent(FACTORY.createStartElement(new 
QName(reader.getNamespaceURI(), reader
+                    addEvent(eventFactory.createStartElement(new 
QName(reader.getNamespaceURI(), reader
                                                             .getLocalName(), 
reader.getPrefix()), null, null));
                     for (int i = 0; i < reader.getNamespaceCount(); i++) {
-                        
addEvent(FACTORY.createNamespace(reader.getNamespacePrefix(i),
+                        
addEvent(eventFactory.createNamespace(reader.getNamespacePrefix(i),
                                                          
reader.getNamespaceURI(i)));
                     }
                     for (int i = 0; i < reader.getAttributeCount(); i++) {
-                        
addEvent(FACTORY.createAttribute(reader.getAttributePrefix(i),
+                        
addEvent(eventFactory.createAttribute(reader.getAttributePrefix(i),
                                                          
reader.getAttributeNamespace(i),
                                                          
reader.getAttributeLocalName(i),
                                                          
reader.getAttributeValue(i)));
@@ -367,7 +376,7 @@ public class ReadHeadersInterceptor extends 
AbstractSoapInterceptor {
                     break;
                 case XMLStreamConstants.END_ELEMENT:
                     if (read > 0) {
-                        addEvent(FACTORY.createEndElement(new 
QName(reader.getNamespaceURI(), reader
+                        addEvent(eventFactory.createEndElement(new 
QName(reader.getNamespaceURI(), reader
                                                               .getLocalName(), 
reader.getPrefix()), null));
                     }
                     read--;
@@ -375,14 +384,14 @@ public class ReadHeadersInterceptor extends 
AbstractSoapInterceptor {
                 case XMLStreamConstants.CHARACTERS:
                     String s = reader.getText();
                     if (s != null) {
-                        addEvent(FACTORY.createCharacters(s));
+                        addEvent(eventFactory.createCharacters(s));
                     }
                     break;
                 case XMLStreamConstants.COMMENT:
-                    addEvent(FACTORY.createComment(reader.getText()));
+                    addEvent(eventFactory.createComment(reader.getText()));
                     break;
                 case XMLStreamConstants.CDATA:
-                    addEvent(FACTORY.createCData(reader.getText()));
+                    addEvent(eventFactory.createCData(reader.getText()));
                     break;
                 case XMLStreamConstants.START_DOCUMENT:
                 case XMLStreamConstants.END_DOCUMENT:

Reply via email to