X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.support.osgi%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fosgi%2FBundlesManager.java;h=6be2294a453605d3f8e06861e164c001458c5307;hb=fa15e0d0a70b92ba12153f5d5d02d7e900fc25d2;hp=b56ebc2a638dc48cb5c6beeabe49f4c9f286f79e;hpb=4661e8999adf4125dd3eee76530b0fed2dccdf39;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java index b56ebc2a6..6be2294a4 100644 --- a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Mathieu Baudier + * Copyright (C) 2007-2012 Mathieu Baudier * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.argeo.slc.osgi; import org.apache.commons.logging.Log; @@ -49,7 +48,7 @@ public class BundlesManager implements BundleContextAware, FrameworkListener, private BundleContext bundleContext; - private Long defaultTimeout = 120 * 1000l; + private Long defaultTimeout = 30 * 1000l; private Long pollingPeriod = 200l; // Refresh sync objects @@ -268,7 +267,7 @@ public class BundlesManager implements BundleContextAware, FrameworkListener, try { Thread.sleep(pollingPeriod); } catch (InterruptedException e) { - // silent + throw new SlcException("Polling interrupted"); } } @@ -281,11 +280,16 @@ public class BundlesManager implements BundleContextAware, FrameworkListener, } @SuppressWarnings(value = { "unchecked" }) - public T getSingleService(Class clss, String filter) { + public T getSingleService(Class clss, String filter, + Boolean synchronous) { Assert.isTrue(OsgiFilterUtils.isValidFilter(filter), "valid filter"); ServiceReference[] sfs; try { - sfs = bundleContext.getServiceReferences(clss.getName(), filter); + if (synchronous) + sfs = getServiceRefSynchronous(clss.getName(), filter); + else + sfs = bundleContext + .getServiceReferences(clss.getName(), filter); } catch (InvalidSyntaxException e) { throw new SlcException("Cannot retrieve service reference for " + filter, e); @@ -299,16 +303,26 @@ public class BundlesManager implements BundleContextAware, FrameworkListener, return (T) bundleContext.getService(sfs[0]); } - public T getSingleServiceStrict(Class clss, String filter) { - T service = getSingleService(clss, filter); + public T getSingleServiceStrict(Class clss, String filter, + Boolean synchronous) { + T service = getSingleService(clss, filter, synchronous); if (service == null) throw new SlcException("No execution flow found for " + filter); else return service; } - /** @return the related bundle or null if not found */ + /** + * @param osgiBundle + * cannot be null + * @return the related bundle or null if not found + * @throws SlcException + * if osgiBundle argument is null + */ public Bundle findRelatedBundle(OsgiBundle osgiBundle) { + if (osgiBundle == null) + throw new SlcException("OSGi bundle cannot be null"); + Bundle bundle = null; if (osgiBundle.getInternalBundleId() != null) { bundle = bundleContext.getBundle(osgiBundle.getInternalBundleId()); @@ -321,7 +335,8 @@ public class BundlesManager implements BundleContextAware, FrameworkListener, bundle.getHeaders().get( Constants.BUNDLE_VERSION)), "version consistent"); - } else if (osgiBundle.getVersion() == null) { + } else if (osgiBundle.getVersion() == null + || osgiBundle.getVersion().equals("0.0.0")) { bundle = OsgiBundleUtils.findBundleBySymbolicName(bundleContext, osgiBundle.getName()); } else {// scan all bundles @@ -382,8 +397,11 @@ public class BundlesManager implements BundleContextAware, FrameworkListener, this.defaultTimeout = defaultTimeout; } - /** Temporary internal access for {@link OsgiExecutionModulesManager} */ - BundleContext getBundleContext() { + /** + * Use with caution since it may interfer with some cached information + * within this object + */ + public BundleContext getBundleContext() { return bundleContext; }