JSP support updates
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugTarget.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugTarget.java
index 7285a59..e990941 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugTarget.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JDIDebugTarget.java
@@ -6,20 +6,17 @@
  */

 

 import com.sun.jdi.*;

+import com.sun.jdi.event.*;

+import com.sun.jdi.request.*;

+import java.io.ByteArrayInputStream;

+import java.util.*;

 import org.eclipse.core.resources.*;

 import org.eclipse.core.runtime.*;

 import org.eclipse.debug.core.*;

 import org.eclipse.debug.core.model.*;

 import org.eclipse.jdt.core.*;

 import org.eclipse.jdt.core.eval.IEvaluationContext;

-import org.eclipse.jdt.debug.core.IJavaDebugConstants;

-import org.eclipse.jdt.debug.core.IJavaDebugTarget;

-import org.eclipse.jdt.debug.core.JDIDebugModel;

-import com.sun.jdi.event.*;

-import com.sun.jdi.request.*;

-import java.io.ByteArrayInputStream;

-import java.text.MessageFormat;

-import java.util.*;

+import org.eclipse.jdt.debug.core.*;

 

 /**

  * Debug target for JDI debug model.

@@ -79,7 +76,7 @@
 	protected boolean fSupportsDisconnect;

 	/**

 	 * Table of deferred breakpoints (cannot be installed because the

-	 * corresponding class is not yet loaded). 

+	 * corresponding class is not yet loaded, or may be loaded again). 

 	 * <p>

 	 * Key: the fully qualified name of the class

 	 * Value: a <code>List</code> of <code>IMarker</code>s representing the

@@ -97,7 +94,7 @@
 	 * Table of installed breakpoints

 	 * <p>

 	 * Key: breakpoint (<code>IMarker</code>)

-	 * Value: the event request associated with the breakpoint (one

+	 * Value: list of event requests associated with the breakpoint (list

 	 * of <code>BreakpointRequest</code> or <code>MethodEntryRequest</code>).

 	 */

 	protected HashMap fInstalledBreakpoints;

@@ -411,7 +408,9 @@
 			bps= new ArrayList(1);

 			fDeferredBreakpointsByClass.put(typeName, bps);

 		}

-		bps.add(breakpoint);

+		if (!bps.contains(breakpoint)) {

+			bps.add(breakpoint);

+		}

 	}

 

 	/**

@@ -756,6 +755,40 @@
 	}

 	

 	/**

+	 * Adds the given request to the list of breakpoint event requests

+	 * for the given breakpoint.

+	 */

+	protected void addInstalledBreakpoint(IMarker breakpoint, EventRequest request) {

+		List list = (List)fInstalledBreakpoints.get(breakpoint);

+		if (list == null) {

+			list = new ArrayList(1);

+			fInstalledBreakpoints.put(breakpoint, list);

+		}

+		list.add(request);

+	}

+	

+	/**

+	 * Returns the list of event requests installed in the target

+	 * for the given breakpoint, or <code>null</code> if no events

+	 * are installed in the target.

+	 */

+	protected List getBreakpointRequests(IMarker breakpoint) {

+		return (List)fInstalledBreakpoints.get(breakpoint);

+	}

+	

+	protected void replaceBreakpointRequest(IMarker breakpoint, EventRequest oldRequest, EventRequest newRequest) {

+		List list = getBreakpointRequests(breakpoint);

+		if (list != null) {

+			list.remove(oldRequest);

+			list.add(newRequest);

+		}

+	}

+	

+	protected List removeBreakpointRequests(IMarker breakpoint) {

+		return (List)fInstalledBreakpoints.remove(breakpoint);

+	}

+	

