11package 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 .*;
84import java .awt .datatransfer .StringSelection ;
95import java .io .BufferedInputStream ;
106import java .io .BufferedReader ;
3026import java .util .concurrent .Executors ;
3127import java .util .concurrent .Future ;
3228
29+ import org .mcphackers .mcp .MCP ;
30+ import org .mcphackers .mcp .tasks .mode .TaskParameter ;
31+
3332public 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