2 * Copyright (C) 2007-2012 Argeo GmbH
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org
.argeo
.slc
.client
.ui
.dist
.views
;
18 import java
.util
.Comparator
;
19 import java
.util
.HashMap
;
22 import java
.util
.TreeMap
;
23 import java
.util
.TreeSet
;
25 import org
.apache
.commons
.logging
.Log
;
26 import org
.apache
.commons
.logging
.LogFactory
;
27 import org
.argeo
.eclipse
.ui
.TreeParent
;
28 import org
.argeo
.slc
.client
.ui
.dist
.DistPlugin
;
29 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
30 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
31 import org
.eclipse
.jface
.viewers
.LabelProvider
;
32 import org
.eclipse
.jface
.viewers
.TreeViewer
;
33 import org
.eclipse
.jface
.viewers
.Viewer
;
34 import org
.eclipse
.swt
.SWT
;
35 import org
.eclipse
.swt
.graphics
.Image
;
36 import org
.eclipse
.swt
.widgets
.Composite
;
37 import org
.eclipse
.ui
.part
.ViewPart
;
38 import org
.osgi
.framework
.Bundle
;
39 import org
.osgi
.framework
.BundleContext
;
40 import org
.osgi
.framework
.ServiceReference
;
41 import org
.osgi
.service
.packageadmin
.ExportedPackage
;
42 import org
.osgi
.service
.packageadmin
.PackageAdmin
;
44 public class ModulesView
extends ViewPart
{
45 private final static Log log
= LogFactory
.getLog(ModulesView
.class);
47 private TreeViewer viewer
;
49 private PackageAdmin packageAdmin
;
51 private Comparator
<ExportedPackage
> exportedPackageComparator
= new Comparator
<ExportedPackage
>() {
53 public int compare(ExportedPackage o1
, ExportedPackage o2
) {
54 if (!o1
.getName().equals(o2
.getName()))
55 return o1
.getName().compareTo(o2
.getName());
57 return o1
.getVersion().compareTo(o2
.getVersion());
62 public void createPartControl(Composite parent
) {
63 viewer
= new TreeViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
64 viewer
.setContentProvider(new ModulesContentProvider());
65 viewer
.setLabelProvider(new ModulesLabelProvider());
66 viewer
.setInput(DistPlugin
.getBundleContext());
70 public void setFocus() {
71 viewer
.getTree().setFocus();
74 private class ModulesContentProvider
implements ITreeContentProvider
{
76 public Object
[] getElements(Object inputElement
) {
77 return getChildren(inputElement
);
80 public Object
[] getChildren(Object parentElement
) {
81 if (parentElement
instanceof BundleContext
) {
82 BundleContext bundleContext
= (BundleContext
) parentElement
;
83 Bundle
[] bundles
= bundleContext
.getBundles();
85 TreeParent bundlesNode
= new TreeParent("Bundles");
86 for (Bundle bundle
: bundles
) {
87 if (bundle
.getState() == Bundle
.ACTIVE
)
88 bundlesNode
.addChild(new BundleNode(bundle
));
92 ServiceReference paSr
= bundleContext
93 .getServiceReference(PackageAdmin
.class.getName());
94 // TODO: make a cleaner referencing
95 packageAdmin
= (PackageAdmin
) bundleContext
.getService(paSr
);
97 Bundle bundle1
= null;
98 Bundle bundle2
= null;
100 Map
<Bundle
, Set
<ExportedPackage
>> importedPackages
= new HashMap
<Bundle
, Set
<ExportedPackage
>>();
101 Map
<String
, Set
<ExportedPackage
>> packages
= new TreeMap
<String
, Set
<ExportedPackage
>>();
102 for (Bundle bundle
: bundles
) {
103 if (bundle
.getSymbolicName()
104 .equals("org.argeo.security.ui"))
106 if (bundle
.getSymbolicName().equals(
107 "org.argeo.security.equinox"))
110 ExportedPackage
[] pkgs
= packageAdmin
111 .getExportedPackages(bundle
);
113 for (ExportedPackage pkg
: pkgs
) {
114 if (!packages
.containsKey(pkg
.getName()))
115 packages
.put(pkg
.getName(),
116 new TreeSet
<ExportedPackage
>(
117 exportedPackageComparator
));
118 Set
<ExportedPackage
> expPackages
= (Set
<ExportedPackage
>) packages
120 expPackages
.add(pkg
);
123 for (Bundle b
: pkg
.getImportingBundles()) {
124 if (bundle
.getBundleId() != b
.getBundleId()) {
125 if (!importedPackages
.containsKey(b
))
128 new TreeSet
<ExportedPackage
>(
129 exportedPackageComparator
));
130 Set
<ExportedPackage
> impPackages
= (Set
<ExportedPackage
>) importedPackages
132 impPackages
.add(pkg
);
138 TreeParent mPackageNode
= new TreeParent("Multiple Packages");
139 TreeParent aPackageNode
= new TreeParent("All Packages");
140 for (String packageName
: packages
.keySet()) {
141 Set
<ExportedPackage
> pkgs
= packages
.get(packageName
);
142 if (pkgs
.size() > 1) {
143 MultiplePackagesNode mpn
= new MultiplePackagesNode(
145 mPackageNode
.addChild(mpn
);
146 aPackageNode
.addChild(mpn
);
148 aPackageNode
.addChild(new ExportedPackageNode(pkgs
149 .iterator().next()));
153 // Map<String, Set<String>> traces1 = new TreeMap<String,
155 // Map<String, ExportedPackage> space1 =
156 // dependencySpace(bundle1,
157 // importedPackages, traces1);
158 // Map<String, Set<String>> traces2 = new TreeMap<String,
160 // Map<String, ExportedPackage> space2 =
161 // dependencySpace(bundle2,
162 // importedPackages, traces2);
163 // for (String key : space1.keySet()) {
164 // if (space2.containsKey(key)) {
165 // ExportedPackage pkg1 = space1.get(key);
166 // ExportedPackage pkg2 = space2.get(key);
167 // if (!pkg1.getVersion().equals(pkg2.getVersion())) {
168 // log.debug("\n##" + pkg1 + " <> " + pkg2);
169 // log.debug("# Traces for "
170 // + bundle1.getSymbolicName());
171 // for (String trace : traces1.get(pkg1.getName())) {
174 // log.debug("# Traces for "
175 // + bundle2.getSymbolicName());
176 // for (String trace : traces2.get(pkg2.getName())) {
183 return new Object
[] { bundlesNode
, mPackageNode
, aPackageNode
};
184 } else if (parentElement
instanceof TreeParent
) {
185 return ((TreeParent
) parentElement
).getChildren();
191 public Object
getParent(Object element
) {
192 // TODO Auto-generated method stub
196 public boolean hasChildren(Object element
) {
197 if (element
instanceof TreeParent
) {
198 return ((TreeParent
) element
).hasChildren();
203 public void dispose() {
204 // TODO Auto-generated method stub
208 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
209 // TODO Auto-generated method stub
215 protected Map
<String
, ExportedPackage
> dependencySpace(Bundle bundle
,
216 Map
<Bundle
, Set
<ExportedPackage
>> importedPackages
,
217 Map
<String
, Set
<String
>> traces
) {
218 log
.debug("Dependency space for " + bundle
.getSymbolicName());
219 Map
<String
, ExportedPackage
> space
= new TreeMap
<String
, ExportedPackage
>();
220 fillDependencySpace(space
, bundle
, importedPackages
,
221 bundle
.getSymbolicName(), traces
);
226 protected void fillDependencySpace(Map
<String
, ExportedPackage
> space
,
227 Bundle bundle
, Map
<Bundle
, Set
<ExportedPackage
>> importedPackages
,
228 String currTrace
, Map
<String
, Set
<String
>> traces
) {
229 if (importedPackages
.containsKey(bundle
)) {
230 Set
<ExportedPackage
> imports
= importedPackages
.get(bundle
);
231 // log.debug("## Fill dependency space for " + bundle + " : ");
232 for (ExportedPackage pkg
: imports
) {
233 if (!traces
.containsKey(pkg
.getName()))
234 traces
.put(pkg
.getName(), new TreeSet
<String
>());
235 traces
.get(pkg
.getName()).add(currTrace
);
236 if (!space
.containsKey(pkg
.getName())) {
237 space
.put(pkg
.getName(), pkg
);
238 Bundle exportingBundle
= pkg
.getExportingBundle();
239 // if (bundle.getBundleId() !=
240 // exportingBundle.getBundleId())
241 fillDependencySpace(space
, exportingBundle
,
242 importedPackages
, currTrace
+ " > "
243 + exportingBundle
.getSymbolicName(), traces
);
249 private class ModulesLabelProvider
extends LabelProvider
implements
250 ITableLabelProvider
{
252 public Image
getColumnImage(Object element
, int columnIndex
) {
253 // TODO Auto-generated method stub
257 public String
getColumnText(Object element
, int columnIndex
) {
258 return getText(element
);
263 class BundleNode
extends TreeParent
{
264 private final Bundle bundle
;
266 public BundleNode(Bundle bundle
) {
267 super(bundle
.getSymbolicName());
268 this.bundle
= bundle
;
270 // Registered services
271 ServiceReference
[] registeredServices
= bundle
272 .getRegisteredServices();
273 if (registeredServices
!= null) {
274 TreeParent registeredServicesNode
= new TreeParent(
275 "Registered Services");
276 addChild(registeredServicesNode
);
277 for (ServiceReference sr
: registeredServices
) {
279 registeredServicesNode
280 .addChild(new ServiceReferenceNode(sr
));
285 ServiceReference
[] usedServices
= bundle
.getRegisteredServices();
286 if (usedServices
!= null) {
287 TreeParent usedServicesNode
= new TreeParent("Used Services");
288 addChild(usedServicesNode
);
289 for (ServiceReference sr
: usedServices
) {
291 usedServicesNode
.addChild(new ServiceReferenceNode(sr
));
296 public Bundle
getBundle() {
302 class ServiceReferenceNode
extends TreeParent
{
303 private final ServiceReference serviceReference
;
305 public ServiceReferenceNode(ServiceReference serviceReference
) {
306 super(serviceReference
.toString());
307 this.serviceReference
= serviceReference
;
309 Bundle
[] usedBundles
= serviceReference
.getUsingBundles();
310 if (usedBundles
!= null) {
311 TreeParent usingBundles
= new TreeParent("Using Bundles");
312 addChild(usingBundles
);
313 for (Bundle b
: usedBundles
) {
315 usingBundles
.addChild(new TreeParent(b
316 .getSymbolicName()));
320 TreeParent properties
= new TreeParent("Properties");
321 addChild(properties
);
322 for (String key
: serviceReference
.getPropertyKeys()) {
323 properties
.addChild(new TreeParent(key
+ "="
324 + serviceReference
.getProperty(key
)));
329 public ServiceReference
getServiceReference() {
330 return serviceReference
;
335 class MultiplePackagesNode
extends TreeParent
{
336 private String packageName
;
337 private Set
<ExportedPackage
> exportedPackages
;
339 public MultiplePackagesNode(String packageName
,
340 Set
<ExportedPackage
> exportedPackages
) {
342 this.packageName
= packageName
;
343 this.exportedPackages
= exportedPackages
;
344 for (ExportedPackage pkg
: exportedPackages
) {
345 addChild(new ExportedPackageNode(pkg
));
351 class ConflictingPackageNode
extends TreeParent
{
352 private ExportedPackage exportedPackage
;
354 public ConflictingPackageNode(ExportedPackage exportedPackage
) {
355 super(exportedPackage
.getName() + " - "
356 + exportedPackage
.getVersion() + " ("
357 + exportedPackage
.getExportingBundle() + ")");
358 this.exportedPackage
= exportedPackage
;
360 TreeParent bundlesNode
= new TreeParent("Dependent Bundles");
361 this.addChild(bundlesNode
);
362 Map
<String
, Bundle
> bundles
= new TreeMap
<String
, Bundle
>();
363 for (Bundle b
: exportedPackage
.getImportingBundles()) {
364 bundles
.put(b
.getSymbolicName(), b
);
366 for (String key
: bundles
.keySet()) {
367 addDependentBundles(bundlesNode
, bundles
.get(key
));
372 protected void addDependentBundles(TreeParent parent
, Bundle bundle
) {
373 TreeParent bundleNode
= new TreeParent(bundle
.toString());
374 parent
.addChild(bundleNode
);
375 Map
<String
, Bundle
> bundles
= new TreeMap
<String
, Bundle
>();
376 ExportedPackage
[] pkgs
= packageAdmin
.getExportedPackages(bundle
);
378 for (ExportedPackage pkg
: pkgs
) {
379 for (Bundle b
: pkg
.getImportingBundles()) {
380 if (!bundles
.containsKey(b
.getSymbolicName())
381 && b
.getBundleId() != bundle
.getBundleId()) {
382 bundles
.put(b
.getSymbolicName(), b
);
387 for (String key
: bundles
.keySet()) {
388 addDependentBundles(bundleNode
, bundles
.get(key
));
392 class ExportedPackageNode
extends TreeParent
{
393 private ExportedPackage exportedPackage
;
395 public ExportedPackageNode(ExportedPackage exportedPackage
) {
396 super(exportedPackage
.getName() + " - "
397 + exportedPackage
.getVersion() + " ("
398 + exportedPackage
.getExportingBundle() + ")");
399 this.exportedPackage
= exportedPackage
;
400 for (Bundle bundle
: exportedPackage
.getImportingBundles()) {
401 addChild(new BundleNode(bundle
));