package com.ctrip.framework.foundation.internals;
import java.util.LinkedHashMap;
import java.util.Map;
import com.ctrip.framework.foundation.internals.provider.DefaultApplicationProvider;
import com.ctrip.framework.foundation.internals.provider.DefaultNetworkProvider;
import com.ctrip.framework.foundation.internals.provider.DefaultServerProvider;
import com.ctrip.framework.foundation.spi.ProviderManager;
import com.ctrip.framework.foundation.spi.provider.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DefaultProviderManager implements ProviderManager {
private static final Logger logger = LoggerFactory.getLogger(DefaultProviderManager.class);
private Map<Class<? extends Provider>, Provider> m_providers =
new LinkedHashMap<Class<? extends Provider>, Provider>();
public DefaultProviderManager() {
// Load per-application configuration, like app id, from classpath://META-INF/app.properties
Provider applicationProvider = new DefaultApplicationProvider();
applicationProvider.initialize();
register(applicationProvider);
// Load network parameters
Provider networkProvider = new DefaultNetworkProvider();
networkProvider.initialize();
register(networkProvider);
// Load environment (fat, fws, uat, prod ...) and dc, from /opt/settings/server.properties, JVM property and/or OS
// environment variables.
Provider serverProvider = new DefaultServerProvider();
serverProvider.initialize();
register(serverProvider);
}
public synchronized void register(Provider provider) {
m_providers.put(provider.getType(), provider);
}
@Override
@SuppressWarnings("unchecked")
public <T extends Provider> T provider(Class<T> clazz) {
Provider provider = m_providers.get(clazz);
if (provider != null) {
return (T) provider;
} else {
logger.error("No provider [{}] found in DefaultProviderManager, please make sure it is registered in DefaultProviderManager ",
clazz.getName());
return (T) NullProviderManager.provider;
}
}
@Override
public String getProperty(String name, String defaultValue) {
for (Provider provider : m_providers.values()) {
String value = provider.getProperty(name, null);
if (value != null) {
return value;
}
}
return defaultValue;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(512);
if (null != m_providers) {
for (Map.Entry<Class<? extends Provider>, Provider> entry : m_providers.entrySet()) {
sb.append(entry.getValue()).append("\n");
}
}
sb.append("(DefaultProviderManager)").append("\n");
return sb.toString();
}
}