+	/**

 	 * Installs or defers the given breakpoint

 	 */

 	public void breakpointAdded(IMarker breakpoint) {

@@ -777,17 +810,15 @@
 		

 		// look for the top-level class - if it is loaded, inner classes may also be loaded

 		List classes= jdiClassesByName(topLevelName);

-		if (classes == null || classes.isEmpty()) {

-			// defer

-			defer(breakpoint, topLevelName);

-		} else {

+		if (classes != null) {

 			// try to install

-			ReferenceType type= (ReferenceType) classes.get(0);

-			if (!installLineBreakpoint(breakpoint, type)) {

-				// install did not succeed - could be an inner type not yet loaded

-				defer(breakpoint, topLevelName);

+			Iterator iter = classes.iterator();

+			while (iter.hasNext()) {

+				ReferenceType type= (ReferenceType) iter.next();

+				installLineBreakpoint(breakpoint, type);

 			}

 		}

+		defer(breakpoint, topLevelName);

 	}

 

 	/**

@@ -828,7 +859,6 @@
 		try {

 			request= getEventRequestManager().createBreakpointRequest(location);

 			request.putProperty(IDebugConstants.BREAKPOINT_MARKER, breakpoint);

-			fInstalledBreakpoints.put(breakpoint, request);

 			int hitCount= DebugJavaUtils.getHitCount(breakpoint);

 			if (hitCount > 0) {

 				request.addCountFilter(hitCount);

@@ -837,11 +867,10 @@
 			} 

 			request.setEnabled(getBreakpointManager().isEnabled(breakpoint));

 			request.setSuspendPolicy(EventRequest.SUSPEND_EVENT_THREAD);

+			addInstalledBreakpoint(breakpoint, request);

 		} catch (VMDisconnectedException e) {

-			fInstalledBreakpoints.remove(breakpoint);

 			return null;

 		} catch (RuntimeException e) {

-			fInstalledBreakpoints.remove(breakpoint);

 			internalError(e);

 			return null;

 		}

@@ -914,15 +943,18 @@
 	}

 	

 	protected void lineBreakpointChanged(IMarker breakpoint) {

-		BreakpointRequest request= (BreakpointRequest) fInstalledBreakpoints.get(breakpoint);

-		if (request != null) {

-			// already installed - could be a change in the enabled state or hit count

-			//may result in a new request being generated

-			request= updateHitCount(request, breakpoint);

-			if (request != null) {

-				updateEnabledState(request, breakpoint);

+		List requests = getBreakpointRequests(breakpoint);

+		if (requests != null) {

+			Iterator iter = requests.iterator();

+			while (iter.hasNext()) {

+				BreakpointRequest request= (BreakpointRequest) iter.next();

+				// already installed - could be a change in the enabled state or hit count

+				//may result in a new request being generated

+				request= updateHitCount(request, breakpoint);

+				if (request != null) {

+					updateEnabledState(request, breakpoint);

+				}

 			}

-			return;

 		}

 

 	}

@@ -982,7 +1014,9 @@
 					getEventRequestManager().deleteEventRequest(request); // disable & remove

 				}

 				Location location = request.location();

+				BreakpointRequest oldRequest = request;

 				request = createLineBreakpointRequest(location, marker);

+				replaceBreakpointRequest(marker, oldRequest, request);

 			} catch (VMDisconnectedException e) {

 			} catch (RuntimeException e) {

 				internalError(e);

@@ -1018,31 +1052,31 @@
 				return;

 			}

 			List classes= jdiClassesByName(exceptionName);

-			ReferenceType exClass= null;

-			if (classes != null && !classes.isEmpty()) {

-				exClass= (ReferenceType) classes.get(0);

-			}

-			if (exClass == null) {

-				// defer the exception

-				defer(exceptionBreakpoint, topLevelName);

-			} else {

-				// new or changed - first delete the old request

-				if (null != fInstalledBreakpoints.get(exceptionBreakpoint))

-					exceptionBreakpointRemoved(exceptionBreakpoint);

-				ExceptionRequest request= null;

-				try {

-					request= getEventRequestManager().createExceptionRequest(exClass, caught, uncaught);

-					request.setSuspendPolicy(EventRequest.SUSPEND_EVENT_THREAD);

-					request.setEnabled(getBreakpointManager().isEnabled(exceptionBreakpoint));

-				} catch (VMDisconnectedException e) {

-					return;

-				} catch (RuntimeException e) {

-					internalError(e);

-					return;

+			if (classes != null) {

+				Iterator iter = classes.iterator();

+				while (iter.hasNext()) {

+					ReferenceType exClass = (ReferenceType)iter.next();

+					// new or changed - first delete the old request

+					if (null != getBreakpointRequests(exceptionBreakpoint))

+						exceptionBreakpointRemoved(exceptionBreakpoint);

+					ExceptionRequest request= null;

+					try {

+						request= getEventRequestManager().createExceptionRequest(exClass, caught, uncaught);

+						request.setSuspendPolicy(EventRequest.SUSPEND_EVENT_THREAD);

+						request.setEnabled(getBreakpointManager().isEnabled(exceptionBreakpoint));

+					} catch (VMDisconnectedException e) {

+						return;

+					} catch (RuntimeException e) {

+						internalError(e);

+						return;

+					}

+					request.putProperty(IDebugConstants.BREAKPOINT_MARKER, exceptionBreakpoint);

+					addInstalledBreakpoint(exceptionBreakpoint, request);

 				}

-				request.putProperty(IDebugConstants.BREAKPOINT_MARKER, exceptionBreakpoint);

-				fInstalledBreakpoints.put(exceptionBreakpoint, request);

+			

 			}

+			// defer the exception

+			defer(exceptionBreakpoint, topLevelName);

 		} else {

 			exceptionBreakpointRemoved(exceptionBreakpoint);

 		}

@@ -1058,15 +1092,18 @@
 			return;

 		}

 		String name = type.getFullyQualifiedName();

-		ExceptionRequest request= (ExceptionRequest) fInstalledBreakpoints.remove(exceptionBreakpoint);

-		if (request != null) {

-			try {

-				getEventRequestManager().deleteEventRequest(request);

-			} catch (VMDisconnectedException e) {

-				return;

-			} catch (RuntimeException e) {

-				internalError(e);

-				return;

+		List list = removeBreakpointRequests(exceptionBreakpoint);

+		if (list != null) {

+			Iterator iter = list.iterator();

+			while (iter.hasNext()) {

+				ExceptionRequest request= (ExceptionRequest) iter.next();

+				try {

+					getEventRequestManager().deleteEventRequest(request);

+				} catch (VMDisconnectedException e) {

+					return;

+				} catch (RuntimeException e) {

+					internalError(e);

+				}

 			}

 		}

 		List deferred = (List)fDeferredBreakpointsByClass.get(name);

@@ -1135,7 +1172,7 @@
 		} catch (CoreException e) {

 			internalError(e);

 		}

-		fInstalledBreakpoints.put(breakpoint, request);

+		addInstalledBreakpoint(breakpoint, request);

 	}	

 	

 	protected MethodEntryRequest getMethodEntryRequest(String className) {

@@ -1153,24 +1190,27 @@
 	 * Update the request.

 	 */

 	protected void methodEntryBreakpointChanged(IMarker breakpoint, IMarkerDelta delta) {

-		MethodEntryRequest request = (MethodEntryRequest)fInstalledBreakpoints.get(breakpoint);

-		if (request == null) {

-			return;

-		}

-		// check the enabled state

-		updateMethodEntryEnabledState(request);

-		

-		List breakpoints= (List)request.getProperty(IDebugConstants.BREAKPOINT_MARKER);

-		int index= breakpoints.indexOf(breakpoint);

-		// update the breakpoints hit count

-		int newCount = DebugJavaUtils.getHitCount(breakpoint);

-		List hitCounts= (List)request.getProperty(IJavaDebugConstants.HIT_COUNT);

-		if (newCount > 0) {

-			hitCounts.set(index, new Integer(newCount));

-		} else {

-			//back to a regular breakpoint

-			hitCounts.set(index, null);			

-		}

+		List list = getBreakpointRequests(breakpoint);

+		if (list != null) {

+			int newCount = DebugJavaUtils.getHitCount(breakpoint);

+			Iterator iter = list.iterator();

+			while (iter.hasNext()) {

+				MethodEntryRequest request = (MethodEntryRequest)iter.next();

+				// check the enabled state

+				updateMethodEntryEnabledState(request);

+				

+				List breakpoints= (List)request.getProperty(IDebugConstants.BREAKPOINT_MARKER);

+				int index= breakpoints.indexOf(breakpoint);

+				// update the breakpoints hit count

+				List hitCounts= (List)request.getProperty(IJavaDebugConstants.HIT_COUNT);

+				if (newCount > 0) {

+					hitCounts.set(index, new Integer(newCount));

+				} else {

+					//back to a regular breakpoint

+					hitCounts.set(index, null);			

+				}

+			}

+		}		

 	}

 	

 	/**

@@ -1178,26 +1218,30 @@
 	 * Update the request.

 	 */

 	protected void methodEntryBreakpointRemoved(IMarker breakpoint) {

-		MethodEntryRequest request = (MethodEntryRequest)fInstalledBreakpoints.remove(breakpoint);

-		if (request != null) {

-			try {

-				DebugJavaUtils.decrementInstallCount(breakpoint);

-			} catch (CoreException e) {

-				internalError(e);

-			}

-			List breakpoints= (List)request.getProperty(IDebugConstants.BREAKPOINT_MARKER);

-			int index = breakpoints.indexOf(breakpoint);

-			breakpoints.remove(index);

-			if (breakpoints.isEmpty()) {

+		List list = removeBreakpointRequests(breakpoint);

+		if (list != null) {

+			Iterator iter = list.iterator();

+			while (iter.hasNext()) {

+				MethodEntryRequest request = (MethodEntryRequest)iter.next();

 				try {

-					getEventRequestManager().deleteEventRequest(request); // disable & remove

-				} catch (VMDisconnectedException e) {

-				} catch (RuntimeException e) {

+					DebugJavaUtils.decrementInstallCount(breakpoint);

+				} catch (CoreException e) {

 					internalError(e);

 				}

-			} else {

-				List hitCounts= (List)request.getProperty(IJavaDebugConstants.HIT_COUNT);

-				hitCounts.remove(index);

+				List breakpoints= (List)request.getProperty(IDebugConstants.BREAKPOINT_MARKER);

+				int index = breakpoints.indexOf(breakpoint);

+				breakpoints.remove(index);

+				if (breakpoints.isEmpty()) {

+					try {

+						getEventRequestManager().deleteEventRequest(request); // disable & remove

+					} catch (VMDisconnectedException e) {

+					} catch (RuntimeException e) {

+						internalError(e);

+					}

+				} else {

+					List hitCounts= (List)request.getProperty(IJavaDebugConstants.HIT_COUNT);

+					hitCounts.remove(index);

+				}

 			}

 		}

 	}

@@ -1280,11 +1324,8 @@
 			//inner class load...resolve the top level type name

 			topLevelName= className.substring(0, index);

 		}

-		ArrayList markers= (ArrayList) fDeferredBreakpointsByClass.remove(topLevelName);

+		ArrayList markers= (ArrayList) fDeferredBreakpointsByClass.get(topLevelName);

 		if (markers != null) {

-			//no longer need to listen for this class load

-			ClassPrepareRequest request= (ClassPrepareRequest) fClassPrepareRequestsByClass.remove(topLevelName);

-			getEventRequestManager().deleteEventRequest(request);

 			Iterator itr= ((ArrayList) markers.clone()).iterator();

 			while (itr.hasNext()) {

 				IMarker marker= (IMarker) itr.next();

@@ -1301,7 +1342,12 @@
 		while (markers.hasNext()) {

 			IMarker marker= (IMarker) markers.next();

 			try {

-				DebugJavaUtils.decrementInstallCount(marker);				

+				List list = getBreakpointRequests(marker);

+				if (list != null) {

+					for (int i = 0; i < list.size(); i++) {

+						DebugJavaUtils.decrementInstallCount(marker);				

+					}

+				}

 			} catch (CoreException e) {

 				internalError(e);

 			}

@@ -1323,40 +1369,44 @@
 	}

 	

 	protected void lineBreakpointRemoved(IMarker breakpoint) {		

-		BreakpointRequest request= (BreakpointRequest) fInstalledBreakpoints.remove(breakpoint);

-		if (request == null) {

-			//deferred breakpoint

-			if (!breakpoint.exists()) {

-				//resource no longer exists

-				return;

-			}

-			String name= getTopLevelTypeName(breakpoint);

-			if (name == null) {

-				internalError(ERROR_BREAKPOINT_NO_TYPE);

-				return;

-			}

-			List markers= (List) fDeferredBreakpointsByClass.get(name);

-			if (markers == null) {

-				return;

-			}

-

-			markers.remove(breakpoint);

-			if (markers.isEmpty()) {

-				fDeferredBreakpointsByClass.remove(name);

-			}

-		} else {

+		List list = removeBreakpointRequests(breakpoint);

+		if (list != null) {

 			//installed breakpoint

-			try {

-				// cannot delete an expired request

-				if (!isExpired(request)) {

-					getEventRequestManager().deleteEventRequest(request); // disable & remove

+			Iterator iter = list.iterator();

+			while (iter.hasNext()) {

+				BreakpointRequest request = (BreakpointRequest)iter.next();

+				try {

+					// cannot delete an expired request

+					if (!isExpired(request)) {

+						getEventRequestManager().deleteEventRequest(request); // disable & remove

+					}

+				} catch (VMDisconnectedException e) {

+					return;

+				} catch (RuntimeException e) {

+					internalError(e);

 				}

-			} catch (VMDisconnectedException e) {

-				return;

-			} catch (RuntimeException e) {

-				internalError(e);

 			}

 		}

+		

+		//deferred breakpoint

+		if (!breakpoint.exists()) {

+			//resource no longer exists

+			return;

+		}

+		String name= getTopLevelTypeName(breakpoint);

+		if (name == null) {

+			internalError(ERROR_BREAKPOINT_NO_TYPE);

+			return;

+		}

+		List markers= (List) fDeferredBreakpointsByClass.get(name);

+		if (markers == null) {

+			return;

+		}

+

+		markers.remove(breakpoint);

+		if (markers.isEmpty()) {

+			fDeferredBreakpointsByClass.remove(name);

+		}

 	}

 

 	/**

@@ -1370,9 +1420,15 @@
 				// do not notify the breakpoint manager of uninstall, as we

 				// are in a resource change callback and cannot modify the resource tree

 				IMarker marker= (IMarker) itr.next();

-				EventRequest req = (EventRequest)fInstalledBreakpoints.remove(marker);

-				getEventRequestManager().deleteEventRequest(req);

-				breakpointAdded(marker);

+				List list = removeBreakpointRequests(marker);

+				if (list != null) {

+					Iterator iter = list.iterator();

+					while (iter.hasNext()) {

+						EventRequest req = (EventRequest)iter.next();

+						getEventRequestManager().deleteEventRequest(req);

+						breakpointAdded(marker);

+					}

+				}

 			}

 		}

 	}

diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/pattern/PatternDebugTarget.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/pattern/PatternDebugTarget.java
index e42b85f..f30d3ed 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/pattern/PatternDebugTarget.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/pattern/PatternDebugTarget.java
Binary files differ
diff --git a/org.eclipse.jdt.debug/plugin.xml b/org.eclipse.jdt.debug/plugin.xml
index ac24caa..1d3ab94 100644
--- a/org.eclipse.jdt.debug/plugin.xml
+++ b/org.eclipse.jdt.debug/plugin.xml
@@ -97,7 +97,7 @@
       id="patternBreakpoint"

       point="org.eclipse.core.resources.markers">

    <super

-         type="org.eclipse.debug.core.lineBreakpoint">

+         type="org.eclipse.jdt.debug.javaLineBreakpoint">

    </super>

    <persistent

          value="true">