You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Richard S. Hall (JIRA)" <ji...@apache.org> on 2012/09/03 16:58:08 UTC

[jira] [Commented] (FELIX-3652) ArrayIndexOutOfBoundsException when trying to adapt() a stopped bundle

    [ https://issues.apache.org/jira/browse/FELIX-3652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13447304#comment-13447304 ] 

Richard S. Hall commented on FELIX-3652:
----------------------------------------

Do you know what state the Bundle is in when the adapt is performed? Could you check? It seems like the number of revisions shouldn't be zero unless the bundle has been uninstalled.
                
> 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