< prev index next >
src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java
Print this page
@@ -30,10 +30,11 @@
import com.sun.xml.internal.messaging.saaj.util.JAXMStreamSource;
import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
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;
import javax.xml.parsers.SAXParser;
import javax.xml.soap.SOAPException;
@@ -44,27 +45,45 @@
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 java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.logging.Logger;
/**
* EnvelopeFactory creates SOAP Envelope objects using different
* 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,
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
private static ContextClassloaderLocal<ParserPool> parserPool =
new ContextClassloaderLocal<ParserPool>() {
@Override
protected ParserPool initialValue() throws Exception {
- return new ParserPool(5);
+ Integer poolSize = AccessController.doPrivileged(
+ new PrivilegedAction<Integer>() {
+ @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
@@ -130,13 +149,15 @@
throw new SOAPException(e);
}
}
private static Envelope parseEnvelopeSax(Source src, SOAPPartImpl soapPart)
throws SOAPException {
+ SAXParser saxParser = null;
+ try {
// 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");
@@ -174,11 +195,13 @@
}
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);
}
}
}
< prev index next >