/*
* Copyright (C) 2007-2012 Argeo GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.argeo.cms.ui.workbench.osgi;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import org.argeo.cms.ui.workbench.WorkbenchUiPlugin;
import org.argeo.eclipse.ui.TreeParent;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;
/** Experimental The OSGi runtime from a module perspective. */
@SuppressWarnings({ "deprecation", "rawtypes", "unchecked" })
public class MultiplePackagesView extends ViewPart {
private TreeViewer viewer;
private PackageAdmin packageAdmin;
private Comparator epc = new Comparator() {
public int compare(ExportedPackage o1, ExportedPackage o2) {
if (!o1.getName().equals(o2.getName()))
return o1.getName().compareTo(o2.getName());
else
return o1.getVersion().compareTo(o2.getVersion());
}
};
@Override
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setContentProvider(new ModulesContentProvider());
viewer.setLabelProvider(new LabelProvider());
viewer.setInput(WorkbenchUiPlugin.getDefault().getBundle()
.getBundleContext());
}
@Override
public void setFocus() {
viewer.getTree().setFocus();
}
private class ModulesContentProvider implements ITreeContentProvider {
private static final long serialVersionUID = 3819934804640641721L;
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof BundleContext) {
BundleContext bundleContext = (BundleContext) parentElement;
Bundle[] bundles = bundleContext.getBundles();
// scan packages
ServiceReference paSr = bundleContext
.getServiceReference(PackageAdmin.class.getName());
// TODO: make a cleaner referencing
packageAdmin = (PackageAdmin) bundleContext.getService(paSr);
Map> imported = new HashMap>();
Map> packages = new TreeMap>();
for (Bundle bundle : bundles) {
processBundle(bundle, imported, packages);
}
List multiplePackages = new ArrayList();
for (String packageName : packages.keySet()) {
Set pkgs = packages.get(packageName);
if (pkgs.size() > 1) {
MultiplePackagesNode mpn = new MultiplePackagesNode(
packageName, pkgs);
multiplePackages.add(mpn);
}
}
return multiplePackages.toArray();
} else if (parentElement instanceof TreeParent) {
return ((TreeParent) parentElement).getChildren();
} else {
return null;
}
}
protected void processBundle(Bundle bundle,
Map> imported,
Map> packages) {
ExportedPackage[] pkgs = packageAdmin.getExportedPackages(bundle);
if (pkgs == null)
return;
for (ExportedPackage pkg : pkgs) {
if (!packages.containsKey(pkg.getName()))
packages.put(pkg.getName(), new TreeSet(
epc));
Set expPackages = packages.get(pkg.getName());
expPackages.add(pkg);
// imported
for (Bundle b : pkg.getImportingBundles()) {
if (bundle.getBundleId() != b.getBundleId()) {
if (!imported.containsKey(b)) {
imported.put(b, new TreeSet(epc));
}
Set impPackages = imported.get(b);
impPackages.add(pkg);
}
}
}
}
public Object getParent(Object element) {
// TODO Auto-generated method stub
return null;
}
public boolean hasChildren(Object element) {
if (element instanceof TreeParent) {
return ((TreeParent) element).hasChildren();
}
return false;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private class MultiplePackagesNode extends TreeParent {
public MultiplePackagesNode(String packageName,
Set exportedPackages) {
super(packageName);
for (ExportedPackage pkg : exportedPackages) {
addChild(new ExportedPackageNode(pkg));
}
}
}
private class ExportedPackageNode extends TreeParent {
public ExportedPackageNode(ExportedPackage exportedPackage) {
super(exportedPackage.getName() + " - "
+ exportedPackage.getVersion() + " ("
+ exportedPackage.getExportingBundle() + ")");
for (Bundle bundle : exportedPackage.getImportingBundles()) {
addChild(new BundleNode(bundle, true));
}
}
}
}