From e62a337dff62eae5e37a0e1ccebacc1b7b6b3542 Mon Sep 17 00:00:00 2001
From: chylex <info@chylex.com>
Date: Mon, 12 Oct 2015 17:41:06 +0200
Subject: [PATCH] Rewrite JC as a tweaker, make it work on all MC versions, add
 clickable link

---
 build.gradle                                  |  4 +-
 .../java/chylex/javacheck/Java7Checker.java   | 27 +++++++
 .../chylex/javacheck/Java7CheckerCoremod.java | 18 -----
 .../java/chylex/javacheck/Java8Checker.java   | 27 +++++++
 .../chylex/javacheck/Java8CheckerCoremod.java | 18 -----
 .../javacheck/report/JavaCheckerReporter.java | 72 +++++++++++++------
 .../javacheck/test/JavaCheckerTestMod.java    | 14 ++++
 7 files changed, 123 insertions(+), 57 deletions(-)
 create mode 100644 src/main/java/chylex/javacheck/Java7Checker.java
 delete mode 100644 src/main/java/chylex/javacheck/Java7CheckerCoremod.java
 create mode 100644 src/main/java/chylex/javacheck/Java8Checker.java
 delete mode 100644 src/main/java/chylex/javacheck/Java8CheckerCoremod.java
 create mode 100644 src/main/java/chylex/javacheck/test/JavaCheckerTestMod.java

