IDEA-149864 Switch boot JDK on Windows shouldn't appear since unavailable
[idea/community.git] / platform / lang-impl / src / com / intellij / util / JdkBundle.java
index f39918fbdcccc97f094addb6e25bbcc1f7474722..2ac187193acc6279145d4ceb779a9743fffd3208 100644 (file)
@@ -27,17 +27,22 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
+import java.util.List;
 import java.util.regex.Pattern;
 
 public class JdkBundle {
   @NotNull private static final Logger LOG = Logger.getInstance("#com.intellij.util.JdkBundle");
 
+  @NotNull
   private static final Pattern[] VERSION_UPDATE_PATTERNS = {
     Pattern.compile("^java version \"([\\d]+\\.[\\d]+\\.[\\d]+)_([\\d]+)\".*", Pattern.MULTILINE),
     Pattern.compile("^openjdk version \"([\\d]+\\.[\\d]+\\.[\\d]+)_([\\d]+).*\".*", Pattern.MULTILINE),
     Pattern.compile("^[a-zA-Z() \"\\d]*([\\d]+\\.[\\d]+\\.?[\\d]*).*", Pattern.MULTILINE)
   };
 
+  @NotNull
+  private static final Pattern ARCH_64_BIT_PATTERN = Pattern.compile(".*64-Bit.*", Pattern.MULTILINE);
+
   @NotNull private File myBundleAsFile;
   @NotNull private String myBundleName;
   @Nullable private Pair<Version, Integer> myVersionUpdate;
@@ -76,14 +81,17 @@ public class JdkBundle {
     if (!SystemInfo.isMac && !isValidBundle) return null; // Skip jre
 
     File absJvmLocation = bundled ? new File(PathManager.getHomePath(), jvm.getPath()) : jvm;
-    Pair<String, Pair<Version, Integer>> nameVersionAndUpdate = getJDKNameVersionAndUpdate(absJvmLocation, homeSubPath);
+    Pair<Pair<String, Boolean>, Pair<Version, Integer>> nameArchVersionAndUpdate = getJDKNameArchVersionAndUpdate(absJvmLocation, homeSubPath);
+    if (nameArchVersionAndUpdate.first.second == null || (nameArchVersionAndUpdate.first.second != SystemInfo.is64Bit)) {
+      return null; // Skip unknown or incompatible arch
+    }
 
-    if (SystemInfo.isMac && nameVersionAndUpdate.second != null && nameVersionAndUpdate.second.first.isOrGreaterThan(1, 7) &&
+    if (SystemInfo.isMac && nameArchVersionAndUpdate.second != null && nameArchVersionAndUpdate.second.first.isOrGreaterThan(1, 7) &&
         !isValidBundle) {
       return null; // Skip jre
     }
 
-    return new JdkBundle(jvm, nameVersionAndUpdate.first, nameVersionAndUpdate.second, boot, bundled);
+    return new JdkBundle(jvm, nameArchVersionAndUpdate.first.first, nameArchVersionAndUpdate.second, boot, bundled);
   }
 
   @Nullable
@@ -154,23 +162,26 @@ public class JdkBundle {
     return myBundleName + ((myVersionUpdate != null) ? myVersionUpdate.first.toString() : "");
   }
 
-  private static Pair<String, Pair<Version, Integer>> getJDKNameVersionAndUpdate(File jvm, String homeSubPath) {
+  private static Pair<Pair<String, Boolean>, Pair<Version, Integer>> getJDKNameArchVersionAndUpdate(File jvm, String homeSubPath) {
     GeneralCommandLine commandLine = new GeneralCommandLine().withParentEnvironmentType(GeneralCommandLine.ParentEnvironmentType.NONE);
     commandLine.setExePath(new File(jvm,  homeSubPath + File.separator +  "jre" +
                            File.separator + "bin" + File.separator + "java").getAbsolutePath());
     commandLine.addParameter("-version");
 
-    String displayVersion = null;
+    String displayVersion;
+    Boolean is64Bit = null;
     Pair<Version, Integer> versionAndUpdate = null;
+    List<String> outputLines = null;
+
     try {
-      displayVersion = ExecUtil.readFirstLine(commandLine.createProcess().getErrorStream(), null);
+      outputLines = ExecUtil.execAndGetOutput(commandLine).getStderrLines();
     }
     catch (ExecutionException e) {
       // Checking for jdk 6 on mac
       if (SystemInfo.isMac) {
         commandLine.setExePath(new File(jvm,  homeSubPath + File.separator +  "bin" + File.separator + "java").getAbsolutePath());
         try {
-          displayVersion = ExecUtil.readFirstLine(commandLine.createProcess().getErrorStream(), null);
+          outputLines = ExecUtil.execAndGetOutput(commandLine).getStderrLines();
         }
         catch (ExecutionException e1) {
           LOG.debug(e);
@@ -179,15 +190,20 @@ public class JdkBundle {
       LOG.debug(e);
     }
 
-    if (displayVersion != null) {
-      versionAndUpdate = VersionUtil.parseVersionAndUpdate(displayVersion, VERSION_UPDATE_PATTERNS);
-      displayVersion = displayVersion.replaceFirst("\".*\"", "");
+    if (outputLines != null && outputLines.size() >= 1) {
+      String versionLine = outputLines.get(0);
+      versionAndUpdate = VersionUtil.parseVersionAndUpdate(versionLine, VERSION_UPDATE_PATTERNS);
+      displayVersion = versionLine.replaceFirst("\".*\"", "");
+      if (outputLines.size() >= 3) {
+        String archLine = outputLines.get(2);
+        is64Bit = ARCH_64_BIT_PATTERN.matcher(archLine).find();
+      }
     }
     else {
       displayVersion = jvm.getName();
     }
 
-    return Pair.create(displayVersion, versionAndUpdate);
+    return Pair.create(Pair.create(displayVersion, is64Bit), versionAndUpdate);
   }
 
   public boolean isBundled() {