package org.argeo.init.osgi; import static java.lang.System.Logger.Level.WARNING; import java.lang.System.Logger; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.service.packageadmin.ExportedPackage; import org.osgi.service.packageadmin.PackageAdmin; class OsgiBootDiagnostics { private final static Logger logger = System.getLogger(OsgiBootDiagnostics.class.getName()); private final BundleContext bundleContext; public OsgiBootDiagnostics(BundleContext bundleContext) { this.bundleContext = bundleContext; } /* * DIAGNOSTICS */ /** Check unresolved bundles */ protected void checkUnresolved() { // Refresh ServiceReference packageAdminRef = bundleContext.getServiceReference(PackageAdmin.class); PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminRef); packageAdmin.resolveBundles(null); Bundle[] bundles = bundleContext.getBundles(); List unresolvedBundles = new ArrayList(); 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) { logger.log(WARNING, "Unresolved bundles " + unresolvedBundles); } // try to start unresolved bundles in order to trigger diagnostics // (this should not have side-effects since unresolved bundles won't be able to // start) for (Bundle b : unresolvedBundles) { try { b.start(); } catch (Exception e) { e.printStackTrace(); } } } /** List packages exported twice. */ public Map> findPackagesExportedTwice() { ServiceReference paSr = bundleContext.getServiceReference(PackageAdmin.class); PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(paSr); // find packages exported twice Bundle[] bundles = bundleContext.getBundles(); Map> exportedPackages = new TreeMap>(); 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()); } (exportedPackages.get(pkgName)).add(bundle.getSymbolicName() + "_" + bundle.getVersion()); } } Map> duplicatePackages = new TreeMap>(); Iterator it = exportedPackages.keySet().iterator(); while (it.hasNext()) { String pkgName = it.next().toString(); Set bdles = exportedPackages.get(pkgName); if (bdles.size() > 1) duplicatePackages.put(pkgName, bdles); } return duplicatePackages; } }