From 92dee1606725534bdfc067cd2cae017f0501ac5d Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 14 Feb 2015 13:30:27 +0000 Subject: [PATCH] Improve OSGi Explorer git-svn-id: https://svn.argeo.org/commons/trunk@7867 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../icons/service_published.gif | Bin 0 -> 197 bytes .../icons/service_referenced.gif | Bin 0 -> 185 bytes org.argeo.eclipse.ui.workbench/plugin.xml | 17 +- .../eclipse/ui/workbench/osgi/BundleNode.java | 46 +++ .../ui/workbench/osgi/BundlesView.java | 71 +--- .../ui/workbench/osgi/ModulesView.java | 305 +----------------- .../workbench/osgi/MultiplePackagesView.java | 177 ++++++++++ .../ui/workbench/osgi/OsgiExplorerImages.java | 8 +- .../workbench/osgi/ServiceReferenceNode.java | 46 +++ .../ui/workbench/osgi/StateLabelProvider.java | 82 +++++ 10 files changed, 388 insertions(+), 364 deletions(-) create mode 100644 org.argeo.eclipse.ui.workbench/icons/service_published.gif create mode 100644 org.argeo.eclipse.ui.workbench/icons/service_referenced.gif create mode 100644 org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/BundleNode.java create mode 100644 org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/MultiplePackagesView.java create mode 100644 org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/ServiceReferenceNode.java create mode 100644 org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/StateLabelProvider.java diff --git a/org.argeo.eclipse.ui.workbench/icons/service_published.gif b/org.argeo.eclipse.ui.workbench/icons/service_published.gif new file mode 100644 index 0000000000000000000000000000000000000000..17f771aff670221134e7f10ba0bbfe04818f3d1e GIT binary patch literal 197 zcmZ?wbhEHb6krfwIKsei;OrBV#MQQ08$C*P=k@H#>)BmCdH>AyS7xlgyky6X6}xX* z1EorLhcq0C?KoXG=T!URa~(_0bu2#Hx#aBBb(g2Ey|iTKjpe&||hddZ5;qk~uG9)wI6NUFSaUSS{>Za!ZN*?!N=wZiNd) sIZmi7WXNEWTGUu#wO7JG@>rJQ1{Id|3`>PLoK>C{{5opa%D`X^0EsGB(EtDd literal 0 HcmV?d00001 diff --git a/org.argeo.eclipse.ui.workbench/icons/service_referenced.gif b/org.argeo.eclipse.ui.workbench/icons/service_referenced.gif new file mode 100644 index 0000000000000000000000000000000000000000..c24a95fba3116080010f8ed5a3764e4d90276584 GIT binary patch literal 185 zcmZ?wbhEHb6krfwIKsg2`OC-8Up_p#x#jEYV_PSwY@edKYr5L+`<=hpK-Tb}4S|Q`*q2II~1}O{@I>|Nj|?28usf7#SD@8FWB8Kz1^)nkA_8rDV>_Sha3N z;)c9QdlqLOZ_Bai@A%`u + @@ -41,7 +46,7 @@ + + >"; - return "STARTING"; - case Bundle.STOPPING: - return "STOPPING"; - case Bundle.ACTIVE: - return "ACTIVE"; - default: - return null; - } - } - } } \ No newline at end of file diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/ModulesView.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/ModulesView.java index b0d6b644a..5e4e3a2b8 100644 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/ModulesView.java +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/ModulesView.java @@ -15,50 +15,24 @@ */ package org.argeo.eclipse.ui.workbench.osgi; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; +import java.util.ArrayList; +import java.util.List; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.argeo.eclipse.ui.TreeParent; import org.argeo.eclipse.ui.workbench.WorkbenchUiPlugin; -import org.eclipse.jface.viewers.ITableLabelProvider; 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.graphics.Image; 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. */ +/** The OSGi runtime from a module perspective. */ public class ModulesView extends ViewPart { - private final static Log log = LogFactory.getLog(ModulesView.class); - private TreeViewer viewer; - private PackageAdmin packageAdmin; - - private Comparator exportedPackageComparator = 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); @@ -74,6 +48,7 @@ public class ModulesView extends ViewPart { } private class ModulesContentProvider implements ITreeContentProvider { + private static final long serialVersionUID = 3819934804640641721L; public Object[] getElements(Object inputElement) { return getChildren(inputElement); @@ -84,77 +59,12 @@ public class ModulesView extends ViewPart { BundleContext bundleContext = (BundleContext) parentElement; Bundle[] bundles = bundleContext.getBundles(); - TreeParent bundlesNode = new TreeParent("Bundles"); + List modules = new ArrayList(); for (Bundle bundle : bundles) { if (bundle.getState() == Bundle.ACTIVE) - bundlesNode.addChild(new BundleNode(bundle)); + modules.add(new BundleNode(bundle, true)); } - - // scan packages - ServiceReference paSr = bundleContext - .getServiceReference(PackageAdmin.class.getName()); - // TODO: make a cleaner referencing - packageAdmin = (PackageAdmin) bundleContext.getService(paSr); - - Bundle bundle1 = null; - Bundle bundle2 = null; - - Map> importedPackages = new HashMap>(); - Map> packages = new TreeMap>(); - for (Bundle bundle : bundles) { - if (bundle.getSymbolicName() - .equals("org.argeo.security.ui")) - bundle1 = bundle; - if (bundle.getSymbolicName().equals( - "org.argeo.security.equinox")) - bundle2 = bundle; - - ExportedPackage[] pkgs = packageAdmin - .getExportedPackages(bundle); - if (pkgs != null) - for (ExportedPackage pkg : pkgs) { - if (!packages.containsKey(pkg.getName())) - packages.put(pkg.getName(), - new TreeSet( - exportedPackageComparator)); - Set expPackages = (Set) packages - .get(pkg.getName()); - expPackages.add(pkg); - - // imported - for (Bundle b : pkg.getImportingBundles()) { - if (bundle.getBundleId() != b.getBundleId()) { - if (!importedPackages.containsKey(b)) - importedPackages - .put(b, - new TreeSet( - exportedPackageComparator)); - Set impPackages = (Set) importedPackages - .get(b); - impPackages.add(pkg); - } - } - } - } - - TreeParent mPackageNode = new TreeParent("Multiple Packages"); - // TreeParent aPackageNode = new TreeParent("All Packages"); - for (String packageName : packages.keySet()) { - Set pkgs = packages.get(packageName); - if (pkgs.size() > 1) { - MultiplePackagesNode mpn = new MultiplePackagesNode( - packageName, pkgs); - mPackageNode.addChild(mpn); - // aPackageNode.addChild(mpn); - } else { - // aPackageNode.addChild(new ExportedPackageNode(pkgs - // .iterator().next())); - } - } - - return new Object[] { bundlesNode, mPackageNode };// , - // aPackageNode - // }; + return modules.toArray(); } else if (parentElement instanceof TreeParent) { return ((TreeParent) parentElement).getChildren(); } else { @@ -175,205 +85,22 @@ public class ModulesView extends ViewPart { } public void dispose() { - // TODO Auto-generated method stub - } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // TODO Auto-generated method stub - - } - - } - - protected Map dependencySpace(Bundle bundle, - Map> importedPackages, - Map> traces) { - log.debug("Dependency space for " + bundle.getSymbolicName()); - Map space = new TreeMap(); - fillDependencySpace(space, bundle, importedPackages, - bundle.getSymbolicName(), traces); - return space; - } - - /** Recursive */ - protected void fillDependencySpace(Map space, - Bundle bundle, Map> importedPackages, - String currTrace, Map> traces) { - if (importedPackages.containsKey(bundle)) { - Set imports = importedPackages.get(bundle); - // log.debug("## Fill dependency space for " + bundle + " : "); - for (ExportedPackage pkg : imports) { - if (!traces.containsKey(pkg.getName())) - traces.put(pkg.getName(), new TreeSet()); - traces.get(pkg.getName()).add(currTrace); - if (!space.containsKey(pkg.getName())) { - space.put(pkg.getName(), pkg); - Bundle exportingBundle = pkg.getExportingBundle(); - // if (bundle.getBundleId() != - // exportingBundle.getBundleId()) - fillDependencySpace(space, exportingBundle, - importedPackages, currTrace + " > " - + exportingBundle.getSymbolicName(), traces); - } - } - } - } - - private class ModulesLabelProvider extends LabelProvider implements - ITableLabelProvider { - - public Image getColumnImage(Object element, int columnIndex) { - // TODO Auto-generated method stub - return null; - } - - public String getColumnText(Object element, int columnIndex) { - return getText(element); - } - - } - - class BundleNode extends TreeParent { - private final Bundle bundle; - - public BundleNode(Bundle bundle) { - super(bundle.getSymbolicName()); - this.bundle = bundle; - - // Registered services - ServiceReference[] registeredServices = bundle - .getRegisteredServices(); - if (registeredServices != null) { - TreeParent registeredServicesNode = new TreeParent( - "Registered Services"); - addChild(registeredServicesNode); - for (ServiceReference sr : registeredServices) { - if (sr != null) - registeredServicesNode - .addChild(new ServiceReferenceNode(sr)); - } - } - - // Used services - ServiceReference[] usedServices = bundle.getRegisteredServices(); - if (usedServices != null) { - TreeParent usedServicesNode = new TreeParent("Used Services"); - addChild(usedServicesNode); - for (ServiceReference sr : usedServices) { - if (sr != null) - usedServicesNode.addChild(new ServiceReferenceNode(sr)); - } - } } - - public Bundle getBundle() { - return bundle; - } - - } - - class ServiceReferenceNode extends TreeParent { - private final ServiceReference serviceReference; - - public ServiceReferenceNode(ServiceReference serviceReference) { - super(serviceReference.toString()); - this.serviceReference = serviceReference; - - Bundle[] usedBundles = serviceReference.getUsingBundles(); - if (usedBundles != null) { - TreeParent usingBundles = new TreeParent("Using Bundles"); - addChild(usingBundles); - for (Bundle b : usedBundles) { - if (b != null) - usingBundles.addChild(new TreeParent(b - .getSymbolicName())); - } - } - - TreeParent properties = new TreeParent("Properties"); - addChild(properties); - for (String key : serviceReference.getPropertyKeys()) { - properties.addChild(new TreeParent(key + "=" - + serviceReference.getProperty(key))); - } - - } - - public ServiceReference getServiceReference() { - return serviceReference; - } - } - class MultiplePackagesNode extends TreeParent { - private String packageName; - private Set exportedPackages; + private class ModulesLabelProvider extends StateLabelProvider { + private static final long serialVersionUID = 5290046145534824722L; - public MultiplePackagesNode(String packageName, - Set exportedPackages) { - super(packageName); - this.packageName = packageName; - this.exportedPackages = exportedPackages; - for (ExportedPackage pkg : exportedPackages) { - addChild(new ExportedPackageNode(pkg)); - } - } - - } - - class ConflictingPackageNode extends TreeParent { - private ExportedPackage exportedPackage; - - public ConflictingPackageNode(ExportedPackage exportedPackage) { - super(exportedPackage.getName() + " - " - + exportedPackage.getVersion() + " (" - + exportedPackage.getExportingBundle() + ")"); - this.exportedPackage = exportedPackage; - - TreeParent bundlesNode = new TreeParent("Dependent Bundles"); - this.addChild(bundlesNode); - Map bundles = new TreeMap(); - for (Bundle b : exportedPackage.getImportingBundles()) { - bundles.put(b.getSymbolicName(), b); - } - for (String key : bundles.keySet()) { - addDependentBundles(bundlesNode, bundles.get(key)); - } - } - } - - protected void addDependentBundles(TreeParent parent, Bundle bundle) { - TreeParent bundleNode = new TreeParent(bundle.toString()); - parent.addChild(bundleNode); - Map bundles = new TreeMap(); - ExportedPackage[] pkgs = packageAdmin.getExportedPackages(bundle); - if (pkgs != null) - for (ExportedPackage pkg : pkgs) { - for (Bundle b : pkg.getImportingBundles()) { - if (!bundles.containsKey(b.getSymbolicName()) - && b.getBundleId() != bundle.getBundleId()) { - bundles.put(b.getSymbolicName(), b); - } - } - } - - for (String key : bundles.keySet()) { - addDependentBundles(bundleNode, bundles.get(key)); - } - } - - class ExportedPackageNode extends TreeParent { - private ExportedPackage exportedPackage; - - public ExportedPackageNode(ExportedPackage exportedPackage) { - super(exportedPackage.getName() + " - " - + exportedPackage.getVersion() + " (" - + exportedPackage.getExportingBundle() + ")"); - this.exportedPackage = exportedPackage; - for (Bundle bundle : exportedPackage.getImportingBundles()) { - addChild(new BundleNode(bundle)); - } + @Override + public String getText(Object element) { + if (element instanceof BundleNode) + return element.toString() + " [" + + ((BundleNode) element).getBundle().getBundleId() + + "]"; + return element.toString(); } } } diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/MultiplePackagesView.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/MultiplePackagesView.java new file mode 100644 index 000000000..83338250e --- /dev/null +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/MultiplePackagesView.java @@ -0,0 +1,177 @@ +/* + * 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.eclipse.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.eclipse.ui.TreeParent; +import org.argeo.eclipse.ui.workbench.WorkbenchUiPlugin; +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)); + } + } + } +} diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/OsgiExplorerImages.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/OsgiExplorerImages.java index 64a240c59..7f58ed0e2 100644 --- a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/OsgiExplorerImages.java +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/OsgiExplorerImages.java @@ -20,12 +20,16 @@ import org.eclipse.swt.graphics.Image; /** Shared icons. */ public class OsgiExplorerImages { - public final static Image INSTALLED = WorkbenchUiPlugin - .getImageDescriptor("icons/installed.gif").createImage(); + public final static Image INSTALLED = WorkbenchUiPlugin.getImageDescriptor( + "icons/installed.gif").createImage(); public final static Image RESOLVED = WorkbenchUiPlugin.getImageDescriptor( "icons/resolved.gif").createImage(); public final static Image STARTING = WorkbenchUiPlugin.getImageDescriptor( "icons/starting.gif").createImage(); public final static Image ACTIVE = WorkbenchUiPlugin.getImageDescriptor( "icons/active.gif").createImage(); + public final static Image SERVICE_PUBLISHED = WorkbenchUiPlugin + .getImageDescriptor("icons/service_published.gif").createImage(); + public final static Image SERVICE_REFERENCED = WorkbenchUiPlugin + .getImageDescriptor("icons/service_referenced.gif").createImage(); } diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/ServiceReferenceNode.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/ServiceReferenceNode.java new file mode 100644 index 000000000..0da5287f3 --- /dev/null +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/ServiceReferenceNode.java @@ -0,0 +1,46 @@ +package org.argeo.eclipse.ui.workbench.osgi; + +import org.argeo.eclipse.ui.TreeParent; +import org.osgi.framework.Bundle; +import org.osgi.framework.ServiceReference; + +/** A tree element representing a {@link ServiceReference} */ +@SuppressWarnings({ "rawtypes" }) +class ServiceReferenceNode extends TreeParent { + private final ServiceReference serviceReference; + private final boolean published; + + public ServiceReferenceNode(ServiceReference serviceReference, + boolean published) { + super(serviceReference.toString()); + this.serviceReference = serviceReference; + this.published = published; + + if (isPublished()) { + Bundle[] usedBundles = serviceReference.getUsingBundles(); + if (usedBundles != null) { + for (Bundle b : usedBundles) { + if (b != null) + addChild(new BundleNode(b)); + } + } + } else { + Bundle provider = serviceReference.getBundle(); + addChild(new BundleNode(provider)); + } + + for (String key : serviceReference.getPropertyKeys()) { + addChild(new TreeParent(key + "=" + + serviceReference.getProperty(key))); + } + + } + + public ServiceReference getServiceReference() { + return serviceReference; + } + + public boolean isPublished() { + return published; + } +} diff --git a/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/StateLabelProvider.java b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/StateLabelProvider.java new file mode 100644 index 000000000..803a35871 --- /dev/null +++ b/org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/osgi/StateLabelProvider.java @@ -0,0 +1,82 @@ +package org.argeo.eclipse.ui.workbench.osgi; + +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.swt.graphics.Image; +import org.osgi.framework.Bundle; +import org.osgi.framework.Constants; + +/** Label provider showing the sate of bundles */ +class StateLabelProvider extends ColumnLabelProvider { + private static final long serialVersionUID = -7885583135316000733L; + + @Override + public Image getImage(Object element) { + int state; + if (element instanceof Bundle) + state = ((Bundle) element).getState(); + else if (element instanceof BundleNode) + state = ((BundleNode) element).getBundle().getState(); + else if (element instanceof ServiceReferenceNode) + if (((ServiceReferenceNode) element).isPublished()) + return OsgiExplorerImages.SERVICE_PUBLISHED; + else + return OsgiExplorerImages.SERVICE_REFERENCED; + else + return null; + + switch (state) { + case Bundle.UNINSTALLED: + return OsgiExplorerImages.INSTALLED; + case Bundle.INSTALLED: + return OsgiExplorerImages.INSTALLED; + case Bundle.RESOLVED: + return OsgiExplorerImages.RESOLVED; + case Bundle.STARTING: + return OsgiExplorerImages.STARTING; + case Bundle.STOPPING: + return OsgiExplorerImages.STARTING; + case Bundle.ACTIVE: + return OsgiExplorerImages.ACTIVE; + default: + return null; + } + } + + @Override + public String getText(Object element) { + return null; + } + + @Override + public String getToolTipText(Object element) { + Bundle bundle = (Bundle) element; + Integer state = bundle.getState(); + switch (state) { + case Bundle.UNINSTALLED: + return "UNINSTALLED"; + case Bundle.INSTALLED: + return "INSTALLED"; + case Bundle.RESOLVED: + return "RESOLVED"; + case Bundle.STARTING: + String activationPolicy = bundle.getHeaders() + .get(Constants.BUNDLE_ACTIVATIONPOLICY).toString(); + + // .get("Bundle-ActivationPolicy").toString(); + // FIXME constant triggers the compilation failure + if (activationPolicy != null + && activationPolicy.equals(Constants.ACTIVATION_LAZY)) + // && activationPolicy.equals("lazy")) + // FIXME constant triggers the compilation failure + // && activationPolicy.equals(Constants.ACTIVATION_LAZY)) + return "<>"; + return "STARTING"; + case Bundle.STOPPING: + return "STOPPING"; + case Bundle.ACTIVE: + return "ACTIVE"; + default: + return null; + } + } +} \ No newline at end of file -- 2.30.2