Fix FELIX-2685 Wrong Element name when XML namespace contains ':'
Also add a unit test.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1032011 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
index e3d05e6..77dceff 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
@@ -1,4 +1,4 @@
-/*
+/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
@@ -469,7 +469,6 @@
for (int i = 0; i < string.length; i++) {
char current = string[i];
-
switch (current) { //NOPMD
// Beginning of an attribute.
case '$':
@@ -524,20 +523,12 @@
// Default case
default:
- StringBuffer name = new StringBuffer();
- StringBuffer namespace = null;
+ StringBuffer qname = new StringBuffer();
current = string[i];
while (current != ' ') {
- if (current == ':') {
- namespace = name;
- name = new StringBuffer();
- i++;
- current = string[i];
- } else {
- name.append(current);
- i++;
- current = string[i]; // Increment and get the new current char.
- }
+ qname.append(current);
+ i++;
+ current = string[i]; // Increment and get the new current char.
}
// Skip spaces
while (string[i] == ' ') {
@@ -546,11 +537,19 @@
i = i + 1; // skip {
Element elem = null;
- if (namespace == null) {
- elem = new Element(name.toString(), null);
+ // Parse the qname
+ String n = qname.toString();
+ if (n.indexOf(':') == -1) {
+ // No namespace
+ elem = new Element(n, null);
} else {
- elem = new Element(name.toString(), namespace.toString());
+ // The namespace ends on the first ':'
+ int index = n.indexOf(':');
+ String ns = n.substring(0, index);
+ String name = n.substring(index + 1);
+ elem = new Element(name.toString(), ns.toString());
}
+
addElement(elem);
break;
diff --git a/ipojo/core/src/test/java/org/apache/felix/ipojo/util/ManifestMetadataParserTest.java b/ipojo/core/src/test/java/org/apache/felix/ipojo/util/ManifestMetadataParserTest.java
new file mode 100644
index 0000000..c788740
--- /dev/null
+++ b/ipojo/core/src/test/java/org/apache/felix/ipojo/util/ManifestMetadataParserTest.java
@@ -0,0 +1,93 @@
+package org.apache.felix.ipojo.util;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+
+/**
+ * Test the {@link ManifestMetadataParser}
+ */
+public class ManifestMetadataParserTest extends TestCase {
+
+ /**
+ * Test FELIX-2685.
+ * The element name contains ':' as in:
+ * "//jasmine.ow2.org/rules/1.0.0:configuration"
+ * @throws ParseException
+ */
+ public void testNameWithColumn() throws ParseException {
+ // Create a test element
+ String header = "mynamespace://jasmine.ow2.org/rules/1.0.0:configuration {}";
+ Element elem = ManifestMetadataParser.parse(header);
+
+ Assert.assertEquals("mynamespace", elem.getNameSpace());
+ Assert.assertEquals("//jasmine.ow2.org/rules/1.0.0:configuration", elem.getName());
+ }
+
+ /**
+ * Check the parsing of handler element using {@link ManifestMetadataParser#parseHeader(String)}
+ * @throws ParseException
+ */
+ public void testHandlerHeader() throws ParseException {
+ String header = "handler { $name=\"wbp\" $classname=\"org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler\"" +
+ " $namespace=\"org.apache.felix.ipojo.whiteboard\" manipulation { $super=\"org.apache.felix.ipojo.PrimitiveHandler\"" +
+ " field { $name=\"m_managers\" $type=\"java.util.List\" }method { $name=\"$init\" }method { $arguments=" +
+ "\"{org.apache.felix.ipojo.metadata.Element,java.util.Dictionary}\" $name=\"configure\" }method { $name=\"start\"" +
+ " }method { $arguments=\"{int}\" $name=\"stateChanged\" }method { $name=\"stop\" }}}";
+
+ ManifestMetadataParser parser = new ManifestMetadataParser();
+ parser.parseHeader(header);
+
+ Element[] elems = parser.getComponentsMetadata();
+ Assert.assertEquals(1, elems.length);
+
+ Element element = elems[0];
+ Assert.assertEquals("handler", element.getName());
+ Assert.assertNull(element.getNameSpace());
+
+ Assert.assertEquals("wbp", element.getAttribute("name"));
+ Assert.assertEquals("org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler", element.getAttribute("classname"));
+ Assert.assertEquals("org.apache.felix.ipojo.whiteboard", element.getAttribute("namespace"));
+
+ // Check the manipulation element
+ Element[] manip = element.getElements("manipulation");
+ Assert.assertNotNull(manip[0]);
+
+ Element[] methods = manip[0].getElements("method");
+ Assert.assertEquals(5, methods.length);
+ }
+
+ /**
+ * Check the parsing of handler element using {@link ManifestMetadataParser#parseHeaderMetadata(String)}
+ * @throws ParseException
+ */
+ public void testHandlerHeader2() throws ParseException {
+ String header = "handler { $name=\"wbp\" $classname=\"org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler\"" +
+ " $namespace=\"org.apache.felix.ipojo.whiteboard\" manipulation { $super=\"org.apache.felix.ipojo.PrimitiveHandler\"" +
+ " field { $name=\"m_managers\" $type=\"java.util.List\" }method { $name=\"$init\" }method { $arguments=" +
+ "\"{org.apache.felix.ipojo.metadata.Element,java.util.Dictionary}\" $name=\"configure\" }method { $name=\"start\"" +
+ " }method { $arguments=\"{int}\" $name=\"stateChanged\" }method { $name=\"stop\" }}}";
+
+ // This method returns an iPOJO root element
+ Element elem = ManifestMetadataParser.parseHeaderMetadata(header);
+ Element element = elem.getElements("handler")[0];
+
+ Assert.assertEquals("handler", element.getName());
+ Assert.assertNull(element.getNameSpace());
+
+ Assert.assertEquals("wbp", element.getAttribute("name"));
+ Assert.assertEquals("org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler", element.getAttribute("classname"));
+ Assert.assertEquals("org.apache.felix.ipojo.whiteboard", element.getAttribute("namespace"));
+
+ // Check the manipulation element
+ Element[] manip = element.getElements("manipulation");
+ Assert.assertNotNull(manip[0]);
+
+ Element[] methods = manip[0].getElements("method");
+ Assert.assertEquals(5, methods.length);
+ }
+
+}