diff options
Diffstat (limited to 'src/main/java/moe/nea/modernjava/launch/relaunch/JavaScanner.java')
-rw-r--r-- | src/main/java/moe/nea/modernjava/launch/relaunch/JavaScanner.java | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/modernjava/launch/relaunch/JavaScanner.java b/src/main/java/moe/nea/modernjava/launch/relaunch/JavaScanner.java new file mode 100644 index 0000000..0003097 --- /dev/null +++ b/src/main/java/moe/nea/modernjava/launch/relaunch/JavaScanner.java @@ -0,0 +1,137 @@ +package moe.nea.modernjava.launch.relaunch; + +import moe.nea.modernjava.launch.util.PropertyNames; +import moe.nea.modernjava.launch.util.TextIoUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.SystemUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class JavaScanner { + + public static final String JAVA_BINARY_PATH = "bin/java" + (SystemUtils.IS_OS_WINDOWS ? ".exe" : ""); + public static final String JAVA_COMPILER_PATH = "bin/javac" + (SystemUtils.IS_OS_WINDOWS ? ".exe" : ""); + + public boolean isJavaHome(File potential) { + if (new File(potential, JAVA_BINARY_PATH).exists()) { + return true; + } + return false; + } + + private List<LocalJavaVersion> versionList = new ArrayList<>(); + + public void scanDirectory(File file) { + scanDirectory(file, 1); + } + + public void scanDirectory(File file, int depthLimit) { + if (depthLimit < 0) return; + if (isJavaHome(file)) { + versionList.add(new LocalJavaVersion(file)); + } else { + for (File listFile : file.listFiles()) { + if (listFile.isDirectory()) { + scanDirectory(listFile, depthLimit - 1); + } + } + } + } + + public void prettyPrint() { + String s = "Fun fact these are the found Java Runtime Environments:\n"; + for (LocalJavaVersion localJavaVersion : versionList) { + s += localJavaVersion.prettyPrint(); + } + System.out.println(s); + } + + public void scanDefaultPaths() { + File home = new File(System.getProperty("user.home")); + scanDirectory(new File(home, ".sdkman/candidates/java")); + scanDirectory(new File(home, ".jdks")); + scanDirectory(new File("/usr"), 0); + String[] paths = System.getProperty(PropertyNames.JAVA_SCAN_PATH, "").split(File.pathSeparator); + for (String path : paths) { + if (!path.isEmpty()) { + scanDirectory(new File(path).getParentFile(), 3); + } + } + } + + public LocalJavaVersion findCandidate() { + LocalJavaVersion bestFit = null; + for (LocalJavaVersion localJavaVersion : versionList) { + if (localJavaVersion.isJdk() && localJavaVersion.getMajorVersion() == 16) { + bestFit = localJavaVersion; + } + } + return bestFit; + } + + public static class LocalJavaVersion { + private final File javaHome; + private String versionString; + + public LocalJavaVersion(File javaHome) { + this.javaHome = javaHome; + } + + public File getJavaHome() { + return javaHome; + } + + public File getJavaBinary() { + return new File(javaHome, JAVA_BINARY_PATH); + } + + public boolean isJdk() { + return new File(javaHome, JAVA_COMPILER_PATH).exists(); + } + + public String getVersionString() { + if (versionString == null) { + ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.command(getJavaBinary().getAbsolutePath(), "-version"); + processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE); + processBuilder.redirectOutput(ProcessBuilder.Redirect.PIPE); + processBuilder.redirectError(ProcessBuilder.Redirect.PIPE); + try { + Process process = processBuilder.start(); + process.waitFor(); + versionString = IOUtils.toString(process.getInputStream()) + IOUtils.toString(process.getErrorStream()); + } catch (Exception e) { + e.printStackTrace(); + versionString = "<invalid>"; + } + } + return versionString; + } + + public String prettyPrint() { + return javaHome.getAbsolutePath() + ":\n" + + "\tJava Binary: " + getJavaBinary().getAbsolutePath() + "\n" + + "\tMajor Version: " + getMajorVersion() + "\n" + + "\tFull Version: " + getVersion() + "\n" + + "\tIs Jdk: " + isJdk() + "\n" + ; + } + + public String getVersion() { + String v = getVersionString(); + String[] s = v.split("\""); + if (s.length < 2) return null; + return s[1]; + } + + public int getMajorVersion() { + try { + return Integer.parseInt(getVersion().split("\\.")[0]); + } catch (Exception e) { + return -1; + } + } + } +} |