osgieclipse-virgospring-dm

Osgi Spring DM - Retrieve all beans by Bundle


Using Eclipse Virgo i have a Bundle with a bean that implements BundleContextAware, i add a addBundleListener and receive the events correctly when a Bundle is started or stoped, thats OK. and have a bundle installed by the bundleChanged event.

Now, i need retrieve all beans of application context of the bundle installed, whats is the best way to retrieve the application context of the bundle?

 public class PluginManager implements BundleContextAware {
               private BundleContext bundleContext;
          @Override
          public void setBundleContext(BundleContext bundleContext) {
            this.bundleContext = bundleContext;
            bundleContext.addBundleListener(this);
           }

              @Override
         public void bundleChanged(BundleEvent event) {


           Bundle bundle = event.getBundle();

    //HOW TO DO TO GET ALL BEANS OF BUNDLE

        }
}

Solution

  • I solve my problem with another Listener

      public class PluginManager implements BundleContextAware,OsgiBundleApplicationContextListener {
               private BundleContext bundleContext;
          @Override
          public void setBundleContext(BundleContext bundleContext) {
            this.bundleContext = bundleContext;
            bundleContext.addBundleListener(this);
           }
    
              @Override
         public void bundleChanged(BundleEvent event) {
    
    
           Bundle bundle = event.getBundle();
    
          //NOW use this method to receive destroy event
    
        }
        @Override
    public void onOsgiApplicationEvent(OsgiBundleApplicationContextEvent event) {
    
                 Bundle bundle = event.getBundle();
    
        PluginBundleDescriptor pluginBundleDescriptor = new PluginBundleDescriptor();
        pluginBundleDescriptor.setId(bundle.getBundleId());
        pluginBundleDescriptor.setName(bundle.getSymbolicName());
        pluginBundleDescriptor.setApplicationContext(event
                .getApplicationContext());
    

    } }

    and publish the service with a interface OsgiBundleApplicationContextListener (this is important)

     <osgi:service id="bundleContextTrackerOSGi" ref="coreModuleManager"
    interface="org.springframework.osgi.context.event.OsgiBundleApplicationContextListener" />