FELIX-4973 : Relax exception handling when reading metatype XML

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1693433 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java b/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java
index 85aa0dc..fac81e1 100644
--- a/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java
+++ b/metatype/src/main/java/org/apache/felix/metatype/MetaDataReader.java
@@ -316,7 +316,8 @@
                     if (getNamespaceVersion() < 13 && ocd.getAttributeDefinitions() == null)
                     {
                         // Need at least one AD in versions 1.0, 1.1 & 1.2...
-                        throw missingElement("AD");
+                        logMissingElement("AD");
+                        ocd = null;
                     }
                     break;
                 }
@@ -377,7 +378,8 @@
                     if (designate.getObject() == null)
                     {
                         // Exactly 1 Object is allowed...
-                        throw missingElement("Object");
+                        logMissingElement("Object");
+                        designate = null;
                     }
                     break;
                 }
@@ -405,7 +407,7 @@
 
         readOptionalAttributes(ad, AD_ATTRIBUTES);
 
-        Map options = new LinkedHashMap();
+        Map<String, String> options = new LinkedHashMap<String, String>();
         int eventType = this.parser.next();
         while (eventType != XmlPullParser.END_DOCUMENT)
         {
@@ -439,7 +441,7 @@
 
         ad.setOptions(options);
 
-        // set value as late as possible to force an options check (FELIX-3884, FELIX-4665)... 
+        // set value as late as possible to force an options check (FELIX-3884, FELIX-4665)...
         if (dfltValue != null)
         {
             ad.setDefaultValue(dfltValue);
@@ -635,10 +637,10 @@
         return new XmlPullParserException(message, this.parser, null);
     }
 
-    private XmlPullParserException missingElement(String elementName)
+    private void logMissingElement(String elementName)
     {
         String message = "Missing element " + elementName + " in element " + this.parser.getName();
-        return new XmlPullParserException(message, this.parser, null);
+        Activator.log(LogService.LOG_ERROR, message);
     }
 
     private XmlPullParserException unexpectedElement(String elementName)
diff --git a/metatype/src/main/java/org/apache/felix/metatype/internal/Activator.java b/metatype/src/main/java/org/apache/felix/metatype/internal/Activator.java
index e224857..bde7c76 100644
--- a/metatype/src/main/java/org/apache/felix/metatype/internal/Activator.java
+++ b/metatype/src/main/java/org/apache/felix/metatype/internal/Activator.java
@@ -21,10 +21,16 @@
 
 import java.io.PrintStream;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.Dictionary;
+import java.util.Hashtable;
 
 import org.apache.felix.metatype.internal.l10n.BundleResources;
-import org.osgi.framework.*;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.log.LogService;
 import org.osgi.service.metatype.MetaTypeService;
 import org.osgi.util.tracker.ServiceTracker;
@@ -126,7 +132,7 @@
 
     public static void log( int level, String message )
     {
-        LogService log = ( LogService ) INSTANCE.logService.getService();
+        final LogService log = (INSTANCE == null ? null : ( LogService ) INSTANCE.logService.getService());
         if ( log == null )
         {
             _log( null, level, message, null );
@@ -140,7 +146,7 @@
 
     public static void log( int level, String message, Throwable exception )
     {
-        LogService log = ( LogService ) INSTANCE.logService.getService();
+        final LogService log = (INSTANCE == null ? null : ( LogService ) INSTANCE.logService.getService());
         if ( log == null )
         {
             _log( null, level, message, exception );
@@ -154,7 +160,7 @@
 
     public static void log( ServiceReference sr, int level, String message )
     {
-        LogService log = ( LogService ) INSTANCE.logService.getService();
+        final LogService log = (INSTANCE == null ? null : ( LogService ) INSTANCE.logService.getService());
         if ( log == null )
         {
             _log( sr, level, message, null );
@@ -168,7 +174,7 @@
 
     public static void log( ServiceReference sr, int level, String message, Throwable exception )
     {
-        LogService log = ( LogService ) INSTANCE.logService.getService();
+        final LogService log = (INSTANCE == null ? null : ( LogService ) INSTANCE.logService.getService());
         if ( log == null )
         {
             _log( sr, level, message, exception );
diff --git a/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java b/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java
index 074d224..975e4b5 100644
--- a/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java
+++ b/metatype/src/test/java/org/apache/felix/metatype/MetaDataReaderTest.java
@@ -24,11 +24,11 @@
 import java.util.Arrays;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.osgi.service.metatype.AttributeDefinition;
 import org.xmlpull.v1.XmlPullParserException;
 
+import junit.framework.TestCase;
+
 /**
  * The <code>MetaDataReaderTest</code> class tests the
  * <code>MetaDataReader</code> class.
@@ -39,6 +39,7 @@
 {
     private MetaDataReader reader;
 
+    @Override
     protected void setUp() throws Exception
     {
         super.setUp();
@@ -46,6 +47,7 @@
         reader = new MetaDataReader();
     }
 
+    @Override
     protected void tearDown() throws Exception
     {
         reader = null;
@@ -184,7 +186,7 @@
     }
 
     /**
-     * FELIX-4665 - Default values can be empty. 
+     * FELIX-4665 - Default values can be empty.
      */
     public void testAttributeWithDefaultValueOk() throws IOException, XmlPullParserException
     {
@@ -221,7 +223,7 @@
     }
 
     /**
-     * FELIX-4644 - Enforce that we can only have one Object in a Designate element. 
+     * FELIX-4644 - Enforce that we can only have one Object in a Designate element.
      */
     public void testOCDWithoutADFail() throws IOException, XmlPullParserException
     {
@@ -231,15 +233,8 @@
 
         String xml = "<MetaData><OCD id=\"" + ocdId + "\" name=\"" + ocdName + "\" description=\"" + ocdDescription + "\" /></MetaData>";
 
-        try
-        {
-            read(xml); // should fail!
-            fail("IOException expected!");
-        }
-        catch (IOException e)
-        {
-            assertTrue(e.getMessage().contains("Missing element AD"));
-        }
+        final MetaData md = read(xml);
+        assertNull(md.getObjectClassDefinitions());
     }
 
     /**
@@ -269,7 +264,7 @@
     }
 
     /**
-     * FELIX-4644 - Enforce that we can only have one Object in a Designate element. 
+     * FELIX-4644 - Enforce that we can only have one Object in a Designate element.
      */
     public void testDesignateWithoutObjectFail() throws IOException, XmlPullParserException
     {
@@ -281,19 +276,13 @@
         String xml = "<MetaData><OCD id=\"" + ocdId + "\" name=\"" + ocdName + "\" description=\"" + ocdDescription + "\"><AD id=\"attr\" type=\"String\" required=\"false\" /></OCD><Designate pid=\""
             + pid + "\" bundle=\"*\"></Designate></MetaData>";
 
-        try
-        {
-            read(xml); // should fail!
-            fail("IOException expected!");
-        }
-        catch (IOException e)
-        {
-            assertTrue(e.getMessage().contains("Missing element Object"));
-        }
+        final MetaData md = read(xml);
+        assertNull(md.getDesignates());
+        assertEquals(1, md.getObjectClassDefinitions().size());
     }
 
     /**
-     * FELIX-4644 - Enforce that we can only have one Object in a Designate element. 
+     * FELIX-4644 - Enforce that we can only have one Object in a Designate element.
      */
     public void testDesignateWithObjectOk() throws IOException, XmlPullParserException
     {
@@ -326,7 +315,7 @@
     }
 
     /**
-     * FELIX-4644 - Enforce that we can only have one Object in a Designate element. 
+     * FELIX-4644 - Enforce that we can only have one Object in a Designate element.
      */
     public void testDesignateWithTwoObjectsFail() throws IOException, XmlPullParserException
     {
@@ -350,7 +339,7 @@
     }
 
     /**
-     * FELIX-4799 - tests that we can have multiple designates for the same factory PID in one MetaData configuration. 
+     * FELIX-4799 - tests that we can have multiple designates for the same factory PID in one MetaData configuration.
      */
     public void testMultipleFactoryDesignatesWithSamePidOk() throws IOException, XmlPullParserException
     {
@@ -366,7 +355,7 @@
     }
 
     /**
-     * FELIX-4799 - tests that we can have multiple designates for the same factory PID in one MetaData configuration. 
+     * FELIX-4799 - tests that we can have multiple designates for the same factory PID in one MetaData configuration.
      */
     public void testMultipleFactoryDesignatesWithDifferentPidsOk() throws IOException, XmlPullParserException
     {