package tc.oc.pgm.filters; import javax.inject.Provider; import com.google.inject.Provides; import tc.oc.api.docs.SemanticVersion; import tc.oc.commons.core.inject.HybridManifest; import tc.oc.pgm.features.FeatureBinder; import tc.oc.pgm.features.FeatureDefinitionParser; import tc.oc.pgm.filters.matcher.CauseFilter; import tc.oc.pgm.filters.parser.FilterDefinitionParser; import tc.oc.pgm.filters.parser.FilterParser; import tc.oc.pgm.filters.parser.LegacyFilterDefinitionParser; import tc.oc.pgm.filters.parser.LegacyFilterParser; import tc.oc.pgm.map.MapProto; import tc.oc.pgm.map.MapRootParser; import tc.oc.pgm.map.ProtoVersions; import tc.oc.pgm.map.inject.MapScoped; import tc.oc.pgm.match.inject.MatchBinders; import tc.oc.pgm.match.inject.MatchScoped; import tc.oc.pgm.xml.parser.ParserBinders; public class FilterManifest extends HybridManifest implements MatchBinders, ParserBinders { @Override protected void configure() { installFactory(CauseFilter.Factory.class); final FeatureBinder<Filter> features = new FeatureBinder<>(binder(), Filter.class); features.bindParser().to(FilterParser.class); bind(LegacyFilterParser.class).in(MapScoped.class); bind(ModernFilterParser.class).in(MapScoped.class); bind(LegacyFilterDefinitionParser.class).in(MapScoped.class); bind(FilterDefinitionParser.class).in(MapScoped.class); bind(FilterMatchModule.class).in(MatchScoped.class); bind(FilterDispatcher.class).to(FilterMatchModule.class); linkOptional(FilterMatchModule.class); linkOptional(FilterParser.class); matchListener(FilterMatchModule.class); inSet(MapRootParser.class) .addBinding() .to(FilterParser.class) .in(MapScoped.class); } @Provides @MapScoped protected FilterParser filterParser(@MapProto SemanticVersion proto, Provider<ModernFilterParser> modern, Provider<LegacyFilterParser> legacy) { return (proto.isOlderThan(ProtoVersions.FILTER_FEATURES) ? legacy : modern).get(); } @Provides @MapScoped FeatureDefinitionParser<Filter> filterDefinitionParser(@MapProto SemanticVersion proto, Provider<FilterDefinitionParser> modern, Provider<LegacyFilterDefinitionParser> legacy) { return (proto.isOlderThan(ProtoVersions.FILTER_FEATURES) ? legacy : modern).get(); } } // This allows us to bind FilterParser to the provider above class ModernFilterParser extends FilterParser {}