@Override
 public void handleRequest(
     final RestRequest request, final RestChannel channel, final NodeClient client)
     throws Exception {
   boolean helpWanted = request.paramAsBoolean("help", false);
   if (helpWanted) {
     Table table = getTableWithHeader(request);
     int[] width = buildHelpWidths(table, request);
     BytesStreamOutput bytesOutput = channel.bytesOutput();
     UTF8StreamWriter out = new UTF8StreamWriter().setOutput(bytesOutput);
     for (Table.Cell cell : table.getHeaders()) {
       // need to do left-align always, so create new cells
       pad(new Table.Cell(cell.value), width[0], request, out);
       out.append(" | ");
       pad(
           new Table.Cell(cell.attr.containsKey("alias") ? cell.attr.get("alias") : ""),
           width[1],
           request,
           out);
       out.append(" | ");
       pad(
           new Table.Cell(cell.attr.containsKey("desc") ? cell.attr.get("desc") : "not available"),
           width[2],
           request,
           out);
       out.append("\n");
     }
     out.close();
     channel.sendResponse(
         new BytesRestResponse(
             RestStatus.OK, BytesRestResponse.TEXT_CONTENT_TYPE, bytesOutput.bytes()));
   } else {
     doRequest(request, channel, client);
   }
 }
 public static void pad(
     Table.Cell cell, int width, RestRequest request, UTF8StreamWriter out, boolean isLast)
     throws IOException {
   String sValue = renderValue(request, cell.value);
   int length = sValue == null ? 0 : sValue.length();
   byte leftOver = (byte) (width - length);
   String textAlign = cell.attr.get("text-align");
   if (textAlign == null) {
     textAlign = "left";
   }
   if (leftOver > 0 && textAlign.equals("right")) {
     for (byte i = 0; i < leftOver; i++) {
       out.append(" ");
     }
     if (sValue != null) {
       out.append(sValue);
     }
   } else {
     if (sValue != null) {
       out.append(sValue);
     }
     // Ignores the leftover spaces if the cell is the last of the column.
     if (!isLast) {
       for (byte i = 0; i < leftOver; i++) {
         out.append(" ");
       }
     }
   }
 }
 /** If exists, reset and return, otherwise create, reset and return a writer. */
 private static UTF8StreamWriter utf8StreamWriter() {
   SoftReference<UTF8StreamWriter> ref = utf8StreamWriter.get();
   UTF8StreamWriter writer = (ref == null) ? null : ref.get();
   if (writer == null) {
     writer = new UTF8StreamWriter(1024 * 4);
     utf8StreamWriter.set(new SoftReference<>(writer));
   }
   writer.reset();
   return writer;
 }
  public static RestResponse buildTextPlainResponse(Table table, RestChannel channel)
      throws IOException {
    RestRequest request = channel.request();
    boolean verbose = request.paramAsBoolean("v", false);

    List<DisplayHeader> headers = buildDisplayHeaders(table, request);
    int[] width = buildWidths(table, request, verbose, headers);

    BytesStreamOutput bytesOut = channel.bytesOutput();
    UTF8StreamWriter out = new UTF8StreamWriter().setOutput(bytesOut);
    int lastHeader = headers.size() - 1;
    if (verbose) {
      for (int col = 0; col < headers.size(); col++) {
        DisplayHeader header = headers.get(col);
        boolean isLastColumn = col == lastHeader;
        pad(
            new Table.Cell(header.display, table.findHeaderByName(header.name)),
            width[col],
            request,
            out,
            isLastColumn);
        if (!isLastColumn) {
          out.append(" ");
        }
      }
      out.append("\n");
    }
    for (int row = 0; row < table.getRows().size(); row++) {
      for (int col = 0; col < headers.size(); col++) {
        DisplayHeader header = headers.get(col);
        boolean isLastColumn = col == lastHeader;
        pad(table.getAsMap().get(header.name).get(row), width[col], request, out, isLastColumn);
        if (!isLastColumn) {
          out.append(" ");
        }
      }
      out.append("\n");
    }
    out.close();
    return new BytesRestResponse(
        RestStatus.OK, BytesRestResponse.TEXT_CONTENT_TYPE, bytesOut.bytes());
  }