Initial Working version of IoTCloudv2, needs more testing
[iotcloud.git] / src2 / java / iotcloud / Transaction.java
1 package iotcloud;
2
3 import java.nio.ByteBuffer;
4 import java.util.Set;
5 import java.util.HashSet;
6
7 class Transaction extends Entry {
8
9     private long seqnum;
10     private long machineid;
11     private Set<KeyValue> keyValueUpdateSet = null;
12     private Guard guard;
13
14     public Transaction(Slot slot, long _seqnum, long _machineid, Set<KeyValue> _keyValueUpdateSet, Guard _guard) {
15         super(slot);
16         seqnum = _seqnum;
17         machineid = _machineid;
18
19         keyValueUpdateSet = new HashSet<KeyValue>();
20
21         for (KeyValue kv : _keyValueUpdateSet) {
22             KeyValue kvCopy = kv.getCopy();
23             keyValueUpdateSet.add(kvCopy);
24         }
25
26         guard = _guard.getCopy();
27     }
28
29     public long getMachineID() {
30         return machineid;
31     }
32
33     public long getSequenceNumber() {
34         return seqnum;
35     }
36
37     public Set<KeyValue> getkeyValueUpdateSet() {
38         return keyValueUpdateSet;
39     }
40
41     public Guard getGuard() {
42         return guard;
43     }
44
45     public byte getType() {
46         return Entry.TypeTransaction;
47     }
48
49     public int getSize() {
50         int size = 2 * Long.BYTES + Byte.BYTES; // seq, machine id, entry type
51         size += Integer.BYTES; // number of KV's
52
53         // Size of each KV
54         for (KeyValue kv : keyValueUpdateSet) {
55             size += kv.getSize();
56         }
57
58         // Size of the guard
59         size += guard.getSize();
60
61         return size;
62     }
63
64
65     public void encode(ByteBuffer bb) {
66         bb.put(Entry.TypeTransaction);
67         bb.putLong(seqnum);
68         bb.putLong(machineid);
69
70         bb.putInt(keyValueUpdateSet.size());
71         for (KeyValue kv : keyValueUpdateSet) {
72             kv.encode(bb);
73         }
74
75         guard.encode(bb);
76     }
77
78     static Entry decode(Slot slot, ByteBuffer bb) {
79         long seqnum = bb.getLong();
80         long machineid = bb.getLong();
81         int numberOfKeys = bb.getInt();
82
83         Set<KeyValue> kvSet = new HashSet<KeyValue>();
84         for (int i = 0; i < numberOfKeys; i++) {
85             KeyValue kv = KeyValue.decode(bb);
86             kvSet.add(kv);
87         }
88
89         Guard guard = Guard.decode(bb);
90
91         return new Transaction(slot, seqnum, machineid, kvSet, guard);
92     }
93
94     public Entry getCopy(Slot s) {
95         return new Transaction(s, seqnum, machineid, keyValueUpdateSet, guard);
96     }
97 }