All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prompto.codefactory.JvmLocator Maven / Gradle / Ivy

package prompto.codefactory;

import java.io.File;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Stream;

import prompto.utils.Logger;

public abstract class JvmLocator {

	static Logger logger = new Logger();

	public static String locateJava17() {
		String jvmDir = locateJdkDir("17");
		if(jvmDir==null)
			return "java"; // and pray
		else
			return locateJvmExe(jvmDir);
	}

	private static String locateJdkDir(String majorVersion) {
		File jvms = locateJvmsDir();
		Optional jvm = Stream.of(jvms.list())
				.filter(s -> s.contains("jdk-" + majorVersion + "."))
				.filter(s -> minorNumberOf(majorVersion, s) != null)
				.filter(s -> fixNumberOf(majorVersion, s) != null)
				.sorted((s1, s2)->{
					var n1 = minorNumberOf(majorVersion, s1);
					var n2 = minorNumberOf(majorVersion, s2);
					if(Objects.equals(n1, n2)) {
						n1 = fixNumberOf(majorVersion, s1);
						n2 = fixNumberOf(majorVersion, s2);
					}
					return Integer.compareUnsigned(Integer.parseInt(n2), Integer.parseInt(n1)); // reverse order 
				})
				.findFirst();
		if(jvm.isPresent())
			return jvms.getAbsolutePath() + "/" + jvm.get();
		else
			return null;
	}

	private static String fullVersionOf(String s) {
		int idx = s.indexOf("openjdk");
		if(idx >= 0)
			return s.substring(idx + 7);
		idx = s.indexOf("jdk");
		if(idx < 0)
			return null;
		return s.substring(idx + 3);
	}

	public static String minorNumberOf(String majorVersion, String s) {
		logger.info(()->"Locating minor number in " + s);
		String number = fullVersionOf(s);
		int idx = number.indexOf(majorVersion + ".");
		if(idx < 0)
			return null;
		number = number.substring(idx + 3);
		if(Character.isDigit(number.charAt(0))) {
			idx = number.indexOf(".");
			return idx < 0 ? number : number.substring(0, number.indexOf('.'));
		} else 
			return null;
	}

	public static String fixNumberOf(String majorVersion, String s) {
		logger.info(()->"Locating fix number in " + s);
		String number = fullVersionOf(s);
		int idx = number.indexOf(majorVersion + ".");
		if(idx < 0)
			return null;
		number = number.substring(idx + 3);
		idx = number.indexOf(".");
		if(idx < 0)
			return null;
		number = number.substring(idx + 1);
		idx = number.indexOf(".");
		if(Character.isDigit(number.charAt(0))) {
			idx = number.indexOf(".");
			return idx < 0 ? number : number.substring(0, number.indexOf('.'));
		} else 
			return null;
	}

	private static File locateJvmsDir() {
		File file = locateJavaHomeDir();
		if(file!=null && file.exists())
			return file;
		file = locatedOracleJdksDir();
		if(file!=null && file.exists())
			return file;
		file = locateOpenJdksDir();
		if(file!=null && file.exists())
			return file;
		file = locateMacOSXJdksDir();
		if(file!=null && file.exists())
			return file;
		throw new RuntimeException("Unable to locate JVMs dir");
	}

	private static File locateMacOSXJdksDir() {
		return new File("/Library/java/JavaVirtualMachines/");
	}

	private static File locateOpenJdksDir() {
		return new File("/usr/lib/jvm/");
	}

	private static File locatedOracleJdksDir() {
		return new File("/usr/java/");
	}

	private static File locateJavaHomeDir() {
		String javaHome = System.getenv("JAVA_HOME");
		if(javaHome != null)
			return new File(javaHome).toPath().getParent().toFile();
		else
			return null;
	}

	private static String locateJvmExe(String jvmDir) {
		File dirFile = new File(jvmDir);
		// special case for MacOS X
		File embedded = new File(dirFile, "Contents/Home");
		if(embedded.exists())
			dirFile = embedded;
		// special case for old JDKs
		embedded = new File(dirFile, "jre");	
		if(embedded.exists())
			dirFile = embedded;
		return new File(dirFile, "bin/java").getAbsolutePath();
	}


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy