You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by fm...@apache.org on 2012/10/19 15:22:01 UTC

svn commit: r1400089 - /felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java

Author: fmeschbe
Date: Fri Oct 19 13:22:01 2012
New Revision: 1400089

URL: http://svn.apache.org/viewvc?rev=1400089&view=rev
Log:
FELIX-3723 Prevent unhandled ClassCastException if the component's bundle is bound to a different Configuration Admin API than the DS implementation bundle. The interface class is checked and a WARN message is logged if not compatible.

Modified:
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java?rev=1400089&r1=1400088&r2=1400089&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java Fri Oct 19 13:22:01 2012
@@ -82,30 +82,45 @@ public class ConfigurationSupport implem
             final ServiceReference caRef = bundleContext.getServiceReference(ComponentRegistry.CONFIGURATION_ADMIN);
             if (caRef != null)
             {
-                final ConfigurationAdmin ca = (ConfigurationAdmin) bundleContext.getService(caRef);
-                if (ca != null)
+                final Object cao = bundleContext.getService(caRef);
+                if (cao != null)
                 {
                     try
                     {
-                        final Configuration[] factory = findFactoryConfigurations(ca, confPid);
-                        if (factory != null)
+                        if ( cao instanceof ConfigurationAdmin )
                         {
-                            for (int i = 0; i < factory.length; i++)
+                            final ConfigurationAdmin ca = ( ConfigurationAdmin ) cao;
+                            final Configuration[] factory = findFactoryConfigurations(ca, confPid);
+                            if (factory != null)
                             {
-                                final String pid = factory[i].getPid();
-                                final Dictionary props = getConfiguration(ca, pid, bundleLocation);
-                                holder.configurationUpdated(pid, props);
+                                for (int i = 0; i < factory.length; i++)
+                                {
+                                    final String pid = factory[i].getPid();
+                                    final Dictionary props = getConfiguration(ca, pid, bundleLocation);
+                                    holder.configurationUpdated(pid, props);
+                                }
+                            }
+                            else
+                            {
+                                // check for configuration and configure the holder
+                                final Configuration singleton = findSingletonConfiguration(ca, confPid);
+                                if (singleton != null)
+                                {
+                                    final Dictionary props = getConfiguration(ca, confPid, bundleLocation);
+                                    holder.configurationUpdated(confPid, props);
+                                }
                             }
                         }
                         else
                         {
-                            // check for configuration and configure the holder
-                            final Configuration singleton = findSingletonConfiguration(ca, confPid);
-                            if (singleton != null)
-                            {
-                                final Dictionary props = getConfiguration(ca, confPid, bundleLocation);
-                                holder.configurationUpdated(confPid, props);
-                            }
+                            Activator.log( LogService.LOG_WARNING, null, "Cannot configure component "
+                                + holder.getComponentMetadata().getName(), null );
+                            Activator.log( LogService.LOG_WARNING, null,
+                                "Component Bundle's Configuration Admin is not compatible with "
+                                    + "ours. This happens if multiple Configuration Admin API versions "
+                                    + "are deployed and different bundles wire to different versions", null );
+
+                            Class<?> caoc = cao.getClass();
                         }
                     }
                     finally
@@ -211,21 +226,35 @@ public class ConfigurationSupport implem
                     {
                         try
                         {
-                            final ConfigurationAdmin ca = (ConfigurationAdmin) bundleContext.getService(caRef);
-                            if (ca != null)
+                            final Object cao = bundleContext.getService(caRef);
+                            if (cao != null)
                             {
                                 try
                                 {
-                                    final Dictionary dict = getConfiguration(ca, pid, bundleContext.getBundle()
-                                        .getLocation());
-                                    if (dict != null)
+                                    if ( cao instanceof ConfigurationAdmin )
+                                    {
+                                        final ConfigurationAdmin ca = ( ConfigurationAdmin ) cao;
+                                        final Dictionary dict = getConfiguration( ca, pid, bundleContext
+                                            .getBundle().getLocation() );
+                                        if ( dict != null )
+                                        {
+                                            cm.configurationUpdated( pid, dict );
+                                        }
+                                    }
+                                    else
                                     {
-                                        cm.configurationUpdated(pid, dict);
+                                        Activator.log( LogService.LOG_WARNING, null, "Cannot reconfigure component "
+                                            + cm.getComponentMetadata().getName(), null );
+                                        Activator.log( LogService.LOG_WARNING, null,
+                                            "Component Bundle's Configuration Admin is not compatible with " +
+                                            "ours. This happens if multiple Configuration Admin API versions " +
+                                            "are deployed and different bundles wire to different versions",
+                                            null );
                                     }
                                 }
                                 finally
                                 {
-                                    bundleContext.ungetService(caRef);
+                                    bundleContext.ungetService( caRef );
                                 }
                             }
                         }