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 extends ModuleManifest { 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 parser(); private MapModuleParser parser; private @Inject MembersInjector injector; private @Inject Provider contextProvider; @Override protected Optional 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); } }