You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/09/27 17:55:29 UTC

svn commit: r1391068 - in /cxf/trunk: api/src/main/java/org/apache/cxf/interceptor/ api/src/main/java/org/apache/cxf/staxutils/ rt/core/src/main/java/org/apache/cxf/wsdl11/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/

Author: dkulp
Date: Thu Sep 27 15:55:28 2012
New Revision: 1391068

URL: http://svn.apache.org/viewvc?rev=1391068&view=rev
Log:
[CXF-4523] Close the XMLStreamReaders
Modified patch from  Ivan/xuhaihong applied

Added:
    cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInEndingInterceptor.java
Modified:
    cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java
    cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInInterceptor.java
    cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java
    cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLManagerImpl.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java?rev=1391068&r1=1391067&r2=1391068&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java Thu Sep 27 15:55:28 2012
@@ -37,7 +37,7 @@ import org.apache.cxf.phase.Phase;
  */
 public class FIStaxInInterceptor extends AbstractPhaseInterceptor<Message> {
     public static final String FI_GET_SUPPORTED = "org.apache.cxf.fastinfoset.get.supported";
-
+    
     public FIStaxInInterceptor() {
         this(Phase.POST_STREAM);
     }
@@ -70,6 +70,8 @@ public class FIStaxInInterceptor extends
             && message.getContent(InputStream.class) != null
             && message.getContent(XMLStreamReader.class) == null) {
             message.setContent(XMLStreamReader.class, getParser(message.getContent(InputStream.class)));
+            //add the StaxInEndingInterceptor which will close the reader
+            message.getInterceptorChain().add(StaxInEndingInterceptor.INSTANCE);
             
             ct = ct.replace("fastinfoset", "xml");
             if (ct.contains("application/xml")) {

Added: cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInEndingInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInEndingInterceptor.java?rev=1391068&view=auto
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInEndingInterceptor.java (added)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInEndingInterceptor.java Thu Sep 27 15:55:28 2012
@@ -0,0 +1,48 @@
+/**
+ * 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.cxf.interceptor;
+
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.staxutils.StaxUtils;
+
+public class StaxInEndingInterceptor extends AbstractPhaseInterceptor<Message> {
+    //certain usages of CXF may require the Stax stream to remain open (example: streaming the stax stuff
+    //directly to the client applications).  Provide a flag to turn off.
+    public static final String STAX_IN_NOCLOSE = StaxInEndingInterceptor.class.getName() + ".dontClose";
+    
+    public static final StaxInEndingInterceptor INSTANCE = new StaxInEndingInterceptor();
+    
+    public StaxInEndingInterceptor() {
+        super(Phase.POST_INVOKE);
+    }
+
+    public void handleMessage(Message message) throws Fault {
+        XMLStreamReader xtr = message.getContent(XMLStreamReader.class);
+        if (xtr != null && !MessageUtils.getContextualBoolean(message, STAX_IN_NOCLOSE, false)) {
+            StaxUtils.close(xtr);
+            message.removeContent(XMLStreamReader.class);
+        }
+    }
+}

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInInterceptor.java?rev=1391068&r1=1391067&r2=1391068&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInInterceptor.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxInInterceptor.java Thu Sep 27 15:55:28 2012
@@ -46,9 +46,10 @@ import org.apache.cxf.staxutils.StaxUtil
  * Creates an XMLStreamReader from the InputStream on the Message.
  */
 public class StaxInInterceptor extends AbstractPhaseInterceptor<Message> {
+    
     private static final Logger LOG = LogUtils.getL7dLogger(StaxInInterceptor.class);    
 
-    private static Map<Object, XMLInputFactory> factories = new HashMap<Object, XMLInputFactory>();
+    private static Map<Object, XMLInputFactory> factories = new HashMap<Object, XMLInputFactory>();        
 
     public StaxInInterceptor() {
         super(Phase.POST_STREAM);
@@ -126,6 +127,7 @@ public class StaxInInterceptor extends A
         }
 
         message.setContent(XMLStreamReader.class, xreader);
+        message.getInterceptorChain().add(StaxInEndingInterceptor.INSTANCE);
     }
 
     public static XMLInputFactory getXMLInputFactory(Message m) throws Fault {

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java?rev=1391068&r1=1391067&r2=1391068&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/StaxOutEndingInterceptor.java Thu Sep 27 15:55:28 2012
@@ -29,6 +29,7 @@ import org.apache.cxf.common.i18n.Bundle
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.AbstractPhaseInterceptor;
 import org.apache.cxf.phase.Phase;
+import org.apache.cxf.staxutils.StaxUtils;
 
 public class StaxOutEndingInterceptor extends AbstractPhaseInterceptor<Message> {
 
@@ -51,9 +52,12 @@ public class StaxOutEndingInterceptor ex
         try {
             XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
             if (xtw != null) {
-                xtw.writeEndDocument();
-                xtw.flush();
-                xtw.close();
+                try {
+                    xtw.writeEndDocument();
+                    xtw.flush();
+                } finally {
+                    StaxUtils.close(xtw);
+                }                
             }
        
             OutputStream os = (OutputStream)message.get(outStreamHolder);

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/StaxUtils.java?rev=1391068&r1=1391067&r2=1391068&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/StaxUtils.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/StaxUtils.java Thu Sep 27 15:55:28 2012
@@ -1588,5 +1588,25 @@ public final class StaxUtils {
         writer.flush();
         return sw.toString();
     }
+    
+    public static void close(XMLStreamReader reader) {
+        if (reader != null) {
+            try {
+                reader.close();
+            } catch (Exception e) {
+                //ignore
+            }
+        }
+    }
+    
+    public static void close(XMLStreamWriter writer) {
+        if (writer != null) {
+            try {
+                writer.close();
+            } catch (Exception e) {
+                //ignore
+            }
+        }
+    }
 
 }

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLManagerImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLManagerImpl.java?rev=1391068&r1=1391067&r2=1391068&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLManagerImpl.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLManagerImpl.java Thu Sep 27 15:55:28 2012
@@ -43,6 +43,7 @@ import javax.wsdl.factory.WSDLFactory;
 import javax.wsdl.xml.WSDLReader;
 import javax.xml.bind.JAXBException;
 import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -227,8 +228,10 @@ public class WSDLManagerImpl implements 
         Definition def = null;
         if (src.getByteStream() != null || src.getCharacterStream() != null) {
             Document doc;
+            XMLStreamReader xmlReader = null;
             try {
-                doc = StaxUtils.read(StaxUtils.createXMLStreamReader(src), true);
+                xmlReader = StaxUtils.createXMLStreamReader(src);
+                doc = StaxUtils.read(xmlReader, true);
                 if (src.getSystemId() != null) {
                     try {
                         doc.setDocumentURI(new String(src.getSystemId()));
@@ -238,6 +241,8 @@ public class WSDLManagerImpl implements 
                 }
             } catch (Exception e) {
                 throw new WSDLException(WSDLException.PARSER_ERROR, e.getMessage(), e);
+            } finally {
+                StaxUtils.close(xmlReader);
             }
             def = reader.readWSDL(wsdlLocator, doc.getDocumentElement());
         } else {

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=1391068&r1=1391067&r2=1391068&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Thu Sep 27 15:55:28 2012
@@ -63,6 +63,7 @@ import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.interceptor.StaxInEndingInterceptor;
 import org.apache.cxf.jaxrs.client.spec.ClientRequestFilterInterceptor;
 import org.apache.cxf.jaxrs.client.spec.ClientResponseFilterInterceptor;
 import org.apache.cxf.jaxrs.impl.MetadataMap;
@@ -862,6 +863,8 @@ public abstract class AbstractClient imp
         exchange.put(MessageObserver.class, new ClientMessageObserver(cfg));
         exchange.put(Endpoint.class, cfg.getConduitSelector().getEndpoint());
         exchange.put("org.apache.cxf.http.no_io_exceptions", true);
+        //REVISIT - when response handling is actually put onto the in chain, this will likely not be needed
+        exchange.put(StaxInEndingInterceptor.STAX_IN_NOCLOSE, Boolean.TRUE);
         m.setExchange(exchange);
         return exchange;
     }