You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ma...@apache.org on 2010/12/06 14:34:39 UTC

svn commit: r1042637 - in /felix/trunk/metatype/src: main/java/org/apache/felix/metatype/MetaDataReader.java test/java/org/apache/felix/metatype/MetaDataReaderTest.java

Author: marrs
Date: Mon Dec  6 13:34:38 2010
New Revision: 1042637

URL: http://svn.apache.org/viewvc?rev=1042637&view=rev
Log:
FELIX-2719 Implemented name space support, added a test for it.

Modified:
    felix/trunk/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java
    felix/trunk/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java

Modified: felix/trunk/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java
URL: http://svn.apache.org/viewvc/felix/trunk/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java?rev=1042637&r1=1042636&r2=1042637&view=diff
==============================================================================
--- felix/trunk/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java (original)
+++ felix/trunk/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java Mon Dec  6 13:34:38 2010
@@ -70,8 +70,8 @@ public class MetaDataReader
      * @return A {@link MetaData} providing access to the
      *      raw contents of the XML document.
      *
-     * @throws IOException If an I/O error occurrs accessing the stream.
-     * @throws XmlPullParserException If an error occurrs parsing the XML
+     * @throws IOException If an I/O error occurs accessing the stream.
+     * @throws XmlPullParserException If an error occurs parsing the XML
      *      document.
      */
     public MetaData parse( URL url ) throws IOException, XmlPullParserException
@@ -82,6 +82,7 @@ public class MetaDataReader
             ins = url.openStream();
             this.parser.setProperty( "http://xmlpull.org/v1/doc/properties.html#location", url.toString() );
             this.parser.setFeature(KXmlParser.FEATURE_PROCESS_NAMESPACES, true);
+            this.parser.setFeature(KXmlParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, false);
             return this.parse( ins );
         }
         finally
@@ -100,7 +101,32 @@ public class MetaDataReader
         }
     }
 
-
+    /**
+     * Checks if this document has a meta type name space.
+     * 
+     * @return <code>true</code> if this document has a meta type name space
+     * @throws XmlPullParserException when there the meta type name space is not valid
+     */
+    private boolean hasMetaTypeNameSpace() throws XmlPullParserException {
+    	
+    	int attrs = this.parser.getAttributeCount();
+    	for (int i = 0 ; i < attrs; i++) {
+    		
+    		if ( this.parser.getAttributeName(i).equals("xmlns:metatype") ) {
+    			if ( !"http://www.osgi.org/xmlns/metatype/v1.0.0".equals(this.parser.getAttributeValue(i)) ) {
+    		        throw new XmlPullParserException( "invalid namespace: " + this.parser.getAttributeValue(i), this.parser, null );
+    			}
+    			return true;
+    		}
+    	}
+    	return false;
+    }
+    
+    private String getCurrentTagName() {
+    	
+    	System.out.println("ns : '" + this.parser.getNamespace() + "'");
+    	return this.parser.getName();
+    }
     /**
      * Parses the XML document in the given input stream.
      * <p>
@@ -129,9 +155,15 @@ public class MetaDataReader
         {
             if ( eventType == XmlPullParser.START_TAG )
             {
-                if ( "MetaData".equals( this.parser.getName() ) )
+            	boolean nameSpaceAware = hasMetaTypeNameSpace();
+            	
+                if ( nameSpaceAware && "metatype:MetaData".equals( this.parser.getName() ) )
+                {
+                    mti = this.readMetaData(nameSpaceAware);
+                }
+                else if ( "MetaData".equals( this.parser.getName() ) )
                 {
-                    mti = this.readMetaData();
+                    mti = this.readMetaData(nameSpaceAware);
                 }
                 else
                 {
@@ -145,7 +177,7 @@ public class MetaDataReader
     }
 
 
-    private MetaData readMetaData() throws IOException, XmlPullParserException
+    private MetaData readMetaData(boolean nameSpaceAware) throws IOException, XmlPullParserException
     {
         MetaData mti = this.createMetaData();
         mti.setLocalePrefix( this.getOptionalAttribute( "localization" ) );
@@ -170,6 +202,10 @@ public class MetaDataReader
             }
             else if ( eventType == XmlPullParser.END_TAG )
             {
+                if ( nameSpaceAware && "metatype:MetaData".equals( this.parser.getName() ) )
+                {
+                    break;
+                }
                 if ( "MetaData".equals( this.parser.getName() ) )
                 {
                     break;

Modified: felix/trunk/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java?rev=1042637&r1=1042636&r2=1042637&view=diff
==============================================================================
--- felix/trunk/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java (original)
+++ felix/trunk/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java Mon Dec  6 13:34:38 2010
@@ -66,6 +66,40 @@ public class MetaDataReaderTest extends 
         assertNull( mti.getObjectClassDefinitions() );
     }
 
+    public void testWithNamespace() throws IOException, XmlPullParserException
+    {
+        String empty = "<metatype:MetaData xmlns:metatype=\"http://www.osgi.org/xmlns/metatype/v1.0.0\" " + 
+        	"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ></metatype:MetaData>";
+        MetaData mti = read( empty );
+        
+        assertNotNull( mti );
+        assertNull( mti.getLocalePrefix() );
+        assertNull( mti.getObjectClassDefinitions() );
+    }
+
+    public void testWithInvalidNamespaceUri() throws IOException, XmlPullParserException
+    {
+        String empty = "<metatype:MetaData xmlns:metatype=\"http://www.osgi.org/xmlns/datatype/v1.0.0\" " + 
+        	"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ></metatype:MetaData>";
+        
+        Exception exc = null;
+        try {
+        	MetaData mti = read( empty );
+        } catch (Exception e) {
+        	exc = e;
+		}
+        assertNotNull(exc);
+    }
+
+    public void testWithInvalidNamespaceName() throws IOException, XmlPullParserException
+    {
+        String empty = "<datatype:MetaData xmlns:metatype=\"http://www.osgi.org/xmlns/metatype/v1.0.0\" " + 
+        	"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ></datatype:MetaData>";
+        
+        MetaData mti = read( empty );
+        
+        assertNull( mti );
+    }
 
     public void testEmptyLocalization() throws IOException, XmlPullParserException
     {