You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2013/10/24 16:03:49 UTC

svn commit: r1535385 - in /karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring: SpringDeploymentListener.java SpringTransformer.java

Author: cschneider
Date: Thu Oct 24 14:03:49 2013
New Revision: 1535385

URL: http://svn.apache.org/r1535385
Log:
KARAF-2526 Improved parsing so it does not already fail in canHandle on incorrect files

Modified:
    karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
    karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java

Modified: karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
URL: http://svn.apache.org/viewvc/karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java?rev=1535385&r1=1535384&r2=1535385&view=diff
==============================================================================
--- karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java (original)
+++ karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java Thu Oct 24 14:03:49 2013
@@ -18,37 +18,35 @@
 package org.apache.karaf.deployer.spring;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
 import java.net.URL;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.events.StartElement;
+import javax.xml.stream.events.XMLEvent;
 
+import org.apache.felix.fileinstall.ArtifactUrlTransformer;
 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;
 
 /**
  * A deployment listener that listens for spring xml applications
  * and creates bundles for these.
  */
 public class SpringDeploymentListener implements ArtifactUrlTransformer {
+	private static final QName SPRING_DM_ROOT = new QName("http://www.springframework.org/schema/beans", "beans");
 
     private final Logger logger = LoggerFactory.getLogger(SpringDeploymentListener.class);
-
-    private DocumentBuilderFactory dbf;
-
+	private XMLInputFactory factory;
+	
     public boolean canHandle(File artifact) {
         try {
             if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
-                Document doc = parse(artifact);
-                String name = doc.getDocumentElement().getLocalName();
-                String uri  = doc.getDocumentElement().getNamespaceURI();
-                if ("beans".equals(name) && "http://www.springframework.org/schema/beans".equals(uri)) {
+                StartElement element = getRootElement(artifact);
+                if (element != null && SPRING_DM_ROOT.equals(element.getName())) {
                     return true;
                 }
             }
@@ -67,22 +65,30 @@ public class SpringDeploymentListener im
         }
     }
 
-    protected Document parse(File artifact) throws Exception {
-        if (dbf == null) {
-            dbf = DocumentBuilderFactory.newInstance();
-            dbf.setNamespaceAware(true);
-        }
-        DocumentBuilder db = dbf.newDocumentBuilder();
-        db.setErrorHandler(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);
+	protected StartElement getRootElement(File artifact) throws Exception {
+    	XMLEventReader parser = null;
+    	InputStream in = null;
+    	try {
+			if (factory == null) {
+				factory = XMLInputFactory.newInstance();
+			}
+			in = new FileInputStream(artifact);
+			parser = factory.createXMLEventReader(in);
+			while (parser.hasNext()) {
+				XMLEvent event = parser.nextEvent();
+				if (event.isStartElement()) {
+					return event.asStartElement();
+				}
+			}
+			return null;
+		} finally {
+			if (parser != null) {
+				parser.close();
+			}
+			if (in != null) {
+				in.close();
+			}
+		}
     }
 
 }

Modified: karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
URL: http://svn.apache.org/viewvc/karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java?rev=1535385&r1=1535384&r2=1535385&view=diff
==============================================================================
--- karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java (original)
+++ karaf/trunk/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java Thu Oct 24 14:03:49 2013
@@ -31,8 +31,6 @@ import java.util.TreeSet;
 import java.util.jar.JarFile;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -46,11 +44,12 @@ import javax.xml.transform.stream.Stream
 import javax.xml.transform.stream.StreamSource;
 
 import org.apache.karaf.util.DeployerUtils;
-
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
-
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 import org.osgi.framework.Constants;
 
 public class SpringTransformer {
@@ -90,7 +89,7 @@ public class SpringTransformer {
                 String text = e.getTextContent();
                 Properties props = new Properties();
                 props.load(new ByteArrayInputStream(text.trim().getBytes()));
-                Enumeration en = props.propertyNames();
+                Enumeration<?> en = props.propertyNames();
                 while (en.hasMoreElements()) {
                     String k = (String) en.nextElement();
                     String v = props.getProperty(k);
@@ -179,6 +178,15 @@ public class SpringTransformer {
             dbf.setNamespaceAware(true);
         }
         DocumentBuilder db = dbf.newDocumentBuilder();
+        db.setErrorHandler(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(url.toString());
     }