package org.distributeme.registry.metaregistry;
import org.distributeme.core.ServiceDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Implementation of the MetaRegistry.
* @author lrosenberg.
*
*/
public final class MetaRegistryImpl implements MetaRegistry{
/**
* Configured service bindings.
*/
private ConcurrentHashMap<String,ServiceDescriptor> bindings;
/**
* Registry listeners.
*/
private List<MetaRegistryListener> listeners;
/**
* Logger.
*/
private static Logger log = LoggerFactory.getLogger(MetaRegistryImpl.class);
/**
* Constructor.
*/
private MetaRegistryImpl() {
reset();
}
public static MetaRegistry getInstance() {
return MetaRegistryImplHolder.registry;
}
@Override
public boolean bind(ServiceDescriptor service) {
bindings.put(service.getGlobalServiceId(), service);
for (MetaRegistryListener listener : listeners){
try{
listener.onBind(service);
}catch(Exception any){
log.warn("Exception in listener on unbind, cught.", any);
}
}
return true;
}
@Override
public ServiceDescriptor resolve(String serviceId) {
return bindings.get(serviceId);
}
@Override
public boolean unbind(ServiceDescriptor service) {
boolean ret = bindings.remove(service.getGlobalServiceId())!=null;
if (ret){
for (MetaRegistryListener listener : listeners){
try{
listener.onUnbind(service);
}catch(Exception any){
log.warn("Exception in listener on unbind, cught.", any);
}
}
}
return ret;
}
@Override
public void remoteUnbind(ServiceDescriptor service) {
bindings.remove(service.getGlobalServiceId());
}
@Override
public void remoteBind(ServiceDescriptor service) {
bindings.put(service.getGlobalServiceId(), service);
}
@Override public List<ServiceDescriptor> list(){
ArrayList<ServiceDescriptor> ret = new ArrayList<ServiceDescriptor>();
ret.addAll(bindings.values());
return ret;
}
private static class MetaRegistryImplHolder {
/**
* Singleton instance.
*/
private static MetaRegistry registry = new MetaRegistryImpl();
}
@Override
public void addListener(MetaRegistryListener listener) {
listeners.add(listener);
}
@Override
public void removeListener(MetaRegistryListener listener) {
listeners.remove(listener);
}
void reset(){
bindings = new ConcurrentHashMap<String, ServiceDescriptor>();
listeners = new CopyOnWriteArrayList<MetaRegistryListener>();
}
}