//////////////////////////////////////////////////////////////////////////// // // IHostedModeSupport // //////////////////////////////////////////////////////////////////////////// public void startup( String browserStartupUrl, String moduleName, IProgressMonitor monitor, int timeout) throws Exception { browserShell.setUrl( browserStartupUrl, moduleName, timeout, new Runnable() { public void run() { runMessagesLoop(); } }); // setup parent for CompilingClassLoader ClassLoader classLoader = getClassLoader(); ReflectionUtils.setField(classLoader, "parent", parentClassLoader); }
public void dispose() { if (moduleSpaceHost != null) { // clear static caches ClassLoader devClassLoader = getDevClassLoader(); try { Class<?> clazz = devClassLoader.loadClass("com.google.gwt.i18n.rebind.ClearStaticData"); ReflectionUtils.invokeMethod2(clazz, "clear"); } catch (Throwable e) { } try { Class<?> clazz = devClassLoader.loadClass("com.google.gwt.uibinder.rebind.model.OwnerFieldClass"); Map<?, ?> map = (Map<?, ?>) ReflectionUtils.getFieldObject(clazz, "FIELD_CLASSES"); map.clear(); } catch (Throwable e) { } // remove parent of CompilingClassLoader if (parentClassLoader != null) { ClassLoader classLoader = getClassLoader(); ReflectionUtils.setField(classLoader, "parent", null); } // clear "loadedModulesCaches" in com.google.gwt.dev.cfg.ModuleDefLoader try { Class<?> moduleDefLoader = devClassLoader.loadClass("com.google.gwt.dev.cfg.ModuleDefLoader"); Map<?, ?> loadedModulesCaches = (Map<?, ?>) ReflectionUtils.getFieldObject(moduleDefLoader, "loadedModulesCaches"); loadedModulesCaches.clear(); } catch (Throwable e) { } /*// clear "threadLocalLogger" in com.google.gwt.dev.shell.ModuleSpace try { Class<?> classModuleSpace = devClassLoader.loadClass("com.google.gwt.dev.shell.ModuleSpace"); ThreadLocal<?> threadLocalLogger = (ThreadLocal<?>) ReflectionUtils.getFieldObject(classModuleSpace, "threadLocalLogger"); threadLocalLogger.set(null); } catch (Throwable e) { } // shutdown com.google.gwt.dev.javac.PersistentUnitCache try { Class<?> classUnitCacheFactory = devClassLoader.loadClass("com.google.gwt.dev.javac.UnitCacheFactory"); Object cacheInstance = ReflectionUtils.getFieldObject(classUnitCacheFactory, "instance"); if (cacheInstance != null) { Method shutdownMethod = ReflectionUtils.getMethodBySignature(cacheInstance.getClass(), "shutdown()"); if (shutdownMethod != null) { shutdownMethod.invoke(cacheInstance); } } ReflectionUtils.setField(classUnitCacheFactory, "instance", null); } catch (Throwable e) { } // Call and remove GWT related java.lang.ApplicationShutdownHooks try { Class<?> hooksClass = ClassLoader.getSystemClassLoader().loadClass("java.lang.ApplicationShutdownHooks"); Field hooksField = ReflectionUtils.getFieldByName(hooksClass, "hooks"); @SuppressWarnings("unchecked") Map<Thread, ?> hooks = (Map<Thread, ?>) hooksField.get(null); List<Thread> threads = ImmutableList.copyOf(hooks.keySet()); for (Thread thread : threads) { ClassLoader contextClassLoader = thread.getContextClassLoader(); if (contextClassLoader == devClassLoader) { thread.setContextClassLoader(ClassLoader.getSystemClassLoader()); thread.run(); hooks.remove(thread); } } } catch (Throwable e) { e.printStackTrace(); } // close com.google.gwt.dev.util.DiskCache try { Class<?> classDiskCache = devClassLoader.loadClass("com.google.gwt.dev.util.DiskCache"); Object cacheInstance = ReflectionUtils.getFieldObject(classDiskCache, "INSTANCE"); ReflectionUtils.invokeMethod(cacheInstance, "close()"); } catch (Throwable e) { } // find embedded Guava Finalizer and clear reference of our "dev" URLClassLoader try { Thread[] threads = getAllThreads(); for (Thread thread : threads) { if (thread != null && thread.getContextClassLoader() == devClassLoader) { thread.setContextClassLoader(null); } } } catch (Throwable e) { }*/ } // if (browserShell != null) { browserShell.dispose(); } logSupport.dispose(); moduleSpaceHost = null; impl = null; projectClassLoader = null; dispatchIdOracle = null; }