package iotcloud; import java.nio.ByteBuffer; class TransactionPart extends Entry { // Max size of the part excluding the fixed size header public static final int MAX_NON_HEADER_SIZE = 512; private long sequenceNumber = -1; private long machineId = -1; private long arbitratorId = -1; private long clientLocalSequenceNumber = -1; // Sequence number of the transaction that this is a part of private int partNumber = -1; // Parts position in the private Boolean isLastPart = false; private Pair transactionId = null; private Pair partId = null; private byte[] data = null; public TransactionPart(Slot s, long _machineId, long _arbitratorId, long _clientLocalSequenceNumber, int _partNumber, byte[] _data, Boolean _isLastPart) { super(s); machineId = _machineId; arbitratorId = _arbitratorId; clientLocalSequenceNumber = _clientLocalSequenceNumber; partNumber = _partNumber; data = _data; isLastPart = _isLastPart; transactionId = new Pair(machineId, clientLocalSequenceNumber); partId = new Pair(clientLocalSequenceNumber, partNumber); } public int getSize() { if (data == null) { return (4 * Long.BYTES) + (2 * Integer.BYTES) + (2 * Byte.BYTES); } return (4 * Long.BYTES) + (2 * Integer.BYTES) + (2 * Byte.BYTES) + data.length; } public void setSlot(Slot s) { parentslot = s; } public Pair getTransactionId() { return transactionId; } public long getArbitratorId() { return arbitratorId; } public Pair getPartId() { return partId; } public int getPartNumber() { return partNumber; } public int getDataSize() { return data.length; } public byte[] getData() { return data; } public Boolean isLastPart() { return isLastPart; } public long getMachineId() { return machineId; } public long getClientLocalSequenceNumber() { return clientLocalSequenceNumber; } public long getSequenceNumber() { return sequenceNumber; } public void setSequenceNumber(long _sequenceNumber) { sequenceNumber = _sequenceNumber; } static Entry decode(Slot s, ByteBuffer bb) { long sequenceNumber = bb.getLong(); long machineId = bb.getLong(); long arbitratorId = bb.getLong(); long clientLocalSequenceNumber = bb.getLong(); int partNumber = bb.getInt(); int dataSize = bb.getInt(); Boolean isLastPart = (bb.get() == 1); // Get the data byte[] data = new byte[dataSize]; bb.get(data); TransactionPart returnTransactionPart = new TransactionPart(s, machineId, arbitratorId, clientLocalSequenceNumber, partNumber, data, isLastPart); returnTransactionPart.setSequenceNumber(sequenceNumber); return returnTransactionPart; } public void encode(ByteBuffer bb) { bb.put(Entry.TypeTransactionPart); bb.putLong(sequenceNumber); bb.putLong(machineId); bb.putLong(arbitratorId); bb.putLong(clientLocalSequenceNumber); bb.putInt(partNumber); bb.putInt(data.length); if (isLastPart) { bb.put((byte)1); } else { bb.put((byte)0); } bb.put(data); } public byte getType() { return Entry.TypeTransactionPart; } public Entry getCopy(Slot s) { TransactionPart copyTransaction = new TransactionPart(s, machineId, arbitratorId, clientLocalSequenceNumber, partNumber, data, isLastPart); copyTransaction.setSequenceNumber(sequenceNumber); return copyTransaction; } }