diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java index 4c9c06f43a2ca006743b044d56d5f7d4c49d6fb3..28b5fc6e4cbd14e784f5694d1d1d2549d908b959 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java @@ -1,5 +1,6 @@ package com.ctrip.framework.apollo.util; +import java.io.File; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; @@ -206,10 +207,27 @@ public class ConfigUtil { } public String getDefaultLocalCacheDir() { - String cacheRoot = isOSWindows() ? "C:\\opt\\data\\%s" : "/opt/data/%s"; + String cacheRoot = getCustomizedCacheRoot(); + + if (!Strings.isNullOrEmpty(cacheRoot)) { + return cacheRoot + File.separator + getAppId(); + } + + cacheRoot = isOSWindows() ? "C:\\opt\\data\\%s" : "/opt/data/%s"; return String.format(cacheRoot, getAppId()); } + private String getCustomizedCacheRoot() { + // 1. Get from System Property + String cacheRoot = System.getProperty("apollo.cacheDir"); + if (Strings.isNullOrEmpty(cacheRoot)) { + // 2. Get from server.properties + cacheRoot = Foundation.server().getProperty("apollo.cacheDir", null); + } + + return cacheRoot; + } + public boolean isInLocalMode() { try { Env env = getApolloEnv(); diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java index 5c569e413a751d6cece7989886eca0a947de8621..fc3c5e16869df46aa7281a313e153f67bb1720e6 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java @@ -2,10 +2,14 @@ package com.ctrip.framework.apollo.util; import com.ctrip.framework.apollo.core.ConfigConsts; +import java.io.File; import org.junit.After; import org.junit.Test; import static org.junit.Assert.*; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; /** * @author Jason Song(song_s@ctrip.com) @@ -22,6 +26,7 @@ public class ConfigUtilTest { System.clearProperty("apollo.configCacheSize"); System.clearProperty("apollo.longPollingInitialDelayInMills"); System.clearProperty("apollo.autoUpdateInjectedSpringProperties"); + System.clearProperty("apollo.cacheDir"); } @Test @@ -185,4 +190,35 @@ public class ConfigUtilTest { assertEquals(someAutoUpdateInjectedSpringProperties, configUtil.isAutoUpdateInjectedSpringPropertiesEnabled()); } + + @Test + public void testLocalCacheDirWithSystemProperty() throws Exception { + String someCacheDir = "someCacheDir"; + String someAppId = "someAppId"; + + System.setProperty("apollo.cacheDir", someCacheDir); + + ConfigUtil configUtil = spy(new ConfigUtil()); + + doReturn(someAppId).when(configUtil).getAppId(); + + assertEquals(someCacheDir + File.separator + someAppId, configUtil.getDefaultLocalCacheDir()); + } + + @Test + public void testDefaultLocalCacheDir() throws Exception { + String someAppId = "someAppId"; + + ConfigUtil configUtil = spy(new ConfigUtil()); + + doReturn(someAppId).when(configUtil).getAppId(); + + doReturn(true).when(configUtil).isOSWindows(); + + assertEquals("C:\\opt\\data\\" + someAppId, configUtil.getDefaultLocalCacheDir()); + + doReturn(false).when(configUtil).isOSWindows(); + + assertEquals("/opt/data/" + someAppId, configUtil.getDefaultLocalCacheDir()); + } }