/* * Copyright 2013 Guidewire Software, Inc. */ package gw.lang.init; import gw.lang.UnstableAPI; import gw.lang.reflect.module.IExecutionEnvironment; import gw.lang.reflect.module.IModule; import gw.util.GosuExceptionUtil; import java.lang.reflect.Method; import java.util.List; import java.util.Map; import java.util.WeakHashMap; @UnstableAPI public class GosuInitialization { private static final Map<IExecutionEnvironment, GosuInitialization> INSTANCES = new WeakHashMap<IExecutionEnvironment, GosuInitialization>(); private IExecutionEnvironment _execEnv; private boolean _initialized; public static GosuInitialization instance( IExecutionEnvironment execEnv ) { GosuInitialization gi = INSTANCES.get( execEnv ); if( gi == null ) { INSTANCES.put( execEnv, gi = new GosuInitialization( execEnv ) ); } return gi; } public static boolean isAnythingInitialized() { return !INSTANCES.isEmpty(); } private GosuInitialization( IExecutionEnvironment execEnv ) { _execEnv = execEnv; _initialized = false; } public boolean isInitialized() { return _initialized; } // single module (i.e. runtime) public void uninitializeRuntime() { if (!_initialized) { return; } _initialized = false; try { Class cls = Class.forName("gw.internal.gosu.init.InternalGosuInit"); Method m = cls.getMethod("uninitializeRuntime", IExecutionEnvironment.class ); m.invoke( null, _execEnv ); } catch (Exception e) { throw new RuntimeException(e); } } public void initializeRuntime( List<GosuPathEntry> pathEntries ) { if (_initialized) { throw new IllegalStateException("Illegal attempt to re-initialize Gosu"); } callMethod("initializeRuntime", pathEntries); _initialized = true; } public void reinitializeRuntime( List<GosuPathEntry> pathEntries ) { if (_initialized) { uninitializeRuntime(); callMethod("reinitializeRuntime", pathEntries); } else { callMethod("initializeRuntime", pathEntries); } _initialized = true; } // multiple modules public void initializeMultipleModules( List<? extends IModule> modules ) { if (_initialized) { throw new IllegalStateException("Illegal attempt to initialize Gosu"); } try { Class cls = Class.forName("gw.internal.gosu.init.InternalGosuInit"); Method m = cls.getMethod("initializeMultipleModules", IExecutionEnvironment.class, List.class); m.invoke(null, _execEnv, modules); } catch (Exception e) { throw new RuntimeException(e); } _initialized = true; } public void uninitializeMultipleModules() { if (!_initialized) { throw new IllegalStateException("Illegal attempt to uninitialize Gosu"); } try { Class cls = Class.forName("gw.internal.gosu.init.InternalGosuInit"); Method m = cls.getMethod("uninitializeMultipleModules", IExecutionEnvironment.class ); m.invoke(null, _execEnv ); } catch (Exception e) { throw new RuntimeException(e); } _initialized = true; } // utilities private void callMethod( String methodName, List<GosuPathEntry> pathEntries ) { try { Class cls = Class.forName("gw.internal.gosu.init.InternalGosuInit"); Method m = cls.getMethod(methodName, IExecutionEnvironment.class, List.class); m.invoke(null, _execEnv, pathEntries); } catch (Exception e) { throw GosuExceptionUtil.forceThrow( e ); } } }