1 package org
.argeo
.init
.osgi
;
3 import static java
.lang
.System
.Logger
.Level
.WARNING
;
5 import java
.lang
.System
.Logger
;
6 import java
.util
.ArrayList
;
7 import java
.util
.Iterator
;
11 import java
.util
.TreeMap
;
12 import java
.util
.TreeSet
;
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
;
20 class OsgiBootDiagnostics
{
21 private final static Logger logger
= System
.getLogger(OsgiBootDiagnostics
.class.getName());
23 private final BundleContext bundleContext
;
25 public OsgiBootDiagnostics(BundleContext bundleContext
) {
26 this.bundleContext
= bundleContext
;
32 /** Check unresolved bundles */
33 protected void checkUnresolved() {
35 ServiceReference
<PackageAdmin
> packageAdminRef
= bundleContext
.getServiceReference(PackageAdmin
.class);
36 PackageAdmin packageAdmin
= (PackageAdmin
) bundleContext
.getService(packageAdminRef
);
37 packageAdmin
.resolveBundles(null);
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
]);
47 if (unresolvedBundles
.size() != 0) {
48 logger
.log(WARNING
, "Unresolved bundles " + unresolvedBundles
);
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
54 for (Bundle b
: unresolvedBundles
) {
57 } catch (Exception e
) {
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
);
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
);
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
>());
80 (exportedPackages
.get(pkgName
)).add(bundle
.getSymbolicName() + "_" + bundle
.getVersion());
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
);
89 duplicatePackages
.put(pkgName
, bdles
);
91 return duplicatePackages
;