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});