content: package com.ctrip.framework.apollo.internals;
  
  import java.util.Properties;
  import java.util.concurrent.atomic.AtomicReference;
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
  import com.ctrip.framework.apollo.core.utils.PropertiesUtil;
  import com.ctrip.framework.apollo.exceptions.ApolloConfigException;
  import com.ctrip.framework.apollo.tracer.Tracer;
  import com.ctrip.framework.apollo.util.ExceptionUtil;
  
  /**
   * @author Jason Song(song_s@ctrip.com)
   */
  public class PropertiesConfigFile extends AbstractConfigFile {
    private static final Logger logger = LoggerFactory.getLogger(PropertiesConfigFile.class);
    protected AtomicReference<String> m_contentCache;
  
    public PropertiesConfigFile(String namespace,
                                ConfigRepository configRepository) {
      super(namespace, configRepository);
      m_contentCache = new AtomicReference<>();
    }
  
    @Override
    protected void update(Properties newProperties) {
      m_configProperties.set(newProperties);
      m_contentCache.set(null);
    }
  
    @Override
    public String getContent() {
      if (m_contentCache.get() == null) {
        m_contentCache.set(doGetContent());
      }
      return m_contentCache.get();
    }
  
    String doGetContent() {
      if (!this.hasContent()) {
        return null;
      }
  
      try {
        return PropertiesUtil.toString(m_configProperties.get());
      } catch (Throwable ex) {
        ApolloConfigException exception =
            new ApolloConfigException(String
                .format("Parse properties file content failed for namespace: %s, cause: %s",
                    m_namespace, ExceptionUtil.getDetailMessage(ex)));
        Tracer.logError(exception);
        throw exception;
      }
    }
  
    @Override
    public boolean hasContent() {
      return m_configProperties.get() != null && !m_configProperties.get().isEmpty();
    }
  
    @Override
    public ConfigFileFormat getConfigFileFormat() {
      return ConfigFileFormat.Properties;
    }
  
  }
  