From 959cf1acf1364341aa7db8b298260d77a6d02572 Mon Sep 17 00:00:00 2001
From: chylex <info@chylex.com>
Date: Sat, 25 Jul 2015 18:43:03 +0200
Subject: [PATCH 1/4] Backport Java Checker to 1.7.10

---
 build.gradle                                  | 39 +++++++++----------
 .../chylex/javacheck/Java7CheckerCoremod.java |  2 +-
 .../chylex/javacheck/Java8CheckerCoremod.java |  2 +-
 .../javacheck/report/JavaCheckerReporter.java |  4 +-
 4 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/build.gradle b/build.gradle
index d73a8a7..db3cd67 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,16 +1,16 @@
-buildscript {
-    repositories {
+buildscript{
+    repositories{
         mavenCentral()
-        maven {
+        maven{
             name = "forge"
             url = "http://files.minecraftforge.net/maven"
         }
-        maven {
+        maven{
             name = "sonatype"
             url = "https://oss.sonatype.org/content/repositories/snapshots/"
         }
     }
-    dependencies {
+    dependencies{
         classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
     }
 }
@@ -18,45 +18,44 @@ buildscript {
 apply plugin: 'forge'
 
 version = ""
-group = "chylex.java7check"
-archivesBaseName = "Java7Checker  MC-1.8+  v1.1"
+group = "chylex.javacheck"
+archivesBaseName = "Java7Checker  MC-1.7.10  v1.1"
 
-minecraft {
-    version = "1.8-11.14.1.1306"
+minecraft{
+    version = "1.7.10-10.13.4.1492-1.7.10"
     assetDir = "eclipse/assets"
-    mappings = "snapshot_nodoc_20141130"
 }
 
-jar {
-    manifest {
+jar{
+    manifest{
         attributes 'FMLCorePlugin': 'chylex.javacheck.Java7CheckerCoremod'
     }
 }
 
-task java8Jar(type: Jar, dependsOn: "jar") {
+task java8Jar(type: Jar, dependsOn: "jar"){
     from sourceSets.main.output
     
-    manifest {
+    manifest{
         attributes 'FMLCorePlugin': 'chylex.javacheck.Java8CheckerCoremod'
     }
     
-    baseName = "Java8Checker  MC-1.8+  v1.1"
+    baseName = "Java8Checker  MC-1.7.10  v1.1"
 }
 
-reobf {
-    reobf java8Jar { classpath -> classpath = configurations.compile }
+reobf{
+    reobf java8Jar{ classpath -> classpath = configurations.compile }
 }
 
-processResources {
+processResources{
     inputs.property "version", project.version
     inputs.property "mcversion", project.minecraft.version
     
-    from(sourceSets.main.resources.srcDirs) {
+    from(sourceSets.main.resources.srcDirs){
         include 'mcmod.info'
         expand 'version':project.version, 'mcversion':project.minecraft.version
     }
     
-    from(sourceSets.main.resources.srcDirs) {
+    from(sourceSets.main.resources.srcDirs){
         exclude 'mcmod.info'
     }
 }
\ No newline at end of file
diff --git a/src/main/java/chylex/javacheck/Java7CheckerCoremod.java b/src/main/java/chylex/javacheck/Java7CheckerCoremod.java
index bb3f00f..96050fb 100644
--- a/src/main/java/chylex/javacheck/Java7CheckerCoremod.java
+++ b/src/main/java/chylex/javacheck/Java7CheckerCoremod.java
@@ -1,8 +1,8 @@
 package chylex.javacheck;
 import java.util.Map;
-import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
 import org.apache.commons.lang3.JavaVersion;
 import chylex.javacheck.report.JavaCheckerReporter;
+import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
 
 public class Java7CheckerCoremod implements IFMLLoadingPlugin{
 	@Override
diff --git a/src/main/java/chylex/javacheck/Java8CheckerCoremod.java b/src/main/java/chylex/javacheck/Java8CheckerCoremod.java
index 5f3b9b3..da6ce08 100644
--- a/src/main/java/chylex/javacheck/Java8CheckerCoremod.java
+++ b/src/main/java/chylex/javacheck/Java8CheckerCoremod.java
@@ -1,8 +1,8 @@
 package chylex.javacheck;
 import java.util.Map;
-import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
 import org.apache.commons.lang3.JavaVersion;
 import chylex.javacheck.report.JavaCheckerReporter;
+import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
 
 public class Java8CheckerCoremod implements IFMLLoadingPlugin{
 	@Override
diff --git a/src/main/java/chylex/javacheck/report/JavaCheckerReporter.java b/src/main/java/chylex/javacheck/report/JavaCheckerReporter.java
index 0a91de4..deebeac 100644
--- a/src/main/java/chylex/javacheck/report/JavaCheckerReporter.java
+++ b/src/main/java/chylex/javacheck/report/JavaCheckerReporter.java
@@ -1,10 +1,10 @@
 package chylex.javacheck.report;
 import java.util.Map;
 import javax.swing.JOptionPane;
-import net.minecraftforge.fml.relauncher.FMLRelaunchLog;
-import net.minecraftforge.fml.relauncher.IFMLCallHook;
 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;

From 7c0e4ff376efaba50c489152e6516604a0ca73a5 Mon Sep 17 00:00:00 2001
From: chylex <info@chylex.com>
Date: Wed, 7 Oct 2015 23:54:22 +0200
Subject: [PATCH 2/4] Fix shading

---
 src/main/java/chylex/javacheck/Java7CheckerCoremod.java | 2 +-
 src/main/java/chylex/javacheck/Java8CheckerCoremod.java | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/chylex/javacheck/Java7CheckerCoremod.java b/src/main/java/chylex/javacheck/Java7CheckerCoremod.java
index 96050fb..17b8a1b 100644
--- a/src/main/java/chylex/javacheck/Java7CheckerCoremod.java
+++ b/src/main/java/chylex/javacheck/Java7CheckerCoremod.java
@@ -8,7 +8,7 @@ public class Java7CheckerCoremod implements IFMLLoadingPlugin{
 	@Override
 	public String getSetupClass(){
 		JavaCheckerReporter.minVersion = JavaVersion.JAVA_1_7;
-		return "chylex.javacheck.report.JavaCheckerReporter";
+		return JavaCheckerReporter.class.getName();
 	}
 	
 	@Override public String[] getASMTransformerClass(){ return null; }
diff --git a/src/main/java/chylex/javacheck/Java8CheckerCoremod.java b/src/main/java/chylex/javacheck/Java8CheckerCoremod.java
index da6ce08..e13bea0 100644
--- a/src/main/java/chylex/javacheck/Java8CheckerCoremod.java
+++ b/src/main/java/chylex/javacheck/Java8CheckerCoremod.java
@@ -8,7 +8,7 @@ public class Java8CheckerCoremod implements IFMLLoadingPlugin{
 	@Override
 	public String getSetupClass(){
 		JavaCheckerReporter.minVersion = JavaVersion.JAVA_1_8;
-		return "chylex.javacheck.report.JavaCheckerReporter";
+		return JavaCheckerReporter.class.getName();
 	}
 
 	@Override public String[] getASMTransformerClass(){ return null; }

From bb9f99feeadf4953d2fa41b1bfe9fb2a6bd3fbeb Mon Sep 17 00:00:00 2001
From: chylex <info@chylex.com>
Date: Mon, 12 Oct 2015 15:44:10 +0200
Subject: [PATCH 3/4] Rewrite build.gradle

---
 build.gradle | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/build.gradle b/build.gradle
index db3cd67..0ea50df 100644
--- a/build.gradle
+++ b/build.gradle
@@ -17,32 +17,37 @@ buildscript{
 
 apply plugin: 'forge'
 
-version = ""
-group = "chylex.javacheck"
-archivesBaseName = "Java7Checker  MC-1.7.10  v1.1"
+String archiveSuffix = "  MC-UNIVERSAL  v1.2.jar"
 
 minecraft{
     version = "1.7.10-10.13.4.1492-1.7.10"
     assetDir = "eclipse/assets"
 }
 
-jar{
+task java7Jar(type: Jar, dependsOn: "jar"){
+    from sourceSets.main.output
+    
     manifest{
-        attributes 'FMLCorePlugin': 'chylex.javacheck.Java7CheckerCoremod'
+        attributes 'TweakClass': 'chylex.javacheck.Java7Checker'
     }
+    
+    archiveName = "Java7Checker"+archiveSuffix
 }
 
 task java8Jar(type: Jar, dependsOn: "jar"){
     from sourceSets.main.output
     
     manifest{
-        attributes 'FMLCorePlugin': 'chylex.javacheck.Java8CheckerCoremod'
+        attributes 'TweakClass': 'chylex.javacheck.Java8Checker'
     }
     
-    baseName = "Java8Checker  MC-1.7.10  v1.1"
+    archiveName = "Java8Checker"+archiveSuffix
 }
 
+jar.enabled = false
+
 reobf{
+    reobf java7Jar{ classpath -> classpath = configurations.compile }
     reobf java8Jar{ classpath -> classpath = configurations.compile }
 }
 

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 4/4] 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);
+	}
+}