src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -27,22 +27,26 @@
 
 import java.util.logging.Logger;
 
 import javax.xml.parsers.SAXParser;
 import javax.xml.soap.SOAPException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stax.StAXSource;
 import javax.xml.transform.stream.StreamSource;
 
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 
+import com.sun.xml.internal.messaging.saaj.LazyEnvelopeSource;
 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
 import com.sun.xml.internal.messaging.saaj.util.*;
-
 import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer;
 
 /**
  * EnvelopeFactory creates SOAP Envelope objects using different
  * underlying implementations.

@@ -56,24 +60,77 @@
     private static ParserPool parserPool = new ParserPool(5);
 
     public static Envelope createEnvelope(Source src, SOAPPartImpl soapPart)
         throws SOAPException
     {
-        // Insert SAX filter to disallow Document Type Declarations since
-        // they are not legal in SOAP
-        SAXParser saxParser = null;
-        if (src instanceof StreamSource) {
             if (src instanceof JAXMStreamSource) {
                 try {
                     if (!SOAPPartImpl.lazyContentLength) {
                         ((JAXMStreamSource) src).reset();
                     }
                 } catch (java.io.IOException ioe) {
                     log.severe("SAAJ0515.source.reset.exception");
                     throw new SOAPExceptionImpl(ioe);
                 }
             }
+        if (src instanceof LazyEnvelopeSource) {
+          return lazy((LazyEnvelopeSource)src, soapPart);
+      }
+        if (soapPart.message.isLazySoapBodyParsing()) {
+            return parseEnvelopeStax(src, soapPart);
+        } else {
+            return parseEnvelopeSax(src, soapPart);
+        }
+    }
+
+    private static Envelope lazy(LazyEnvelopeSource src, SOAPPartImpl soapPart) throws SOAPException {
+        try {
+                StaxBridge staxBridge = new StaxLazySourceBridge(src, soapPart);
+                staxBridge.bridgeEnvelopeAndHeaders();
+            Envelope env = (Envelope) soapPart.getEnvelope();
+            env.setStaxBridge(staxBridge);
+            return env;
+        } catch (XMLStreamException e) {
+            throw new SOAPException(e);
+        }
+    }
+
+    static private XMLInputFactory xmlInputFactory = null;
+
+    private static Envelope parseEnvelopeStax(Source src, SOAPPartImpl soapPart)
+            throws SOAPException {
+        XMLStreamReader streamReader = null;
+        if (src instanceof StAXSource) {
+           streamReader = ((StAXSource) src).getXMLStreamReader();
+        }
+        try {
+            if (streamReader == null) {
+                if (xmlInputFactory == null) xmlInputFactory = XMLInputFactory.newInstance();
+                streamReader = xmlInputFactory.createXMLStreamReader(src);
+            }
+//            SaajStaxWriter saajWriter = new SaajStaxWriter(soapPart.message, soapPart.document);
+//            XMLStreamReaderToXMLStreamWriter readerWriterBridge = new XMLStreamReaderToXMLStreamWriter(
+//                    streamReader, saajWriter, soapPart.getSOAPNamespace());
+
+            StaxBridge readerWriterBridge = new StaxReaderBridge(streamReader, soapPart);
+            //bridge will stop reading at body element, and parse upon request, so save it
+            //on the envelope
+            readerWriterBridge.bridgeEnvelopeAndHeaders();
+
+            Envelope env = (Envelope) soapPart.getEnvelope();
+            env.setStaxBridge(readerWriterBridge);
+            return env;
+        } catch (Exception e) {
+            throw new SOAPException(e);
+        }
+    }
+    private static Envelope parseEnvelopeSax(Source src, SOAPPartImpl soapPart)
+            throws SOAPException {
+        // Insert SAX filter to disallow Document Type Declarations since
+        // they are not legal in SOAP
+        SAXParser saxParser = null;
+        if (src instanceof StreamSource) {
             try {
                 saxParser = parserPool.get();
             } catch (Exception e) {
                 log.severe("SAAJ0601.util.newSAXParser.exception");
                 throw new SOAPExceptionImpl(