package org.squirrelframework.foundation.component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.google.common.base.Preconditions;
public class SquirrelSingletonProvider implements SquirrelComponent, SquirrelSingleton {
private static SquirrelSingletonProvider instance = new SquirrelSingletonProvider();
public static SquirrelSingletonProvider getInstance() {
return instance;
}
public static void setInstance(SquirrelSingletonProvider instance) {
SquirrelSingletonProvider.instance = instance;
}
private Map<String, Object> instanceRegistry = new ConcurrentHashMap<String, Object>();
public <T> void register(Class<T> componentClass, Object instance) {
Preconditions.checkArgument(componentClass.isAssignableFrom(instance.getClass()));
instanceRegistry.put(componentClass.getName(), instance);
}
public void unregister(Class<?> componentClass) {
instanceRegistry.remove(componentClass.getName());
}
public void clearRegistry() {
instanceRegistry.clear();
}
public <T> T get(Class<T> componentClass) {
Object instance = instanceRegistry.get(componentClass.getName());
if(instance==null) {
try {
instance = SquirrelProvider.getInstance().newInstance(componentClass);
} catch(Exception e) {
instance = null;
}
if(instance!=null) {
register(componentClass, instance);
}
}
return instance!=null ? componentClass.cast(instance) : null;
}
}