package alien4cloud.plugin;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import com.google.common.collect.Maps;
import alien4cloud.plugin.exception.MissingPluginException;
/**
* Utility abstract implementation of an {@link IPluginLinker}.
*
* @param <T> The type of element that the plugin linker supports.
*/
public abstract class AbstractPluginLinker<T> implements IPluginLinker<T> {
private ConcurrentMap<String, Map<String, T>> instancesByPlugins = Maps.newConcurrentMap();
@Override
public void link(String pluginId, String instanceId, T instance) {
Map<String, T> pluginInstances = instancesByPlugins.get(pluginId);
if (pluginInstances == null) {
Map<String, T> map = Maps.newHashMap();
instancesByPlugins.putIfAbsent(pluginId, map);
pluginInstances = instancesByPlugins.get(pluginId);
}
pluginInstances.put(instanceId, instance);
}
@Override
public void unlink(String pluginId) {
instancesByPlugins.remove(pluginId);
}
/**
* Get the bean of a plugin based on it's id and plugin bean name
*
* @param pluginId The id of the plugin that should contains the bean.
* @param pluginBeanName The name of the bean to actually get.
* @return The bean.
*/
public T getPluginBean(String pluginId, String pluginBeanName) {
Map<String, T> pluginBeans = instancesByPlugins.get(pluginId);
if (pluginBeans == null) {
throw new MissingPluginException("The plugin <" + pluginId + "> cannot be found", false);
}
T pluginBean = pluginBeans.get(pluginBeanName);
if (pluginBean == null) {
throw new MissingPluginException("The bean <" + pluginBeanName + "> from plugin <" + pluginId + "> cannot be found", true);
}
return pluginBean;
}
/**
* Get the first bean found of a plugin based on it's id
*
* @param pluginId The id of the plugin that should contains the bean.
* @return The bean.
*/
public T getSinglePluginBean(String pluginId) {
Map<String, T> pluginBeans = instancesByPlugins.get(pluginId);
if (pluginBeans == null || pluginBeans.isEmpty()) {
throw new MissingPluginException("The plugin <" + pluginId + "> cannot be found", false);
}
return pluginBeans.values().iterator().next();
}
/**
* Get all the instances mapped by pluginId -> pluginBeanName -> instance.
*
* @return The map of instances by pluginId and pluginBeanName
*/
public Map<String, Map<String, T>> getInstancesByPlugins() {
return instancesByPlugins;
}
}