1 package org
.argeo
.init
.osgi
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Iterator
;
8 import java
.util
.TreeMap
;
9 import java
.util
.TreeSet
;
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
;
17 @SuppressWarnings("deprecation")
18 class OsgiBootDiagnostics
{
19 private final BundleContext bundleContext
;
21 public OsgiBootDiagnostics(BundleContext bundleContext
) {
22 this.bundleContext
= bundleContext
;
28 /** Check unresolved bundles */
29 protected void checkUnresolved() {
31 ServiceReference
<PackageAdmin
> packageAdminRef
= bundleContext
.getServiceReference(PackageAdmin
.class);
32 PackageAdmin packageAdmin
= (PackageAdmin
) bundleContext
.getService(packageAdminRef
);
33 packageAdmin
.resolveBundles(null);
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
]);
43 if (unresolvedBundles
.size() != 0) {
44 OsgiBootUtils
.warn("Unresolved bundles " + unresolvedBundles
);
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
50 for (Bundle b
: unresolvedBundles
) {
53 } catch (Exception e
) {
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
);
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
);
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
>());
76 (exportedPackages
.get(pkgName
)).add(bundle
.getSymbolicName() + "_" + bundle
.getVersion());
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
);
85 duplicatePackages
.put(pkgName
, bdles
);
87 return duplicatePackages
;