You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by fl...@apache.org on 2017/02/06 20:10:53 UTC
karaf git commit: [KARAF-4979] fixes resource leaks in UrlLoader &
StaxParser
Repository: karaf
Updated Branches:
refs/heads/master 868c68524 -> 264cd4e2a
[KARAF-4979] fixes resource leaks in UrlLoader & StaxParser
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/264cd4e2
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/264cd4e2
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/264cd4e2
Branch: refs/heads/master
Commit: 264cd4e2ae9d8cb6b8410a597cc5ee981c374694
Parents: 868c685
Author: Fabian Lange <la...@gmail.com>
Authored: Mon Feb 6 21:09:44 2017 +0100
Committer: Fabian Lange <la...@gmail.com>
Committed: Mon Feb 6 21:09:53 2017 +0100
----------------------------------------------------------------------
.../internal/repository/StaxParser.java | 160 ++++++++++---------
.../features/internal/repository/UrlLoader.java | 22 +--
2 files changed, 97 insertions(+), 85 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/264cd4e2/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
index 5359fb4..effbce3 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
@@ -89,33 +89,37 @@ public final class StaxParser {
public static void write(XmlRepository repository, Writer os) throws XMLStreamException {
XMLStreamWriter writer = getOutputFactory().createXMLStreamWriter(os);
- writer.writeStartDocument();
- writer.setDefaultNamespace(REPOSITORY_NAMESPACE);
- // repository element
- writer.writeStartElement(REPOSITORY_NAMESPACE, REPOSITORY);
- writer.writeAttribute("xmlns", REPOSITORY_NAMESPACE);
- writer.writeAttribute(REPO_NAME, repository.name);
- writer.writeAttribute(INCREMENT, Long.toString(repository.increment));
- // referrals
- for (Referral referral : repository.referrals) {
- writer.writeStartElement(REPOSITORY_NAMESPACE, REFERRAL);
- writer.writeAttribute(DEPTH, Integer.toString(referral.depth));
- writer.writeAttribute(URL, referral.url);
- writer.writeEndElement();
- }
- // resources
- for (Resource resource : repository.resources) {
- writer.writeStartElement(REPOSITORY_NAMESPACE, RESOURCE);
- for (Capability cap : resource.getCapabilities(null)) {
- writeClause(writer, CAPABILITY, cap.getNamespace(), cap.getDirectives(), cap.getAttributes());
+ try {
+ writer.writeStartDocument();
+ writer.setDefaultNamespace(REPOSITORY_NAMESPACE);
+ // repository element
+ writer.writeStartElement(REPOSITORY_NAMESPACE, REPOSITORY);
+ writer.writeAttribute("xmlns", REPOSITORY_NAMESPACE);
+ writer.writeAttribute(REPO_NAME, repository.name);
+ writer.writeAttribute(INCREMENT, Long.toString(repository.increment));
+ // referrals
+ for (Referral referral : repository.referrals) {
+ writer.writeStartElement(REPOSITORY_NAMESPACE, REFERRAL);
+ writer.writeAttribute(DEPTH, Integer.toString(referral.depth));
+ writer.writeAttribute(URL, referral.url);
+ writer.writeEndElement();
}
- for (Requirement req : resource.getRequirements(null)) {
- writeClause(writer, REQUIREMENT, req.getNamespace(), req.getDirectives(), req.getAttributes());
+ // resources
+ for (Resource resource : repository.resources) {
+ writer.writeStartElement(REPOSITORY_NAMESPACE, RESOURCE);
+ for (Capability cap : resource.getCapabilities(null)) {
+ writeClause(writer, CAPABILITY, cap.getNamespace(), cap.getDirectives(), cap.getAttributes());
+ }
+ for (Requirement req : resource.getRequirements(null)) {
+ writeClause(writer, REQUIREMENT, req.getNamespace(), req.getDirectives(), req.getAttributes());
+ }
+ writer.writeEndElement();
}
- writer.writeEndElement();
+ writer.writeEndDocument();
+ writer.flush();
+ } finally {
+ writer.close();
}
- writer.writeEndDocument();
- writer.flush();
}
private static void writeClause(XMLStreamWriter writer, String element, String namespace, Map<String, String> directives, Map<String, Object> attributes) throws XMLStreamException {
@@ -189,63 +193,67 @@ public final class StaxParser {
public static XmlRepository parse(URI repositoryUrl, InputStream is, XmlRepository previous) throws XMLStreamException {
XMLStreamReader reader = getInputFactory().createXMLStreamReader(is);
- int event = reader.nextTag();
- if (event != START_ELEMENT || !REPOSITORY.equals(reader.getLocalName())) {
- throw new IllegalStateException("Expected element 'repository' at the root of the document");
- }
- XmlRepository repo = new XmlRepository();
- for (int i = 0, nb = reader.getAttributeCount(); i < nb; i++) {
- String attrName = reader.getAttributeLocalName(i);
- String attrValue = reader.getAttributeValue(i);
- switch (attrName) {
- case REPO_NAME:
- repo.name = attrValue;
- break;
- case INCREMENT:
- repo.increment = Long.parseLong(attrValue);
- break;
- default:
- throw new IllegalStateException("Unexpected attribute '" + attrName + "'");
+ try {
+ int event = reader.nextTag();
+ if (event != START_ELEMENT || !REPOSITORY.equals(reader.getLocalName())) {
+ throw new IllegalStateException("Expected element 'repository' at the root of the document");
}
- }
- if (previous != null && repo.increment == previous.increment) {
- return previous;
- }
- while ((event = reader.nextTag()) == START_ELEMENT) {
- String element = reader.getLocalName();
- switch (element) {
- case REFERRAL:
- Referral referral = new Referral();
- for (int i = 0, nb = reader.getAttributeCount(); i < nb; i++) {
- String attrName = reader.getAttributeLocalName(i);
- String attrValue = reader.getAttributeValue(i);
- switch (attrName) {
- case DEPTH:
- referral.depth = Integer.parseInt(attrValue);
- break;
- case URL:
- referral.url = attrValue;
- break;
- default:
- throw new IllegalStateException("Unexpected attribute '" + attrName + "'");
- }
+ XmlRepository repo = new XmlRepository();
+ for (int i = 0, nb = reader.getAttributeCount(); i < nb; i++) {
+ String attrName = reader.getAttributeLocalName(i);
+ String attrValue = reader.getAttributeValue(i);
+ switch (attrName) {
+ case REPO_NAME:
+ repo.name = attrValue;
+ break;
+ case INCREMENT:
+ repo.increment = Long.parseLong(attrValue);
+ break;
+ default:
+ throw new IllegalStateException("Unexpected attribute '" + attrName + "'");
}
- if (referral.url == null) {
- throw new IllegalStateException("Expected attribute '" + URL + "'");
+ }
+ if (previous != null && repo.increment == previous.increment) {
+ return previous;
+ }
+ while ((event = reader.nextTag()) == START_ELEMENT) {
+ String element = reader.getLocalName();
+ switch (element) {
+ case REFERRAL:
+ Referral referral = new Referral();
+ for (int i = 0, nb = reader.getAttributeCount(); i < nb; i++) {
+ String attrName = reader.getAttributeLocalName(i);
+ String attrValue = reader.getAttributeValue(i);
+ switch (attrName) {
+ case DEPTH:
+ referral.depth = Integer.parseInt(attrValue);
+ break;
+ case URL:
+ referral.url = attrValue;
+ break;
+ default:
+ throw new IllegalStateException("Unexpected attribute '" + attrName + "'");
+ }
+ }
+ if (referral.url == null) {
+ throw new IllegalStateException("Expected attribute '" + URL + "'");
+ }
+ repo.referrals.add(referral);
+ sanityCheckEndElement(reader, reader.nextTag(), REFERRAL);
+ break;
+ case RESOURCE:
+ repo.resources.add(parseResource(repositoryUrl, reader));
+ break;
+ default:
+ throw new IllegalStateException("Unsupported element '" + element + "'. Expected 'referral' or 'resource'");
}
- repo.referrals.add(referral);
- sanityCheckEndElement(reader, reader.nextTag(), REFERRAL);
- break;
- case RESOURCE:
- repo.resources.add(parseResource(repositoryUrl, reader));
- break;
- default:
- throw new IllegalStateException("Unsupported element '" + element + "'. Expected 'referral' or 'resource'");
}
+ // Sanity check
+ sanityCheckEndElement(reader, event, REPOSITORY);
+ return repo;
+ } finally {
+ reader.close();
}
- // Sanity check
- sanityCheckEndElement(reader, event, REPOSITORY);
- return repo;
}
private static void sanityCheckEndElement(XMLStreamReader reader, int event, String element) {
http://git-wip-us.apache.org/repos/asf/karaf/blob/264cd4e2/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
index ec0ab92..48552fb 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
@@ -76,22 +76,26 @@ public abstract class UrlLoader {
lastChecked = time;
return false;
}
- try (
- BufferedInputStream bis = new BufferedInputStream(connection.getInputStream())
- ) {
+ InputStream is = null;
+ try {
+ is = new BufferedInputStream(connection.getInputStream());
// Auto-detect gzipped streams
- InputStream is = bis;
- bis.mark(512);
- int b0 = bis.read();
- int b1 = bis.read();
- bis.reset();
+ is.mark(512);
+ int b0 = is.read();
+ int b1 = is.read();
+ is.reset();
if (b0 == 0x1f && b1 == 0x8b) {
- is = new GZIPInputStream(bis);
+ is = new GZIPInputStream(is);
}
boolean r = doRead(is);
lastModified = lm;
lastChecked = time;
return r;
+ } finally {
+ // cannot be use try-with-resources, as it would not close GZIPInpuStream
+ if (is != null) {
+ is.close();
+ }
}
} catch (IOException e) {
throw new RuntimeException(e);