Repository: camel
Updated Branches:
  refs/heads/camel-2.15.x bf6d1b7c4 -> 1f499f626


Simplify ScrHelper


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1f499f62
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1f499f62
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1f499f62

Branch: refs/heads/camel-2.15.x
Commit: 1f499f626291e47ab64c8fc5ab4c02e5784b8bfe
Parents: bf6d1b7
Author: Jyrki Ruuskanen <yur...@kotikone.fi>
Authored: Mon Sep 28 17:23:47 2015 +0300
Committer: Jyrki Ruuskanen <yur...@kotikone.fi>
Committed: Mon Sep 28 17:23:47 2015 +0300

----------------------------------------------------------------------
 .../apache/camel/scr/internal/ScrHelper.java    | 104 +++++--------------
 .../camel/scr/internal/ScrHelperTest.java       |   1 +
 .../resources/componentDefinitionExample.xml    |  10 ++
 3 files changed, 37 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/1f499f62/components/camel-scr/src/main/java/org/apache/camel/scr/internal/ScrHelper.java
----------------------------------------------------------------------
diff --git 
a/components/camel-scr/src/main/java/org/apache/camel/scr/internal/ScrHelper.java
 
b/components/camel-scr/src/main/java/org/apache/camel/scr/internal/ScrHelper.java
index 3d5842b..59f2745 100644
--- 
a/components/camel-scr/src/main/java/org/apache/camel/scr/internal/ScrHelper.java
+++ 
b/components/camel-scr/src/main/java/org/apache/camel/scr/internal/ScrHelper.java
@@ -16,29 +16,19 @@
  */
 package org.apache.camel.scr.internal;
 
