Block Chain Transactions, Commits multiple parts version
[iotcloud.git] / version2 / backup / src / java / iotcloud / Commit.java
1 package iotcloud;
2
3 import java.nio.ByteBuffer;
4 import java.util.Set;
5 import java.util.HashSet;
6 import java.util.Iterator;
7
8 /**
9  * This Entry records the commit of a transaction.
10  * @author Ali Younis <ayounis@uci.edu>
11  * @version 1.0
12  */
13
14
15 class Commit extends Entry {
16         private long seqnumtrans;
17         private long seqnumcommit;
18         private long transarbitrator;
19
20         private Set<KeyValue> keyValueUpdateSet = null;
21
22
23         public Commit(Slot slot, long _seqnumtrans,  long _seqnumcommit, long _transarbitrator, Set<KeyValue> _keyValueUpdateSet) {
24                 super(slot);
25                 seqnumtrans = _seqnumtrans;
26                 seqnumcommit = _seqnumcommit;
27                 transarbitrator = _transarbitrator;
28
29                 keyValueUpdateSet = new HashSet<KeyValue>();
30
31                 for (KeyValue kv : _keyValueUpdateSet) {
32                         KeyValue kvCopy = kv.getCopy();
33                         keyValueUpdateSet.add(kvCopy);
34                 }
35         }
36
37         public long getTransSequenceNumber() {
38                 return seqnumtrans;
39         }
40         public long getSequenceNumber() {
41                 return seqnumcommit;
42         }
43
44         public long getTransArbitrator() {
45                 return transarbitrator;
46         }
47
48         public Set<KeyValue> getkeyValueUpdateSet() {
49                 return keyValueUpdateSet;
50         }
51
52         public byte getType() {
53                 return Entry.TypeCommit;
54         }
55
56         public int getSize() {
57                 int size = 3 * Long.BYTES + Byte.BYTES; // seq id, entry type
58                 size += Integer.BYTES; // number of KV's
59
60                 // Size of each KV
61                 for (KeyValue kv : keyValueUpdateSet) {
62                         size += kv.getSize();
63                 }
64
65                 return size;
66         }
67
68         static Entry decode(Slot slot, ByteBuffer bb) {
69                 long seqnumtrans = bb.getLong();
70                 long seqnumcommit = bb.getLong();
71                 long transarbitrator = bb.getLong();
72                 int numberOfKeys = bb.getInt();
73
74                 Set<KeyValue> kvSet = new HashSet<KeyValue>();
75                 for (int i = 0; i < numberOfKeys; i++) {
76                         KeyValue kv = KeyValue.decode(bb);
77                         kvSet.add(kv);
78                 }
79
80                 return new Commit(slot, seqnumtrans, seqnumcommit, transarbitrator, kvSet);
81         }
82
83         public void encode(ByteBuffer bb) {
84                 bb.put(Entry.TypeCommit);
85                 bb.putLong(seqnumtrans);
86                 bb.putLong(seqnumcommit);
87                 bb.putLong(transarbitrator);
88
89                 bb.putInt(keyValueUpdateSet.size());
90
91                 for (KeyValue kv : keyValueUpdateSet) {
92                         kv.encode(bb);
93                 }
94         }
95
96         public Entry getCopy(Slot s) {
97                 return new Commit(s, seqnumtrans, seqnumcommit, transarbitrator, keyValueUpdateSet);
98         }
99
100         public Set<KeyValue> updateLiveKeys(Set<KeyValue> kvSet) {
101
102                 if (!this.isLive())
103                         return new HashSet<KeyValue>();
104
105                 Set<KeyValue> toDelete = new HashSet<KeyValue>();
106
107                 for (KeyValue kv1 : kvSet) {
108                         for (Iterator<KeyValue> i = keyValueUpdateSet.iterator(); i.hasNext();) {
109                                 KeyValue kv2 = i.next();
110
111                                 if (kv1.getKey().equals(kv2.getKey())) {
112                                         toDelete.add(kv2);
113                                         i.remove();
114                                         break;
115                                 }
116                         }
117                 }
118
119                 if (keyValueUpdateSet.size() == 0) {
120                         this.setDead();
121                 }
122
123                 return toDelete;
124         }
125 }