package com.quickserverlab.quickcached; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * * @author Akshath */ public class DataCarrier implements java.io.Serializable { private final ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock(); public final Lock readLock = rwlock.readLock(); public final Lock writeLock = rwlock.writeLock(); private byte data[]; private String flags; private int cas; public int getSize() { readLock.lock(); try { if(data==null) return 0; return data.length; } finally { readLock.unlock(); } } private void incCas() { cas = cas + 1;//no need of explicit locking.. private method } public void append(byte chunk[]) { writeLock.lock(); try { int newlen = data.length + chunk.length; byte data_new[] = new byte[newlen]; System.arraycopy(data, 0, data_new, 0, data.length); System.arraycopy(chunk, 0, data_new, data.length, chunk.length); data = data_new; data_new = null; incCas(); } finally { writeLock.unlock(); } } public void prepend(byte chunk[]) { writeLock.lock(); try { int newlen = data.length + chunk.length; byte data_new[] = new byte[newlen]; System.arraycopy(chunk, 0, data_new, 0, chunk.length); System.arraycopy(data, 0, data_new, chunk.length, data.length); data = data_new; data_new = null; incCas(); } finally { writeLock.unlock(); } } public String getFlags() { return flags; } public void setFlags(String flags) { this.flags = flags; } public DataCarrier(byte data[]) { setData(data); } public byte[] getData() { readLock.lock(); try { return data; } finally { readLock.unlock(); } } public void setData(byte[] data) { writeLock.lock(); try { this.data = data; incCas(); } finally { writeLock.unlock(); } } public int getCas() { return cas; } public void setCas(int cas) { this.cas = cas; } public boolean checkCas(String newcas) { if(newcas==null || "0000000000000000".equals(newcas)) return true; StringBuilder sb = new StringBuilder(); sb.append(cas); //0000 0000 0000 0001 while(sb.length()<16) { sb.insert(0, "0"); } return sb.toString().equals(newcas); } }