/*
   * (non-Javadoc)
   *
   * @see org.eclipse.e4.languages.javascript.jsdi.ThreadReference#frames()
   */
  public synchronized List frames() {
    if (!suspended || status == THREAD_STATUS_ZOMBIE) return Collections.EMPTY_LIST;

    if (frames != null) return frames;

    Request request = new Request(JSONConstants.FRAMES);
    request.getArguments().put(JSONConstants.THREAD_ID, threadId);
    try {
      Response response = vm.sendRequest(request, 30000);
      List frameIds = (List) response.getBody().get(JSONConstants.FRAMES);
      if (frameIds.isEmpty()) {
        frames = Collections.EMPTY_LIST;
        return frames;
      }
      frames = new ArrayList();
      for (Iterator iterator = frameIds.iterator(); iterator.hasNext(); ) {
        Long frameId = new Long(((Number) iterator.next()).longValue());
        StackFrameReferenceImpl frame = createStackFrame(frameId);
        frames.add(frame);
      }
    } catch (DisconnectException e) {
      e.printStackTrace();
    } catch (TimeoutException e) {
      e.printStackTrace();
    }
    return frames;
  }
 /*
  * (non-Javadoc)
  *
  * @see org.eclipse.e4.languages.javascript.jsdi.ThreadReference#resume()
  */
 public synchronized void resume() {
   if (status == THREAD_STATUS_ZOMBIE) {
     return;
   }
   Request request = new Request(JSONConstants.CONTINUE);
   request.getArguments().put(JSONConstants.THREAD_ID, threadId);
   if (step != null) {
     request.getArguments().put(JSONConstants.STEP, step);
   }
   try {
     Response response = vm.sendRequest(request, 30000);
     if (response.isSuccess()) {
       step = null;
       frames = null;
       suspended = false;
       atBreakpoint = false;
     }
   } catch (DisconnectException e) {
     e.printStackTrace();
   } catch (TimeoutException e) {
     e.printStackTrace();
   }
 }
 /*
  * (non-Javadoc)
  *
  * @see org.eclipse.e4.languages.javascript.jsdi.ThreadReference#suspend()
  */
 public void suspend() {
   if (status == THREAD_STATUS_ZOMBIE) {
     return;
   }
   Request request = new Request(JSONConstants.SUSPEND);
   request.getArguments().put(JSONConstants.THREAD_ID, threadId);
   try {
     vm.sendRequest(request, 30000);
   } catch (DisconnectException e) {
     e.printStackTrace();
   } catch (TimeoutException e) {
     e.printStackTrace();
   }
 }
 /**
  * Sends a request to make a new {@link StackFrameReference} in the current debugger. Returns a
  * new {@link StackFrameReference} on success, <code>null</code> on failure
  *
  * @param frameId
  * @return a new {@link StackFrameReference} or <code>null</code>
  */
 private StackFrameReferenceImpl createStackFrame(Long frameId) {
   Request request = new Request(JSONConstants.FRAME);
   request.getArguments().put(JSONConstants.THREAD_ID, threadId);
   request.getArguments().put(JSONConstants.FRAME_ID, frameId);
   try {
     Response response = vm.sendRequest(request, 30000);
     Map jsonFrame = (Map) response.getBody().get(JSONConstants.FRAME);
     return new StackFrameReferenceImpl(vm, jsonFrame);
   } catch (DisconnectException e) {
     e.printStackTrace();
   } catch (TimeoutException e) {
     e.printStackTrace();
   }
   return null;
 }