]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java
MOve project to PDE
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.osgi / src / main / java / org / argeo / slc / osgi / BundlesManager.java
index a096a44d413bf6eca8c216440144bfd09bfab427..2f846ccb7a102663e5b10ba9986eaac2d0e7d130 100644 (file)
@@ -17,12 +17,18 @@ import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.osgi.context.BundleContextAware;
+import org.springframework.osgi.context.event.OsgiBundleApplicationContextEvent;
+import org.springframework.osgi.context.event.OsgiBundleApplicationContextListener;
+import org.springframework.osgi.context.event.OsgiBundleContextClosedEvent;
+import org.springframework.osgi.context.event.OsgiBundleContextFailedEvent;
+import org.springframework.osgi.context.event.OsgiBundleContextRefreshedEvent;
+import org.springframework.osgi.util.OsgiBundleUtils;
 import org.springframework.osgi.util.OsgiFilterUtils;
 import org.springframework.util.Assert;
 
 /** Wraps low-level access to a {@link BundleContext} */
 public class BundlesManager implements BundleContextAware, FrameworkListener,
-               InitializingBean, DisposableBean {
+               InitializingBean, DisposableBean, OsgiBundleApplicationContextListener {
        private final static Log log = LogFactory.getLog(BundlesManager.class);
 
        private BundleContext bundleContext;
@@ -57,7 +63,7 @@ public class BundlesManager implements BundleContextAware, FrameworkListener,
                        startSynchronous(bundle);
 
                        long aStart = System.currentTimeMillis();
-                       if (log.isDebugEnabled()) {
+                       if (log.isTraceEnabled()) {
                                log.debug("OSGi upgrade performed in " + (aStart - begin)
                                                + "ms for bundle " + osgiBundle);
                                log.debug(" stop \t: " + (bUpdate - bStop) + "ms");
@@ -72,22 +78,35 @@ public class BundlesManager implements BundleContextAware, FrameworkListener,
                                        + ")";
                        // Wait for application context to be ready
                        // TODO: use service tracker
-                       getServiceRefSynchronous(ApplicationContext.class.getName(), filter);
+                       ServiceReference[] srs = getServiceRefSynchronous(
+                                       ApplicationContext.class.getName(), filter);
+                       ServiceReference sr = srs[0];
                        long aAppContext = System.currentTimeMillis();
                        long end = aAppContext;
 
-                       if (log.isDebugEnabled()) {
+                       if (log.isTraceEnabled()) {
                                log.debug("Application context refresh performed in "
                                                + (aAppContext - bAppContext) + "ms for bundle "
                                                + osgiBundle);
-                               log.debug(" TOTAL\t: " + (aAppContext - bAppContext) + "ms");
                        }
 
                        if (log.isDebugEnabled())
                                log.debug("Bundle " + bundle.getSymbolicName()
                                                + " ready to be used at latest version."
                                                + " (upgrade performed in " + (end - begin) + "ms).");
-                       log.debug(" TOTAL\t: " + (end - begin) + "ms");
+
+                       if (log.isTraceEnabled()) {
+                               ApplicationContext applicationContext = (ApplicationContext) bundleContext
+                                               .getService(sr);
+                               int beanDefCount = applicationContext.getBeanDefinitionCount();
+                               log.debug(" " + beanDefCount + " beans in app context of "
+                                               + bundle.getSymbolicName()
+                                               + ", average init time per bean=" + (end - begin)
+                                               / beanDefCount + "ms");
+                       }
+
+                       bundleContext.ungetService(sr);
+
                } catch (Exception e) {
                        throw new SlcException("Cannot update bundle " + osgiBundle, e);
                }
@@ -280,16 +299,31 @@ public class BundlesManager implements BundleContextAware, FrameworkListener,
                        Assert.isTrue(
                                        osgiBundle.getName().equals(bundle.getSymbolicName()),
                                        "symbolic name consistent");
-                       Assert.isTrue(osgiBundle.getVersion().equals(
-                                       bundle.getHeaders().get(Constants.BUNDLE_VERSION)),
-                                       "version consistent");
-               } else {
-                       for (Bundle b : bundleContext.getBundles()) {
+                       if (osgiBundle.getVersion() != null)
+                               Assert.isTrue(osgiBundle.getVersion().equals(
+                                               bundle.getHeaders().get(Constants.BUNDLE_VERSION)),
+                                               "version consistent");
+               } else if (osgiBundle.getVersion() == null) {
+                       bundle = OsgiBundleUtils.findBundleBySymbolicName(bundleContext,
+                                       osgiBundle.getName());
+               } else {// scan all bundles
+                       bundles: for (Bundle b : bundleContext.getBundles()) {
+                               if (b.getSymbolicName() == null) {
+                                       log.warn("Bundle " + b + " has no symbolic name defined.");
+                                       continue bundles;
+                               }
+
                                if (b.getSymbolicName().equals(osgiBundle.getName())) {
+                                       if (osgiBundle.getVersion() == null) {
+                                               bundle = b;
+                                               break bundles;
+                                       }
+
                                        if (b.getHeaders().get(Constants.BUNDLE_VERSION).equals(
                                                        osgiBundle.getVersion())) {
                                                bundle = b;
                                                osgiBundle.setInternalBundleId(b.getBundleId());
+                                               break bundles;
                                        }
                                }
                        }
@@ -339,4 +373,16 @@ public class BundlesManager implements BundleContextAware, FrameworkListener,
                this.pollingPeriod = pollingPeriod;
        }
 
+       public void onOsgiApplicationEvent(OsgiBundleApplicationContextEvent event) {
+               if (event instanceof OsgiBundleContextRefreshedEvent) {
+                       log.debug("App context refreshed: " + event);
+               } else if (event instanceof OsgiBundleContextFailedEvent) {
+                       log.debug("App context failed: " + event);
+               }
+               if (event instanceof OsgiBundleContextClosedEvent) {
+                       log.debug("App context closed: " + event);
+               }
+
+       }
+
 }