-import java.io.File;
+import java.io.FileReader;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
-import javax.xml.XMLConstants;
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.events.XMLEvent;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Helper class.
+ * Helper class for reading properties from a component description file. Used 
in unit testing.
  */
 public final class ScrHelper {
 
@@ -54,68 +44,26 @@ public final class ScrHelper {
     public static Map<String, String> getScrProperties(String xmlLocation, 
String componentName) throws Exception {
         Map<String, String> result = new HashMap<String, String>();
 
-        final Document dom = readXML(new File(xmlLocation));
-        final XPath xPath = 
XPathFactory.newInstance(XPathFactory.DEFAULT_OBJECT_MODEL_URI, 
"com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl", null).newXPath();
-        xPath.setNamespaceContext(new ScrNamespaceContext(dom, xPath));
-
-        String propertyListExpression = 
String.format("/components/scr:component[@name='%s']/property", componentName);
-        XPathExpression propertyList = xPath.compile(propertyListExpression);
-        XPathExpression propertyName = xPath.compile("@name");
-        XPathExpression propertyValue = xPath.compile("@value");
-        NodeList nodes = (NodeList) propertyList.evaluate(dom, 
XPathConstants.NODESET);
-        for (int i = 0; i < nodes.getLength(); i++) {
-            Node node = nodes.item(i);
-            result.put((String) propertyName.evaluate(node, 
XPathConstants.STRING), (String) propertyValue.evaluate(node, 
XPathConstants.STRING));
-        }
-        return result;
-    }
-
-    private static Document readXML(File xml) throws Exception {
-        DocumentBuilderFactory builderFactory = 
DocumentBuilderFactory.newInstance();
-        builderFactory.setNamespaceAware(true);
-        DocumentBuilder builder = builderFactory.newDocumentBuilder();
-        return builder.parse(xml);
-    }
-
-    private static final class ScrNamespaceContext implements NamespaceContext 
{
-
-        private final Document dom;
-        private final XPath xPath;
-
-        private ScrNamespaceContext(Document dom, XPath xPath) {
-            this.dom = dom;
-            this.xPath = xPath;
-        }
-
-        @Override
-        public String getNamespaceURI(String prefix) {
-            switch (prefix) {
-            case "scr":
-                try {
-                    XPathExpression scrNamespace = 
xPath.compile("/*/namespace::*[name()='scr']");
-                    Node node = (Node) scrNamespace.evaluate(dom, 
XPathConstants.NODE);
-                    return node.getNodeValue();
-                } catch (XPathExpressionException e) {
-                    // ignore
-                    LOG.debug("Error evaluating xpath to obtain namespace 
prefix. This exception is ignored and using namespace: 
http://www.osgi.org/xmlns/scr/v1.1.0";, e);
-                }
-                return "http://www.osgi.org/xmlns/scr/v1.1.0";;
-            default:
-                // noop
+        XMLInputFactory inputFactory = XMLInputFactory.newFactory();
+        inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);
+        XMLEventReader eventReader = inputFactory.createXMLEventReader(new 
FileReader(xmlLocation));
+        boolean collect = false;
+        while (eventReader.hasNext()) {
+            XMLEvent event = eventReader.nextEvent();
+            if (event.getEventType() == XMLEvent.START_ELEMENT
+                && 
event.asStartElement().getName().toString().equals("scr:component")
+                && 
event.asStartElement().getAttributeByName(QName.valueOf("name")).getValue().equals(componentName))
 {
+                collect = true;
+            } else if (collect
+                && event.getEventType() == XMLEvent.START_ELEMENT
+                && 
event.asStartElement().getName().toString().equals("property")) {
+                
result.put(event.asStartElement().getAttributeByName(QName.valueOf("name")).getValue(),
 event.asStartElement().getAttributeByName(QName.valueOf("value")).getValue());
+            } else if (collect
+                && event.getEventType() == XMLEvent.END_ELEMENT
+                && 
event.asEndElement().getName().toString().equals("scr:component")) {
+                break;
             }
-            return XMLConstants.NULL_NS_URI;
-        }
-
-        @Override
-        public String getPrefix(String namespaceURI) {
-            return null;
-        }
-
-        @Override
-        public Iterator<String> getPrefixes(String namespaceURI) {
-            return null;
         }
+        return result;
     }
-
-}
-
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/1f499f62/components/camel-scr/src/test/java/org/apache/camel/scr/internal/ScrHelperTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-scr/src/test/java/org/apache/camel/scr/internal/ScrHelperTest.java
 
b/components/camel-scr/src/test/java/org/apache/camel/scr/internal/ScrHelperTest.java
index d97cf71..9d301e5 100644
--- 
a/components/camel-scr/src/test/java/org/apache/camel/scr/internal/ScrHelperTest.java
+++ 
b/components/camel-scr/src/test/java/org/apache/camel/scr/internal/ScrHelperTest.java
@@ -50,6 +50,7 @@ public class ScrHelperTest {
     public void scrHelperTest() throws Exception {
         Map<String, String> properties = 
ScrHelper.getScrProperties("src/test/resources/componentDefinitionExample.xml", 
"my.example.Component");
         assertEquals("exampleContext", properties.get("camelContextId"));
+        assertEquals("true", properties.get("active"));
         assertTrue(properties.size() == 6);
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/1f499f62/components/camel-scr/src/test/resources/componentDefinitionExample.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-scr/src/test/resources/componentDefinitionExample.xml 
b/components/camel-scr/src/test/resources/componentDefinitionExample.xml
index 162ca9c..d2030c3 100644
--- a/components/camel-scr/src/test/resources/componentDefinitionExample.xml
+++ b/components/camel-scr/src/test/resources/componentDefinitionExample.xml
@@ -10,4 +10,14 @@
         <property name="service.pid" value="my.example.Component"/>
         <reference name="camelComponent" 
interface="org.apache.camel.spi.ComponentResolver" cardinality="1..n" 
policy="dynamic" bind="gotCamelComponent" unbind="lostCamelComponent" 
policy-option="greedy"/>
     </scr:component>
+    <scr:component immediate="true" name="my.example.Component2">
+        <implementation class="my.example.Component2"/>
+        <property name="camelContextId" value="exampleContext2"/>
+        <property name="unit.camelContextId" 
value="exampleContextForUnitTest2"/>
+        <property name="camelRouteId" value="{{camelContextId}}/timer-log"/>
+        <property name="active" value="false"/>
+        <property name="master" value="master:{{camelContextId}}"/>
+        <property name="service.pid" value="my.example.Component"/>
+        <reference name="camelComponent" 
interface="org.apache.camel.spi.ComponentResolver" cardinality="1..n" 
policy="dynamic" bind="gotCamelComponent" unbind="lostCamelComponent" 
policy-option="greedy"/>
+    </scr:component>
 </components>

Reply via email to