Bug 368212 - JavaLineBreakpoint.computeJavaProject does not let
ISourceLocator evaluate the stackFrame - use JavaDebugUtils
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
index 6e4b847..4909d54 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
@@ -14,7 +14,6 @@
 import java.util.HashMap;
 import java.util.Iterator;
 
-import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -25,15 +24,12 @@
 import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.ILaunchesListener;
 import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IStackFrame;
 import org.eclipse.debug.core.model.IVariable;
 import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.debug.ui.IValueDetailListener;
-import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.debug.core.IEvaluationRunnable;
 import org.eclipse.jdt.debug.core.IJavaArray;
@@ -195,10 +191,10 @@
 		if (type != null) {
 			return type.getJavaProject();
 		}
-		IStackFrame stackFrame= null;
+		IJavaStackFrame stackFrame= null;
 		IJavaDebugTarget target = (IJavaDebugTarget)javaValue.getDebugTarget().getAdapter(IJavaDebugTarget.class);
 		if (target != null) {
-			stackFrame= thread.getTopStackFrame();
+			stackFrame= (IJavaStackFrame) thread.getTopStackFrame();
 			if (stackFrame != null && !stackFrame.getDebugTarget().equals(target)) {
 				stackFrame= null;
 			}
@@ -206,20 +202,7 @@
 		if (stackFrame == null) {
 			return null;
 		}
-		Object sourceElement = JavaDebugUtils.resolveSourceElement(stackFrame, stackFrame.getLaunch());
-		if (!(sourceElement instanceof IJavaElement) && sourceElement instanceof IAdaptable) {
-			sourceElement = ((IAdaptable)sourceElement).getAdapter(IJavaElement.class);
-		}
-		IJavaProject project= null;
-		if (sourceElement instanceof IJavaElement) {
-			project= ((IJavaElement) sourceElement).getJavaProject();
-		} else if (sourceElement instanceof IResource) {
-			IJavaProject resourceProject = JavaCore.create(((IResource)sourceElement).getProject());
-			if (resourceProject.exists()) {
-				project= resourceProject;
-			}
-		}
-		return project;
+		return JavaDebugUtils.resolveJavaProject(stackFrame);
 	}
 	
 	/**
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
index 2316e3b..e960ff3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
@@ -13,16 +13,13 @@
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.ISourceLocator;
 import org.eclipse.debug.core.model.IStackFrame;
 import org.eclipse.debug.core.model.IThread;
 import org.eclipse.debug.core.model.IValue;
 import org.eclipse.debug.core.model.IWatchExpressionDelegate;
 import org.eclipse.debug.core.model.IWatchExpressionListener;
 import org.eclipse.debug.core.model.IWatchExpressionResult;
-import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.debug.core.IJavaDebugTarget;
 import org.eclipse.jdt.debug.core.IJavaStackFrame;
@@ -31,6 +28,7 @@
 import org.eclipse.jdt.debug.eval.IEvaluationListener;
 import org.eclipse.jdt.debug.eval.IEvaluationResult;
 import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
+import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
 import org.eclipse.jdt.internal.debug.core.model.JDIThread;
 import org.eclipse.jdt.internal.debug.ui.display.JavaInspectExpression;
 
@@ -111,7 +109,7 @@
 		}
 		
 		public void run() {
-			IJavaProject project = getProject(fStackFrame);
+			IJavaProject project = JavaDebugUtils.resolveJavaProject(fStackFrame);
 			if (project == null) {
 				fListener.watchEvaluationFinished(null);
 				return;
@@ -148,27 +146,4 @@
 			}
 		}
 	}
-	
-	/**
-	 * Return the project associated with the given stack frame.
-	 */
-	private IJavaProject getProject(IJavaStackFrame javaStackFrame) {
-		ILaunch launch = javaStackFrame.getLaunch();
-		if (launch == null) {
-			return null;
-		}
-		ISourceLocator locator= launch.getSourceLocator();
-		if (locator == null) {
-			return null;
-		}
-
-		Object sourceElement = locator.getSourceElement(javaStackFrame);
-		if (!(sourceElement instanceof IJavaElement) && sourceElement instanceof IAdaptable) {
-			sourceElement = ((IAdaptable)sourceElement).getAdapter(IJavaElement.class);
-		}
-		if (sourceElement instanceof IJavaElement) {
-			return ((IJavaElement) sourceElement).getJavaProject();
-		}
-		return null;
-	}
 }
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
index df9a294..6482c7f 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2011 IBM Corporation and others.
+ * Copyright (c) 2005, 2012 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
@@ -302,8 +302,7 @@
 	 * @return corresponding Java element or <code>null</code>
 	 * @throws CoreException if an exception occurs
 	 */
