package org.jboss.cache.lock;
import EDU.oswego.cs.dl.util.concurrent.SynchronizedRef;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class LockMap
{
public static final int OWNER_ANY = 0;
public static final int OWNER_READ = 1;
public static final int OWNER_WRITE = 2;
private SynchronizedRef writeOwner_;
private List readOwnerList_;
public LockMap()
{
writeOwner_ = new SynchronizedRef(null);
readOwnerList_ = Collections.synchronizedList(new ArrayList());
}
private LockMap(Object writer, List readers)
{
writeOwner_ = new SynchronizedRef(writer);
readOwnerList_ = Collections.synchronizedList(readers);
}
public LockMap copy()
{
return new LockMap(writeOwner_.get(), new ArrayList(readOwnerList_));
}
public synchronized boolean isOwner(Object owner, int ownership)
{
checkOwnerNull(owner);
boolean hasOwner = false;
switch (ownership) {
case OWNER_ANY:
if ((getWriteOwner() != null && getWriteOwner().equals(owner) ||
readOwnerList_.size() != 0 && readOwnerList_.contains(owner)))
hasOwner = true;
break;
case OWNER_READ:
if (readOwnerList_.size() != 0 && readOwnerList_.contains(owner))
hasOwner = true;
break;
case OWNER_WRITE:
if (getWriteOwner() != null && getWriteOwner().equals(owner)) hasOwner = true;
break;
default:
break;
}
return hasOwner;
}
private void checkOwnerNull(Object owner)
{
if (owner == null)
throw new IllegalArgumentException("Owner object is null");
}
public void addReader(Object owner)
{
checkOwnerNull(owner);
synchronized(readOwnerList_) {
if(!readOwnerList_.contains(owner))
readOwnerList_.add(owner);
}
}
public void addWriter(Object owner)
{
checkOwnerNull(owner);
synchronized(this) {
if(getWriteOwner() != null)
throw new IllegalStateException("addWriter(): owner already existed");
addWriteOwner(owner);
}
}
private void addWriteOwner(Object owner) {
writeOwner_.set(owner);
}
private Object getWriteOwner() {
return writeOwner_.get();
}
public boolean upgrade(Object owner) throws OwnerNotExistedException
{
checkOwnerNull(owner);
synchronized(this) {
if (!readOwnerList_.contains(owner))
throw new OwnerNotExistedException("Can't upgrade lock. Read lock owner not existed");
readOwnerList_.remove(owner);
addWriteOwner(owner);
}
return true;
}
public List readerOwners()
{
return readOwnerList_;
}
public Object writerOwner()
{
return getWriteOwner();
}
public boolean removeReader(Object owner)
{
checkOwnerNull(owner);
return readOwnerList_.remove(owner);
}
public Object removeWriter(Object owner)
{
checkOwnerNull(owner);
Object tmp;
synchronized(this) {
tmp = getWriteOwner();
addWriteOwner(null);
}
return tmp;
}
public void removeAll()
{
synchronized(this) {
addWriteOwner(null);
readOwnerList_.clear();
}
}
public String printInfo()
{
StringBuffer buf = new StringBuffer();
synchronized(this) {
buf.append("Read lock owners: ").append(readOwnerList_).append("\n");
buf.append("Write lock owner: ").append(getWriteOwner()).append("\n");
}
return buf.toString();
}
}