Added stack trace to result.
1.1 --- a/dew4nb/manifest.mf Wed Jan 29 14:22:48 2014 +0100
1.2 +++ b/dew4nb/manifest.mf Wed Jan 29 16:15:41 2014 +0100
1.3 @@ -2,4 +2,5 @@
1.4 OpenIDE-Module: org.netbeans.modules.dew4nb
1.5 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/dew4nb/Bundle.properties
1.6 OpenIDE-Module-Specification-Version: 1.0
1.7 +OpenIDE-Module-Package-Dependencies: com.sun.jdi[VirtualMachineManager]
1.8
2.1 --- a/dew4nb/nbproject/project.properties Wed Jan 29 14:22:48 2014 +0100
2.2 +++ b/dew4nb/nbproject/project.properties Wed Jan 29 16:15:41 2014 +0100
2.3 @@ -3,3 +3,4 @@
2.4 run.args.ide=-J-Dweb4dew=${basedir}/release/web4dew/
2.5 requires.nb.javac=true
2.6 spec.version.base.fatal.warning=false
2.7 +cp.extra=${tools.jar}
3.1 --- a/dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/ActiveSessions.java Wed Jan 29 14:22:48 2014 +0100
3.2 +++ b/dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/ActiveSessions.java Wed Jan 29 16:15:41 2014 +0100
3.3 @@ -42,9 +42,11 @@
3.4
3.5 package org.netbeans.modules.dew4nb.services.debugger;
3.6
3.7 +import com.sun.jdi.AbsentInformationException;
3.8 import java.beans.Customizer;
3.9 import java.beans.PropertyChangeEvent;
3.10 import java.beans.PropertyChangeListener;
3.11 +import java.io.File;
3.12 import java.util.concurrent.ConcurrentHashMap;
3.13 import java.util.concurrent.ConcurrentMap;
3.14 import java.util.concurrent.atomic.AtomicInteger;
3.15 @@ -52,6 +54,7 @@
3.16 import java.util.logging.Logger;
3.17 import org.netbeans.api.annotations.common.CheckForNull;
3.18 import org.netbeans.api.annotations.common.NonNull;
3.19 +import org.netbeans.api.annotations.common.NullAllowed;
3.20 import org.netbeans.api.debugger.DebuggerManager;
3.21 import org.netbeans.api.debugger.Session;
3.22 import org.netbeans.api.debugger.jpda.CallStackFrame;
3.23 @@ -61,6 +64,11 @@
3.24 import org.netbeans.modules.dew4nb.endpoint.EndPoint;
3.25 import org.netbeans.modules.dew4nb.endpoint.Status;
3.26 import org.netbeans.modules.dew4nb.spi.WorkspaceResolver;
3.27 +import org.netbeans.spi.debugger.jpda.SourcePathProvider;
3.28 +import org.openide.filesystems.FileObject;
3.29 +import org.openide.filesystems.FileUtil;
3.30 +import org.openide.filesystems.URLMapper;
3.31 +import org.openide.util.Lookup;
3.32 import org.openide.util.Parameters;
3.33
3.34 /**
3.35 @@ -166,28 +174,52 @@
3.36 }
3.37 } else if (JPDAThread.PROP_SUSPENDED.equals(propName)) {
3.38 CallStackFrame[] callStack = null;
3.39 -// try {
3.40 -// callStack = currentThread.getCallStack();
3.41 -// } catch (Exception aie) {/*pass*/}
3.42 - if (callStack != null) {
3.43 - env.sendObject(createSuspendResult(callStack));
3.44 - } else {
3.45 - LOG.log(
3.46 - Level.WARNING,
3.47 - "No callstack for suspended thread: {0}", //NOI18N
3.48 - currentThread);
3.49 - }
3.50 + try {
3.51 + callStack = currentThread.getCallStack();
3.52 + } catch (AbsentInformationException aie) {/*pass, no -g*/}
3.53 + env.sendObject(createSuspendResult(callStack));
3.54 }
3.55 }
3.56
3.57 @NonNull
3.58 - private SuspendResult createSuspendResult(@NonNull CallStackFrame[] callStack) {
3.59 + private SuspendResult createSuspendResult(@NullAllowed CallStackFrame[] callStack) {
3.60 final SuspendResult res = new SuspendResult();
3.61 res.setId(id);
3.62 res.setStatus(Status.done);
3.63 res.setType(DebugMessageType.suspended);
3.64 - for (CallStackFrame csf : callStack) {
3.65 -
3.66 + if (callStack != null) {
3.67 + final WorkspaceResolver wr = Lookup.getDefault().lookup(WorkspaceResolver.class);
3.68 + if (wr == null) {
3.69 + throw new IllegalStateException("No workspace resolver."); //NOI18N
3.70 + }
3.71 + final FileObject root = wr.resolveFile(ctx);
3.72 + final SourcePathProvider spp = session.lookupFirst(null, SourcePathProvider.class);
3.73 + for (CallStackFrame csf : callStack) {
3.74 + String relativePath;
3.75 + try {
3.76 + relativePath = csf.getSourcePath(null).replace (File.separatorChar, '/');
3.77 + } catch (AbsentInformationException e) {
3.78 + relativePath = "<unknown>";
3.79 + }
3.80 + final String surl = spp.getURL (relativePath, true);
3.81 + if (surl != null) {
3.82 + try {
3.83 + final FileObject fo = URLMapper.findFileObject(new java.net.URL(surl));
3.84 + if (root != null && fo != null && FileUtil.isParentOf(root, fo)) {
3.85 + relativePath = FileUtil.getRelativePath(root, fo);
3.86 + }
3.87 + } catch (java.net.MalformedURLException muex) {
3.88 + LOG.log(
3.89 + Level.WARNING,
3.90 + "Malformed URL {0}", //NOI18N
3.91 + surl);
3.92 + }
3.93 + }
3.94 + res.getStack().add(String.format(
3.95 + "%s:%d",
3.96 + relativePath,
3.97 + csf.getLineNumber(null)));
3.98 + }
3.99 }
3.100 return res;
3.101 }