-	public static IJavaElement resolveJavaElement(Object object, ILaunch launch)
-			throws CoreException {
+	public static IJavaElement resolveJavaElement(Object object, ILaunch launch) throws CoreException {
 		Object sourceElement = resolveSourceElement(object, launch);
 		return getJavaElement(sourceElement);
 	}
@@ -323,8 +322,7 @@
 		if (sourceElement instanceof IJavaElement) {
 			javaElement = (IJavaElement) sourceElement;
 		} else if (sourceElement instanceof IAdaptable) {
-			javaElement = (IJavaElement) ((IAdaptable) sourceElement)
-					.getAdapter(IJavaElement.class);
+			javaElement = (IJavaElement) ((IAdaptable) sourceElement).getAdapter(IJavaElement.class);
 		}
 		if (javaElement == null && sourceElement instanceof IResource) {
 			javaElement = JavaCore.create((IResource) sourceElement);
@@ -349,8 +347,7 @@
 	 * @return corresponding source element or <code>null</code>
 	 * @throws CoreException if an exception occurs
 	 */
-	public static Object resolveSourceElement(Object object, ILaunch launch)
-			throws CoreException {
+	public static Object resolveSourceElement(Object object, ILaunch launch) throws CoreException {
 		ISourceLocator sourceLocator = launch.getSourceLocator();
 		if (sourceLocator instanceof ISourceLookupDirector) {
 			ISourceLookupDirector director = (ISourceLookupDirector) sourceLocator;
@@ -363,6 +360,29 @@
 	}
 
 	/**
+	 * Resolves the {@link IJavaProject} within the context of the given {@link IJavaStackFrame}
+	 * 
+	 * @param frame
+	 * @return the {@link IJavaProject} or <code>null</code>
+	 * @since 3.8.0
+	 */
+	public static IJavaProject resolveJavaProject(IJavaStackFrame frame) {
+		ILaunch launch = frame.getLaunch();
+		if(launch != null) {
+			try {
+				IJavaElement element = resolveJavaElement(frame, launch);
+				if(element != null) {
+					return element.getJavaProject();
+				}
+			}
+			catch(CoreException ce) {
+				//do nothing, return null
+			}
+		}
+		return null;
+	}
+	
+	/**
 	 * Returns an array of simple type names that are part of the given type's
 	 * qualified name. For example, if the given name is <code>x.y.A$B</code>,
 	 * an array with <code>["A", "B"]</code> is returned.
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
index cd5c4c2..41c56fb 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
@@ -22,30 +22,23 @@
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspaceRunnable;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.IStatusHandler;
 import org.eclipse.debug.core.model.IBreakpoint;
 import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.ISourceLocator;
 import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
-import org.eclipse.jdt.debug.core.IJavaReferenceType;
 import org.eclipse.jdt.debug.core.IJavaStackFrame;
 import org.eclipse.jdt.debug.core.IJavaThread;
-import org.eclipse.jdt.debug.core.IJavaType;
 import org.eclipse.jdt.debug.core.JDIDebugModel;
 import org.eclipse.jdt.debug.eval.ICompiledExpression;
 import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
+import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
 import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;
 import org.eclipse.jdt.internal.debug.core.model.JDIStackFrame;
 import org.eclipse.jdt.internal.debug.core.model.JDIThread;
@@ -450,10 +443,9 @@
 
 	protected IJavaProject getJavaProject(IJavaStackFrame stackFrame) {
 		synchronized (fProjectsByFrame) {
-			IJavaProject project = fProjectsByFrame
-					.get(stackFrame);
+			IJavaProject project = fProjectsByFrame.get(stackFrame);
 			if (project == null) {
-				project = computeJavaProject(stackFrame);
+				project = JavaDebugUtils.resolveJavaProject(stackFrame);
 				if (project != null) {
 					fProjectsByFrame.put(stackFrame, project);
 				}
@@ -462,54 +454,6 @@
 		}
 	}
 
-	private IJavaProject computeJavaProject(IJavaStackFrame stackFrame) {
-		ILaunch launch = stackFrame.getLaunch();
-		if (launch == null) {
-			return null;
-		}
-		ISourceLocator locator = launch.getSourceLocator();
-		if (locator == null)
-			return null;
-
-		Object sourceElement = locator.getSourceElement(stackFrame);
-		if (sourceElement == null) {
-			try {
-				if (locator instanceof ISourceLookupDirector
-						&& !stackFrame.isStatic()) {
-					IJavaType thisType = stackFrame.getThis().getJavaType();
-					if (thisType instanceof IJavaReferenceType) {
-						String[] sourcePaths = ((IJavaReferenceType) thisType)
-								.getSourcePaths(null);
-						if (sourcePaths != null && sourcePaths.length > 0) {
-							sourceElement = ((ISourceLookupDirector) locator)
-									.getSourceElement(sourcePaths[0]);
-						}
-					}
-				}
-			} catch (DebugException e) {
-				DebugPlugin.log(e);
-			}
-		}
-		if (!(sourceElement instanceof IJavaElement)
-				&& sourceElement instanceof IAdaptable) {
-			Object element = ((IAdaptable) sourceElement)
-					.getAdapter(IJavaElement.class);
-			if (element != null) {
-				sourceElement = element;
-			}
-		}
-		if (sourceElement instanceof IJavaElement) {
-			return ((IJavaElement) sourceElement).getJavaProject();
-		} else if (sourceElement instanceof IResource) {
-			IJavaProject project = JavaCore.create(((IResource) sourceElement)
-					.getProject());
-			if (project.exists()) {
-				return project;
-			}
-		}
-		return null;
-	}
-
 	/*
 	 * (non-Javadoc)
 	 *