I mentioned somewhere recently that my implementation of R5 features for DS was 
stalled due to test failures running against released versions of Felix config 
admin.  I've identified the problem more closely and wonder what to do.

The config admin problem appears to be solved by FELIX-3820. Here's some test 
code that reproduces it (I put this in the DS ComponentConfigurationPID test to 
run it)

    @Test
    public void testConfigAdminClosed() throws Exception
    {
        Bundle b = installBundle();
        b.start();
        BundleContext bc = b.getBundleContext();
        ServiceReference<ConfigurationAdmin> ref = bc.getServiceReference( 
ConfigurationAdmin.class );
        ConfigurationAdmin ca = bc.getService( ref );
        Configuration conf = ca.getConfiguration( "foo.pid" );
        bc.ungetService( ref );
        String location = conf.getBundleLocation();
        
    }
    
    protected Bundle installBundle( ) throws BundleException
    {
        final InputStream bundleStream = bundle()
                .set(Constants.BUNDLE_SYMBOLICNAME, "simplecomponent2")
                .set(Constants.BUNDLE_VERSION, "0.0.11")
            .build(withBnd());

        try
        {
            final String location = "test:SimpleComponent/" + 
System.currentTimeMillis();
            return bundleContext.installBundle( location, bundleStream );
        }
        finally
        {
            try
            {
                bundleStream.close();
            }
            catch ( IOException ioe )
            {
            }
        }
    }


The line 
        String location = conf.getBundleLocation();

gives an NPE like this:

    <error type="java.lang.NullPointerException">java.lang.NullPointerException
        at 
org.apache.felix.cm.impl.ConfigurationAdminImpl.hasPermission(ConfigurationAdminImpl.java:156)
        at 
org.apache.felix.cm.impl.ConfigurationAdminImpl.checkPermission(ConfigurationAdminImpl.java:170)
        at 
org.apache.felix.cm.impl.ConfigurationAdapter.getBundleLocation(ConfigurationAdapter.java:73)
        at 
org.apache.felix.scr.integration.ComponentConfigurationPidTest.testConfigAdmingClosed(ComponentConfigurationPidTest.java:137)


IIUC the problem is that ungetting the CA ref nulls out the field that does the 
logging in the Configuration or ConfigurationAdminImpl, so calling any method 
on the configuration that tries to log something will give an NPE.

You can call conf.getBundleLocation() successfully as long as you still have 
the CA ref.

I think this is an egregious bug in felix CA.  Did I miss something in the spec 
that says this is OK and that configurations are only usable while you hold the 
CA reference?

I can think of 3 courses of action:

1. make the code structure worse in DS so that DS holds the ref until it is 
done validating the configuration and extracting the properties. 

2. require use of the R5 ca and try to get a CA release out with the 3820 fix 
fairly soon, DS will then not work with any older felix CA's (not sure about 
anyone else's' CA).

3. backport the 3820 fix to earlier felix CA's and do bug fix releases on them. 
 I'm not aware of this (back porting) ever happening in felix…  DS users using 
felix CA  would have to upgrade but not change framework levels.

I've implemented (1) but I'm not very happy about how the code looks.

thoughts?

thanks 
david jencks




 

Reply via email to