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);
+	}
+
+}