content: package com.ctrip.framework.apollo.internals;
  
  import java.util.Map;
  
  import com.ctrip.framework.apollo.Config;
  import com.ctrip.framework.apollo.ConfigFile;
  import com.ctrip.framework.apollo.build.ApolloInjector;
  import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
  import com.ctrip.framework.apollo.spi.ConfigFactory;
  import com.ctrip.framework.apollo.spi.ConfigFactoryManager;
  import com.google.common.collect.Maps;
  
  /**
   * @author Jason Song(song_s@ctrip.com)
   */
  public class DefaultConfigManager implements ConfigManager {
    private ConfigFactoryManager m_factoryManager;
  
    private Map<String, Config> m_configs = Maps.newConcurrentMap();
    private Map<String, ConfigFile> m_configFiles = Maps.newConcurrentMap();
  
    public DefaultConfigManager() {
      m_factoryManager = ApolloInjector.getInstance(ConfigFactoryManager.class);
    }
  
    @Override
    public Config getConfig(String namespace) {
      Config config = m_configs.get(namespace);
  
      if (config == null) {
        synchronized (this) {
          config = m_configs.get(namespace);
  
          if (config == null) {
            ConfigFactory factory = m_factoryManager.getFactory(namespace);
  
            config = factory.create(namespace);
            m_configs.put(namespace, config);
          }
        }
      }
  
      return config;
    }
  
    @Override
    public ConfigFile getConfigFile(String namespace, ConfigFileFormat configFileFormat) {
      String namespaceFileName = String.format("%s.%s", namespace, configFileFormat.getValue());
      ConfigFile configFile = m_configFiles.get(namespaceFileName);
  
      if (configFile == null) {
        synchronized (this) {
          configFile = m_configFiles.get(namespaceFileName);
  
          if (configFile == null) {
            ConfigFactory factory = m_factoryManager.getFactory(namespaceFileName);
  
            configFile = factory.createConfigFile(namespaceFileName, configFileFormat);
            m_configFiles.put(namespaceFileName, configFile);
          }
        }
      }
  
      return configFile;
    }
  }
  