package org.kairosdb.core.datastore;
import com.google.inject.Binding;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import org.kairosdb.core.annotation.PluginName;
import java.util.HashMap;
import java.util.Map;
/**
Created by bhawkins on 11/23/14.
*/
public class GuiceQueryPluginFactory implements QueryPluginFactory
{
private Map<String, Class<QueryPlugin>> m_plugins = new HashMap<String, Class<QueryPlugin>>();
private final Injector m_injector;
@Inject
@SuppressWarnings("unchecked")
public GuiceQueryPluginFactory(Injector injector)
{
m_injector = injector;
Map<Key<?>, Binding<?>> bindings = injector.getAllBindings();
for (Key<?> key : bindings.keySet())
{
Class<?> bindingClass = key.getTypeLiteral().getRawType();
if (QueryPlugin.class.isAssignableFrom(bindingClass))
{
PluginName ann = (PluginName) bindingClass.getAnnotation(PluginName.class);
if (ann == null)
throw new IllegalStateException("Aggregator class " + bindingClass.getName() +
" does not have required annotation " + PluginName.class.getName());
m_plugins.put(ann.name(), (Class<QueryPlugin>)bindingClass);
}
}
}
@Override
public QueryPlugin createQueryPlugin(String name)
{
Class<QueryPlugin> pluginClass = m_plugins.get(name);
if (pluginClass == null)
return (null);
QueryPlugin plugin = m_injector.getInstance(pluginClass);
return (plugin);
}
}