You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2021/02/17 00:06:02 UTC

[cxf] branch 3.3.x-fixes updated: CXF-8422: Unclosed input streams after using org.apache.cxf.tools.wsdlto.WSDLToJava (#745)

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch 3.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/3.3.x-fixes by this push:
     new faae544  CXF-8422: Unclosed input streams after using org.apache.cxf.tools.wsdlto.WSDLToJava (#745)
faae544 is described below

commit faae544a8d4952d1649b151034c9410248143319
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Tue Feb 16 16:26:10 2021 -0500

    CXF-8422: Unclosed input streams after using org.apache.cxf.tools.wsdlto.WSDLToJava (#745)
    
    * CXF-8422: Unclosed input streams after using org.apache.cxf.tools.wsdlto.WSDLToJava
    
    * Fixing code review comments
    
    * Fixing code review comments
    
    * Addressing code review comments
    
    (cherry picked from commit 68d3587e0dbb4d782917b25a6c3df01b1e83c2a4)
---
 .../apache/cxf/catalog/OASISCatalogManager.java    |  4 +-
 .../java/org/apache/cxf/resource/URIResolver.java  | 10 ++-
 .../factory/AbstractServiceFactoryBean.java        | 12 ++--
 .../src/main/java/demo/jaxrs/client/Client.java    | 66 ++++++++++----------
 .../java/org/apache/cxf/jaxb/JAXBDataBinding.java  | 71 +++++++++++-----------
 .../cxf/endpoint/dynamic/DynamicClientFactory.java | 10 ++-
 .../tools/validator/internal/SchemaValidator.java  |  4 +-
 .../cxf/tools/wadlto/jaxb/CustomizationParser.java |  3 +-
 .../wsdlto/databinding/jaxb/JAXBDataBinding.java   |  3 +-
 .../wsdlto/frontend/jaxws/JAXWSContainer.java      | 12 ++--
 .../jaxws/customization/CustomizationParser.java   | 57 +++++++----------
 11 files changed, 122 insertions(+), 130 deletions(-)

diff --git a/core/src/main/java/org/apache/cxf/catalog/OASISCatalogManager.java b/core/src/main/java/org/apache/cxf/catalog/OASISCatalogManager.java
index 4d386f0..80cc890 100644
--- a/core/src/main/java/org/apache/cxf/catalog/OASISCatalogManager.java
+++ b/core/src/main/java/org/apache/cxf/catalog/OASISCatalogManager.java
@@ -99,10 +99,8 @@ public class OASISCatalogManager {
                 public String getResolvedEntity(String publicId, String systemId) {
                     String s = super.getResolvedEntity(publicId, systemId);
                     if (s != null && s.startsWith("classpath:")) {
-                        try {
-                            URIResolver r = new URIResolver(s);
+                        try (URIResolver r = new URIResolver(s)) {
                             if (r.isResolved()) {
-                                r.getInputStream().close();
                                 return r.getURL().toExternalForm();
                             }
                         } catch (IOException e) {
diff --git a/core/src/main/java/org/apache/cxf/resource/URIResolver.java b/core/src/main/java/org/apache/cxf/resource/URIResolver.java
index 8774245..30bc6a6 100644
--- a/core/src/main/java/org/apache/cxf/resource/URIResolver.java
+++ b/core/src/main/java/org/apache/cxf/resource/URIResolver.java
@@ -54,7 +54,7 @@ import org.apache.cxf.helpers.LoadingByteArrayOutputStream;
  * <li>If the classpath doesn't exist, try to create URL from the URI.</li>
  * </ul>
  */
-public class URIResolver {
+public class URIResolver implements AutoCloseable {
     private static final Logger LOG = LogUtils.getLogger(URIResolver.class);
 
     private Map<String, LoadingByteArrayOutputStream> cache = new HashMap<>();
@@ -450,4 +450,12 @@ public class URIResolver {
     public boolean isResolved() {
         return is != null;
     }
+    
+    @Override
+    public void close() throws IOException {
+        if (isResolved()) {
+            is.close();
+            unresolve();
+        }
+    }
 }
diff --git a/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java b/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java
index 5bce9d0..8edc53e 100644
--- a/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java
+++ b/core/src/main/java/org/apache/cxf/service/factory/AbstractServiceFactoryBean.java
@@ -133,16 +133,14 @@ public abstract class AbstractServiceFactoryBean {
         for (String l : schemaLocations) {
             URL url = rr.resolveResource(l, URL.class);
             if (url == null) {
-                URIResolver res;
-                try {
-                    res = new URIResolver(l);
+                try (URIResolver res = new URIResolver(l)) {
+                    if (!res.isResolved()) {
+                        throw new ServiceConstructionException(new Message("INVALID_SCHEMA_URL", LOG, l));
+                    }
+                    url = res.getURL();
                 } catch (IOException e) {
                     throw new ServiceConstructionException(new Message("INVALID_SCHEMA_URL", LOG, l), e);
                 }
-                if (!res.isResolved()) {
-                    throw new ServiceConstructionException(new Message("INVALID_SCHEMA_URL", LOG, l));
-                }
-                url = res.getURL();
             }
             Document d;
             try {
diff --git a/distribution/src/main/release/samples/jax_rs/basic/src/main/java/demo/jaxrs/client/Client.java b/distribution/src/main/release/samples/jax_rs/basic/src/main/java/demo/jaxrs/client/Client.java
index 3cb40cb..e2e809f 100644
--- a/distribution/src/main/release/samples/jax_rs/basic/src/main/java/demo/jaxrs/client/Client.java
+++ b/distribution/src/main/release/samples/jax_rs/basic/src/main/java/demo/jaxrs/client/Client.java
@@ -67,44 +67,46 @@ public final class Client {
         System.out.println("Sent HTTP PUT request to update customer info");
         Client client = new Client();
         String inputFile = client.getClass().getResource("/update_customer.xml").getFile();
-        URIResolver resolver = new URIResolver(inputFile);
-        File input = new File(resolver.getURI());
-
-        HttpPut put = new HttpPut("http://localhost:9000/customerservice/customers");
-        put.setEntity(new FileEntity(input, ContentType.TEXT_XML));
-        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
-        try {
-            CloseableHttpResponse response = httpClient.execute(put);
-            System.out.println("Response status code: " + response.getStatusLine().getStatusCode());
-            System.out.println("Response body: ");
-            System.out.println(EntityUtils.toString(response.getEntity()));
-        } finally {
-            // Release current connection to the connection pool once you are
-            // done
-            put.releaseConnection();
+        try (URIResolver resolver = new URIResolver(inputFile)) {
+            File input = new File(resolver.getURI());
+    
+            HttpPut put = new HttpPut("http://localhost:9000/customerservice/customers");
+            put.setEntity(new FileEntity(input, ContentType.TEXT_XML));
+            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+            try {
+                CloseableHttpResponse response = httpClient.execute(put);
+                System.out.println("Response status code: " + response.getStatusLine().getStatusCode());
+                System.out.println("Response body: ");
+                System.out.println(EntityUtils.toString(response.getEntity()));
+            } finally {
+                // Release current connection to the connection pool once you are
+                // done
+                put.releaseConnection();
+            }
         }
 
         // Sent HTTP POST request to add customer
         System.out.println("\n");
         System.out.println("Sent HTTP POST request to add customer");
         inputFile = client.getClass().getResource("/add_customer.xml").getFile();
-        resolver = new URIResolver(inputFile);
-        input = new File(resolver.getURI());
-
-        HttpPost post = new HttpPost("http://localhost:9000/customerservice/customers");
-        post.addHeader("Accept", "text/xml");
-        post.setEntity(new FileEntity(input, ContentType.TEXT_XML));
-        httpClient = HttpClientBuilder.create().build();
-
-        try {
-            CloseableHttpResponse response = httpClient.execute(post);
-            System.out.println("Response status code: " + response.getStatusLine().getStatusCode());
-            System.out.println("Response body: ");
-            System.out.println(EntityUtils.toString(response.getEntity()));
-        } finally {
-            // Release current connection to the connection pool once you are
-            // done
-            post.releaseConnection();
+        try (URIResolver resolver = new URIResolver(inputFile)) {
+            File input = new File(resolver.getURI());
+    
+            HttpPost post = new HttpPost("http://localhost:9000/customerservice/customers");
+            post.addHeader("Accept", "text/xml");
+            post.setEntity(new FileEntity(input, ContentType.TEXT_XML));
+            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+    
+            try {
+                CloseableHttpResponse response = httpClient.execute(post);
+                System.out.println("Response status code: " + response.getStatusLine().getStatusCode());
+                System.out.println("Response body: ");
+                System.out.println(EntityUtils.toString(response.getEntity()));
+            } finally {
+                // Release current connection to the connection pool once you are
+                // done
+                post.releaseConnection();
+            }
         }
 
         System.out.println("\n");
diff --git a/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java b/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
index df435cd..2d842a1 100644
--- a/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
+++ b/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
@@ -149,42 +149,45 @@ public class JAXBDataBinding extends AbstractInterceptorProvidingDataBinding
     }
     private static final Map<String, DOMResult> BUILT_IN_SCHEMAS = new HashMap<>();
     static {
-        URIResolver resolver = new URIResolver();
-        try {
-            resolver.resolve("", "classpath:/schemas/wsdl/ws-addr-wsdl.xsd", JAXBDataBinding.class);
-            if (resolver.isResolved()) {
-                resolver.getInputStream().close();
-                DOMResult dr = new DelayedDOMResult(resolver.getURL(),
-                                                    "classpath:/schemas/wsdl/ws-addr-wsdl.xsd",
-                                                    "http://www.w3.org/2005/02/addressing/wsdl");
-                BUILT_IN_SCHEMAS.put("http://www.w3.org/2005/02/addressing/wsdl", dr);
-                resolver.unresolve();
+        try (URIResolver resolver = new URIResolver()) {
+            try {
+                resolver.resolve("", "classpath:/schemas/wsdl/ws-addr-wsdl.xsd", JAXBDataBinding.class);
+                if (resolver.isResolved()) {
+                    resolver.getInputStream().close();
+                    DOMResult dr = new DelayedDOMResult(resolver.getURL(),
+                                                        "classpath:/schemas/wsdl/ws-addr-wsdl.xsd",
+                                                        "http://www.w3.org/2005/02/addressing/wsdl");
+                    BUILT_IN_SCHEMAS.put("http://www.w3.org/2005/02/addressing/wsdl", dr);
+                    resolver.unresolve();
+                }
+            } catch (Exception e) {
+                //IGNORE
             }
-        } catch (Exception e) {
-            //IGNORE
-        }
-        try {
-            resolver.resolve("", "classpath:/schemas/wsdl/ws-addr.xsd", JAXBDataBinding.class);
-            if (resolver.isResolved()) {
-                resolver.getInputStream().close();
-                DOMResult dr = new DelayedDOMResult(resolver.getURL(),
-                                                    "classpath:/schemas/wsdl/ws-addr.xsd",
-                                                    "http://www.w3.org/2005/08/addressing");
-                BUILT_IN_SCHEMAS.put("http://www.w3.org/2005/08/addressing", dr);
-                resolver.unresolve();
+            try {
+                resolver.resolve("", "classpath:/schemas/wsdl/ws-addr.xsd", JAXBDataBinding.class);
+                if (resolver.isResolved()) {
+                    resolver.getInputStream().close();
+                    DOMResult dr = new DelayedDOMResult(resolver.getURL(),
+                                                        "classpath:/schemas/wsdl/ws-addr.xsd",
+                                                        "http://www.w3.org/2005/08/addressing");
+                    BUILT_IN_SCHEMAS.put("http://www.w3.org/2005/08/addressing", dr);
+                    resolver.unresolve();
+                }
+            } catch (Exception e) {
+                //IGNORE
             }
-        } catch (Exception e) {
-            //IGNORE
-        }
-        try {
-            resolver.resolve("", "classpath:/schemas/wsdl/wsrm.xsd", JAXBDataBinding.class);
-            if (resolver.isResolved()) {
-                resolver.getInputStream().close();
-                DOMResult dr = new DelayedDOMResult(resolver.getURL(),
-                                                    "classpath:/schemas/wsdl/wsrm.xsd",
-                                                    "http://schemas.xmlsoap.org/ws/2005/02/rm");
-                BUILT_IN_SCHEMAS.put("http://schemas.xmlsoap.org/ws/2005/02/rm", dr);
-                resolver.unresolve();
+            try {
+                resolver.resolve("", "classpath:/schemas/wsdl/wsrm.xsd", JAXBDataBinding.class);
+                if (resolver.isResolved()) {
+                    resolver.getInputStream().close();
+                    DOMResult dr = new DelayedDOMResult(resolver.getURL(),
+                                                        "classpath:/schemas/wsdl/wsrm.xsd",
+                                                        "http://schemas.xmlsoap.org/ws/2005/02/rm");
+                    BUILT_IN_SCHEMAS.put("http://schemas.xmlsoap.org/ws/2005/02/rm", dr);
+                    resolver.unresolve();
+                }
+            } catch (Exception e) {
+                //IGNORE
             }
         } catch (Exception e) {
             //IGNORE
diff --git a/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java b/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java
index 777ff33..568186b 100644
--- a/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java
+++ b/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java
@@ -727,16 +727,15 @@ public class DynamicClientFactory {
     }
 
     private URL composeUrl(String s) {
-        try {
-            URIResolver resolver = new URIResolver(null, s, getClass());
-
+        try (URIResolver resolver = new URIResolver(null, s, getClass())) {
             if (resolver.isResolved()) {
                 return resolver.getURI().toURL();
             }
-            throw new ServiceConstructionException(new Message("COULD_NOT_RESOLVE_URL", LOG, s));
         } catch (IOException e) {
             throw new ServiceConstructionException(new Message("COULD_NOT_RESOLVE_URL", LOG, s), e);
         }
+        
+        throw new ServiceConstructionException(new Message("COULD_NOT_RESOLVE_URL", LOG, s));
     }
 
     static class InnerErrorListener {
@@ -922,8 +921,7 @@ public class DynamicClientFactory {
         }
 
 
-        try {
-            URIResolver resolver = new URIResolver(base, target);
+        try (URIResolver resolver = new URIResolver(base, target)) {
             if (resolver.isResolved()) {
                 target = resolver.getURI().toString();
             }
diff --git a/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java b/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java
index e58dc1a..e8bc050 100644
--- a/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java
+++ b/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java
@@ -402,12 +402,12 @@ class SchemaResourceResolver implements LSResourceResolver {
             }
         }
 
-        URIResolver resolver;
         try {
             msg = new Message("RESOLVE_FROM_LOCAL", LOG, localFile);
             LOG.log(Level.FINE, msg.toString());
 
-            resolver = new URIResolver(localFile);
+            @SuppressWarnings("resource")
+            final URIResolver resolver = new URIResolver(localFile);
             if (resolver.isResolved()) {
                 lsin = new LSInputImpl();
                 lsin.setSystemId(localFile);
diff --git a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxb/CustomizationParser.java b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxb/CustomizationParser.java
index cf35e3e..37e766e 100644
--- a/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxb/CustomizationParser.java
+++ b/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxb/CustomizationParser.java
@@ -117,8 +117,7 @@ public final class CustomizationParser {
     private void addBinding(String bindingFile) throws XMLStreamException {
 
         Element root = null;
-        try {
-            URIResolver resolver = new URIResolver(bindingFile);
+        try (URIResolver resolver = new URIResolver(bindingFile)) {
             root = StaxUtils.read(resolver.getInputStream()).getDocumentElement();
         } catch (Exception e1) {
             Message msg = new Message("CAN_NOT_READ_AS_ELEMENT", LOG, new Object[] {bindingFile});
diff --git a/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java b/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java
index 4f159cc..0b5741a 100644
--- a/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java
+++ b/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java
@@ -1304,8 +1304,7 @@ public class JAXBDataBinding implements DataBindingProfile {
         }
 
 
-        try {
-            URIResolver resolver = new URIResolver(base, target);
+        try (URIResolver resolver = new URIResolver(base, target)) {
             if (resolver.isResolved()) {
                 target = resolver.getURI().toString();
             }
diff --git a/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/JAXWSContainer.java b/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/JAXWSContainer.java
index 71cdeea..f2289b0 100644
--- a/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/JAXWSContainer.java
+++ b/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/JAXWSContainer.java
@@ -70,17 +70,15 @@ public class JAXWSContainer extends WSDLToJavaContainer {
         super.validate(env);
         if (env.containsKey(ToolConstants.CFG_BINDING)) {
             String[] bindings = (String[])env.get(ToolConstants.CFG_BINDING);
-            URIResolver resolver = null;
             for (int i = 0; i < bindings.length; i++) {
-                try {
-                    resolver = new URIResolver(bindings[i]);
+                try (URIResolver resolver = new URIResolver(bindings[i])) {
+                    if (!resolver.isResolved()) {
+                        Message msg = new Message("FILE_NOT_EXIST", LOG, bindings[i]);
+                        throw new ToolException(msg);
+                    }
                 } catch (IOException ioe) {
                     throw new ToolException(ioe);
                 }
-                if (!resolver.isResolved()) {
-                    Message msg = new Message("FILE_NOT_EXIST", LOG, bindings[i]);
-                    throw new ToolException(msg);
-                }
             }
             env.put(ToolConstants.CFG_BINDING, bindings);
         }
diff --git a/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java b/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java
index d2e799b..3dfe73f 100644
--- a/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java
+++ b/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java
@@ -20,7 +20,6 @@ package org.apache.cxf.tools.wsdlto.frontend.jaxws.customization;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
@@ -140,39 +139,31 @@ public final class CustomizationParser {
         if (uri.equals(wsdlURL) && wsdlNode != null) {
             return wsdlNode;
         }
-        Document doc = null;
-        InputStream ins = null;
 
-        try {
-            URIResolver resolver = new URIResolver(uri);
-            ins = resolver.getInputStream();
+        Document doc = null;
+        try (URIResolver resolver = new URIResolver(uri)) {
+            if (!resolver.isResolved()) {
+                return null;
+            }
+            
+            XMLStreamReader reader = null;
+            try {   //NOPMD
+                reader = StaxUtils.createXMLStreamReader(uri, resolver.getInputStream());
+                doc = StaxUtils.read(reader, true);
+            } catch (Exception e) {
+                Message msg = new Message("CAN_NOT_READ_AS_ELEMENT", LOG, new Object[] {uri});
+                throw new ToolException(msg, e);
+            } finally {
+                try {
+                    StaxUtils.close(reader);
+                } catch (XMLStreamException e) {
+                    //ignore
+                }
+            }
         } catch (IOException e1) {
             return null;
         }
-
-        if (ins == null) {
-            return null;
-        }
-
-        XMLStreamReader reader = null;
-        try {   //NOPMD
-            reader = StaxUtils.createXMLStreamReader(uri, ins);
-            doc = StaxUtils.read(reader, true);
-        } catch (Exception e) {
-            Message msg = new Message("CAN_NOT_READ_AS_ELEMENT", LOG, new Object[] {uri});
-            throw new ToolException(msg, e);
-        } finally {
-            try {
-                StaxUtils.close(reader);
-            } catch (XMLStreamException e) {
-                //ignore
-            }
-            try {
-                ins.close();
-            } catch (IOException ex) {
-                //ignore
-            }
-        }
+        
         try {
             doc.setDocumentURI(uri);
         } catch (Exception ex) {
@@ -486,10 +477,8 @@ public final class CustomizationParser {
 
         Element root = null;
         XMLStreamReader xmlReader = null;
-        try {
-            URIResolver resolver = new URIResolver(bindingFile);
-            xmlReader = StaxUtils.createXMLStreamReader(resolver.getURI().toString(),
-                                                                     resolver.getInputStream());
+        try (URIResolver resolver = new URIResolver(bindingFile)) {
+            xmlReader = StaxUtils.createXMLStreamReader(resolver.getURI().toString(), resolver.getInputStream());
             root = StaxUtils.read(xmlReader, true).getDocumentElement();
         } catch (Exception e1) {
             Message msg = new Message("CAN_NOT_READ_AS_ELEMENT", LOG, new Object[] {bindingFile});