Added stack trace to result.
authorTomas Zezula <tzezula@netbeans.org>
Wed, 29 Jan 2014 16:15:41 +0100
changeset 18127926f75c87de3
parent 18126 7e7868b5ad70
child 18128 aea99e83722b
Added stack trace to result.
dew4nb/manifest.mf
dew4nb/nbproject/project.properties
dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/ActiveSessions.java
     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           }