[r322] Bug 297039 - Debugger opens ".java" files instead of ".class" files if target platform is inside the workspace
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
index 66609a6..76468c0 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JavaSourceLookupUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * Copyright (c) 2000, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Kelly Campbell - Bug 285607
  *******************************************************************************/
 package org.eclipse.jdt.internal.launching;
 
@@ -149,75 +150,51 @@
 	 */
 	private static IPackageFragmentRoot getPackageFragmentRoot(IRuntimeClasspathEntry entry) {
 		IResource resource = entry.getResource();
-		if (resource == null) { 
-			// Check all package fragment roots for case of external archive.
-			// External jars are shared, so it does not matter which project it
-			// originates from
-			IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
+		if (resource != null) {
+			// find package fragment associated with the resource
+			IProject project = resource.getProject();
+			IJavaProject jp = JavaCore.create(project);
 			try {
-				IJavaProject[] jps = model.getJavaProjects();
-				for (int i = 0; i < jps.length; i++) {
-					IJavaProject jp = jps[i];
-					IProject p =  jp.getProject();
-					if (p.isOpen()) {
-						IPackageFragmentRoot[] allRoots = jp.getPackageFragmentRoots();
-						for (int j = 0; j < allRoots.length; j++) {
-							IPackageFragmentRoot root = allRoots[j];
-							if (root.isExternal() && root.getPath().equals(new Path(entry.getLocation()))) {
-								if (isSourceAttachmentEqual(root, entry)) {
-									// use package fragment root
-									return root;
-								}							
-							}
+				if (project.isOpen() && jp.exists()) {
+					IPackageFragmentRoot root = jp.findPackageFragmentRoot(resource.getFullPath());
+					if (root != null) {
+						// ensure source attachment paths match
+						if (isSourceAttachmentEqual(root, entry)) {
+							// use package fragment root
+							return root;
 						}
 					}
 				}
 			} catch (JavaModelException e) {
 				LaunchingPlugin.log(e);
 			}
-		} else {
-			// check if the archive is a package fragment root
-			IProject project = resource.getProject();
-			IJavaProject jp = JavaCore.create(project);
-			try {
-				if (project.isOpen() && jp.exists()) {
-					IPackageFragmentRoot root = jp.getPackageFragmentRoot(resource);
+		}
+		// Check all package fragment roots for case of external archive.
+		// External jars are shared, so it does not matter which project it
+		// originates from
+		IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
+		Path entryPath = new Path(entry.getLocation());
+		try {
+			IJavaProject[] jps = model.getJavaProjects();
+			for (int i = 0; i < jps.length; i++) {
+				IJavaProject jp = jps[i];
+				IProject p =  jp.getProject();
+				if (p.isOpen()) {
 					IPackageFragmentRoot[] allRoots = jp.getPackageFragmentRoots();
 					for (int j = 0; j < allRoots.length; j++) {
-						if (allRoots[j].equals(root)) {
-							// ensure source attachment paths match
+						IPackageFragmentRoot root = allRoots[j];
+						if (root.isExternal() && root.getPath().equals(entryPath)) {
 							if (isSourceAttachmentEqual(root, entry)) {
 								// use package fragment root
 								return root;
-							}
-						}
-					}
-
-				}
-				// check all other java projects to see if another project references
-				// the archive
-				IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-				IJavaProject[] jps = model.getJavaProjects();
-				for (int i = 0; i < jps.length; i++) {
-					IJavaProject jp1 = jps[i];
-					IProject p = jp1.getProject();
-					if (p.isOpen()) {
-						IPackageFragmentRoot[] allRoots = jp1.getPackageFragmentRoots();
-						for (int j = 0; j < allRoots.length; j++) {
-							IPackageFragmentRoot root = allRoots[j];
-							if (!root.isExternal() && root.getPath().equals(entry.getPath())) {
-								if (isSourceAttachmentEqual(root, entry)) {
-									// use package fragment root
-									return root;
-								}							
-							}
+							}							
 						}
 					}
 				}
-			} catch (JavaModelException e) {
-				LaunchingPlugin.log(e);
-			}		
-		}		
+			}
+		} catch (JavaModelException e) {
+			LaunchingPlugin.log(e);
+		}
 		return null;
 	}	
 }
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntry.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntry.java
index d8ad951..84918b0 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntry.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/RuntimeClasspathEntry.java
@@ -342,10 +342,6 @@
 	protected IResource getResource(IPath path) {
 		if (path != null) {
 			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-			if (path.getDevice() == null) {
-				// search relative to the workspace if no device present
-				return root.findMember(path);
-			} 
 			// look for files or folders with the given path
 			IFile[] files = root.findFilesForLocation(path);
 			if (files.length > 0) {
@@ -355,6 +351,10 @@
 			if (containers.length > 0) {
 				return containers[0];
 			}
+			if (path.getDevice() == null) {
+				// search relative to the workspace if no device present
+				return root.findMember(path);
+			} 
 		}		
 		return null;
 	}