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