--- /dev/null
+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