diff --git a/build.gradle b/build.gradle
index 0ea50df..5216038 100644
--- a/build.gradle
+++ b/build.gradle
@@ -21,7 +21,7 @@ String archiveSuffix = "  MC-UNIVERSAL  v1.2.jar"
 
 minecraft{
     version = "1.7.10-10.13.4.1492-1.7.10"
-    assetDir = "eclipse/assets"
+    runDir = "eclipse"
 }
 
 task java7Jar(type: Jar, dependsOn: "jar"){
@@ -51,6 +51,8 @@ reobf{
     reobf java8Jar{ classpath -> classpath = configurations.compile }
 }
 
+reobf.enabled = false
+
 processResources{
     inputs.property "version", project.version
     inputs.property "mcversion", project.minecraft.version
diff --git a/src/main/java/chylex/javacheck/Java7Checker.java b/src/main/java/chylex/javacheck/Java7Checker.java
new file mode 100644
index 0000000..d30ad30
--- /dev/null
+++ b/src/main/java/chylex/javacheck/Java7Checker.java
@@ -0,0 +1,27 @@
+package chylex.javacheck;
+import java.io.File;
+import java.util.List;
+import net.minecraft.launchwrapper.ITweaker;
+import net.minecraft.launchwrapper.LaunchClassLoader;
+import org.apache.commons.lang3.JavaVersion;
+import chylex.javacheck.report.JavaCheckerReporter;
+
+public class Java7Checker implements ITweaker{
+	@Override
+	public void injectIntoClassLoader(LaunchClassLoader classLoader){
+		JavaCheckerReporter.run(JavaVersion.JAVA_1_7);
+	}
+	
+	@Override
+	public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile){}
+	
+	@Override
+	public String getLaunchTarget(){
+		return null;
+	}
+	
+	@Override
+	public String[] getLaunchArguments(){
+		return new String[0];
+	}
+}
diff --git a/src/main/java/chylex/javacheck/Java7CheckerCoremod.java b/src/main/java/chylex/javacheck/Java7CheckerCoremod.java
deleted file mode 100644
index 17b8a1b..0000000
--- a/src/main/java/chylex/javacheck/Java7CheckerCoremod.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package chylex.javacheck;
-import java.util.Map;
-import org.apache.commons.lang3.JavaVersion;
-import chylex.javacheck.report.JavaCheckerReporter;
-import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
-
-public class Java7CheckerCoremod implements IFMLLoadingPlugin{
-	@Override
-	public String getSetupClass(){
-		JavaCheckerReporter.minVersion = JavaVersion.JAVA_1_7;
-		return JavaCheckerReporter.class.getName();
-	}
-	
-	@Override public String[] getASMTransformerClass(){ return null; }
-	@Override public String getAccessTransformerClass(){ return null; }
-	@Override public String getModContainerClass(){ return null; }
-	@Override public void injectData(Map<String,Object> data){}
-}
diff --git a/src/main/java/chylex/javacheck/Java8Checker.java b/src/main/java/chylex/javacheck/Java8Checker.java
new file mode 100644
index 0000000..7b14c3a
--- /dev/null
+++ b/src/main/java/chylex/javacheck/Java8Checker.java
@@ -0,0 +1,27 @@
+package chylex.javacheck;
+import java.io.File;
+import java.util.List;
+import net.minecraft.launchwrapper.ITweaker;
+import net.minecraft.launchwrapper.LaunchClassLoader;
+import org.apache.commons.lang3.JavaVersion;
+import chylex.javacheck.report.JavaCheckerReporter;
+
+public class Java8Checker implements ITweaker{
+	@Override
+	public void injectIntoClassLoader(LaunchClassLoader classLoader){
+		JavaCheckerReporter.run(JavaVersion.JAVA_1_8);
+	}
+	
+	@Override
+	public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile){}
+	
+	@Override
+	public String getLaunchTarget(){
+		return null;
+	}
+	
+	@Override
+	public String[] getLaunchArguments(){
+		return new String[0];
+	}
+}
diff --git a/src/main/java/chylex/javacheck/Java8CheckerCoremod.java b/src/main/java/chylex/javacheck/Java8CheckerCoremod.java
deleted file mode 100644
index e13bea0..0000000
--- a/src/main/java/chylex/javacheck/Java8CheckerCoremod.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package chylex.javacheck;
-import java.util.Map;
-import org.apache.commons.lang3.JavaVersion;
-import chylex.javacheck.report.JavaCheckerReporter;
-import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
-
-public class Java8CheckerCoremod implements IFMLLoadingPlugin{
-	@Override
-	public String getSetupClass(){
-		JavaCheckerReporter.minVersion = JavaVersion.JAVA_1_8;
-		return JavaCheckerReporter.class.getName();
-	}
-
-	@Override public String[] getASMTransformerClass(){ return null; }
-	@Override public String getAccessTransformerClass(){ return null; }
-	@Override public String getModContainerClass(){ return null; }
-	@Override public void injectData(Map<String,Object> data){}
-}
diff --git a/src/main/java/chylex/javacheck/report/JavaCheckerReporter.java b/src/main/java/chylex/javacheck/report/JavaCheckerReporter.java
index deebeac..de26230 100644
--- a/src/main/java/chylex/javacheck/report/JavaCheckerReporter.java
+++ b/src/main/java/chylex/javacheck/report/JavaCheckerReporter.java
@@ -1,29 +1,49 @@
 package chylex.javacheck.report;
-import java.util.Map;
+import java.awt.Desktop;
+import java.awt.Font;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
 import javax.swing.JOptionPane;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkEvent.EventType;
+import javax.swing.event.HyperlinkListener;
 import org.apache.commons.lang3.JavaVersion;
 import org.apache.commons.lang3.SystemUtils;
-import cpw.mods.fml.relauncher.FMLRelaunchLog;
-import cpw.mods.fml.relauncher.IFMLCallHook;
 
