/** {@inheritDoc} */
  @Override
  public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
    writer.setBuffer(buf);

    if (!super.writeTo(buf, writer)) return false;

    if (!writer.isHeaderWritten()) {
      if (!writer.writeHeader(directType(), fieldsCount())) return false;

      writer.onHeaderWritten();
    }

    switch (writer.state()) {
      case 8:
        if (!writer.writeByte(
            "concurrency", concurrency != null ? (byte) concurrency.ordinal() : -1)) return false;

        writer.incrementState();

      case 9:
        if (!writer.writeCollection("dhtVerKeys", dhtVerKeys, MessageCollectionItemType.MSG))
          return false;

        writer.incrementState();

      case 10:
        if (!writer.writeCollection("dhtVerVals", dhtVerVals, MessageCollectionItemType.MSG))
          return false;

        writer.incrementState();

      case 11:
        if (!writer.writeByteArray("grpLockKeyBytes", grpLockKeyBytes)) return false;

        writer.incrementState();

      case 12:
        if (!writer.writeBoolean("invalidate", invalidate)) return false;

        writer.incrementState();

      case 13:
        if (!writer.writeByte("isolation", isolation != null ? (byte) isolation.ordinal() : -1))
          return false;

        writer.incrementState();

      case 14:
        if (!writer.writeBoolean("onePhaseCommit", onePhaseCommit)) return false;

        writer.incrementState();

      case 15:
        if (!writer.writeBoolean("partLock", partLock)) return false;

        writer.incrementState();

      case 16:
        if (!writer.writeByte("plc", plc != null ? (byte) plc.ordinal() : -1)) return false;

        writer.incrementState();

      case 17:
        if (!writer.writeCollection("reads", reads, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();

      case 18:
        if (!writer.writeBoolean("sys", sys)) return false;

        writer.incrementState();

      case 19:
        if (!writer.writeLong("threadId", threadId)) return false;

        writer.incrementState();

      case 20:
        if (!writer.writeLong("timeout", timeout)) return false;

        writer.incrementState();

      case 21:
        if (!writer.writeByteArray("txNodesBytes", txNodesBytes)) return false;

        writer.incrementState();

      case 22:
        if (!writer.writeInt("txSize", txSize)) return false;

        writer.incrementState();

      case 23:
        if (!writer.writeMessage("writeVer", writeVer)) return false;

        writer.incrementState();

      case 24:
        if (!writer.writeCollection("writes", writes, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();
    }

    return true;
  }