Skip to content

Commit fa581bb

Browse files
committed
style: Refactor Util#getJavaVersion
1 parent 9309e88 commit fa581bb

File tree

1 file changed

+77
-72
lines changed
  • src/main/java/org/mcphackers/mcp/tools

1 file changed

+77
-72
lines changed

src/main/java/org/mcphackers/mcp/tools/Util.java

Lines changed: 77 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package org.mcphackers.mcp.tools;
22

3-
import org.mcphackers.mcp.MCP;
4-
import org.mcphackers.mcp.tasks.mode.TaskParameter;
5-
6-
import java.awt.Desktop;
7-
import java.awt.Toolkit;
3+
import java.awt.*;
84
import java.awt.datatransfer.StringSelection;
95
import java.io.BufferedInputStream;
106
import java.io.BufferedReader;
@@ -30,6 +26,9 @@
3026
import java.util.concurrent.Executors;
3127
import java.util.concurrent.Future;
3228

29+
import org.mcphackers.mcp.MCP;
30+
import org.mcphackers.mcp.tasks.mode.TaskParameter;
31+
3332
public abstract class Util {
3433
public static final ExecutorService SINGLE_THREAD_EXECUTOR = Executors.newSingleThreadExecutor();
3534
public static final Map<String, Integer> javaToJavaVersion = new HashMap<>();
@@ -46,21 +45,21 @@ public static int runCommand(String[] cmd, Path dir, boolean killOnShutdown) thr
4645
}
4746
BufferedReader err = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
4847
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
49-
Thread stderr = new Thread(()-> {
48+
Thread stderr = new Thread(() -> {
5049
String line;
5150
try {
52-
while((line = err.readLine()) != null) {
51+
while ((line = err.readLine()) != null) {
5352
System.out.println("Minecraft STDERR: " + line);
5453
}
5554
} catch (IOException ignored) {
5655
// we don't really care what happens here
5756
}
5857

5958
});
60-
Thread stdout = new Thread(()-> {
59+
Thread stdout = new Thread(() -> {
6160
String line;
6261
try {
63-
while((line = in.readLine()) != null) {
62+
while ((line = in.readLine()) != null) {
6463
System.out.println(line);
6564
}
6665
} catch (IOException ignored) {
@@ -72,7 +71,7 @@ public static int runCommand(String[] cmd, Path dir, boolean killOnShutdown) thr
7271
try {
7372
proc.waitFor();
7473
} catch (InterruptedException e) {
75-
throw new RuntimeException("thread interrupted while runCommand was waiting for a process to finish", e );
74+
throw new RuntimeException("thread interrupted while runCommand was waiting for a process to finish", e);
7675
}
7776
in.close();
7877
err.close();
@@ -184,11 +183,11 @@ public static byte[] getDigest(MessageDigest md, Path file) {
184183
while ((bytesRead = bs.read(buffer, 0, buffer.length)) != -1) {
185184
md.update(buffer, 0, bytesRead);
186185
}
187-
return md.digest();
186+
return md.digest();
188187
} catch (IOException ex) {
189188
ex.printStackTrace();
190189
}
191-
return new byte[] {};
190+
return new byte[]{};
192191
}
193192

194193
public static String firstUpperCase(String s) {
@@ -216,30 +215,81 @@ public static String getJava() {
216215

217216
public static String getJavac(MCP mcp) {
218217
String javaHome = mcp.getOptions().getStringParameter(TaskParameter.JAVA_HOME);
219-
String defaultJavaHome = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java";
218+
String defaultJavaCompiler = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "javac";
219+
220+
// Returns path to custom Java compiler
220221
if (!javaHome.isEmpty()) {
221222
return javaHome + File.separator + "bin" + File.separator + "javac";
222223
}
223-
return defaultJavaHome;
224+
return defaultJavaCompiler;
224225
}
225226

226227
public static int getJavaVersion(MCP mcp) {
227-
String java = getJava();
228+
String defaultJavaHome = getJava();
229+
String customJavaHome = mcp.getOptions().getStringParameter(TaskParameter.JAVA_HOME);
228230

229-
// Get cached value if already ran
230-
if (mcp != null) {
231-
String javacString = getJavac(mcp);
231+
// Use custom Java compiler
232+
if (!customJavaHome.isEmpty()) {
233+
if (javaToJavaVersion.containsKey(customJavaHome)) {
234+
return javaToJavaVersion.get(customJavaHome);
235+
}
232236

233-
if (!javacString.isEmpty() && javaToJavaVersion.containsKey(javacString)) {
234-
return javaToJavaVersion.get(javacString);
235-
} else {
236-
if (javaToJavaVersion.containsKey(java)) {
237-
return javaToJavaVersion.get(java);
237+
Path javacPath = Paths.get(mcp.getOptions().getStringParameter(TaskParameter.JAVA_HOME)).resolve("bin").resolve("javac");
238+
String javac = javacPath.toString();
239+
240+
241+
if (!javac.isEmpty() && javaToJavaVersion.containsKey(javac)) {
242+
return javaToJavaVersion.get(javac);
243+
}
244+
245+
if (Files.exists(javacPath)) {
246+
// This is a hack...
247+
int javaVersion;
248+
if (!Files.exists(javacPath)) {
249+
javaVersion = 6;
250+
javaToJavaVersion.put(customJavaHome, javaVersion);
251+
return javaVersion;
252+
}
253+
254+
String tempDirPath = System.getProperty("java.io.tmpdir");
255+
256+
// Write and compile a temporary Java file, then use ASM to read the default class file
257+
// version.
258+
try {
259+
Path tempJavaSrc = Files.createTempFile("retromcp-javac-check-", ".java");
260+
Path tempJavaOut = tempJavaSrc.getParent().resolve("Main.class");
261+
try (BufferedWriter writer = Files.newBufferedWriter(tempJavaSrc)) {
262+
writer.write("class Main { }\n");
263+
}
264+
265+
// Compile tempJavaSrc using the set javaHome
266+
List<String> cmd = new ArrayList<>();
267+
cmd.add(javacPath.toString());
268+
cmd.add(tempJavaSrc.toAbsolutePath().toString());
269+
cmd.add("-d");
270+
cmd.add(tempDirPath);
271+
272+
int exitCode = Util.runCommand(cmd.toArray(new String[]{}), Paths.get(tempDirPath), true);
273+
if (exitCode != 0) {
274+
throw new RuntimeException("Failed to compile a test program with: " + javac);
275+
}
276+
277+
if (!Files.exists(tempJavaOut)) {
278+
throw new IllegalStateException("Test program could not be found at the location it was supposed to!");
279+
}
280+
281+
// Read class version from class
282+
int classVersion = ClassUtils.getClassVersion(tempJavaOut);
283+
javaToJavaVersion.put(customJavaHome, classVersion);
284+
return ClassUtils.getSourceFromClassVersion(classVersion);
285+
} catch (IOException ignored) {
238286
}
239287
}
240-
}
288+
} else {
289+
if (javaToJavaVersion.containsKey(defaultJavaHome)) {
290+
return javaToJavaVersion.get(defaultJavaHome);
291+
}
241292

242-
if (mcp == null) {
243293
String javaVersion = System.getProperty("java.version");
244294
String[] versionParts = javaVersion.split("\\.");
245295
int versionNumber = Integer.parseInt(versionParts[0]);
@@ -249,54 +299,9 @@ public static int getJavaVersion(MCP mcp) {
249299
} else {
250300
versionNumber = Integer.parseInt(versionParts[0]);
251301
}
252-
javaToJavaVersion.put(java, versionNumber);
302+
javaToJavaVersion.put(defaultJavaHome, versionNumber);
253303
return versionNumber;
254-
} else {
255-
// TODO: This is a hack
256-
// Please refactor.
257-
java = mcp.getOptions().getStringParameter(TaskParameter.JAVA_HOME);
258-
Path javac = Paths.get(java).resolve("bin").resolve("javac");
259-
int javaVersion;
260-
if (!Files.exists(javac)) {
261-
javaVersion = 6;
262-
javaToJavaVersion.put(java, javaVersion);
263-
return javaVersion;
264-
}
265-
266-
String tempDirPath = System.getProperty("java.io.tmpdir");
267-
268-
// Write and compile a temporary Java file, then use ASM to read the default class file
269-
// version.
270-
try {
271-
Path tempJavaSrc = Files.createTempFile("retromcp-javac-check-", ".java");
272-
Path tempJavaOut = tempJavaSrc.getParent().resolve("Main.class");
273-
try (BufferedWriter writer = Files.newBufferedWriter(tempJavaSrc)) {
274-
writer.write("class Main { }\n");
275-
}
276-
277-
// Compile tempJavaSrc using the set javaHome
278-
List<String> cmd = new ArrayList<>();
279-
cmd.add(javac.toAbsolutePath().toString());
280-
cmd.add(tempJavaSrc.toAbsolutePath().toString());
281-
cmd.add("-d");
282-
cmd.add(tempDirPath);
283-
284-
int exitCode = Util.runCommand(cmd.toArray(new String[] {}), Paths.get(tempDirPath), true);
285-
if (exitCode != 0) {
286-
throw new RuntimeException("Failed to compile a test program with: " + java);
287-
}
288-
289-
if (!Files.exists(tempJavaOut)) {
290-
throw new IllegalStateException("Test program could not be found at the location it was supposed to!");
291-
}
292-
293-
// Read class version from class
294-
int classVersion = ClassUtils.getClassVersion(tempJavaOut);
295-
return ClassUtils.getSourceFromClassVersion(classVersion);
296-
} catch (IOException ignored) {
297-
}
298-
299-
return 6;
300304
}
305+
return 8;
301306
}
302307
}

0 commit comments

Comments
 (0)