]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.init/src/org/argeo/init/osgi/OsgiBootDiagnostics.java
Simplify multi-runtime
[lgpl/argeo-commons.git] / org.argeo.init / src / org / argeo / init / osgi / OsgiBootDiagnostics.java
1 package org.argeo.init.osgi;
2
3 import static java.lang.System.Logger.Level.WARNING;
4
5 import java.lang.System.Logger;
6 import java.util.ArrayList;
7 import java.util.Iterator;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Set;
11 import java.util.TreeMap;
12 import java.util.TreeSet;
13
14 import org.osgi.framework.Bundle;
15 import org.osgi.framework.BundleContext;
16 import org.osgi.framework.ServiceReference;
17 import org.osgi.service.packageadmin.ExportedPackage;
18 import org.osgi.service.packageadmin.PackageAdmin;
19
20 class OsgiBootDiagnostics {
21 private final static Logger logger = System.getLogger(OsgiBootDiagnostics.class.getName());
22
23 private final BundleContext bundleContext;
24
25 public OsgiBootDiagnostics(BundleContext bundleContext) {
26 this.bundleContext = bundleContext;
27 }
28
29 /*
30 * DIAGNOSTICS
31 */
32 /** Check unresolved bundles */
33 protected void checkUnresolved() {
34 // Refresh
35 ServiceReference<PackageAdmin> packageAdminRef = bundleContext.getServiceReference(PackageAdmin.class);
36 PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminRef);
37 packageAdmin.resolveBundles(null);
38
39 Bundle[] bundles = bundleContext.getBundles();
40 List<Bundle> unresolvedBundles = new ArrayList<Bundle>();
41 for (int i = 0; i < bundles.length; i++) {
42 int bundleState = bundles[i].getState();
43 if (!(bundleState == Bundle.ACTIVE || bundleState == Bundle.RESOLVED || bundleState == Bundle.STARTING))
44 unresolvedBundles.add(bundles[i]);
45 }
46
47 if (unresolvedBundles.size() != 0) {
48 logger.log(WARNING, "Unresolved bundles " + unresolvedBundles);
49 }
50
51 // try to start unresolved bundles in order to trigger diagnostics
52 // (this should not have side-effects since unresolved bundles won't be able to
53 // start)
54 for (Bundle b : unresolvedBundles) {
55 try {
56 b.start();
57 } catch (Exception e) {
58 e.printStackTrace();
59 }
60 }
61 }
62
63 /** List packages exported twice. */
64 public Map<String, Set<String>> findPackagesExportedTwice() {
65 ServiceReference<PackageAdmin> paSr = bundleContext.getServiceReference(PackageAdmin.class);
66 PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(paSr);
67
68 // find packages exported twice
69 Bundle[] bundles = bundleContext.getBundles();
70 Map<String, Set<String>> exportedPackages = new TreeMap<String, Set<String>>();
71 for (int i = 0; i < bundles.length; i++) {
72 Bundle bundle = bundles[i];
73 ExportedPackage[] pkgs = packageAdmin.getExportedPackages(bundle);
74 if (pkgs != null)
75 for (int j = 0; j < pkgs.length; j++) {
76 String pkgName = pkgs[j].getName();
77 if (!exportedPackages.containsKey(pkgName)) {
78 exportedPackages.put(pkgName, new TreeSet<String>());
79 }
80 (exportedPackages.get(pkgName)).add(bundle.getSymbolicName() + "_" + bundle.getVersion());
81 }
82 }
83 Map<String, Set<String>> duplicatePackages = new TreeMap<String, Set<String>>();
84 Iterator<String> it = exportedPackages.keySet().iterator();
85 while (it.hasNext()) {
86 String pkgName = it.next().toString();
87 Set<String> bdles = exportedPackages.get(pkgName);
88 if (bdles.size() > 1)
89 duplicatePackages.put(pkgName, bdles);
90 }
91 return duplicatePackages;
92 }
93
94 }