RESOLVED - bug 200034: [pde viz] Indicate plug-ins which cannot be resolved
https://bugs.eclipse.org/bugs/show_bug.cgi?id=200034
diff --git a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/AbstractVisualizationLabelProvider.java b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/AbstractVisualizationLabelProvider.java
index ac0c169..58f4794 100644
--- a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/AbstractVisualizationLabelProvider.java
+++ b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/AbstractVisualizationLabelProvider.java
@@ -63,12 +63,12 @@
 	public Color EDGE_HIGHLIGHT = new Color(Display.getDefault(), 192, 32, 32);
 	public Color DISABLED = new Color(Display.getDefault(), 230, 240, 250);
 
-	private BundleDescription selected = null;
-	protected BundleDescription rootNode = null;
+	private Object selected = null;
+	protected Object rootNode = null;
 	private HashSet interestingRelationships = new HashSet();
 	private HashSet interestingDependencies = new HashSet();
 	private Color disabledColor = null;
-	protected BundleDescription pinnedNode = null;
+	protected Object pinnedNode = null;
 	private GraphViewer viewer;
 	private boolean showVersionNumber = false;
 	private DependenciesLabelProvider pdeLabelProvider = null;
@@ -230,11 +230,11 @@
 	 * 
 	 * @see org.eclipse.pde.visualization.views.VisualizationLabelProvider#setPinnedNode(org.eclipse.osgi.service.resolver.BundleDescription)
 	 */
