ProjectAres/PGM/src/main/java/tc/oc/pgm/map/MapModuleManifest.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);
}
}