-public final class JavaCheckerReporter implements IFMLCallHook{
-	public static JavaVersion minVersion = null;
-	
-	@Override
-	public Void call() throws Exception{
-		if (!SystemUtils.isJavaVersionAtLeast(minVersion)){
-			FMLRelaunchLog.severe(getConsoleReport());
-			JOptionPane.showMessageDialog(null, "<html>"+getWindowReport()+"</html>","Outdated Java",JOptionPane.ERROR_MESSAGE);
-            		throw new OutdatedJavaException();
+public final class JavaCheckerReporter{
+	public static void run(JavaVersion minVersion){
+		if (minVersion == null || !SystemUtils.isJavaVersionAtLeast(minVersion)){
+			if (minVersion == null)minVersion = JavaVersion.JAVA_1_8;
+			
+			try{
+				Class relaunchLog = findRelaunchLog();
+				if (relaunchLog != null)relaunchLog.getMethod("severe",String.class,Object[].class).invoke(null,getConsoleReport(minVersion),new Object[0]);
+			}catch(Throwable t){}
+			
+			String style = "font-family:Dialog;font-size:12;font-weight:bold";
+			JEditorPane pane = new JEditorPane("text/html","<html><body style='"+style+"'>"+getWindowReport(minVersion)+"</body></html>");
+			pane.setBackground(new JLabel().getBackground());
+			pane.setEditable(false);
+			
+			pane.addHyperlinkListener(new HyperlinkListener(){
+				@Override
+				public void hyperlinkUpdate(HyperlinkEvent e){
+					if (e.getEventType() == EventType.ACTIVATED){
+						try{
+							if (Desktop.isDesktopSupported())Desktop.getDesktop().browse(e.getURL().toURI());
+						}catch(Exception ex){
+							ex.printStackTrace();
+						}
+					}
+				}
+			});
+			
+			JOptionPane.showMessageDialog(null,pane,"Outdated Java",JOptionPane.ERROR_MESSAGE);
+            throw new OutdatedJavaException();
 		}
-		
-		return null;
 	}
-
-	@Override
-	public void injectData(Map<String,Object> data){}
 	
-	static String getConsoleReport(){
+	private static String getConsoleReport(JavaVersion minVersion){
 		return new StringBuilder(242).append("\n")
 		.append("\n!! DO NOT REPORT !!\n\n")
 		.append("One of the mods requires Java "+minVersion.toString()+" or newer, you are using ").append(SystemUtils.JAVA_VERSION).append(".\n")
@@ -33,11 +53,23 @@ public final class JavaCheckerReporter implements IFMLCallHook{
 		.toString();
 	}
 	
-	static String getWindowReport(){
+	private static String getWindowReport(JavaVersion minVersion){
 		return new StringBuilder(230)
 		.append("One of the mods requires Java "+minVersion.toString()+" or newer, you are using ").append(SystemUtils.JAVA_VERSION).append(".<br>")
-		.append("Visit <span style=\"color:red\">https://java.com/download/</span> for the latest version.<br>")
+		.append("Visit <a href=\"https://java.com/download/\"><span style=\"color:blue\">https://java.com/download/</span></a> for the latest version.<br>")
 		.append("Please, uninstall the old version first to prevent further issues.")
 		.toString();
 	}
+	
+	private static Class findRelaunchLog() throws Throwable{
+		try{
+			return Class.forName("cpw.mods.fml.relauncher.FMLRelaunchLog");
+		}catch(ClassNotFoundException e){}
+		
+		try{
+			return Class.forName("net.minecraftforge.fml.relauncher.FMLRelaunchLog");
+		}catch(ClassNotFoundException e){}
+		
+		return null;
+	}
 }
diff --git a/src/main/java/chylex/javacheck/test/JavaCheckerTestMod.java b/src/main/java/chylex/javacheck/test/JavaCheckerTestMod.java
new file mode 100644
index 0000000..c35c6af
--- /dev/null
+++ b/src/main/java/chylex/javacheck/test/JavaCheckerTestMod.java
@@ -0,0 +1,14 @@
+package chylex.javacheck.test;
+import org.apache.commons.lang3.JavaVersion;
+import chylex.javacheck.report.JavaCheckerReporter;
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Mod.EventHandler;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+
+@Mod(modid = "JavaCheckerTestMod")
+public class JavaCheckerTestMod{
+	@EventHandler
+	public void onPreInit(FMLPreInitializationEvent e){
+		JavaCheckerReporter.run(null);
+	}
+}