View Javadoc
1   package org.argeo.osgi.boot;
2   
3   import java.util.ArrayList;
4   import java.util.Iterator;
5   import java.util.List;
6   import java.util.Map;
7   import java.util.Set;
8   import java.util.TreeMap;
9   import java.util.TreeSet;
10  
11  import org.osgi.framework.Bundle;
12  import org.osgi.framework.BundleContext;
13  import org.osgi.framework.ServiceReference;
14  import org.osgi.service.packageadmin.ExportedPackage;
15  import org.osgi.service.packageadmin.PackageAdmin;
16  
17  @SuppressWarnings("deprecation")
18  class OsgiBootDiagnostics {
19  	private final BundleContext bundleContext;
20  
21  	public OsgiBootDiagnostics(BundleContext bundleContext) {
22  		this.bundleContext = bundleContext;
23  	}
24  	/*
25  	 * DIAGNOSTICS
26  	 */
27  	/** Check unresolved bundles */
28  	protected void checkUnresolved() {
29  		// Refresh
30  		ServiceReference<PackageAdmin> packageAdminRef = bundleContext.getServiceReference(PackageAdmin.class);
31  		PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminRef);
32  		packageAdmin.resolveBundles(null);
33  
34  		Bundle[] bundles = bundleContext.getBundles();
35  		List<Bundle> unresolvedBundles = new ArrayList<Bundle>();
36  		for (int i = 0; i < bundles.length; i++) {
37  			int bundleState = bundles[i].getState();
38  			if (!(bundleState == Bundle.ACTIVE || bundleState == Bundle.RESOLVED || bundleState == Bundle.STARTING))
39  				unresolvedBundles.add(bundles[i]);
40  		}
41  
42  		if (unresolvedBundles.size() != 0) {
43  			OsgiBootUtils.warn("Unresolved bundles " + unresolvedBundles);
44  		}
45  	}
46  
47  	/** List packages exported twice. */
48  	public Map<String, Set<String>> findPackagesExportedTwice() {
49  		ServiceReference<PackageAdmin> paSr = bundleContext.getServiceReference(PackageAdmin.class);
50  		PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(paSr);
51  
52  		// find packages exported twice
53  		Bundle[] bundles = bundleContext.getBundles();
54  		Map<String, Set<String>> exportedPackages = new TreeMap<String, Set<String>>();
55  		for (int i = 0; i < bundles.length; i++) {
56  			Bundle bundle = bundles[i];
57  			ExportedPackage[] pkgs = packageAdmin.getExportedPackages(bundle);
58  			if (pkgs != null)
59  				for (int j = 0; j < pkgs.length; j++) {
60  					String pkgName = pkgs[j].getName();
61  					if (!exportedPackages.containsKey(pkgName)) {
62  						exportedPackages.put(pkgName, new TreeSet<String>());
63  					}
64  					(exportedPackages.get(pkgName)).add(bundle.getSymbolicName() + "_" + bundle.getVersion());
65  				}
66  		}
67  		Map<String, Set<String>> duplicatePackages = new TreeMap<String, Set<String>>();
68  		Iterator<String> it = exportedPackages.keySet().iterator();
69  		while (it.hasNext()) {
70  			String pkgName = it.next().toString();
71  			Set<String> bdles = exportedPackages.get(pkgName);
72  			if (bdles.size() > 1)
73  				duplicatePackages.put(pkgName, bdles);
74  		}
75  		return duplicatePackages;
76  	}
77  
78  }