I've figured out the answer with clay's eye opener answer. (Thank you!)
First, a bean which loads the modules.xml
:
import static com.google.common.collect.Lists.newArrayList;
import java.util.List;
import javax.annotation.PreDestroy;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Singleton;
@Singleton
public class RequiredModuleConfigurationLoader {
private final List<RequiredModuleConfiguration> configurationList =
newArrayList();
public RequiredModuleConfigurationLoader() {
// read the XML file here
configurationList.add(new RequiredModuleConfiguration(
"cdiproto.ModuleOne", "moduleConfig1"));
configurationList.add(new RequiredModuleConfiguration(
"cdiproto.ModuleTwo", "moduleConfig2"));
}
@Produces
public List<RequiredModuleConfiguration> getRequiredModuleConfigurations() {
return newArrayList(configurationList);
}
@Produces
public ModuleConfiguration getModuleConfiguration(
final InjectionPoint injectionPoint) {
final String injectedClassName = injectionPoint.getMember()
.getDeclaringClass().getName();
for (final RequiredModuleConfiguration requiredModuleConfiguration:
configurationList) {
final String moduleClassName =
requiredModuleConfiguration.getClassName();
if (moduleClassName.equals(injectedClassName)) {
final String option =
requiredModuleConfiguration.getSubConfiguration();
return new ModuleConfiguration(option);
}
}
throw new IllegalStateException("Unknown module: " +
injectedClassName);
}
}
It also produces the configuration instance for every module based on the InjectionPoint
.
The Application class, which loads the modules based on the XML configuration is the following:
import static com.google.common.collect.Lists.newArrayList;
import java.lang.annotation.Annotation;
import java.util.List;
import javax.annotation.PreDestroy;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class Application {
private final Annotation qualifiers = new AnnotationLiteral<Any>() { };
@Inject
private List<RequiredModuleConfiguration> requiredModuleConfigurationInstance;
@Inject
private Instance<Module> moduleInstance;
private final List<Module> modules = newArrayList();
public void init() throws Exception {
for (final RequiredModuleConfiguration requiredModuleConfiguration:
requiredModuleConfigurationInstance) {
final String className = requiredModuleConfiguration.getClassName();
final Class<Module> moduleClass =
(Class<Module>) Class.forName(className);
final Instance<Module> currentModuleInstance =
moduleInstance.select(moduleClass, qualifiers);
final Module module = currentModuleInstance.get();
modules.add(module);
}
...
}
...
}
And a sample module:
import javax.inject.Inject;
public class ModuleOne implements Module {
@Inject
private ModuleConfiguration moduleConfiguration;
@Inject
ModuleTwo moduleTwo;
public String getName() {
return "moduleOne name";
}
}