[platform] environment util optimizations: single map on Windows; code duplication...
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Fri, 4 Sep 2015 10:21:48 +0000 (13:21 +0300)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Fri, 4 Sep 2015 10:21:48 +0000 (13:21 +0300)
platform/util/src/com/intellij/util/EnvironmentUtil.java
platform/util/testSrc/com/intellij/util/EnvironmentUtilTest.java

index e0a4be324acd95b75953358fb2283c198a9ddb1c..19e112645c18de2cc59b9f06747a577ed6196dee 100644 (file)
@@ -46,23 +46,17 @@ public class EnvironmentUtil {
   private static final Future<Map<String, String>> ourEnvGetter;
   static {
     if (SystemInfo.isMac && "unlocked".equals(System.getProperty("__idea.mac.env.lock")) && Registry.is("idea.fix.mac.env")) {
-      ExecutorService executor = Executors.newSingleThreadExecutor(ConcurrencyUtil.newNamedThreadFactory("get shell env"));
+      ExecutorService executor = Executors.newSingleThreadExecutor(ConcurrencyUtil.newNamedThreadFactory("Shell Env Loader"));
       ourEnvGetter = executor.submit(new Callable<Map<String, String>>() {
         @Override
         public Map<String, String> call() throws Exception {
-          try {
-            return getShellEnv();
-          }
-          catch (Throwable t) {
-            LOG.warn("can't get shell environment", t);
-            return System.getenv();
-          }
+          return getShellEnv();
         }
       });
       executor.shutdown();
     }
     else {
-      ourEnvGetter = new FixedFuture<Map<String, String>>(System.getenv());
+      ourEnvGetter = new FixedFuture<Map<String, String>>(getSystemEnv());
     }
   }
 
@@ -73,24 +67,21 @@ public class EnvironmentUtil {
       try {
         return ourEnvGetter.get();
       }
-      catch (Exception e) {
-        LOG.warn(e);
-        return System.getenv();
+      catch (Throwable t) {
+        LOG.warn("can't get shell environment", t);
+        return getSystemEnv();
       }
     }
   };
 
-  private static final NotNullLazyValue<Map<String, String>> ourEnvironmentOsSpecific = new AtomicNotNullLazyValue<Map<String, String>>() {
-    @NotNull
-    @Override
-    protected Map<String, String> compute() {
-      Map<String, String> env = ourEnvironment.getValue();
-      if (SystemInfo.isWindows) {
-        env = Collections.unmodifiableMap(new THashMap<String, String>(env, CaseInsensitiveStringHashingStrategy.INSTANCE));
-      }
-      return env;
+  private static Map<String, String> getSystemEnv() {
+    if (SystemInfo.isWindows) {
+      return Collections.unmodifiableMap(new THashMap<String, String>(System.getenv(), CaseInsensitiveStringHashingStrategy.INSTANCE));
     }
-  };
+    else {
+      return System.getenv();
+    }
+  }
 
   private EnvironmentUtil() { }
 
@@ -100,7 +91,8 @@ public class EnvironmentUtil {
 
   /**
    * Returns the process environment.
-   * On Mac OS X a shell (Terminal.app) environment is returned (unless disabled by a system property).
+   * On Mac OS X, a shell (Terminal.app) environment is returned (unless disabled by a system property).
+   * On Windows, the returned map is case-insensitive ({@code map.get("Path") == map.get("PATH")} holds).
    *
    * @return unmodifiable map of the process environment.
    */
@@ -110,16 +102,12 @@ public class EnvironmentUtil {
   }
 
   /**
-   * Returns value for the passed environment variable name.
-   * The passed environment variable name is handled in a case-sensitive or case-insensitive manner depending on OS.<p>
-   * For example, on Windows <code>getValue("Path")</code> will return the same result as <code>getValue("PATH")</code>.
-   *
-   * @param name environment variable name
-   * @return value of the environment variable or null if no such variable found
+   * Same as {@code getEnvironmentMap().get(name)}.
+   * Returns value for the passed environment variable name, or null if no such variable found.
    */
   @Nullable
   public static String getValue(@NotNull String name) {
-    return ourEnvironmentOsSpecific.getValue().get(name);
+    return getEnvironmentMap().get(name);
   }
 
   public static String[] getEnvironment() {
@@ -150,7 +138,7 @@ public class EnvironmentUtil {
       throw new Exception("bin:" + PathManager.getBinPath());
     }
 
-    File envFile = FileUtil.createTempFile("intellij-shell-env", null, false);
+    File envFile = FileUtil.createTempFile("intellij-shell-env.", ".tmp", false);
     try {
       String[] command = {shell, "-l", "-i", "-c", ("'" + reader.getAbsolutePath() + "' '" + envFile.getAbsolutePath() + "'")};
       LOG.info("loading shell env: " + StringUtil.join(command, " "));
index fc68077afa470c194634ad9c31145859bcacc45b..9728f9b70390a9d33ccaf04c5bbe01008da7a941 100644 (file)
@@ -29,7 +29,7 @@ import static org.junit.Assume.assumeTrue;
  */
 public class EnvironmentUtilTest {
   @Test(timeout = 30000)
-  public void map() throws Exception {
+  public void map() {
     assertNotNull(EnvironmentUtil.getEnvironmentMap());
   }