Block Chain Transactions, Commits multiple parts version
[iotcloud.git] / version2 / backup / src / java / iotcloud / Commit.java
diff --git a/version2/backup/src/java/iotcloud/Commit.java b/version2/backup/src/java/iotcloud/Commit.java
new file mode 100644 (file)
index 0000000..fb52e67
--- /dev/null
@@ -0,0 +1,125 @@
+package iotcloud;
+
+import java.nio.ByteBuffer;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
+
+/**
+ * This Entry records the commit of a transaction.
+ * @author Ali Younis <ayounis@uci.edu>
+ * @version 1.0
+ */
+
+
+class Commit extends Entry {
+       private long seqnumtrans;
+       private long seqnumcommit;
+       private long transarbitrator;
+
+       private Set<KeyValue> keyValueUpdateSet = null;
+
+
+       public Commit(Slot slot, long _seqnumtrans,  long _seqnumcommit, long _transarbitrator, Set<KeyValue> _keyValueUpdateSet) {
+               super(slot);
+               seqnumtrans = _seqnumtrans;
+               seqnumcommit = _seqnumcommit;
+               transarbitrator = _transarbitrator;
+
+               keyValueUpdateSet = new HashSet<KeyValue>();
+
+               for (KeyValue kv : _keyValueUpdateSet) {
+                       KeyValue kvCopy = kv.getCopy();
+                       keyValueUpdateSet.add(kvCopy);
+               }
+       }
+
+       public long getTransSequenceNumber() {
+               return seqnumtrans;
+       }
+       public long getSequenceNumber() {
+               return seqnumcommit;
+       }
+
+       public long getTransArbitrator() {
+               return transarbitrator;
+       }
+
+       public Set<KeyValue> getkeyValueUpdateSet() {
+               return keyValueUpdateSet;
+       }
+
+       public byte getType() {
+               return Entry.TypeCommit;
+       }
+
+       public int getSize() {
+               int size = 3 * Long.BYTES + Byte.BYTES; // seq id, entry type
+               size += Integer.BYTES; // number of KV's
+
+               // Size of each KV
+               for (KeyValue kv : keyValueUpdateSet) {
+                       size += kv.getSize();
+               }
+
+               return size;
+       }
+
+       static Entry decode(Slot slot, ByteBuffer bb) {
+               long seqnumtrans = bb.getLong();
+               long seqnumcommit = bb.getLong();
+               long transarbitrator = bb.getLong();
+               int numberOfKeys = bb.getInt();
+
+               Set<KeyValue> kvSet = new HashSet<KeyValue>();
+               for (int i = 0; i < numberOfKeys; i++) {
+                       KeyValue kv = KeyValue.decode(bb);
+                       kvSet.add(kv);
+               }
+
+               return new Commit(slot, seqnumtrans, seqnumcommit, transarbitrator, kvSet);
+       }
+
+       public void encode(ByteBuffer bb) {
+               bb.put(Entry.TypeCommit);
+               bb.putLong(seqnumtrans);
+               bb.putLong(seqnumcommit);
+               bb.putLong(transarbitrator);
+
+               bb.putInt(keyValueUpdateSet.size());
+
+               for (KeyValue kv : keyValueUpdateSet) {
+                       kv.encode(bb);
+               }
+       }
+
+       public Entry getCopy(Slot s) {
+               return new Commit(s, seqnumtrans, seqnumcommit, transarbitrator, keyValueUpdateSet);
+       }
+
+       public Set<KeyValue> updateLiveKeys(Set<KeyValue> kvSet) {
+
+               if (!this.isLive())
+                       return new HashSet<KeyValue>();
+
+               Set<KeyValue> toDelete = new HashSet<KeyValue>();
+
+               for (KeyValue kv1 : kvSet) {
+                       for (Iterator<KeyValue> i = keyValueUpdateSet.iterator(); i.hasNext();) {
+                               KeyValue kv2 = i.next();
+
+                               if (kv1.getKey().equals(kv2.getKey())) {
+                                       toDelete.add(kv2);
+                                       i.remove();
+                                       break;
+                               }
+                       }
+               }
+
+               if (keyValueUpdateSet.size() == 0) {
+                       this.setDead();
+               }
+
+               return toDelete;
+       }
+}
\ No newline at end of file