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