package org.dcm4che3.net.proxy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.TreeMap;
/**
* Service that retrieves the Service Provider Implementations of Proxy Manager.
*
* @author Amaury Pernette
*
*/
public class ProxyService {
public static final String DEFAULT_PROVIDER_NAME = BasicProxyManager.PROVIDER_NAME;
public static final String DEFAULT_VERSION = BasicProxyManager.VERSION;
// Initialize-on-Demand Holder Class Idiom
private static class SingletonHolder {
private static ProxyService service = new ProxyService();
}
private Map<String, Map<String, ProxyManager>> managersModel;
private ProxyService() {
this.managersModel = new HashMap<String, Map<String, ProxyManager>>();
final ServiceLoader<ProxyManager> loader = ServiceLoader.load(ProxyManager.class);
// Load managers in internal model
final Iterator<ProxyManager> managers = loader.iterator();
while (managers.hasNext()) {
final ProxyManager proxyManager = managers.next();
// Manager provider map
final String providerName = proxyManager.getProviderName();
if (!this.managersModel.containsKey(providerName)) {
this.managersModel.put(providerName, new TreeMap<String, ProxyManager>());
}
final Map<String, ProxyManager> providerManagers = this.managersModel.get(providerName);
// Manager version
final String version = proxyManager.getVersion();
providerManagers.put(version, proxyManager);
}
}
public static synchronized ProxyService getInstance() {
return SingletonHolder.service;
}
public ProxyManager getProxyManager(final String managerProviderName, final String managerVersion) {
if (managerProviderName != null && !managerProviderName.isEmpty()) {
// Get managers for this provider
final Map<String, ProxyManager> providerManagers = this.managersModel.get(managerProviderName);
if (providerManagers != null && !providerManagers.isEmpty()) {
ProxyManager manager = null;
if (managerVersion != null && !managerVersion.isEmpty()) {
// Get specific version
manager = providerManagers.get(managerVersion);
} else {
// If no specified version : get the last available
final List<String> versions = new ArrayList<String>(providerManagers.keySet());
Collections.reverse(versions);
manager = providerManagers.get(versions.get(0));
}
return manager;
}
}
return getDefaultProxyManager();
}
public ProxyManager getDefaultProxyManager() {
return getProxyManager(DEFAULT_PROVIDER_NAME, DEFAULT_VERSION);
}
public List<String> getAvailableProviders() {
return new ArrayList<String>(this.managersModel.keySet());
}
public List<String> getAvailableVersionsFor(final String provider) {
final List<String> versions = new ArrayList<String>();
if (this.managersModel.containsKey(provider)) {
versions.addAll(this.managersModel.get(provider).keySet());
}
return versions;
}
}