content: package com.ctrip.framework.apollo;
  
  import com.ctrip.framework.apollo.build.ApolloInjector;
  import com.ctrip.framework.apollo.core.ConfigConsts;
  import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
  import com.ctrip.framework.apollo.internals.ConfigManager;
  import com.ctrip.framework.apollo.spi.ConfigFactory;
  import com.ctrip.framework.apollo.spi.ConfigRegistry;
  
  /**
   * Entry point for client config use
   *
   * @author Jason Song(song_s@ctrip.com)
   */
  public class ConfigService {
    private static final ConfigService s_instance = new ConfigService();
  
    private volatile ConfigManager m_configManager;
    private volatile ConfigRegistry m_configRegistry;
  
    private ConfigManager getManager() {
      if (m_configManager == null) {
        synchronized (this) {
          if (m_configManager == null) {
            m_configManager = ApolloInjector.getInstance(ConfigManager.class);
          }
        }
      }
  
      return m_configManager;
    }
  
    private ConfigRegistry getRegistry() {
      if (m_configRegistry == null) {
        synchronized (this) {
          if (m_configRegistry == null) {
            m_configRegistry = ApolloInjector.getInstance(ConfigRegistry.class);
          }
        }
      }
  
      return m_configRegistry;
    }
  
    /**
     * Get Application's config instance.
     *
     * @return config instance
     */
    public static Config getAppConfig() {
      return getConfig(ConfigConsts.NAMESPACE_APPLICATION);
    }
  
    /**
     * Get the config instance for the namespace.
     *
     * @param namespace the namespace of the config
     * @return config instance
     */
    public static Config getConfig(String namespace) {
      return s_instance.getManager().getConfig(namespace);
    }
  
    public static ConfigFile getConfigFile(String namespace, ConfigFileFormat configFileFormat) {
      return s_instance.getManager().getConfigFile(namespace, configFileFormat);
    }
  
    static void setConfig(Config config) {
      setConfig(ConfigConsts.NAMESPACE_APPLICATION, config);
    }
  
    /**
     * Manually set the config for the namespace specified, use with caution.
     *
     * @param namespace the namespace
     * @param config    the config instance
     */
    static void setConfig(String namespace, final Config config) {
      s_instance.getRegistry().register(namespace, new ConfigFactory() {
        @Override
        public Config create(String namespace) {
          return config;
        }
  
        @Override
        public ConfigFile createConfigFile(String namespace, ConfigFileFormat configFileFormat) {
          return null;
        }
  
      });
    }
  
    static void setConfigFactory(ConfigFactory factory) {
      setConfigFactory(ConfigConsts.NAMESPACE_APPLICATION, factory);
    }
  
    /**
     * Manually set the config factory for the namespace specified, use with caution.
     *
     * @param namespace the namespace
     * @param factory   the factory instance
     */
    static void setConfigFactory(String namespace, ConfigFactory factory) {
      s_instance.getRegistry().register(namespace, factory);
    }
  
    // for test only
    static void reset() {
      synchronized (s_instance) {
        s_instance.m_configManager = null;
        s_instance.m_configRegistry = null;
      }
    }
  }
  