diff --git a/debugger.jpda.ant/antsrc/org/netbeans/modules/debugger/jpda/ant/JPDAConnect.java b/debugger.jpda.ant/antsrc/org/netbeans/modules/debugger/jpda/ant/JPDAConnect.java --- a/debugger.jpda.ant/antsrc/org/netbeans/modules/debugger/jpda/ant/JPDAConnect.java +++ b/debugger.jpda.ant/antsrc/org/netbeans/modules/debugger/jpda/ant/JPDAConnect.java @@ -42,7 +42,11 @@ package org.netbeans.modules.debugger.jpda.ant; import java.io.File; +import java.lang.ref.WeakReference; +import java.net.URL; import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -50,10 +54,18 @@ import org.apache.tools.ant.Task; import org.apache.tools.ant.types.Path; +import org.netbeans.api.debugger.Breakpoint; +import org.netbeans.api.debugger.DebuggerManager; +import org.netbeans.api.debugger.DebuggerManagerAdapter; +import org.netbeans.api.debugger.DebuggerManagerListener; +import org.netbeans.api.debugger.Session; +import org.netbeans.api.debugger.jpda.ExceptionBreakpoint; import org.openide.util.RequestProcessor; import org.netbeans.api.debugger.jpda.JPDADebugger; import org.netbeans.api.java.classpath.ClassPath; +import org.netbeans.api.java.source.BuildArtifactMapper.ArtifactsUpdated; +import org.netbeans.modules.debugger.jpda.ant.JPDAStart.Listener; /** @@ -86,6 +98,7 @@ /** Default transport is socket*/ private String transport = "dt_socket"; // NOI18N + private String listeningCP = null; /** * Host to connect to. @@ -132,6 +145,12 @@ return transport; } + public void setListeningcp(String listeningCP) { + if (listeningCP != null && listeningCP.length() > 0) { + this.listeningCP = listeningCP; + } + } + public void setName (String name) { this.name = name; } @@ -192,6 +211,7 @@ properties.put ("sourcepath", sourcePath); // NOI18N properties.put ("name", getName ()); // NOI18N properties.put ("jdksources", jdkSourcePath); // NOI18N + properties.put ("listeningCP", listeningCP); // NOI18N String workDir = getProject().getProperty("work.dir"); File baseDir; if (workDir != null) { @@ -203,12 +223,35 @@ logger.fine("JPDAConnect: properties = "+properties); + final WeakReference startedSessionRef[] = new WeakReference[] { new WeakReference(null) }; + + Map listeners = new HashMap(); + List artificialBreakpoints = new LinkedList(); + if (listeningCP != null) { + ExceptionBreakpoint b = JPDAStart.createCompilationErrorBreakpoint(); + DebuggerManager.getDebuggerManager ().addBreakpoint (b); + artificialBreakpoints.add(b); + } + + DebuggerManager.getDebuggerManager().addDebuggerListener( + DebuggerManager.PROP_DEBUGGER_ENGINES, + new Listener(null, artificialBreakpoints, listeners, startedSessionRef)); synchronized(lock) { RequestProcessor.getDefault ().post (new Runnable () { public void run() { synchronized(lock) { + DebuggerManagerListener sessionListener = new DebuggerManagerAdapter() { + @Override + public void sessionAdded(Session session) { + synchronized (startedSessionRef) { + // TODO: make that more deterministic. + startedSessionRef[0] = new WeakReference(session); + } + } + }; try { + DebuggerManager.getDebuggerManager().addDebuggerListener(sessionListener); if (logger.isLoggable(Level.FINE)) { logger.fine( "JPDAConnect.execute ().synchronized: " // NOI18N @@ -249,6 +292,7 @@ lock[0] = e; } finally { lock.notify(); + DebuggerManager.getDebuggerManager().removeDebuggerListener(sessionListener); } } } diff --git a/debugger.jpda.ant/antsrc/org/netbeans/modules/debugger/jpda/ant/JPDAStart.java b/debugger.jpda.ant/antsrc/org/netbeans/modules/debugger/jpda/ant/JPDAStart.java --- a/debugger.jpda.ant/antsrc/org/netbeans/modules/debugger/jpda/ant/JPDAStart.java +++ b/debugger.jpda.ant/antsrc/org/netbeans/modules/debugger/jpda/ant/JPDAStart.java @@ -176,7 +176,9 @@ } public void setListeningcp(String listeningCP) { - this.listeningCP = listeningCP; + if (listeningCP != null && listeningCP.length() > 0) { + this.listeningCP = listeningCP; + } } public void addClasspath (Path path) { @@ -502,7 +504,7 @@ return breakpoint; } - private ExceptionBreakpoint createCompilationErrorBreakpoint() { + static ExceptionBreakpoint createCompilationErrorBreakpoint() { ExceptionBreakpoint b = ExceptionBreakpoint.create("java.lang.RuntimeException", ExceptionBreakpoint.TYPE_EXCEPTION_UNCATCHED); b.setHidden (true); b.addJPDABreakpointListener(new JPDABreakpointListener() { @@ -750,7 +752,7 @@ } - private static class Listener extends DebuggerManagerAdapter { + static class Listener extends DebuggerManagerAdapter { private Set debuggers = new HashSet (); @@ -759,7 +761,7 @@ private final Map listeners; private final WeakReference startedSessionRef[]; - private Listener(Breakpoint first, + Listener(Breakpoint first, List artificalBreakpoints, Map listeners, WeakReference startedSessionRef[]) {