--- old/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java 2015-10-22 23:49:43.000000000 +0200 +++ new/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java 2015-10-22 23:49:43.000000000 +0200 @@ -32,6 +32,7 @@ import com.sun.xml.internal.messaging.saaj.util.ParserPool; import com.sun.xml.internal.messaging.saaj.util.RejectDoctypeSaxFilter; import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer; + import org.xml.sax.InputSource; import org.xml.sax.XMLReader; @@ -46,6 +47,9 @@ import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamSource; + +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.logging.Logger; /** @@ -53,6 +57,8 @@ * underlying implementations. */ public class EnvelopeFactory { + private static final String SAX_PARSER_POOL_SIZE_PROP_NAME = "com.sun.xml.internal.messaging.saaj.soap.saxParserPoolSize"; + private static final int DEFAULT_SAX_PARSER_POOL_SIZE = 5; protected static final Logger log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN, @@ -62,9 +68,22 @@ new ContextClassloaderLocal() { @Override protected ParserPool initialValue() throws Exception { - return new ParserPool(5); + Integer poolSize = AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public Integer run() { + try { + return Integer.getInteger( + SAX_PARSER_POOL_SIZE_PROP_NAME, + DEFAULT_SAX_PARSER_POOL_SIZE); + } catch (SecurityException se) { + return DEFAULT_SAX_PARSER_POOL_SIZE; + } + } + }); + return new ParserPool(poolSize); } - }; + }; public static Envelope createEnvelope(Source src, SOAPPartImpl soapPart) throws SOAPException @@ -132,51 +151,55 @@ } 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().get(); - } catch (Exception e) { - log.severe("SAAJ0601.util.newSAXParser.exception"); - throw new SOAPExceptionImpl( - "Couldn't get a SAX parser while constructing a envelope", - e); - } - InputSource is = SAXSource.sourceToInputSource(src); - if (is.getEncoding()== null && soapPart.getSourceCharsetEncoding() != null) { - is.setEncoding(soapPart.getSourceCharsetEncoding()); - } - XMLReader rejectFilter; - try { - rejectFilter = new RejectDoctypeSaxFilter(saxParser); - } catch (Exception ex) { - log.severe("SAAJ0510.soap.cannot.create.envelope"); - throw new SOAPExceptionImpl( - "Unable to create envelope from given source: ", - ex); - } - src = new SAXSource(rejectFilter, is); - } - try { - Transformer transformer = - EfficientStreamingTransformer.newTransformer(); - DOMResult result = new DOMResult(soapPart); - transformer.transform(src, result); + // Insert SAX filter to disallow Document Type Declarations since + // they are not legal in SOAP - Envelope env = (Envelope) soapPart.getEnvelope(); - return env; - } catch (Exception ex) { - if (ex instanceof SOAPVersionMismatchException) { - throw (SOAPVersionMismatchException) ex; - } - log.severe("SAAJ0511.soap.cannot.create.envelope"); - throw new SOAPExceptionImpl( - "Unable to create envelope from given source: ", - ex); + if (src instanceof StreamSource) { + try { + saxParser = parserPool.get().get(); + } catch (Exception e) { + log.severe("SAAJ0601.util.newSAXParser.exception"); + throw new SOAPExceptionImpl( + "Couldn't get a SAX parser while constructing a envelope", + e); + } + InputSource is = SAXSource.sourceToInputSource(src); + if (is.getEncoding()== null && soapPart.getSourceCharsetEncoding() != null) { + is.setEncoding(soapPart.getSourceCharsetEncoding()); + } + XMLReader rejectFilter; + try { + rejectFilter = new RejectDoctypeSaxFilter(saxParser); + } catch (Exception ex) { + log.severe("SAAJ0510.soap.cannot.create.envelope"); + throw new SOAPExceptionImpl( + "Unable to create envelope from given source: ", + ex); + } + src = new SAXSource(rejectFilter, is); + } + + try { + Transformer transformer = + EfficientStreamingTransformer.newTransformer(); + DOMResult result = new DOMResult(soapPart); + transformer.transform(src, result); + + Envelope env = (Envelope) soapPart.getEnvelope(); + return env; + } catch (Exception ex) { + if (ex instanceof SOAPVersionMismatchException) { + throw (SOAPVersionMismatchException) ex; + } + log.severe("SAAJ0511.soap.cannot.create.envelope"); + throw new SOAPExceptionImpl( + "Unable to create envelope from given source: ", + ex); + } } finally { + //no matter what condition occurs, always return the parser to the pool if (saxParser != null) { parserPool.get().returnParser(saxParser); }