package org.async.rmi.modules;
import org.async.rmi.server.ObjectRef;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
/**
* Created by Barak Bar Orion
* 28/10/14.
*/
public class ObjectRepository {
@SuppressWarnings("UnusedDeclaration")
private static final Logger logger = LoggerFactory.getLogger(ObjectRepository.class);
private AtomicLong nextObjectId = new AtomicLong(0);
private ConcurrentHashMap<Long, ObjectRef> map = new ConcurrentHashMap<>();
public synchronized long add(ObjectRef ref, long objectId){
if(objectId < 0) {
if(map.get(objectId) == null){
map.put(objectId, ref);
return objectId;
}else{
logger.error("{} Overriding existing object {}", ref, map.get(objectId));
map.put(objectId, ref);
return objectId;
}
}
for (Map.Entry<Long, ObjectRef> entry : map.entrySet()) {
if(entry.getValue().equals(ref)){
return entry.getKey();
}
}
objectId = nextObjectId.getAndDecrement();
map.put(objectId, ref);
return objectId;
}
public ObjectRef get(long objectId){
return map.get(objectId);
}
public synchronized ObjectRef remove(long objectId){
return map.remove(objectId);
}
}