Dan Gravell created FELIX-3652:
----------------------------------

             Summary: ArrayIndexOutOfBoundsException when trying to adapt() a 
stopped bundle
                 Key: FELIX-3652
                 URL: https://issues.apache.org/jira/browse/FELIX-3652
             Project: Felix
          Issue Type: Bug
          Components: Framework
    Affects Versions: framework-4.0.2
            Reporter: Dan Gravell
            Priority: Minor


I have the following code block:

final Iterable<Bundle> startedBundles = [...]

for (Bundle bundle : startedBundles) {
        try {
                if(!FelixObrUtils.isFragment(bundle)) 
sysBundle.getBundleContext().getBundle(bundle.getBundleId()).stop();
        } catch (BundleException e) {
                LOG.error("Failed to stop " + bundle.getSymbolicName(), e);
        }
}
resolver.deploy(0);
blockingRefreshBundles(null, sysBundle.getBundleContext());
for (Bundle bundle : startedBundles) {
        try {
                if(!FelixObrUtils.isFragment(bundle)) 
sysBundle.getBundleContext().getBundle(bundle.getBundleId()).start();
        } catch (BundleException e) {
                LOG.error("Failed to restart " + bundle.getSymbolicName(), e);
        }
}

blockingRefreshBundles() blocks until frameworkWiring.refreshBundles has 
completed using a CountDownLatch and a FrameworkListener.

Pertinently, FelixObrUtils.isFragment looks like:

public static boolean isFragment(Bundle bundle) {
        return (bundle.adapt(BundleRevision.class).getTypes() & 
BundleRevision.TYPE_FRAGMENT) != 0;
}

Upon the second call to FelixObrUtils.isFragment I get:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.rangeCheck(ArrayList.java:571)
        at java.util.ArrayList.get(ArrayList.java:349)
        at org.apache.felix.framework.BundleImpl.adapt(BundleImpl.java:1046)
        at 
com.elsten.bliss.updater.FelixObrUtils.isFragment(FelixObrUtils.java:149)
        at 
com.elsten.bliss.updater.OnlineUpdater$2.doRun(OnlineUpdater.java:124)
        at 
com.elsten.util.CatchThrowableRunnable.run(CatchThrowableRunnable.java:23)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:679)

Presumably this is because the bundle has been stopped, possibly updated and 
refreshed in the meantime.

Maybe I should not be doing this on a stopped bundle, and I should be getting a 
fresh view of the bundle, but shouldn't this be handled differently? AIOOBE is 
not documented as an exception that may be thrown in the OSGi API. Knowing how 
to handle this requires knowledge of BundleImpl's implementation (m_revisions 
etc).

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to