Fixes to tex doc; Code Updates
[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         for (KeyValue kv : _keyValueUpdateSet) {
20             KeyValue kvCopy = kv.getCopy();
21             keyValueUpdateSet.add(kvCopy);
22         }
23
24         guard = _guard.getCopy();
25     }
26
27     public long getMachineID() {
28         return machineid;
29     }
30
31     public long getSequenceNumber() {
32         return seqnum;
33     }
34
35     public Set<KeyValue> getkeyValueUpdateSet() {
36         return keyValueUpdateSet;
37     }
38
39     public Guard getGuard() {
40         return guard;
41     }
42
43     public byte getType() {
44         return Entry.TypeTransaction;
45     }
46
47     public int getSize() {
48         int size = 2 * Long.BYTES + Byte.BYTES; // seq, machine id, entry type
49         size += Integer.BYTES; // number of KV's
50
51         // Size of each KV
52         for (KeyValue kv : keyValueUpdateSet) {
53             size += kv.getSize();
54         }
55
56         // Size of the guard
57         size += guard.getSize();
58
59         return size;
60     }
61
62
63     public void encode(ByteBuffer bb) {
64         bb.put(Entry.TypeTransaction);
65         bb.putLong(seqnum);
66         bb.putLong(machineid);
67
68         bb.putInt(keyValueUpdateSet.size());
69         for (KeyValue kv : keyValueUpdateSet) {
70             kv.encode(bb);
71         }
72
73         guard.encode(bb);
74     }
75
76     static Entry decode(Slot slot, ByteBuffer bb) {
77         long seqnum = bb.getLong();
78         long machineid = bb.getLong();
79         int numberOfKeys = bb.getInt();
80
81         Set<KeyValue> kvSet = new HashSet<KeyValue>();
82         for (int i = 0; i < numberOfKeys; i++) {
83             KeyValue kv = KeyValue.decode(bb);
84             kvSet.add(kv);
85         }
86
87         Guard guard = Guard.decode(bb);
88
89         return new Transaction(slot, seqnum, machineid, kvSet, guard);
90     }
91
92     public Entry getCopy(Slot s) {
93         return new Transaction(s, seqnum, machineid, keyValueUpdateSet, guard);
94     }
95 }