-	public void setPinnedNode(BundleDescription pinnedNode) {
+	public void setPinnedNode(Object pinnedNode) {
 		this.pinnedNode = pinnedNode;
 	}
 
-	protected BundleDescription getSelected() {
+	protected Object getSelected() {
 		if (pinnedNode != null) {
 			return pinnedNode;
 		}
@@ -254,10 +254,10 @@
 			viewer.unReveal(entityConnectionData);
 		}
 
-		this.rootNode = (BundleDescription) root;
+		this.rootNode = root;
 		this.selected = null;
 
-		this.selected = (BundleDescription) currentSelection;
+		this.selected = currentSelection;
 
 		interestingRelationships = new HashSet();
 		interestingDependencies = new HashSet();
diff --git a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/AnalysisUtil.java b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/AnalysisUtil.java
index 168dcee..49dc925 100644
--- a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/AnalysisUtil.java
+++ b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/AnalysisUtil.java
@@ -30,24 +30,24 @@
  */
 public class AnalysisUtil {
 
-	public static BundleDescription[] getPath(Object root, Object bundle) {
+	public static Object[] getPath(Object root, Object bundle) {
 		LinkedList q = new LinkedList();
 		Set orderedSet = new HashSet();
 		LinkedList orderedList = new LinkedList();
 		q.add(root);
 		while (!q.isEmpty()) {
-			BundleDescription head = (BundleDescription) q.remove(0);
+			Object head = q.remove(0);
 			if (!orderedSet.contains(head)) {
 				orderedSet.add(head);
 				orderedList.add(head);
 				buildQueue(head, q);
 			}
 		}
-		BundleDescription[] path = modifiedDijkstra(orderedList, root, bundle);
+		Object[] path = modifiedDijkstra(orderedList, root, bundle);
 		return path;
 	}
 
-	private static void buildQueue(BundleDescription root, LinkedList q) {
+	private static void buildQueue(Object root, LinkedList q) {
 		Object[] descriptions = getDependencies(root);
 		if (descriptions == null || descriptions.length == 0) {
 			return;
@@ -57,7 +57,7 @@
 		}
 	}
 
-	public static BundleDescription[] modifiedDijkstra(LinkedList q, Object s, Object t) {
+	public static Object[] modifiedDijkstra(LinkedList q, Object s, Object t) {
 		HashMap previous = new HashMap();
 		HashMap dValues = new HashMap();
 		for (Iterator iter = q.iterator(); iter.hasNext();) {
@@ -87,7 +87,7 @@
 			currentNode = previous.get(currentNode);
 		}
 		path.add(currentNode);
-		return (BundleDescription[]) path.toArray(new BundleDescription[path.size()]);
+		return path.toArray(new Object[path.size()]);
 	}
 
 	public static BundleDescription[] getCallers(BundleDescription bundle, BundleDescription[] bundles) {
@@ -107,7 +107,7 @@
 	 * 
 	 * @return
 	 */
-	public static BundleDescription[] getAllCallers(BundleDescription bundle, Object[] bundles) {
+	public static Object[] getAllCallers(Object bundle, Object[] bundles) {
 		HashSet callers = new HashSet();
 		for (int i = 0; i < bundles.length; i++) {
 			HashSet hashSet = new HashSet();
@@ -116,7 +116,7 @@
 				callers.add(bundles[i]);
 			}
 		}
-		return (BundleDescription[]) callers.toArray(new BundleDescription[callers.size()]);
+		return callers.toArray(new Object[callers.size()]);
 	}
 
 	public static Object[] getPrerequisites(Object[] bundles) {
@@ -145,7 +145,7 @@
 	public static Object[] getDependencies(Object bundle) {
 
 		if (bundle == null || bundle instanceof BundleSpecification) {
-			return null;
+			return new Object[0];
 		}
 		BundleDescription bundleDescription = (BundleDescription) bundle;
 
diff --git a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/GraphContentProvider.java b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/GraphContentProvider.java
index a4130ab..f8e1799 100644
--- a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/GraphContentProvider.java
+++ b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/GraphContentProvider.java
@@ -21,11 +21,11 @@
  */
 class GraphContentProvider implements IGraphEntityContentProvider {
 
-	BundleDescription currentBundle = null;
+	Object currentBundle = null;
 
-	private Object[] getDependencies(BundleDescription bundle) {
+	private Object[] getDependencies(Object bundle) {
 		if (bundle != null) {
-			return AnalysisUtil.getPrerequisites(new BundleDescription[] { currentBundle });
+			return AnalysisUtil.getPrerequisites(new Object[] { currentBundle });
 		}
 		return new BundleDescription[0];
 	}
@@ -35,7 +35,7 @@
 	}
 
 	public Object[] getElements(Object inputElement) {
-		return getDependencies((BundleDescription) inputElement);
+		return getDependencies(inputElement);
 
 	}
 
@@ -49,7 +49,7 @@
 	}
 
 	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		currentBundle = (BundleDescription) newInput;
+		currentBundle = newInput;
 
 	}
 
diff --git a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/PathDependencyAnalysis.java b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/PathDependencyAnalysis.java
index 904d0fa..2f9459a 100644
--- a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/PathDependencyAnalysis.java
+++ b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/PathDependencyAnalysis.java
@@ -15,7 +15,6 @@
 
 import org.eclipse.mylyn.zest.core.viewers.EntityConnectionData;
 import org.eclipse.mylyn.zest.core.viewers.GraphViewer;
-import org.eclipse.osgi.service.resolver.BundleDescription;
 
 /**
  * 
@@ -31,7 +30,7 @@
 	protected void calculateInterestingDependencies(HashSet interestingRels, HashSet interestingEntities) {
 
 		if (this.getSelected() != null) {
-			BundleDescription[] descriptions = AnalysisUtil.getAllCallers(this.getSelected(), AnalysisUtil.getPrerequisites(new BundleDescription[] { this.rootNode }));
+			Object[] descriptions = AnalysisUtil.getAllCallers(this.getSelected(), AnalysisUtil.getPrerequisites(new Object[] { this.rootNode }));
 			for (int i = 0; i < descriptions.length; i++) {
 				for (int j = 0; j < descriptions.length; j++) {
 					EntityConnectionData entityConnectionData = new EntityConnectionData(descriptions[i], descriptions[j]);
diff --git a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/PluginVisualizationView.java b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/PluginVisualizationView.java
index 964b500..f34523f 100644
--- a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/PluginVisualizationView.java
+++ b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/PluginVisualizationView.java
@@ -45,6 +45,7 @@
 import org.eclipse.mylyn.zest.layouts.algorithms.HorizontalShift;
 import org.eclipse.mylyn.zest.layouts.algorithms.TreeLayoutAlgorithm;
 import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.BundleSpecification;
 import org.eclipse.pde.core.plugin.IPluginModel;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
 import org.eclipse.pde.core.plugin.PluginRegistry;
@@ -167,7 +168,7 @@
 				}
 				Object selectedElement = selection.getFirstElement();
 				if (selectedElement instanceof BundleDescription) {
-					focusOn((BundleDescription) selectedElement, true);
+					focusOn(selectedElement, true);
 					// When a new plug-in is selected, disable the forward action.
 					// The forward action only stores history when the back button was used (much like a browser)
 					forwardStack.clear();
@@ -243,7 +244,7 @@
 
 		// Set the pinned node in case we have one from the previous content
 		// provider
-		this.currentLabelProvider.setPinnedNode((BundleDescription) pinnedNode);
+		this.currentLabelProvider.setPinnedNode(pinnedNode);
 		if (viewer.getSelection() != null) {
 			viewer.setSelection(viewer.getSelection());
 			this.selectionChanged(((IStructuredSelection) viewer.getSelection()).getFirstElement());
@@ -293,7 +294,7 @@
 	 * @param bundle
 	 * @param recordHistory
 	 */
-	private void focusOn(BundleDescription bundle, boolean recordHistory) {
+	private void focusOn(Object bundle, boolean recordHistory) {
 		viewer.setSelection(new StructuredSelection());
 		this.selectionChanged(null);
 		viewer.setInput(bundle);
@@ -374,7 +375,7 @@
 					Object o = historyStack.pop();
 					forwardStack.push(currentNode);
 					forwardAction.setEnabled(true);
-					focusOn((BundleDescription) o, false);
+					focusOn(o, false);
 					if (historyStack.size() <= 0) {
 						historyAction.setEnabled(false);
 					}
@@ -391,7 +392,7 @@
 			public void run() {
 				if (forwardStack.size() > 0) {
 					Object o = forwardStack.pop();
-					focusOn((BundleDescription) o, true);
+					focusOn(o, true);
 					if (forwardStack.size() <= 0) {
 						forwardAction.setEnabled(false);
 					}
@@ -443,7 +444,7 @@
 		// @tag action : Focus on Current Selection action
 		focusAction = new Action() {
 			public void run() {
-				focusOn((BundleDescription) objectToFocusOn, true);
+				focusOn(objectToFocusOn, true);
 
 				// When a new plug-in is selected, disable the forward action
 				// The forward action only stores history when the back button was used (much like a browser)
@@ -451,7 +452,12 @@
 				forwardAction.setEnabled(false);
 			}
 		};
-		focusAction.setText("Focus On \'" + ((BundleDescription) objectToFocusOn).getName() + "\'");
+		if (objectToFocusOn instanceof BundleDescription) {
+			focusAction.setText("Focus On \'" + ((BundleDescription) objectToFocusOn).getName() + "\'");
+		} else if (objectToFocusOn instanceof BundleSpecification) {
+			focusAction.setText("Focus On \'" + ((BundleSpecification) objectToFocusOn).getName() + "\'");
+
+		}
 		focusAction.setToolTipText("Focus on a plugin");
 	}
 
@@ -466,13 +472,22 @@
 		unPinAction.setChecked(true);
 	}
 
-	private void makePinAction(final BundleDescription objectToPin) {
+	private String getName(Object o ) {
+		if ( o instanceof BundleDescription ) {
+			return ((BundleDescription)o).getName();
+		}
+		else if ( o instanceof BundleSpecification ) {
+			return ((BundleSpecification)o).getName();
+		}
+		return null;
+	}
+	private void makePinAction(final Object objectToPin) {
 		pinAction = new Action() {
 			public void run() {
 				pinNode(objectToPin);
 			}
 		};
-		pinAction.setText("Pin selection of " + objectToPin.getName());
+		pinAction.setText("Pin selection of " + getName(objectToPin));
 		pinAction.setToolTipText("Toggle pin selected node");
 	}
 
@@ -481,7 +496,7 @@
 	}
 
 	private void pinNode(Object objectToPin) {
-		this.currentLabelProvider.setPinnedNode((BundleDescription) objectToPin);
+		this.currentLabelProvider.setPinnedNode( objectToPin);
 		this.pinnedNode = objectToPin;
 		this.currentLabelProvider.setCurrentSelection(this.currentNode, ((IStructuredSelection) viewer.getSelection()).getFirstElement());
 		this.viewer.update(contentProvider.getElements(currentNode), null);
@@ -529,7 +544,7 @@
 			manager.add(unPinAction);
 		}
 		if (((IStructuredSelection) viewer.getSelection()).size() > 0) {
-			makePinAction((BundleDescription) ((IStructuredSelection) viewer.getSelection()).getFirstElement());
+			makePinAction(((IStructuredSelection) viewer.getSelection()).getFirstElement());
 			manager.add(pinAction);
 		}
 
diff --git a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/ShortestPathDependencyAnalysis.java b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/ShortestPathDependencyAnalysis.java
index 0993545..a3aa955 100644
--- a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/ShortestPathDependencyAnalysis.java
+++ b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/ShortestPathDependencyAnalysis.java
@@ -15,7 +15,6 @@
 
 import org.eclipse.mylyn.zest.core.viewers.EntityConnectionData;
 import org.eclipse.mylyn.zest.core.viewers.GraphViewer;
-import org.eclipse.osgi.service.resolver.BundleDescription;
 
 /**
  * 
@@ -30,7 +29,7 @@
 	protected void calculateInterestingDependencies(HashSet interestingRels, HashSet interestingEntities) {
 
 		if (this.getSelected() != null) {
-			BundleDescription[] descriptions = AnalysisUtil.getPath(this.rootNode, this.getSelected());
+			Object[] descriptions = AnalysisUtil.getPath(this.rootNode, this.getSelected());
 
 			for (int i = 0; i < descriptions.length; i++) {
 				for (int j = 0; j < descriptions.length; j++) {
diff --git a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/SmartPathDependencyAnalysis.java b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/SmartPathDependencyAnalysis.java
index 3c207b8..fc78752 100644
--- a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/SmartPathDependencyAnalysis.java
+++ b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/SmartPathDependencyAnalysis.java
@@ -15,7 +15,6 @@
 
 import org.eclipse.mylyn.zest.core.viewers.EntityConnectionData;
 import org.eclipse.mylyn.zest.core.viewers.GraphViewer;
-import org.eclipse.osgi.service.resolver.BundleDescription;
 
 /**
  * 
@@ -54,7 +53,7 @@
 				// For each dependency of the root node, compute the shortest path
 				// to the selected node.  add each of these to to the list of nodes.
 				EntityConnectionData entityConnectionData = new EntityConnectionData(this.rootNode, descriptions[i]);
-				BundleDescription[] path = AnalysisUtil.getPath(descriptions[i], this.getSelected());
+				Object[] path = AnalysisUtil.getPath(descriptions[i], this.getSelected());
 				if (path.length > 1) {
 					for (int j = 0; j < path.length; j++) {
 						for (int k = 0; k < path.length; k++) {
@@ -67,7 +66,7 @@
 					interestingRels.add(entityConnectionData);
 				}
 			}
-			BundleDescription[] path = AnalysisUtil.getPath(this.rootNode, this.getSelected());
+			Object[] path = AnalysisUtil.getPath(this.rootNode, this.getSelected());
 			if (path.length > 1) {
 				for (int j = 0; j < path.length; j++) {
 					for (int k = 0; k < path.length; k++) {
diff --git a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/VisualizationLabelProvider.java b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/VisualizationLabelProvider.java
index 5dff7d2..1d7a642 100644
--- a/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/VisualizationLabelProvider.java
+++ b/visualization/plugins/org.eclipse.pde.visualization.dependency/src/org/eclipse/pde/visualization/dependency/views/VisualizationLabelProvider.java
@@ -12,7 +12,6 @@
 package org.eclipse.pde.visualization.dependency.views;
 
 import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.osgi.service.resolver.BundleDescription;
 
 /**
  * A content provider to represent the different types of label providers we have in pde.visualization
@@ -39,7 +38,7 @@
 	 * Sets a node to be pinned on this viewer
 	 * @param pinnedNode
 	 */
-	public void setPinnedNode(BundleDescription pinnedNode);
+	public void setPinnedNode(Object pinnedNode);
 
 	/**
 	 * If true, shows the version number after the name of the plug-in.  If false,