content: package com.ctrip.framework.apollo.spi;
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  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.internals.ConfigRepository;
  import com.ctrip.framework.apollo.internals.DefaultConfig;
  import com.ctrip.framework.apollo.internals.JsonConfigFile;
  import com.ctrip.framework.apollo.internals.LocalFileConfigRepository;
  import com.ctrip.framework.apollo.internals.PropertiesConfigFile;
  import com.ctrip.framework.apollo.internals.RemoteConfigRepository;
  import com.ctrip.framework.apollo.internals.XmlConfigFile;
  import com.ctrip.framework.apollo.internals.YamlConfigFile;
  import com.ctrip.framework.apollo.internals.YmlConfigFile;
  import com.ctrip.framework.apollo.util.ConfigUtil;
  
  /**
   * @author Jason Song(song_s@ctrip.com)
   */
  public class DefaultConfigFactory implements ConfigFactory {
    private static final Logger logger = LoggerFactory.getLogger(DefaultConfigFactory.class);
    private ConfigUtil m_configUtil;
  
    public DefaultConfigFactory() {
      m_configUtil = ApolloInjector.getInstance(ConfigUtil.class);
    }
  
    @Override
    public Config create(String namespace) {
      DefaultConfig defaultConfig =
          new DefaultConfig(namespace, createLocalConfigRepository(namespace));
      return defaultConfig;
    }
  
    @Override
    public ConfigFile createConfigFile(String namespace, ConfigFileFormat configFileFormat) {
      ConfigRepository configRepository = createLocalConfigRepository(namespace);
      switch (configFileFormat) {
        case Properties:
          return new PropertiesConfigFile(namespace, configRepository);
        case XML:
          return new XmlConfigFile(namespace, configRepository);
        case JSON:
          return new JsonConfigFile(namespace, configRepository);
        case YAML:
          return new YamlConfigFile(namespace, configRepository);
        case YML:
          return new YmlConfigFile(namespace, configRepository);
      }
  
      return null;
    }
  
    LocalFileConfigRepository createLocalConfigRepository(String namespace) {
      if (m_configUtil.isInLocalMode()) {
        logger.warn(
            "==== Apollo is in local mode! Won't pull configs from remote server for namespace {} ! ====",
            namespace);
        return new LocalFileConfigRepository(namespace);
      }
      return new LocalFileConfigRepository(namespace, createRemoteConfigRepository(namespace));
    }
  
    RemoteConfigRepository createRemoteConfigRepository(String namespace) {
      return new RemoteConfigRepository(namespace);
    }
  }
  