-
- /**
- * Start the provided list of bundles
- *
- * @return whether all bundlesa are now in active state
- */
- public boolean startBundles(List<String> bundlesToStart) {
- if (bundlesToStart.size() == 0)
- return true;
-
- // used to monitor ACTIVE states
- List<Bundle> startedBundles = new ArrayList<Bundle>();
- // used to log the bundles not found
- List<String> notFoundBundles = new ArrayList<String>(bundlesToStart);
-
- Bundle[] bundles = bundleContext.getBundles();
- long startBegin = System.currentTimeMillis();
- for (int i = 0; i < bundles.length; i++) {
- Bundle bundle = bundles[i];
- String symbolicName = bundle.getSymbolicName();
- if (bundlesToStart.contains(symbolicName))
- try {
- try {
- bundle.start();
- if (debug)
- debug("Bundle " + symbolicName + " started");
- } catch (Exception e) {
- OsgiBootUtils.warn("Start of bundle " + symbolicName
- + " failed because of " + e
- + ", maybe bundle is not yet resolved,"
- + " waiting and trying again.");
- waitForBundleResolvedOrActive(startBegin, bundle);
- bundle.start();
- startedBundles.add(bundle);
- }
- notFoundBundles.remove(symbolicName);
- } catch (Exception e) {
- OsgiBootUtils.warn("Bundle " + symbolicName
- + " cannot be started: " + e.getMessage());
- if (debug)
- e.printStackTrace();
- // was found even if start failed
- notFoundBundles.remove(symbolicName);
- }
- }
-
- for (int i = 0; i < notFoundBundles.size(); i++)
- OsgiBootUtils.warn("Bundle '" + notFoundBundles.get(i)
- + "' not started because it was not found.");
-
- // monitors that all bundles are started
- long beginMonitor = System.currentTimeMillis();
- boolean allStarted = !(startedBundles.size() > 0);
- List<String> notStarted = new ArrayList<String>();
- while (!allStarted
- && (System.currentTimeMillis() - beginMonitor) < defaultTimeout) {
- notStarted = new ArrayList<String>();
- allStarted = true;
- for (int i = 0; i < startedBundles.size(); i++) {
- Bundle bundle = (Bundle) startedBundles.get(i);
- // TODO check behaviour of lazs bundles
- if (bundle.getState() != Bundle.ACTIVE) {
- allStarted = false;
- notStarted.add(bundle.getSymbolicName());
- }
- }
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- // silent
- }
- }
- long duration = System.currentTimeMillis() - beginMonitor;
-
- if (!allStarted)
- for (int i = 0; i < notStarted.size(); i++)
- OsgiBootUtils.warn("Bundle '" + notStarted.get(i)
- + "' not ACTIVE after " + (duration / 1000) + "s");
-
- return allStarted;
- }
-
- /*
- * DIAGNOSTICS
- */
- /** Check unresolved bundles */
- @SuppressWarnings("deprecation")
- protected void checkUnresolved() {
- // Refresh
- ServiceReference<PackageAdmin> packageAdminRef = bundleContext
- .getServiceReference(PackageAdmin.class);
- PackageAdmin packageAdmin = (PackageAdmin) bundleContext
- .getService(packageAdminRef);
- packageAdmin.resolveBundles(null);
-
- Bundle[] bundles = bundleContext.getBundles();
- List<Bundle> unresolvedBundles = new ArrayList<Bundle>();
- for (int i = 0; i < bundles.length; i++) {
- int bundleState = bundles[i].getState();
- if (!(bundleState == Bundle.ACTIVE
- || bundleState == Bundle.RESOLVED || bundleState == Bundle.STARTING))
- unresolvedBundles.add(bundles[i]);
- }
-
- if (unresolvedBundles.size() != 0) {
- OsgiBootUtils.warn("Unresolved bundles " + unresolvedBundles);
- }
- }
-
- /** List packages exported twice. */
- @SuppressWarnings("deprecation")
- public Map<String, Set<String>> findPackagesExportedTwice() {
- ServiceReference<PackageAdmin> paSr = bundleContext
- .getServiceReference(PackageAdmin.class);
- PackageAdmin packageAdmin = (PackageAdmin) bundleContext
- .getService(paSr);
-
- // find packages exported twice
- Bundle[] bundles = bundleContext.getBundles();
- Map<String, Set<String>> exportedPackages = new TreeMap<String, Set<String>>();
- for (int i = 0; i < bundles.length; i++) {
- Bundle bundle = bundles[i];
- ExportedPackage[] pkgs = packageAdmin.getExportedPackages(bundle);
- if (pkgs != null)
- for (int j = 0; j < pkgs.length; j++) {
- String pkgName = pkgs[j].getName();
- if (!exportedPackages.containsKey(pkgName)) {
- exportedPackages.put(pkgName, new TreeSet<String>());
- }
- (exportedPackages.get(pkgName)).add(bundle
- .getSymbolicName() + "_" + bundle.getVersion());
- }
- }
- Map<String, Set<String>> duplicatePackages = new TreeMap<String, Set<String>>();
- Iterator<String> it = exportedPackages.keySet().iterator();
- while (it.hasNext()) {
- String pkgName = it.next().toString();
- Set<String> bdles = exportedPackages.get(pkgName);
- if (bdles.size() > 1)
- duplicatePackages.put(pkgName, bdles);
- }
- return duplicatePackages;
- }