From 9d07fd69b41f2b2985e77515d82cfc3a0ba77c3e Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 23 Dec 2013 17:50:19 +0400 Subject: [PATCH] Introduced Bitness and JdkVersionInfo combining version and bitness --- .../jps/model/java/JdkVersionDetector.java | 29 +++++++++ .../java/impl/JdkVersionDetectorImpl.java | 61 ++++++++++++++++--- .../projectRoots/impl/SdkVersionUtil.java | 6 ++ .../com/intellij/openapi/util/Bitness.java | 6 ++ 4 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 platform/util-rt/src/com/intellij/openapi/util/Bitness.java diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JdkVersionDetector.java b/jps/model-api/src/org/jetbrains/jps/model/java/JdkVersionDetector.java index 2f5aaa6d4c19..9cca7dc6ea69 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JdkVersionDetector.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JdkVersionDetector.java @@ -15,6 +15,8 @@ */ package org.jetbrains.jps.model.java; +import com.intellij.openapi.util.Bitness; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.service.JpsServiceManager; @@ -34,6 +36,13 @@ public abstract class JdkVersionDetector { @Nullable public abstract String detectJdkVersion(String homePath, ActionRunner actionRunner); + @Nullable + public abstract JdkVersionInfo detectJdkVersionInfo(String homePath); + + @Nullable + public abstract JdkVersionInfo detectJdkVersionInfo(String homePath, ActionRunner actionRunner); + + @Deprecated @Nullable public abstract String readVersionFromProcessOutput(String homePath, String[] command, String versionLineMarker, ActionRunner actionRunner); @@ -42,4 +51,24 @@ public abstract class JdkVersionDetector { public interface ActionRunner { Future run(Runnable runnable); } + + public static final class JdkVersionInfo { + private final String myVersion; + private final Bitness myBitness; + + public JdkVersionInfo(@NotNull String version, @NotNull Bitness bitness) { + myVersion = version; + myBitness = bitness; + } + + @NotNull + public String getVersion() { + return myVersion; + } + + @NotNull + public Bitness getBitness() { + return myBitness; + } + } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JdkVersionDetectorImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JdkVersionDetectorImpl.java index fecb068d4efd..ef4ae25e6c5d 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JdkVersionDetectorImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JdkVersionDetectorImpl.java @@ -16,12 +16,14 @@ package org.jetbrains.jps.model.java.impl; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Bitness; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.java.JdkVersionDetector; import org.jetbrains.jps.service.SharedThreadPool; import java.io.*; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicReference; /** * @author nik @@ -43,20 +45,41 @@ public class JdkVersionDetectorImpl extends JdkVersionDetector { @Nullable public String detectJdkVersion(String homePath, final ActionRunner actionRunner) { + JdkVersionInfo info = detectJdkVersionInfo(homePath, actionRunner); + if (info != null) { + return info.getVersion(); + } + return null; + } + + @Override + public JdkVersionInfo detectJdkVersionInfo(String homePath) { + return detectJdkVersionInfo(homePath, ACTION_RUNNER); + } + + @Override + public JdkVersionInfo detectJdkVersionInfo(String homePath, ActionRunner actionRunner) { String[] command = {homePath + File.separator + "bin" + File.separator + "java", "-version"}; - return readVersionFromProcessOutput(homePath, command, "version", actionRunner); + return readVersionInfoFromProcessOutput(homePath, command, null, actionRunner); } public String readVersionFromProcessOutput(String homePath, String[] command, String versionLineMarker, - ActionRunner actionRunner) { + ActionRunner actionRunner) { + JdkVersionInfo info = readVersionInfoFromProcessOutput(homePath, command, versionLineMarker, actionRunner); + if (info != null) { + return info.getVersion(); + } + return null; + } + + private static JdkVersionInfo readVersionInfoFromProcessOutput(String homePath, String[] command, String versionLineMarker, ActionRunner actionRunner) { if (homePath == null || !new File(homePath).exists()) { return null; } - final String[] versionString = new String[1]; try { //noinspection HardCodedStringLiteral Process process = Runtime.getRuntime().exec(command); - VersionParsingThread parsingThread = new VersionParsingThread(process.getErrorStream(), versionString, versionLineMarker); + VersionParsingThread parsingThread = new VersionParsingThread(process.getErrorStream(), versionLineMarker); final Future parsingThreadFuture = actionRunner.run(parsingThread); ReadStreamThread readThread = new ReadStreamThread(process.getInputStream()); actionRunner.run(readThread); @@ -78,11 +101,15 @@ public class JdkVersionDetectorImpl extends JdkVersionDetector { LOG.info(e); } } + String version = parsingThread.getVersion(); + if (version != null) { + return new JdkVersionInfo(version, parsingThread.getBitness()); + } } catch (IOException ex) { LOG.info(ex); } - return versionString[0]; + return null; } public static class ReadStreamThread implements Runnable { @@ -109,13 +136,24 @@ public class JdkVersionDetectorImpl extends JdkVersionDetector { private Reader myReader; private final InputStream myStream; private boolean mySkipLF = false; - private final String[] myVersionString; private final String myVersionLineMarker; - protected VersionParsingThread(InputStream input, String[] versionString, String versionLineMarker) { + private final AtomicReference myVersionString = new AtomicReference(); + private final AtomicReference myBitness = new AtomicReference(Bitness.x32); + private static final String VERSION_LINE_MARKER = "version"; + private static final String BITNESS_64_MARKER = "64-Bit"; + + protected VersionParsingThread(InputStream input, String versionLineMarker) { myStream = input; - myVersionString = versionString; - myVersionLineMarker = versionLineMarker; + myVersionLineMarker = versionLineMarker != null ? versionLineMarker : VERSION_LINE_MARKER; + } + + Bitness getBitness() { + return myBitness.get(); + } + + String getVersion() { + return myVersionString.get(); } public void run() { @@ -125,7 +163,10 @@ public class JdkVersionDetectorImpl extends JdkVersionDetector { String line = readLine(); if (line == null) return; if (line.contains(myVersionLineMarker)) { - myVersionString[0] = line; + myVersionString.set(line); + } + if (line.contains(BITNESS_64_MARKER)) { + myBitness.set(Bitness.x64); } } } diff --git a/platform/lang-api/src/com/intellij/openapi/projectRoots/impl/SdkVersionUtil.java b/platform/lang-api/src/com/intellij/openapi/projectRoots/impl/SdkVersionUtil.java index 8e61cd45eb87..570d36600ebd 100644 --- a/platform/lang-api/src/com/intellij/openapi/projectRoots/impl/SdkVersionUtil.java +++ b/platform/lang-api/src/com/intellij/openapi/projectRoots/impl/SdkVersionUtil.java @@ -40,6 +40,7 @@ public class SdkVersionUtil { private SdkVersionUtil() { } + @Deprecated @Nullable public static String readVersionFromProcessOutput(String homePath, @NonNls String[] command, @NonNls String versionLineMarker) { return JdkVersionDetector.getInstance().readVersionFromProcessOutput(homePath, command, versionLineMarker, ACTION_RUNNER); @@ -49,4 +50,9 @@ public class SdkVersionUtil { public static String detectJdkVersion(String homePath) { return JdkVersionDetector.getInstance().detectJdkVersion(homePath, ACTION_RUNNER); } + + @Nullable + public static JdkVersionDetector.JdkVersionInfo getJdkVersionInfo(String homePath) { + return JdkVersionDetector.getInstance().detectJdkVersionInfo(homePath, ACTION_RUNNER); + } } diff --git a/platform/util-rt/src/com/intellij/openapi/util/Bitness.java b/platform/util-rt/src/com/intellij/openapi/util/Bitness.java new file mode 100644 index 000000000000..882d5d095275 --- /dev/null +++ b/platform/util-rt/src/com/intellij/openapi/util/Bitness.java @@ -0,0 +1,6 @@ +package com.intellij.openapi.util; + +/** +* @author egor +*/ +public enum Bitness {x32, x64}