Author: veithen Date: Sat Jan 28 18:27:31 2012 New Revision: 1237134 URL: http://svn.apache.org/viewvc?rev=1237134&view=rev Log: AXIS-2863: Prevent the Oracle SAX parser (oracle.xml.parser.v2) from keeping a reference to DeserializationContext after the parser is released (actually until the parser is reused).
Added: axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/utils/DefaultErrorHandler.java (with props) Modified: axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializationContext.java axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializerImpl.java Modified: axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializationContext.java URL: http://svn.apache.org/viewvc/axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializationContext.java?rev=1237134&r1=1237133&r2=1237134&view=diff ============================================================================== --- axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializationContext.java (original) +++ axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializationContext.java Sat Jan 28 18:27:31 2012 @@ -25,6 +25,8 @@ import org.apache.axis.constants.Use; import org.apache.axis.attachments.Attachments; import org.apache.axis.description.TypeDesc; import org.apache.axis.soap.SOAPConstants; +import org.apache.axis.utils.DefaultEntityResolver; +import org.apache.axis.utils.DefaultErrorHandler; import org.apache.axis.utils.NSStack; import org.apache.axis.utils.XMLUtils; import org.apache.axis.utils.JavaUtils; @@ -42,12 +44,14 @@ import org.apache.axis.message.EnvelopeH import org.apache.axis.message.NullAttributes; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; import org.xml.sax.SAXException; import org.xml.sax.Locator; import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; import org.xml.sax.ext.LexicalHandler; import org.xml.sax.helpers.AttributesImpl; -import org.xml.sax.helpers.DefaultHandler; import javax.xml.namespace.QName; import javax.xml.parsers.SAXParser; @@ -62,8 +66,8 @@ import java.lang.reflect.Method; * an AXIS compliant DeserializationContext must extend the org.xml.sax.helpers.DefaultHandler. */ -public class DeserializationContext extends DefaultHandler - implements javax.xml.rpc.encoding.DeserializationContext, LexicalHandler { +public class DeserializationContext implements ContentHandler, DTDHandler, + javax.xml.rpc.encoding.DeserializationContext, LexicalHandler { protected static Log log = LogFactory.getLog(DeserializationContext.class.getName()); @@ -223,12 +227,24 @@ public class DeserializationContext exte if (inputSource != null) { SAXParser parser = XMLUtils.getSAXParser(); try { - parser.setProperty("http://xml.org/sax/properties/lexical-handler", this); - parser.parse(inputSource, this); + // We only set the DeserializationContext as ContentHandler and DTDHandler, but + // we use singletons for the EntityResolver and ErrorHandler. This reduces the risk + // that the SAX parser internally keeps a reference to the DeserializationContext + // after we release the parser. E.g. Oracle's SAX parser (oracle.xml.parser.v2) keeps a + // reference to the EntityResolver, although we reset the EntityResolver in + // XMLUtils#releaseSAXParser. That reference is only cleared when the parser is reused. + XMLReader reader = parser.getXMLReader(); + reader.setContentHandler(this); + reader.setEntityResolver(DefaultEntityResolver.INSTANCE); + reader.setErrorHandler(DefaultErrorHandler.INSTANCE); + reader.setDTDHandler(this); + + reader.setProperty("http://xml.org/sax/properties/lexical-handler", this); + reader.parse(inputSource); try { // cleanup - so that the parser can be reused. - parser.setProperty("http://xml.org/sax/properties/lexical-handler", nullLexicalHandler); + reader.setProperty("http://xml.org/sax/properties/lexical-handler", nullLexicalHandler); } catch (Exception e){ // Ignore. } @@ -1164,6 +1180,15 @@ public class DeserializationContext exte */ } + public void notationDecl(String name, String publicId, String systemId) throws SAXException { + // Do nothing; we never get here + } + + public void unparsedEntityDecl(String name, String publicId, String systemId, + String notationName) throws SAXException { + // Do nothing; we never get here + } + public void endDTD() throws SAXException { @@ -1208,12 +1233,6 @@ public class DeserializationContext exte recorder.comment(ch, start, length); } - public InputSource resolveEntity(String publicId, String systemId) - { - return XMLUtils.getEmptyInputSource(); - } - - /** We only need one instance of this dummy handler to set into the parsers. */ private static final NullLexicalHandler nullLexicalHandler = new NullLexicalHandler(); Modified: axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializerImpl.java URL: http://svn.apache.org/viewvc/axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializerImpl.java?rev=1237134&r1=1237133&r2=1237134&view=diff ============================================================================== --- axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializerImpl.java (original) +++ axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/encoding/DeserializerImpl.java Sat Jan 28 18:27:31 2012 @@ -29,7 +29,6 @@ import org.apache.axis.soap.SOAPConstant import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; import javax.xml.namespace.QName; import java.io.StringWriter; @@ -366,7 +365,7 @@ public class DeserializerImpl extends SO SAX2EventRecorder r = context.getRecorder(); context.setRecorder(null); - ((MessageElement)ref).publishToHandler((DefaultHandler) context); + ((MessageElement)ref).publishToHandler(context); context.setRecorder(r); } else { Added: axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/utils/DefaultErrorHandler.java URL: http://svn.apache.org/viewvc/axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/utils/DefaultErrorHandler.java?rev=1237134&view=auto ============================================================================== --- axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/utils/DefaultErrorHandler.java (added) +++ axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/utils/DefaultErrorHandler.java Sat Jan 28 18:27:31 2012 @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.axis.utils; + +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * Default {@link ErrorHandler} implementation. The implementation is identical to + * {@link DefaultHandler}, i.e. {@link ErrorHandler#fatalError(SAXParseException)} throws the + * exception passed as parameter, while the other methods do nothing. + * + * @author Andreas Veithen + */ +public class DefaultErrorHandler implements ErrorHandler { + /** + * The singleton instance. + */ + public static final DefaultErrorHandler INSTANCE = new DefaultErrorHandler(); + + private DefaultErrorHandler() {} + + public void warning(SAXParseException exception) throws SAXException { + } + + public void error(SAXParseException exception) throws SAXException { + } + + public void fatalError(SAXParseException exception) throws SAXException { + throw exception; + } +} Propchange: axis/axis1/java/trunk/axis/src/main/java/org/apache/axis/utils/DefaultErrorHandler.java ------------------------------------------------------------------------------ svn:eol-style = native