changeset 727:eb52d04ba3bd

Added appcontex hack to make sweethome3d fully working again
author Jiri Vanek <jvanek@redhat.com>
date Thu, 02 May 2013 19:02:06 +0200
parents 0d6213db4fc7
children edcfd8b76af1
files netx/net/sourceforge/jnlp/Launcher.java
diffstat 1 files changed, 27 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/netx/net/sourceforge/jnlp/Launcher.java	Thu May 02 18:44:16 2013 +0200
+++ b/netx/net/sourceforge/jnlp/Launcher.java	Thu May 02 19:02:06 2013 +0200
@@ -20,8 +20,11 @@
 
 import java.applet.Applet;
 import java.awt.Container;
+import java.awt.EventQueue;
 import java.awt.SplashScreen;
+import java.awt.Toolkit;
 import java.io.File;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.net.InetAddress;
 import java.net.URL;
@@ -46,6 +49,7 @@
 import net.sourceforge.jnlp.runtime.AppletEnvironment;
 import net.sourceforge.jnlp.splashscreen.SplashUtils;
 
+import sun.awt.AppContext;
 import sun.awt.SunToolkit;
 
 /**
@@ -749,6 +753,7 @@
          AppletInstance appletInstance = null;
          try {
             JNLPClassLoader loader = JNLPClassLoader.getInstance(file, updatePolicy);
+            forceContextClassLoaderHack(loader);
 
             if (enableCodeBase) {
                 loader.enableCodeBase();
@@ -794,6 +799,7 @@
     protected Applet createAppletObject(JNLPFile file, boolean enableCodeBase, Container cont) throws LaunchException {
         try {
             JNLPClassLoader loader = JNLPClassLoader.getInstance(file, updatePolicy);
+            forceContextClassLoaderHack(loader);
 
             if (enableCodeBase) {
                 loader.enableCodeBase();
@@ -817,6 +823,7 @@
     protected ApplicationInstance createApplication(JNLPFile file) throws LaunchException {
         try {
             JNLPClassLoader loader = JNLPClassLoader.getInstance(file, updatePolicy);
+            forceContextClassLoaderHack(loader);
             ThreadGroup group = Thread.currentThread().getThreadGroup();
 
             ApplicationInstance app = new ApplicationInstance(file, group, loader);
@@ -898,6 +905,26 @@
         new ParserDelegator();
     }
 
+    /*
+     * This is necessary to ensure the AppContext context-classloader is correctly set to our JNLPClassLoader.
+     * This is unfortunately necessary until it is possible to create a JNLPClassLoader -before- we create our AppContext.
+     */
+    private void forceContextClassLoaderHack(ClassLoader classLoader) {
+        try {
+            Field appContextClassLoaderField = AppContext.class.getDeclaredField("contextClassLoader");
+            appContextClassLoaderField.setAccessible(true);
+            appContextClassLoaderField.set(AppContext.getAppContext(), classLoader);
+
+            Field eventQueueClassLoaderField = EventQueue.class.getDeclaredField("classLoader");
+            eventQueueClassLoaderField.setAccessible(true);
+            eventQueueClassLoaderField.set(Toolkit.getDefaultToolkit().getSystemEventQueue(), classLoader);
+
+        } catch (Exception e) {
+            System.err.println("Problem occurred while setting the AppContext context-classloader using reflection:");
+            e.printStackTrace();
+        }
+    }
+
        /**
      * This runnable is used to call the appropriate launch method
      * for the application, applet, or installer in its thread group.