/**
   * Gets the CPU dump string.
   *
   * @param runtime The runtime
   * @param mainClass The main class
   * @param arguments The arguments
   * @return The CPU dump string
   */
  protected String getCpuDumpString(String runtime, String mainClass, String arguments) {

    // get date and time
    Date currentDate = new Date();
    String date = new SimpleDateFormat("yyyy/MM/dd").format(currentDate); // $NON-NLS-1$
    String time = new SimpleDateFormat("HH:mm:ss").format(currentDate); // $NON-NLS-1$

    StringBuffer buffer = new StringBuffer();
    buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); // $NON-NLS-1$
    buffer.append("<?JvmMonitor version=\""); // $NON-NLS-1$
    buffer.append(AGENT_VERSION);
    buffer.append("\"?>\n"); // $NON-NLS-1$

    buffer
        .append("<cpu-profile date=\"")
        .append(date)
        .append(' ') // $NON-NLS-1$
        .append(time)
        .append("\" "); // $NON-NLS-1$
    buffer.append("runtime=\"").append(runtime).append("\" "); // $NON-NLS-1$ //$NON-NLS-2$
    buffer.append("mainClass=\"").append(mainClass).append("\" "); // $NON-NLS-1$ //$NON-NLS-2$
    buffer.append("arguments=\"").append(arguments).append("\">\n"); // $NON-NLS-1$ //$NON-NLS-2$

    for (ThreadNode<CallTreeNode> node : callTreeThreads) {
      buffer
          .append("\t<thread name=\"")
          .append(node.getName())
          .append("\">\n"); // $NON-NLS-1$ //$NON-NLS-2$
      for (CallTreeNode frameNode : node.getChildren()) {
        frameNode.dump(buffer, 2);
      }
      buffer.append("\t</thread>\n"); // $NON-NLS-1$
    }
    buffer.append("</cpu-profile>"); // $NON-NLS-1$

    return buffer.toString();
  }