content: package com.ctrip.framework.foundation;
  
  import com.ctrip.framework.foundation.internals.NullProviderManager;
  import com.ctrip.framework.foundation.internals.ServiceBootstrap;
  import com.ctrip.framework.foundation.spi.ProviderManager;
  import com.ctrip.framework.foundation.spi.provider.ApplicationProvider;
  import com.ctrip.framework.foundation.spi.provider.NetworkProvider;
  import com.ctrip.framework.foundation.spi.provider.ServerProvider;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  public abstract class Foundation {
    private static final Logger logger = LoggerFactory.getLogger(Foundation.class);
    private static Object lock = new Object();
  
    private static volatile ProviderManager s_manager;
  
    // Encourage early initialization and fail early if it happens.
    static {
      getManager();
    }
  
    private static ProviderManager getManager() {
      try {
        if (s_manager == null) {
          // Double locking to make sure only one thread initializes ProviderManager.
          synchronized (lock) {
            if (s_manager == null) {
              s_manager = ServiceBootstrap.loadFirst(ProviderManager.class);
            }
          }
        }
  
        return s_manager;
      } catch (Throwable ex) {
        s_manager = new NullProviderManager();
        logger.error("Initialize ProviderManager failed.", ex);
        return s_manager;
      }
    }
  
    public static String getProperty(String name, String defaultValue) {
      try {
        return getManager().getProperty(name, defaultValue);
      } catch (Throwable ex) {
        logger.error("getProperty for {} failed.", name, ex);
        return defaultValue;
      }
    }
  
    public static NetworkProvider net() {
      try {
        return getManager().provider(NetworkProvider.class);
      } catch (Exception ex) {
        logger.error("Initialize NetworkProvider failed.", ex);
        return NullProviderManager.provider;
      }
    }
  
    public static ServerProvider server() {
      try {
        return getManager().provider(ServerProvider.class);
      } catch (Exception ex) {
        logger.error("Initialize ServerProvider failed.", ex);
        return NullProviderManager.provider;
      }
    }
  
    public static ApplicationProvider app() {
      try {
        return getManager().provider(ApplicationProvider.class);
      } catch (Exception ex) {
        logger.error("Initialize ApplicationProvider failed.", ex);
        return NullProviderManager.provider;
      }
    }
  }
  