code: /*
   * generated by Xtext 2.18.0.M3
   */
  package co.edu.uniandes.accordant_dv.tests;
  
  import co.edu.uniandes.accordant_dv.AdvlRuntimeModule;
  import co.edu.uniandes.accordant_dv.AdvlStandaloneSetup;
  import com.google.inject.Guice;
  import com.google.inject.Injector;
  import org.eclipse.xtext.testing.GlobalRegistries;
  import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento;
  import org.eclipse.xtext.testing.IInjectorProvider;
  import org.eclipse.xtext.testing.IRegistryConfigurator;
  
  public class AdvlInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
  
  	protected GlobalStateMemento stateBeforeInjectorCreation;
  	protected GlobalStateMemento stateAfterInjectorCreation;
  	protected Injector injector;
  
  	static {
  		GlobalRegistries.initializeDefaults();
  	}
  
  	@Override
  	public Injector getInjector() {
  		if (injector == null) {
  			this.injector = internalCreateInjector();
  			stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
  		}
  		return injector;
  	}
  
  	protected Injector internalCreateInjector() {
  		return new AdvlStandaloneSetup() {
  			@Override
  			public Injector createInjector() {
  				return Guice.createInjector(createRuntimeModule());
  			}
  		}.createInjectorAndDoEMFRegistration();
  	}
  
  	protected AdvlRuntimeModule createRuntimeModule() {
  		// make it work also with Maven/Tycho and OSGI
  		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=493672
  		return new AdvlRuntimeModule() {
  			@Override
  			public ClassLoader bindClassLoaderToInstance() {
  				return AdvlInjectorProvider.class
  						.getClassLoader();
  			}
  		};
  	}
  
  	@Override
  	public void restoreRegistry() {
  		stateBeforeInjectorCreation.restoreGlobalState();
  		stateBeforeInjectorCreation = null;
  	}
  
  	@Override
  	public void setupRegistry() {
  		stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
  		if (injector == null) {
  			getInjector();
  		}
  		stateAfterInjectorCreation.restoreGlobalState();
  	}
  }
  