private int processLongCache(
      Machine machine, Transaction transaction, MessageTree tree, int count) {
    long duration = ((Transaction) transaction).getDurationInMillis();

    if (duration > m_defaultCacheThreshold) {
      String type = ProblemType.LONG_CACHE.getName();
      String status = transaction.getName();

      Entry entry = findOrCreateEntry(machine, type, status);
      updateEntry(tree, entry, 0);
      count++;
    }
    return count;
  }
  private int processLongSql(
      Machine machine, Transaction transaction, MessageTree tree, int count) {
    long duration = transaction.getDurationInMillis();
    String domain = tree.getDomain();

    long nomarizeDuration =
        computeLongDuration(duration, domain, m_defaultLongSqlDuration, m_longSqlThresholds);
    if (nomarizeDuration > 0) {
      String type = ProblemType.LONG_SQL.getName();
      String status = transaction.getName();

      Entry entry = findOrCreateEntry(machine, type, status);
      updateEntry(tree, entry, (int) nomarizeDuration);
      count++;
    }
    return count;
  }
  protected int encodeTransactionLine(
      MessageTree tree, Transaction t, ChannelBuffer buf, Locator locator, Ruler ruler) {
    BufferHelper helper = m_bufferHelper;
    XmlBuilder b = new XmlBuilder();
    int width = 6;
    int height = 18;
    int x = 0;
    int y = locator.getLine() * height + ruler.getOffsetY();
    String tid = "t" + locator.getLine();
    long t0 = tree.getMessage().getTimestamp();
    long t1 = t.getTimestamp();
    int rx = ruler.calcX((t1 - t0) * 1000);
    int rw = ruler.calcWidth(t.getDurationInMicros() * 1000);
    int[] segments = getTransactionDurationSegments(t);

    b.branch(locator, x, y, width, height);
    x += locator.getLevel() * width;

    if (t.getStatus().equals("0")) {
      b.tag1("text", "x", x, "y", y - 5, "font-weight", "bold", "stroke-width", "0");
    } else {
      b.tag1("text", "x", x, "y", y - 5, "font-weight", "bold", "stroke-width", "0", "fill", "red");
    }

    b.add(t.getType()).newLine();
    b.tag(
        "set",
        "attributeName",
        "fill",
        "to",
        "red",
        "begin",
        tid + ".mouseover",
        "end",
        tid + ".mouseout");
    b.tag2("text");

    if (segments == null) {
      String durationInMillis =
          String.format("%.2f %s", t.getDurationInMicros() / 1000.0, t.getName());

      b.tag(
          "rect",
          "x",
          rx + 1,
          "y",
          y - 15,
          "width",
          rw,
          "height",
          height - 2,
          "fill",
          "#0066ff",
          "opacity",
          "0.5");
      b.tagWithText(
          "text",
          durationInMillis,
          "x",
          rx + 5,
          "y",
          y - 3,
          "font-size",
          "11",
          "stroke-width",
          "0");
    } else {
      int index = 0;

      for (int segment : segments) {
        int w = ruler.calcWidth(segment);
        String durationInMillis =
            String.format("%.2f %s", segment / 1000.0 / 1000.0, index == 0 ? t.getName() : "");
        String color = m_colors[index % m_colors.length];

        b.tag(
            "rect",
            "x",
            rx + 1,
            "y",
            y - 15,
            "width",
            w,
            "height",
            height - 2,
            "fill",
            color,
            "opacity",
            "0.5");
        b.tagWithText(
            "text",
            durationInMillis,
            "x",
            rx + 5,
            "y",
            y - 3,
            "font-size",
            "11",
            "stroke-width",
            "0");

        index++;
        rx += w;
      }
    }

    b.tag(
        "rect",
        "id",
        tid,
        "x",
        ruler.getOffsetX() + 1,
        "y",
        y - 15,
        "width",
        ruler.getWidth(),
        "height",
        height,
        "fill",
        "#ffffff",
        "stroke-width",
        "0",
        "opacity",
        "0.01");

    return helper.write(buf, b.getResult().toString());
  }