Commit fba39307 authored by Jason Song's avatar Jason Song

a little refactoring for pr #2867

parent f9b2aa6b
......@@ -34,7 +34,7 @@ public class PortalMetaDomainConsts {
private static final Map<Env, String> metaServerAddressCache = Maps.newConcurrentMap();
// initialize meta server provider without cache
private static final PortalMetaServerProvider metaServerProvider = new PortalMetaServerProvider();
private static final PortalMetaServerProvider metaServerProvider = PortalMetaServerProvider.getInstance();
private static final long REFRESH_INTERVAL_IN_SECOND = 60;// 1 min
private static final Logger logger = LoggerFactory.getLogger(PortalMetaDomainConsts.class);
......
......@@ -30,17 +30,27 @@ public class PortalMetaServerProvider {
*/
private static final String APOLLO_ENV_PROPERTIES_FILE_PATH = "apollo-env.properties";
// thread safe
private static volatile Map<Env, String> domains = initializeDomains();
private static final PortalMetaServerProvider instance = new PortalMetaServerProvider();
public PortalMetaServerProvider() {
private Map<Env, String> domains;
private PortalMetaServerProvider() {
domains = initializeDomains();
}
public static PortalMetaServerProvider getInstance() {
return instance;
}
String getMetaServerAddress(Env targetEnv) {
String metaServerAddress = domains.get(targetEnv);
return metaServerAddress == null ? null : metaServerAddress.trim();
}
/**
* load all environment's meta address dynamically when this class loaded by JVM
*/
private static Map<Env, String> initializeDomains() {
private Map<Env, String> initializeDomains() {
// find key-value from System Property which key ends with "_meta" (case insensitive)
Map<String, String> metaServerAddressesFromSystemProperty = KeyValueUtils.filterWithKeyIgnoreCaseEndsWith(System.getProperties(), "_meta");
// remove key's suffix "_meta" (case insensitive)
......@@ -77,55 +87,23 @@ public class PortalMetaServerProvider {
}
// log all
logger.info("All environment's meta server address: {}", map);
logger.info("Loaded meta server addresses: {}", map);
return map;
}
/**
* reload all
* environments and meta server addresses
*/
public static void reloadAll() {
domains = initializeDomains();
}
public static String getMetaServerAddress(Env targetEnv) {
String metaServerAddress = domains.get(targetEnv);
return metaServerAddress == null ? null : metaServerAddress.trim();
}
/**
* add a environment's meta server address
* for the feature: add self-define environment in the web ui
* @param env
* @param metaServerAddress
*/
public static void addMetaServerAddress(Env env, String metaServerAddress) {
void mockMetaServerAddress(Env env, String metaServerAddress) {
domains.put(env, metaServerAddress);
}
/**
* delete the meta server address of the environment
* @param env
* only for test
* reload all environments and meta server addresses
*/
public static void deleteMetaServerAddress(Env env) {
domains.remove(env);
}
/**
* update the meta server address of the environment
* @param env
* @param metaServerAddress
*/
public static void updateMetaServerAddress(Env env, String metaServerAddress) {
domains.put(env, metaServerAddress);
}
/**
* clear all environments and meta server addresses saved
*/
public static void clear() {
domains.clear();
void reset() {
domains = initializeDomains();
}
}
......@@ -14,14 +14,14 @@ public class PortalMetaDomainConstsTest extends BaseIntegrationTest {
@After
public void tearDown() throws Exception {
super.tearDown();
MockMetaServerProvider.clear();
clear();
}
@Test
public void testGetMetaDomain() {
// local
String localMetaServerAddress = "http://localhost:8080";
PortalMetaServerProvider.updateMetaServerAddress(Env.LOCAL, localMetaServerAddress);
mockMetaServerAddress(Env.LOCAL, localMetaServerAddress);
assertEquals(localMetaServerAddress, PortalMetaDomainConsts.getDomain(Env.LOCAL));
// add this environment without meta server address
......@@ -38,8 +38,8 @@ public class PortalMetaDomainConstsTest extends BaseIntegrationTest {
String validServer = " http://localhost:" + PORT + " ";
String invalidServer = "http://localhost:" + findFreePort();
MockMetaServerProvider.mock(Env.FAT, validServer + "," + invalidServer);
MockMetaServerProvider.mock(Env.UAT, invalidServer + "," + validServer);
mockMetaServerAddress(Env.FAT, validServer + "," + invalidServer);
mockMetaServerAddress(Env.UAT, invalidServer + "," + validServer);
assertEquals(validServer.trim(), PortalMetaDomainConsts.getDomain(Env.FAT));
assertEquals(validServer.trim(), PortalMetaDomainConsts.getDomain(Env.UAT));
......@@ -50,21 +50,18 @@ public class PortalMetaDomainConstsTest extends BaseIntegrationTest {
String invalidServer = "http://localhost:" + findFreePort() + " ";
String anotherInvalidServer = "http://localhost:" + findFreePort() + " ";
MockMetaServerProvider.mock(Env.LPT, invalidServer + "," + anotherInvalidServer);
mockMetaServerAddress(Env.LPT, invalidServer + "," + anotherInvalidServer);
String metaServer = PortalMetaDomainConsts.getDomain(Env.LPT);
assertTrue(metaServer.equals(invalidServer.trim()) || metaServer.equals(anotherInvalidServer.trim()));
}
public static class MockMetaServerProvider {
private static void mock(Env env, String metaServerAddress) {
PortalMetaServerProvider.addMetaServerAddress(env, metaServerAddress);
}
private void mockMetaServerAddress(Env env, String metaServerAddress) {
PortalMetaServerProvider.getInstance().mockMetaServerAddress(env, metaServerAddress);
}
private static void clear() {
PortalMetaServerProvider.clear();
}
private void clear() {
PortalMetaServerProvider.getInstance().reset();
}
}
\ No newline at end of file
......@@ -8,55 +8,51 @@ import static org.junit.Assert.assertEquals;
public class PortalMetaServerProviderTest {
/**
* may be the environments and meta server addresses
* have been clear, so we need to reload when start the every unit test
*/
@Before
public void reload() {
PortalMetaServerProvider.reloadAll();
}
@After
public void tearDown() throws Exception {
System.clearProperty("dev_meta");
}
@Test
public void testFromPropertyFile() {
assertEquals("http://localhost:8080", PortalMetaServerProvider.getMetaServerAddress(Env.LOCAL));
assertEquals("${dev_meta}", PortalMetaServerProvider.getMetaServerAddress(Env.DEV));
assertEquals("${pro_meta}", PortalMetaServerProvider.getMetaServerAddress(Env.PRO));
}
/**
* testing the environment dynamic added from system property
*/
@Test
public void testDynamicEnvironmentFromSystemProperty() {
String someDevMetaAddress = "someMetaAddress";
String someFatMetaAddress = "someFatMetaAddress";
System.setProperty("dev_meta", someDevMetaAddress);
System.setProperty("fat_meta", someFatMetaAddress);
// reload above added
PortalMetaServerProvider.reloadAll();
assertEquals(someDevMetaAddress, PortalMetaServerProvider.getMetaServerAddress(Env.DEV));
assertEquals(someFatMetaAddress, PortalMetaServerProvider.getMetaServerAddress(Env.FAT));
String randomAddress = "randomAddress";
String randomEnvironment = "randomEnvironment";
System.setProperty(randomEnvironment + "_meta", randomAddress);
// reload above added
PortalMetaServerProvider.reloadAll();
assertEquals(
randomAddress,
PortalMetaServerProvider.getMetaServerAddress(
Env.valueOf(randomEnvironment)
)
);
// clear the property
System.clearProperty(randomEnvironment + "_meta");
}
private PortalMetaServerProvider portalMetaServerProvider;
@Before
public void setUp() throws Exception {
portalMetaServerProvider = PortalMetaServerProvider.getInstance();
}
@After
public void tearDown() throws Exception {
System.clearProperty("dev_meta");
System.clearProperty("fat_meta");
PortalMetaServerProvider.getInstance().reset();
}
@Test
public void testFromPropertyFile() {
assertEquals("http://localhost:8080", portalMetaServerProvider.getMetaServerAddress(Env.LOCAL));
assertEquals("${dev_meta}", portalMetaServerProvider.getMetaServerAddress(Env.DEV));
assertEquals("${pro_meta}", portalMetaServerProvider.getMetaServerAddress(Env.PRO));
}
/**
* testing the environment dynamic added from system property
*/
@Test
public void testDynamicEnvironmentFromSystemProperty() {
String someDevMetaAddress = "someMetaAddress";
String someFatMetaAddress = "someFatMetaAddress";
System.setProperty("dev_meta", someDevMetaAddress);
System.setProperty("fat_meta", someFatMetaAddress);
// reload above added
portalMetaServerProvider.reset();
assertEquals(someDevMetaAddress, portalMetaServerProvider.getMetaServerAddress(Env.DEV));
assertEquals(someFatMetaAddress, portalMetaServerProvider.getMetaServerAddress(Env.FAT));
String randomAddress = "randomAddress";
String randomEnvironment = "randomEnvironment";
System.setProperty(randomEnvironment + "_meta", randomAddress);
// reload above added
portalMetaServerProvider.reset();
assertEquals(randomAddress,
portalMetaServerProvider.getMetaServerAddress(Env.valueOf(randomEnvironment)));
// clear the property
System.clearProperty(randomEnvironment + "_meta");
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment