56 lines
1.7 KiB
Java
56 lines
1.7 KiB
Java
package tc.oc.pgm.map;
|
|
|
|
import java.util.Optional;
|
|
import javax.inject.Inject;
|
|
import javax.inject.Provider;
|
|
|
|
import com.google.inject.MembersInjector;
|
|
import tc.oc.commons.core.reflect.Types;
|
|
import tc.oc.pgm.map.inject.MapScoped;
|
|
import tc.oc.pgm.match.MatchModuleFactory;
|
|
import tc.oc.pgm.match.inject.MatchModuleFactoryManifest;
|
|
import tc.oc.pgm.module.ModuleLoadException;
|
|
import tc.oc.pgm.module.ModuleManifest;
|
|
|
|
/**
|
|
* Configures a {@link MapModule} that is created by a {@link MapModuleParser}.
|
|
*
|
|
* {@link MapModuleParser#parse} can return null to omit the module.
|
|
*/
|
|
public abstract class MapModuleManifest<M extends MapModule> extends ModuleManifest<MapModule, MapScoped, MapModuleContext, M> {
|
|
|
|
protected MapModuleManifest() {
|
|
super(null);
|
|
}
|
|
|
|
@Override
|
|
protected void configure() {
|
|
super.configure();
|
|
|
|
// Eagerly acquire the parser
|
|
parser = parser();
|
|
|
|
// If the MapModule is also a MatchModuleFactory, configure that as well.
|
|
if(Types.isAssignable(MatchModuleFactory.class, type)) {
|
|
install(new MatchModuleFactoryManifest(key));
|
|
}
|
|
}
|
|
|
|
protected abstract MapModuleParser<M> parser();
|
|
|
|
private MapModuleParser<M> parser;
|
|
|
|
private @Inject MembersInjector<M> injector;
|
|
private @Inject Provider<MapModuleContext> contextProvider;
|
|
|
|
@Override
|
|
protected Optional<M> provisionModuleWithoutDependencies() throws ModuleLoadException {
|
|
final MapModuleContext context = contextProvider.get();
|
|
final M module = parser.parse(context, context.logger(), context.xmlDocument());
|
|
if(module != null) {
|
|
injector.injectMembers(module);
|
|
}
|
|
return Optional.ofNullable(module);
|
|
}
|
|
}
|