[ 
https://issues.apache.org/jira/browse/CXF-2397?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12745129#action_12745129
 ] 

Mike Youngstrom commented on CXF-2397:
--------------------------------------

Just wanted to make sure you were amiable to the idea first. :)  Here is a 
patch that works great for me.  I tested both with fastinfoset on the classpath 
and without.

Index: rt/core/pom.xml
===================================================================
--- rt/core/pom.xml     (revision 805827)
+++ rt/core/pom.xml     (working copy)
@@ -79,6 +79,7 @@
        <dependency>
          <groupId>com.sun.xml.fastinfoset</groupId>
          <artifactId>FastInfoset</artifactId>
+         <optional>true</optional>
         </dependency>
         
     </dependencies>
Index: rt/core/src/main/java/org/apache/cxf/bus/spring/TunedDocumentLoader.java
===================================================================
--- rt/core/src/main/java/org/apache/cxf/bus/spring/TunedDocumentLoader.java    
(revision 805827)
+++ rt/core/src/main/java/org/apache/cxf/bus/spring/TunedDocumentLoader.java    
(working copy)
@@ -22,7 +22,9 @@
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
 import java.net.URL;
+import java.util.logging.Logger;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -31,6 +33,7 @@
 import javax.xml.parsers.SAXParserFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLInputFactory;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.sax.SAXSource;
@@ -42,9 +45,9 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 
-import com.sun.xml.fastinfoset.stax.StAXDocumentParser;
-
+import org.apache.cxf.bus.spring.BusApplicationContext;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
+import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.staxutils.StaxUtils;
 import org.apache.cxf.staxutils.W3CDOMStreamWriter;
 import org.springframework.beans.factory.xml.DefaultDocumentLoader;
@@ -54,12 +57,15 @@
  * A Spring DocumentLoader that uses WoodStox when we are not validating to 
speed up the process. 
  */
 class TunedDocumentLoader extends DefaultDocumentLoader {
+       
+       private static final Logger LOG = 
LogUtils.getL7dLogger(TunedDocumentLoader.class);
     
     // DocumentBuilderFactories are somewhat expensive but not thread-safe.
     // We only use this builder with WoodStox, and Fast Infoset 
     // and we respect Spring's desire to make new factories 
     // when we aren't doing the optimization.
     private static DocumentBuilder documentBuilder;
+    private static Class<XMLStreamReader> fastInfosetParserClass;
     static {
         try {
             documentBuilder = 
@@ -67,10 +73,17 @@
         } catch (ParserConfigurationException e) {
             throw new RuntimeException(e);
         }
+        try {
+               fastInfosetParserClass = 
(Class<XMLStreamReader>)ClassLoaderUtils.loadClass("com.sun.xml.fastinfoset.stax.StAXDocumentParser",
+                                                      
TunedDocumentLoader.class);
+        } catch (Throwable e) {
+               LOG.info("FastInfoset not found on classpath.  Disabling 
context load optimizations.");
+        }
     }
     private TransformerFactory transformerFactory;
     private SAXParserFactory saxParserFactory;
     private SAXParserFactory nsasaxParserFactory;
+    private XMLInputFactory xmlInputFactory;
     
     TunedDocumentLoader() {
         transformerFactory = TransformerFactory.newInstance();
@@ -93,6 +106,10 @@
         } catch (Throwable e) {
             //ignore
         }
+        if(fastInfosetParserClass == null) {
+            //fastinfoset not found, using any other Stax parser
+               xmlInputFactory = XMLInputFactory.newInstance();
+        }
     }
 
     @Override
@@ -141,7 +158,18 @@
         
         InputStream is = url.openStream();
         InputStream in = new BufferedInputStream(is);
-        XMLStreamReader staxReader = new StAXDocumentParser(in);
+        XMLStreamReader staxReader = null;
+        if(fastInfosetParserClass != null) {
+               try {
+                               staxReader = 
fastInfosetParserClass.getConstructor(InputStream.class).newInstance(in);
+                       } catch (Exception e) {
+                               ParserConfigurationException exception = new 
ParserConfigurationException("Unable to create FastInfoset StAXDocumentParser");
+                               exception.initCause(e);
+                               throw exception;
+                       }
+        } else {
+               staxReader = 
XMLInputFactory.newInstance().createXMLStreamReader(in);
+        }
         W3CDOMStreamWriter writer = new W3CDOMStreamWriter();
         StaxUtils.copy(staxReader, writer);
         in.close();


> Make use of ControlledValidationXmlBeanDefinitionReader optional depending 
> upon existence of FastInfoSet.jar
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: CXF-2397
>                 URL: https://issues.apache.org/jira/browse/CXF-2397
>             Project: CXF
>          Issue Type: Improvement
>          Components: Core
>    Affects Versions: 2.2.3
>            Reporter: Mike Youngstrom
>
> I work on a project where Classloader size and distribution size is rather 
> important.  So we're trying to keep our number of required dependencies to a 
> minimum.
> One area where we found this might be able to improve is in the use of 
> ControlledValidationXmlBeanDefinitionReader and its dependence on 
> FastInfoSet.  It would be nice if an application who didn't wish to benefit 
> from the improved startup time of ControlledValidationXmlBeanDefinitionReader 
> could not use it if they wished.
> I wonder if this could simply be a matter of checking in 
> BusApplicationContext.loadBeanDefinitions() if 
> com.sun.xml.fastinfoset.stax.StAXDocumentParser is on the classpath.  If it's 
> not then log a warning or an info about its absence and the potential 
> performance impact then simply use a regular XmlBeanDefinitionReader instead?
> Or perhaps in TunedDocumentLoader only use a 
> com.sun.xml.fastinfoset.stax.StAXDocumentParser if fastinfoset is on the 
> classpath.  Otherwise use a default stax implementation?
> This would allow me to make FastInfoSet an optional dependency in my project.
> Mike

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to