]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.osgi.boot/src/org/argeo/osgi/boot/OsgiBootDiagnostics.java
Merge remote-tracking branch 'origin/master' into v2.x
[lgpl/argeo-commons.git] / org.argeo.osgi.boot / src / org / argeo / osgi / boot / OsgiBootDiagnostics.java
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 }