package org.jboss.seam.ioc.guice; import com.google.inject.Guice; import com.google.inject.Module; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.*; import static org.jboss.seam.annotations.Install.FRAMEWORK; import org.jboss.seam.log.LogProvider; import org.jboss.seam.log.Logging; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Creates Guice injector from a list of modules. * * @author Pawel Wrzeszcz (pwrzeszcz [at] jboss . org) */ @Name("org.jboss.seam.ioc.guice.injector") @Scope(ScopeType.APPLICATION) @Startup @Install(value=false, precedence = FRAMEWORK) public class Injector implements Serializable { private static final long serialVersionUID = 8935525407647910950L; private static final LogProvider log = Logging.getLogProvider(Injector.class); private String[] modules; private com.google.inject.Injector injector = null; @Unwrap public com.google.inject.Injector getInjector() { return injector; } @Create public void createInjector() throws IllegalAccessException, InstantiationException, ClassNotFoundException { if ((modules == null) || (modules.length == 0)) { throw new IllegalArgumentException("No Guice module specified."); } log.debug("Creating injector '" + "'from modules: " + Arrays.toString(modules)); final List<Module> moduleList = getModuleList(modules); injector = Guice.createInjector(moduleList); } private static List<Module> getModuleList(String[] modules) throws IllegalAccessException, InstantiationException, ClassNotFoundException { List<Module> moduleList = new ArrayList<Module>(); for (String m : modules) { Module module = getModule(m); moduleList.add(module); } return moduleList; } private static Module getModule(String className) { try { final Class<?> clazz = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); return (Module) clazz.newInstance(); } catch (Exception e) { throw new IllegalArgumentException("Unable to create guice module: " + className, e); } } public String[] getModules() { return modules; } public void setModules(String[] modules) { this.modules = modules; } }