You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by io...@apache.org on 2014/01/13 13:33:04 UTC
git commit: [KARAF-2679] Remove state from spring and blueprint URL
handlers. Use thread local TransformerFactory and DocumentBuilderFactory to
prevent multiple threads of using the same instance.
Updated Branches:
refs/heads/karaf-2.3.x f2a240caf -> 542893410
[KARAF-2679] Remove state from spring and blueprint URL handlers. Use thread local TransformerFactory and DocumentBuilderFactory to prevent multiple threads of using the same instance.
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/54289341
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/54289341
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/54289341
Branch: refs/heads/karaf-2.3.x
Commit: 5428934100944ce79024e66a531b0a4bf582ff56
Parents: f2a240c
Author: Ioannis Canellos <io...@gmail.com>
Authored: Fri Jan 10 18:40:01 2014 +0200
Committer: Ioannis Canellos <io...@gmail.com>
Committed: Mon Jan 13 14:32:51 2014 +0200
----------------------------------------------------------------------
.../blueprint/BlueprintDeploymentListener.java | 16 +---
.../blueprint/BlueprintTransformer.java | 31 +------
.../deployer/blueprint/BlueprintURLHandler.java | 11 +--
.../spring/SpringDeploymentListener.java | 16 +---
.../deployer/spring/SpringTransformer.java | 31 +------
.../karaf/deployer/spring/SpringURLHandler.java | 16 +---
.../java/org/apache/karaf/util/XmlUtils.java | 98 ++++++++++++++++++++
7 files changed, 118 insertions(+), 101 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/54289341/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java
----------------------------------------------------------------------
diff --git a/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java b/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java
index 5a9c6ec..88dd715 100644
--- a/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java
+++ b/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java
@@ -20,17 +20,15 @@ package org.apache.karaf.deployer.blueprint;
import java.io.File;
import java.net.URL;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
+import org.apache.karaf.util.XmlUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.apache.felix.fileinstall.ArtifactUrlTransformer;
import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXParseException;
import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
/**
* A deployment listener that listens for spring xml applications
@@ -40,8 +38,6 @@ public class BlueprintDeploymentListener implements ArtifactUrlTransformer {
private final Logger logger = LoggerFactory.getLogger(BlueprintDeploymentListener.class);
- private DocumentBuilderFactory dbf;
-
public boolean canHandle(File artifact) {
try {
if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
@@ -68,12 +64,7 @@ public class BlueprintDeploymentListener implements ArtifactUrlTransformer {
}
protected Document parse(File artifact) throws Exception {
- if (dbf == null) {
- dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- }
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(new ErrorHandler() {
+ return XmlUtils.parse(artifact, new ErrorHandler() {
public void warning(SAXParseException exception) throws SAXException {
}
public void error(SAXParseException exception) throws SAXException {
@@ -82,7 +73,6 @@ public class BlueprintDeploymentListener implements ArtifactUrlTransformer {
throw exception;
}
});
- return db.parse(artifact);
}
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/54289341/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java
----------------------------------------------------------------------
diff --git a/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java b/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java
index a8f31aa..006acd4 100644
--- a/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java
+++ b/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java
@@ -33,18 +33,15 @@ import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.karaf.util.DeployerUtils;
+import org.apache.karaf.util.XmlUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -55,11 +52,6 @@ import static org.apache.karaf.util.MvnUtils.getMvnPath;
public class BlueprintTransformer {
- static Transformer transformer;
- static DocumentBuilderFactory dbf;
- static TransformerFactory tf;
-
-
public static void transform(URL url, OutputStream os) throws Exception {
// Build dom document
Document doc = parse(url);
@@ -116,28 +108,18 @@ public class BlueprintTransformer {
e = new ZipEntry("OSGI-INF/blueprint/" + name);
out.putNextEntry(e);
// Copy the new DOM
- if (tf == null) {
- tf = TransformerFactory.newInstance();
- }
- tf.newTransformer().transform(new DOMSource(doc), new StreamResult(out));
+ XmlUtils.transform(new DOMSource(doc), new StreamResult(out));
out.closeEntry();
out.close();
}
public static Set<String> analyze(Source source) throws Exception {
- if (transformer == null) {
- if (tf == null) {
- tf = TransformerFactory.newInstance();
- }
- Source s = new StreamSource(BlueprintTransformer.class.getResourceAsStream("extract.xsl"));
- transformer = tf.newTransformer(s);
- }
Set<String> refers = new TreeSet<String>();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
Result r = new StreamResult(bout);
- transformer.transform(source, r);
+ XmlUtils.transform(new StreamSource(BlueprintTransformer.class.getResourceAsStream("extract.xsl")), source, r);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
bout.close();
@@ -177,12 +159,7 @@ public class BlueprintTransformer {
}
protected static Document parse(URL url) throws Exception {
- if (dbf == null) {
- dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- }
- DocumentBuilder db = dbf.newDocumentBuilder();
- return db.parse(url.toString());
+ return XmlUtils.parse(url.toString());
}
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/54289341/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java
----------------------------------------------------------------------
diff --git a/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java b/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java
index 452f4cb..d379a5a 100644
--- a/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java
+++ b/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java
@@ -42,8 +42,6 @@ public class BlueprintURLHandler extends AbstractURLStreamHandlerService {
private static String SYNTAX = "blueprint: bp-xml-uri";
- private URL blueprintXmlURL;
-
/**
* Open the connection for the given URL.
*
@@ -56,15 +54,10 @@ public class BlueprintURLHandler extends AbstractURLStreamHandlerService {
if (url.getPath() == null || url.getPath().trim().length() == 0) {
throw new MalformedURLException ("Path cannot be null or empty. Syntax: " + SYNTAX );
}
- blueprintXmlURL = new URL(url.getPath());
- logger.debug("Blueprint xml URL is: [" + blueprintXmlURL + "]");
+ logger.debug("Blueprint xml URL is: [" + url.getPath() + "]");
return new Connection(url);
}
-
- public URL getBlueprintXmlURL() {
- return blueprintXmlURL;
- }
public class Connection extends URLConnection {
@@ -80,7 +73,7 @@ public class BlueprintURLHandler extends AbstractURLStreamHandlerService {
public InputStream getInputStream() throws IOException {
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
- BlueprintTransformer.transform(blueprintXmlURL, os);
+ BlueprintTransformer.transform(new URL(url.getPath()), os);
os.close();
return new ByteArrayInputStream(os.toByteArray());
} catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/karaf/blob/54289341/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
----------------------------------------------------------------------
diff --git a/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java b/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
index a332029..e1691e4 100644
--- a/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
+++ b/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
@@ -20,9 +20,7 @@ package org.apache.karaf.deployer.spring;
import java.io.File;
import java.net.URL;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
+import org.apache.karaf.util.XmlUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
@@ -40,8 +38,6 @@ public class SpringDeploymentListener implements ArtifactUrlTransformer {
private final Logger logger = LoggerFactory.getLogger(SpringDeploymentListener.class);
- private DocumentBuilderFactory dbf;
-
public boolean canHandle(File artifact) {
try {
if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
@@ -68,21 +64,17 @@ public class SpringDeploymentListener implements ArtifactUrlTransformer {
}
protected Document parse(File artifact) throws Exception {
- if (dbf == null) {
- dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- }
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(new ErrorHandler() {
+ return XmlUtils.parse(artifact, new ErrorHandler() {
public void warning(SAXParseException exception) throws SAXException {
}
+
public void error(SAXParseException exception) throws SAXException {
}
+
public void fatalError(SAXParseException exception) throws SAXException {
throw exception;
}
});
- return db.parse(artifact);
}
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/54289341/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
----------------------------------------------------------------------
diff --git a/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java b/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
index 8d3650e..279305e 100644
--- a/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
+++ b/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
@@ -33,18 +33,15 @@ import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.karaf.util.DeployerUtils;
+import org.apache.karaf.util.XmlUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -55,10 +52,6 @@ import static org.apache.karaf.util.MvnUtils.getMvnPath;
public class SpringTransformer {
- static Transformer transformer;
- static DocumentBuilderFactory dbf;
- static TransformerFactory tf;
-
public static void transform(URL url, OutputStream os) throws Exception {
// Build dom document
@@ -113,28 +106,17 @@ public class SpringTransformer {
e = new ZipEntry("META-INF/spring/" + name);
out.putNextEntry(e);
// Copy the new DOM
- if (tf == null) {
- tf = TransformerFactory.newInstance();
- }
- tf.newTransformer().transform(new DOMSource(doc), new StreamResult(out));
+ XmlUtils.transform(new DOMSource(doc), new StreamResult(out));
out.closeEntry();
out.close();
}
public static Set<String> analyze(Source source) throws Exception {
- if (transformer == null) {
- if (tf == null) {
- tf = TransformerFactory.newInstance();
- }
- Source s = new StreamSource(SpringTransformer.class.getResourceAsStream("extract.xsl"));
- transformer = tf.newTransformer(s);
- }
-
Set<String> refers = new TreeSet<String>();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
Result r = new StreamResult(bout);
- transformer.transform(source, r);
+ XmlUtils.transform(new StreamSource(SpringTransformer.class.getResourceAsStream("extract.xsl")), source, r);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
bout.close();
@@ -174,12 +156,7 @@ public class SpringTransformer {
}
protected static Document parse(URL url) throws Exception {
- if (dbf == null) {
- dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- }
- DocumentBuilder db = dbf.newDocumentBuilder();
- return db.parse(url.toString());
+ return XmlUtils.parse(url.toString());
}
}
http://git-wip-us.apache.org/repos/asf/karaf/blob/54289341/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java
----------------------------------------------------------------------
diff --git a/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java b/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java
index d471123..60c9b6f 100644
--- a/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java
+++ b/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java
@@ -19,9 +19,6 @@ package org.apache.karaf.deployer.spring;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
@@ -42,8 +39,6 @@ public class SpringURLHandler extends AbstractURLStreamHandlerService {
private static String SYNTAX = "spring: spring-xml-uri";
- private URL springXmlURL;
-
/**
* Open the connection for the given URL.
*
@@ -55,16 +50,11 @@ public class SpringURLHandler extends AbstractURLStreamHandlerService {
public URLConnection openConnection(URL url) throws IOException {
if (url.getPath() == null || url.getPath().trim().length() == 0) {
throw new MalformedURLException ("Path cannot be null or empty. Syntax: " + SYNTAX );
- }
- springXmlURL = new URL(url.getPath());
+ }
- logger.debug("Spring xml URL is: [" + springXmlURL + "]");
+ logger.debug("Spring xml URL is: [" + url.getPath() + "]");
return new Connection(url);
}
-
- public URL getSpringXmlURL() {
- return springXmlURL;
- }
public class Connection extends URLConnection {
@@ -80,7 +70,7 @@ public class SpringURLHandler extends AbstractURLStreamHandlerService {
public InputStream getInputStream() throws IOException {
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
- SpringTransformer.transform(springXmlURL, os);
+ SpringTransformer.transform(new URL(url.getPath()), os);
os.close();
return new ByteArrayInputStream(os.toByteArray());
} catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/karaf/blob/54289341/util/src/main/java/org/apache/karaf/util/XmlUtils.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/XmlUtils.java b/util/src/main/java/org/apache/karaf/util/XmlUtils.java
new file mode 100644
index 0000000..b11cb3d
--- /dev/null
+++ b/util/src/main/java/org/apache/karaf/util/XmlUtils.java
@@ -0,0 +1,98 @@
+package org.apache.karaf.util;
+
+import org.w3c.dom.Document;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.*;
+import java.io.File;
+import java.io.IOException;
+
+
+public class XmlUtils {
+
+ private static final ThreadLocal<DocumentBuilderFactory> DOCUMENT_BUILDER_FACTORY = new ThreadLocal<DocumentBuilderFactory>();
+ private static final ThreadLocal<TransformerFactory> TRANSFORMER_FACTORY = new ThreadLocal<TransformerFactory>();
+
+ public static Document parse(String uri) throws TransformerException, IOException, SAXException, ParserConfigurationException {
+ DocumentBuilder db = documentBuilder();
+ try {
+ return db.parse(uri);
+ } finally {
+ db.reset();
+ }
+ }
+
+ public static Document parse(File f) throws TransformerException, IOException, SAXException, ParserConfigurationException {
+ DocumentBuilder db = documentBuilder();
+ try {
+ return db.parse(f);
+ } finally {
+ db.reset();
+ }
+ }
+ public static Document parse(File f, ErrorHandler errorHandler) throws TransformerException, IOException, SAXException, ParserConfigurationException {
+ DocumentBuilder db = documentBuilder();
+ db.setErrorHandler(errorHandler);
+ try {
+ return db.parse(f);
+ } finally {
+ db.reset();
+ }
+ }
+
+ public static void transform(Source xmlSource, Result outputTarget) throws TransformerException {
+ Transformer t = transformer();
+ try {
+ t.transform(xmlSource, outputTarget);
+ } finally {
+ t.reset();
+ }
+ }
+
+ public static void transform(Source xsltSource, Source xmlSource, Result outputTarget) throws TransformerException {
+ Transformer t = transformer(xsltSource);
+ try {
+ t.transform(xmlSource, outputTarget);
+ } finally {
+ t.reset();
+ }
+ }
+
+ private static DocumentBuilder documentBuilder() throws ParserConfigurationException {
+ DocumentBuilderFactory dbf;
+ if (DOCUMENT_BUILDER_FACTORY.get() == null) {
+ dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DOCUMENT_BUILDER_FACTORY.set(dbf);
+ } else {
+ dbf = DOCUMENT_BUILDER_FACTORY.get();
+ }
+ return dbf.newDocumentBuilder();
+ }
+
+ private static Transformer transformer() throws TransformerConfigurationException {
+ TransformerFactory tf;
+ if (TRANSFORMER_FACTORY.get() == null) {
+ tf = TransformerFactory.newInstance();
+ TRANSFORMER_FACTORY.set(tf);
+ } else {
+ tf = TRANSFORMER_FACTORY.get();
+ }
+ return tf.newTransformer();
+ }
+
+ private static Transformer transformer(Source xsltSource) throws TransformerConfigurationException {
+ TransformerFactory tf;
+ if (TRANSFORMER_FACTORY.get() == null) {
+ tf = TransformerFactory.newInstance();
+ TRANSFORMER_FACTORY.set(tf);
+ } else {
+ tf = TRANSFORMER_FACTORY.get();
+ }
+ return tf.newTransformer(xsltSource);
+ }
+}