]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.init/src/org/argeo/init/osgi/OsgiBootDiagnostics.java
Make CmsLog initialisation more robust
[lgpl/argeo-commons.git] / org.argeo.init / src / org / argeo / init / osgi / OsgiBootDiagnostics.java
1 package org.argeo.init.osgi;
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 /*
26 * DIAGNOSTICS
27 */
28 /** Check unresolved bundles */
29 protected void checkUnresolved() {
30 // Refresh
31 ServiceReference<PackageAdmin> packageAdminRef = bundleContext.getServiceReference(PackageAdmin.class);
32 PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminRef);
33 packageAdmin.resolveBundles(null);
34
35 Bundle[] bundles = bundleContext.getBundles();
36 List<Bundle> unresolvedBundles = new ArrayList<Bundle>();
37 for (int i = 0; i < bundles.length; i++) {
38 int bundleState = bundles[i].getState();
39 if (!(bundleState == Bundle.ACTIVE || bundleState == Bundle.RESOLVED || bundleState == Bundle.STARTING))
40 unresolvedBundles.add(bundles[i]);
41 }
42
43 if (unresolvedBundles.size() != 0) {
44 OsgiBootUtils.warn("Unresolved bundles " + unresolvedBundles);
45 }
46
47 // try to start unresolved bundles in order to trigger diagnostics
48 // (this should not have side-effects since unresolved bundles won't be able to
49 // start)
50 for (Bundle b : unresolvedBundles) {
51 try {
52 b.start();
53 } catch (Exception e) {
54 e.printStackTrace();
55 }
56 }
57 }
58
59 /** List packages exported twice. */
60 public Map<String, Set<String>> findPackagesExportedTwice() {
61 ServiceReference<PackageAdmin> paSr = bundleContext.getServiceReference(PackageAdmin.class);
62 PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(paSr);
63
64 // find packages exported twice
65 Bundle[] bundles = bundleContext.getBundles();
66 Map<String, Set<String>> exportedPackages = new TreeMap<String, Set<String>>();
67 for (int i = 0; i < bundles.length; i++) {
68 Bundle bundle = bundles[i];
69 ExportedPackage[] pkgs = packageAdmin.getExportedPackages(bundle);
70 if (pkgs != null)
71 for (int j = 0; j < pkgs.length; j++) {
72 String pkgName = pkgs[j].getName();
73 if (!exportedPackages.containsKey(pkgName)) {
74 exportedPackages.put(pkgName, new TreeSet<String>());
75 }
76 (exportedPackages.get(pkgName)).add(bundle.getSymbolicName() + "_" + bundle.getVersion());
77 }
78 }
79 Map<String, Set<String>> duplicatePackages = new TreeMap<String, Set<String>>();
80 Iterator<String> it = exportedPackages.keySet().iterator();
81 while (it.hasNext()) {
82 String pkgName = it.next().toString();
83 Set<String> bdles = exportedPackages.get(pkgName);
84 if (bdles.size() > 1)
85 duplicatePackages.put(pkgName, bdles);
86 }
87 return duplicatePackages;
88 }
89
90 }