package tc.oc.pgm.match.inject;
import java.util.Optional;
import javax.inject.Provider;
import com.google.inject.Key;
import com.google.inject.MembersInjector;
import tc.oc.commons.core.inject.Injection;
import tc.oc.commons.core.inject.Keys;
import tc.oc.pgm.match.MatchModule;
import tc.oc.pgm.match.MatchModuleFactory;
/**
* Manifest for a {@link MatchModule} that is created by a {@link MatchModuleFactory}
*/
public class MatchModuleFactoryManifest<M extends MatchModule, F extends MatchModuleFactory<M>> extends MatchModuleManifest<M> {
private final Key<Optional<F>> factoryKey;
public MatchModuleFactoryManifest(Key<F> factoryKey) {
super(MatchModuleFactory.matchModuleType(factoryKey.getTypeLiteral()));
this.factoryKey = Keys.optional(factoryKey);
}
@Override
protected void configure() {
super.configure();
factoryProvider = getProvider(factoryKey);
membersInjector = getMembersInjector(type);
}
private Provider<Optional<F>> factoryProvider;
private MembersInjector<M> membersInjector;
@Override
protected Optional<M> provisionModuleWithoutFiltering() {
return factoryProvider.get().flatMap(Injection.wrappingExceptions(factory -> {
final M module = factory.createMatchModule(matchProvider.get());
if(module != null) {
membersInjector.injectMembers(module);
}
return Optional.ofNullable(module);
}));
}
}