package org.jboss.weld.contexts.beanstore;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
public class MapBeanStore extends AttributeBeanStore {
protected transient volatile LockStore lockStore;
private final Map<String, Object> delegate;
/*
* Indicates whether it is safe to iterate over the keys if the delegate without synchronizing on it.
* For example, it is safe for ConcurrentHashMap but is not for Collections.synchronizedMap()
*/
private final boolean safeIteration;
public MapBeanStore(NamingScheme namingScheme, Map<String, Object> delegate) {
this(namingScheme, delegate, false);
}
public MapBeanStore(NamingScheme namingScheme, Map<String, Object> delegate, boolean safeIteration) {
super(namingScheme, false);
this.delegate = delegate;
this.safeIteration = safeIteration;
}
@Override
protected Object getAttribute(String prefixedId) {
return delegate.get(prefixedId);
}
@Override
protected void removeAttribute(String prefixedId) {
delegate.remove(prefixedId);
}
@Override
protected Iterator<String> getAttributeNames() {
if (safeIteration) {
return new HashSet<String>(delegate.keySet()).iterator();
}
synchronized (delegate) {
return new HashSet<String>(delegate.keySet()).iterator();
}
}
@Override
protected void setAttribute(String prefixedId, Object instance) {
delegate.put(prefixedId, instance);
}
public LockStore getLockStore() {
LockStore lockStore = this.lockStore;
if(lockStore == null) {
synchronized (this) {
lockStore = this.lockStore;
if(lockStore == null) {
this.lockStore = lockStore = new LockStore();
}
}
}
return lockStore;
}
}