content: package com.ctrip.framework.apollo.portal.component.config;
  
  
  import com.google.common.base.Strings;
  import com.google.common.collect.Lists;
  import com.google.common.collect.Sets;
  import com.google.gson.Gson;
  import com.google.gson.reflect.TypeToken;
  
  import com.ctrip.framework.apollo.common.config.RefreshableConfig;
  import com.ctrip.framework.apollo.common.config.RefreshablePropertySource;
  import com.ctrip.framework.apollo.core.enums.Env;
  import com.ctrip.framework.apollo.portal.entity.vo.Organization;
  import com.ctrip.framework.apollo.portal.service.PortalDBPropertySource;
  
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Component;
  
  import java.lang.reflect.Type;
  import java.util.Collections;
  import java.util.List;
  import java.util.Objects;
  import java.util.Set;
  
  @Component
  public class PortalConfig extends RefreshableConfig {
  
    private Gson gson = new Gson();
    private static final Type ORGANIZATION = new TypeToken<List<Organization>>() {
    }.getType();
  
    @Autowired
    private PortalDBPropertySource portalDBPropertySource;
  
    @Override
    public List<RefreshablePropertySource> getRefreshablePropertySources() {
      return Collections.singletonList(portalDBPropertySource);
    }
  
    /***
     * Level: important
     **/
    public List<Env> portalSupportedEnvs() {
      String[] configurations = getArrayProperty("apollo.portal.envs", new String[]{"FAT", "UAT", "PRO"});
      List<Env> envs = Lists.newLinkedList();
  
      for (String env : configurations) {
        envs.add(Env.fromString(env));
      }
  
      return envs;
    }
  
    public List<String> superAdmins() {
      String superAdminConfig = getValue("superAdmin", "");
      if (Strings.isNullOrEmpty(superAdminConfig)) {
        return Collections.emptyList();
      }
      return splitter.splitToList(superAdminConfig);
    }
  
    public Set<Env> emailSupportedEnvs() {
      String[] configurations = getArrayProperty("email.supported.envs", null);
  
      Set<Env> result = Sets.newHashSet();
      if (configurations == null || configurations.length == 0) {
        return result;
      }
  
      for (String env : configurations) {
        result.add(Env.fromString(env));
      }
  
      return result;
    }
  
    /***
     * Level: normal
     **/
    public int connectTimeout() {
      return getIntProperty("api.connectTimeout", 3000);
    }
  
    public int readTimeout() {
      return getIntProperty("api.readTimeout", 10000);
    }
  
    public List<Organization> organizations() {
  
      String organizations = getValue("organizations");
      return organizations == null ? Collections.emptyList() : gson.fromJson(organizations, ORGANIZATION);
    }
  
    public String portalAddress() {
      return getValue("apollo.portal.address");
    }
  
    public boolean isEmergencyPublishAllowed(Env env) {
      String targetEnv = env.name();
  
      String[] emergencyPublishSupportedEnvs = getArrayProperty("emergencyPublish.supported.envs", new String[0]);
  
      for (String supportedEnv : emergencyPublishSupportedEnvs) {
        if (Objects.equals(targetEnv, supportedEnv.toUpperCase().trim())) {
          return true;
        }
      }
  
      return false;
    }
  
    /***
     * Level: low
     **/
    public Set<Env> publishTipsSupportedEnvs() {
      String[] configurations = getArrayProperty("namespace.publish.tips.supported.envs", null);
  
      Set<Env> result = Sets.newHashSet();
      if (configurations == null || configurations.length == 0) {
        return result;
      }
  
      for (String env : configurations) {
        result.add(Env.fromString(env));
      }
  
      return result;
    }
  
    public String consumerTokenSalt() {
      return getValue("consumer.token.salt", "apollo-portal");
    }
  
    public String emailSender() {
      return getValue("email.sender");
    }
  
    public String emailTemplateFramework() {
      return getValue("email.template.framework", "");
    }
  
    public String emailReleaseDiffModuleTemplate() {
      return getValue("email.template.release.module.diff", "");
    }
  
    public String emailRollbackDiffModuleTemplate() {
      return getValue("email.template.rollback.module.diff", "");
    }
  
    public String emailGrayRulesModuleTemplate() {
      return getValue("email.template.release.module.rules", "");
    }
  
    public String wikiAddress() {
      return getValue("wiki.address", "https://github.com/ctripcorp/apollo/wiki");
    }
  
    public boolean canAppAdminCreatePrivateNamespace() {
      return getBooleanProperty("admin.createPrivateNamespace.switch", true);
    }
  
    /***
     * The following configurations are used in ctrip profile
     **/
  
    public int appId() {
      return getIntProperty("ctrip.appid", 0);
    }
  
    //send code & template id. apply from ewatch
    public String sendCode() {
      return getValue("ctrip.email.send.code");
    }
  
    public int templateId() {
      return getIntProperty("ctrip.email.template.id", 0);
    }
  
    //email retention time in email server queue.TimeUnit: hour
    public int survivalDuration() {
      return getIntProperty("ctrip.email.survival.duration", 5);
    }
  
    public boolean isSendEmailAsync() {
      return getBooleanProperty("email.send.async", true);
    }
  
    public String portalServerName() {
      return getValue("serverName");
    }
  
    public String casServerLoginUrl() {
      return getValue("casServerLoginUrl");
    }
  
    public String casServerUrlPrefix() {
      return getValue("casServerUrlPrefix");
    }
  
    public String credisServiceUrl() {
      return getValue("credisServiceUrl");
    }
  
    public String userServiceUrl() {
      return getValue("userService.url");
    }
  
    public String userServiceAccessToken() {
      return getValue("userService.accessToken");
    }
  
    public String soaServerAddress() {
      return getValue("soa.server.address");
    }
  
    public String cloggingUrl() {
      return getValue("clogging.server.url");
    }
  
    public String cloggingPort() {
      return getValue("clogging.server.port");
    }
  
    public String hermesServerAddress() {
      return getValue("hermes.server.address");
    }
  
  }
  