8035782: sun/launcher/LauncherHelper$FXHelper loaded unnecessarily

Reviewed-by: ddehaven, kcr, ksrini, mchung
This commit is contained in:
Neil Toda 2014-05-03 17:23:51 -07:00 committed by Kumar Srinivasan
parent bd948f1ace
commit a3798db37e
2 changed files with 36 additions and 26 deletions

View File

@ -69,6 +69,14 @@ import java.util.jar.Manifest;
public enum LauncherHelper {
INSTANCE;
// used to identify JavaFX applications
private static final String JAVAFX_APPLICATION_MARKER =
"JavaFX-Application-Class";
private static final String JAVAFX_APPLICATION_CLASS_NAME =
"javafx.application.Application";
private static final String JAVAFX_FXHELPER_CLASS_NAME_SUFFIX =
"sun.launcher.LauncherHelper$FXHelper";
private static final String MAIN_CLASS = "Main-Class";
private static StringBuilder outBuf = new StringBuilder();
@ -418,7 +426,8 @@ public enum LauncherHelper {
* exists to enforce compliance with the jar specification
*/
if (mainAttrs.containsKey(
new Attributes.Name(FXHelper.JAVAFX_APPLICATION_MARKER))) {
new Attributes.Name(JAVAFX_APPLICATION_MARKER))) {
FXHelper.setFXLaunchParameters(jarname, LM_JAR);
return FXHelper.class.getName();
}
@ -516,9 +525,9 @@ public enum LauncherHelper {
* the main class may or may not have a main method, so do this before
* validating the main class.
*/
if (mainClass.equals(FXHelper.class) ||
FXHelper.doesExtendFXApplication(mainClass)) {
// Will abort() if there are problems with the FX runtime
if (JAVAFX_FXHELPER_CLASS_NAME_SUFFIX.equals(mainClass.getName()) ||
doesExtendFXApplication(mainClass)) {
// Will abort() if there are problems with FX runtime
FXHelper.setFXLaunchParameters(what, mode);
return FXHelper.class;
}
@ -537,6 +546,21 @@ public enum LauncherHelper {
return appClass;
}
/*
* Check if the given class is a JavaFX Application class. This is done
* in a way that does not cause the Application class to load or throw
* ClassNotFoundException if the JavaFX runtime is not available.
*/
private static boolean doesExtendFXApplication(Class<?> mainClass) {
for (Class<?> sc = mainClass.getSuperclass(); sc != null;
sc = sc.getSuperclass()) {
if (sc.getName().equals(JAVAFX_APPLICATION_CLASS_NAME)) {
return true;
}
}
return false;
}
// Check the existence and signature of main and abort if incorrect
static void validateMainClass(Class<?> mainClass) {
Method mainMethod;
@ -545,7 +569,7 @@ public enum LauncherHelper {
} catch (NoSuchMethodException nsme) {
// invalid main or not FX application, abort with an error
abort(null, "java.launcher.cls.error4", mainClass.getName(),
FXHelper.JAVAFX_APPLICATION_CLASS_NAME);
JAVAFX_APPLICATION_CLASS_NAME);
return; // Avoid compiler issues
}
@ -668,11 +692,7 @@ public enum LauncherHelper {
}
static final class FXHelper {
// Marker entry in jar manifest that designates a JavaFX application jar
private static final String JAVAFX_APPLICATION_MARKER =
"JavaFX-Application-Class";
private static final String JAVAFX_APPLICATION_CLASS_NAME =
"javafx.application.Application";
private static final String JAVAFX_LAUNCHER_CLASS_NAME =
"com.sun.javafx.application.LauncherImpl";
@ -742,21 +762,6 @@ public enum LauncherHelper {
}
}
/*
* Check if the given class is a JavaFX Application class. This is done
* in a way that does not cause the Application class to load or throw
* ClassNotFoundException if the JavaFX runtime is not available.
*/
private static boolean doesExtendFXApplication(Class<?> mainClass) {
for (Class<?> sc = mainClass.getSuperclass(); sc != null;
sc = sc.getSuperclass()) {
if (sc.getName().equals(JAVAFX_APPLICATION_CLASS_NAME)) {
return true;
}
}
return false;
}
public static void main(String... args) throws Exception {
if (fxLauncherMethod == null
|| fxLaunchMode == null

View File

@ -23,7 +23,7 @@
/*
* @test
* @bug 8001533 8004547
* @bug 8001533 8004547 8035782
* @summary Test launching FX application with java -jar
* Test uses main method and blank main method, a jfx app class and an incorrest
* jfx app class, a main-class for the manifest, a bogus one and none.
@ -373,6 +373,11 @@ public class FXLauncherTest extends TestHelper {
System.out.println(tr);
throw new Exception("jfxrt.jar is being loaded, it should not be!");
}
if (!tr.notContains("sun.launcher.LauncherHelper$FXHelper")) {
System.out.println("testing for extraneous 'sun.launcher.LauncherHelper$FXHelper'");
System.out.println(tr);
throw new Exception("FXHelper is being loaded, it should not be!");
}
for (String p : APP_PARMS) {
if (!tr.contains(p)) {
System.err.println("ERROR: Did not find "