package com.ctrip.framework.foundation.internals.provider;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ctrip.framework.foundation.internals.Utils;
import com.ctrip.framework.foundation.internals.io.BOMInputStream;
import com.ctrip.framework.foundation.spi.provider.ApplicationProvider;
import com.ctrip.framework.foundation.spi.provider.Provider;
public class DefaultApplicationProvider implements ApplicationProvider {
private static final Logger logger = LoggerFactory.getLogger(DefaultApplicationProvider.class);
public static final String APP_PROPERTIES_CLASSPATH = "/META-INF/app.properties";
private Properties m_appProperties = new Properties();
private String m_appId;
@Override
public void initialize() {
try {
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(APP_PROPERTIES_CLASSPATH);
if (in == null) {
in = DefaultApplicationProvider.class.getResourceAsStream(APP_PROPERTIES_CLASSPATH);
}
if (in == null) {
logger.warn("{} not found from classpath!", APP_PROPERTIES_CLASSPATH);
}
initialize(in);
} catch (Throwable ex) {
logger.error("Initialize DefaultApplicationProvider failed.", ex);
}
}
@Override
public void initialize(InputStream in) {
try {
if (in != null) {
try {
m_appProperties.load(new InputStreamReader(new BOMInputStream(in), StandardCharsets.UTF_8));
} finally {
in.close();
}
}
initAppId();
} catch (Throwable ex) {
logger.error("Initialize DefaultApplicationProvider failed.", ex);
}
}
@Override
public String getAppId() {
return m_appId;
}
@Override
public boolean isAppIdSet() {
return !Utils.isBlank(m_appId);
}
@Override
public String getProperty(String name, String defaultValue) {
if ("app.id".equals(name)) {
String val = getAppId();
return val == null ? defaultValue : val;
} else {
String val = m_appProperties.getProperty(name, defaultValue);
return val == null ? defaultValue : val;
}
}
@Override
public Class<? extends Provider> getType() {
return ApplicationProvider.class;
}
private void initAppId() {
// 1. Get app.id from System Property
m_appId = System.getProperty("app.id");
if (!Utils.isBlank(m_appId)) {
m_appId = m_appId.trim();
logger.info("App ID is set to {} by app.id property from System Property", m_appId);
return;
}
// 2. Try to get app id from app.properties.
m_appId = m_appProperties.getProperty("app.id");
if (!Utils.isBlank(m_appId)) {
m_appId = m_appId.trim();
logger.info("App ID is set to {} by app.id property from {}", m_appId, APP_PROPERTIES_CLASSPATH);
return;
}
m_appId = null;
logger.warn("app.id is not available from System Property and {}. It is set to null", APP_PROPERTIES_CLASSPATH);
}
@Override
public String toString() {
return "appId [" + getAppId() + "] properties: " + m_appProperties + " (DefaultApplicationProvider)";
}
}