/** {@inheritDoc} */
  @Override
  public boolean readFrom(ByteBuffer buf, MessageReader reader) {
    reader.setBuffer(buf);

    if (!reader.beforeMessageRead()) return false;

    if (!super.readFrom(buf, reader)) return false;

    switch (reader.state()) {
      case 8:
        byte concurrencyOrd;

        concurrencyOrd = reader.readByte("concurrency");

        if (!reader.isLastRead()) return false;

        concurrency = TransactionConcurrency.fromOrdinal(concurrencyOrd);

        reader.incrementState();

      case 9:
        dhtVerKeys = reader.readCollection("dhtVerKeys", MessageCollectionItemType.MSG);

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 10:
        dhtVerVals = reader.readCollection("dhtVerVals", MessageCollectionItemType.MSG);

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 11:
        grpLockKeyBytes = reader.readByteArray("grpLockKeyBytes");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 12:
        invalidate = reader.readBoolean("invalidate");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 13:
        byte isolationOrd;

        isolationOrd = reader.readByte("isolation");

        if (!reader.isLastRead()) return false;

        isolation = TransactionIsolation.fromOrdinal(isolationOrd);

        reader.incrementState();

      case 14:
        onePhaseCommit = reader.readBoolean("onePhaseCommit");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 15:
        partLock = reader.readBoolean("partLock");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 16:
        byte plcOrd;

        plcOrd = reader.readByte("plc");

        if (!reader.isLastRead()) return false;

        plc = GridIoPolicy.fromOrdinal(plcOrd);

        reader.incrementState();

      case 17:
        reads = reader.readCollection("reads", MessageCollectionItemType.MSG);

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 18:
        sys = reader.readBoolean("sys");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 19:
        threadId = reader.readLong("threadId");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 20:
        timeout = reader.readLong("timeout");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 21:
        txNodesBytes = reader.readByteArray("txNodesBytes");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 22:
        txSize = reader.readInt("txSize");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 23:
        writeVer = reader.readMessage("writeVer");

        if (!reader.isLastRead()) return false;

        reader.incrementState();

      case 24:
        writes = reader.readCollection("writes", MessageCollectionItemType.MSG);

        if (!reader.isLastRead()) return false;

        reader.incrementState();
    }

    return true;
  }