edits
[iotcloud.git] / version2 / src / java / iotcloud / TransactionPart.java
1 package iotcloud;
2
3 import java.nio.ByteBuffer;
4
5 class TransactionPart extends Entry {
6
7     // Max size of the part excluding the fixed size header
8     public static final int MAX_NON_HEADER_SIZE = 512;
9
10     private long sequenceNumber = -1;
11     private long machineId = -1;
12     private long arbitratorId = -1;
13     private long clientLocalSequenceNumber = -1; // Sequence number of the transaction that this is a part of
14     private int partNumber = -1; // Parts position in the
15     private Boolean isLastPart = false;
16
17     private Pair<Long, Long> transactionId = null;
18     private Pair<Long, Integer> partId = null;
19
20     private byte[] data = null;
21
22     public TransactionPart(Slot s, long _machineId, long _arbitratorId, long _clientLocalSequenceNumber, int _partNumber, byte[] _data, Boolean _isLastPart) {
23         super(s);
24         machineId = _machineId;
25         arbitratorId = _arbitratorId;
26         clientLocalSequenceNumber = _clientLocalSequenceNumber;
27         partNumber = _partNumber;
28         data = _data;
29         isLastPart = _isLastPart;
30
31         transactionId = new Pair<Long, Long>(machineId, clientLocalSequenceNumber);
32         partId = new Pair<Long, Integer>(clientLocalSequenceNumber, partNumber);
33
34     }
35
36     public int getSize() {
37         if (data == null) {
38             return (4 * Long.BYTES) + (2 * Integer.BYTES) + (2 * Byte.BYTES);
39         }
40         return (4 * Long.BYTES) + (2 * Integer.BYTES) + (2 * Byte.BYTES) + data.length;
41     }
42
43     public void setSlot(Slot s) {
44         parentslot = s;
45     }
46
47     public Pair<Long, Long> getTransactionId() {
48         return transactionId;
49     }
50
51     public long getArbitratorId() {
52         return arbitratorId;
53     }
54
55     public Pair<Long, Integer> getPartId() {
56         return partId;
57     }
58
59     public int getPartNumber() {
60         return partNumber;
61     }
62
63     public int getDataSize() {
64         return data.length;
65     }
66
67     public byte[] getData() {
68         return data;
69     }
70
71     public Boolean isLastPart() {
72         return isLastPart;
73     }
74
75     public long getMachineId() {
76         return machineId;
77     }
78
79     public long getClientLocalSequenceNumber() {
80         return clientLocalSequenceNumber;
81     }
82
83
84     public long getSequenceNumber() {
85         return sequenceNumber;
86     }
87
88     public void setSequenceNumber(long _sequenceNumber) {
89         sequenceNumber = _sequenceNumber;
90     }
91
92     static Entry decode(Slot s, ByteBuffer bb) {
93         long sequenceNumber = bb.getLong();
94         long machineId = bb.getLong();
95         long arbitratorId = bb.getLong();
96         long clientLocalSequenceNumber = bb.getLong();
97         int partNumber = bb.getInt();
98         int dataSize = bb.getInt();
99         Boolean isLastPart = (bb.get() == 1);
100         // Get the data
101         byte[] data = new byte[dataSize];
102         bb.get(data);
103
104         TransactionPart returnTransactionPart = new TransactionPart(s, machineId, arbitratorId, clientLocalSequenceNumber, partNumber, data, isLastPart);
105         returnTransactionPart.setSequenceNumber(sequenceNumber);
106
107         return returnTransactionPart;
108     }
109
110     public void encode(ByteBuffer bb) {
111         bb.put(Entry.TypeTransactionPart);
112         bb.putLong(sequenceNumber);
113         bb.putLong(machineId);
114         bb.putLong(arbitratorId);
115         bb.putLong(clientLocalSequenceNumber);
116         bb.putInt(partNumber);
117         bb.putInt(data.length);
118
119         if (isLastPart) {
120             bb.put((byte)1);
121         } else {
122             bb.put((byte)0);
123         }
124
125         bb.put(data);
126     }
127
128     public byte getType() {
129         return Entry.TypeTransactionPart;
130     }
131
132     public Entry getCopy(Slot s) {
133
134         TransactionPart copyTransaction = new TransactionPart(s, machineId, arbitratorId, clientLocalSequenceNumber, partNumber, data, isLastPart);
135         copyTransaction.setSequenceNumber(sequenceNumber);
136
137         return copyTransaction;
138     }
139 }