diff --git a/core/src/main/java/org/elasticsearch/cluster/ClusterModule.java b/core/src/main/java/org/elasticsearch/cluster/ClusterModule.java index 7a4a3e0722d..69f43b5b7c1 100644 --- a/core/src/main/java/org/elasticsearch/cluster/ClusterModule.java +++ b/core/src/main/java/org/elasticsearch/cluster/ClusterModule.java @@ -125,9 +125,9 @@ public class ClusterModule extends AbstractModule { private final Settings settings; private final DynamicSettings.Builder clusterDynamicSettings = new DynamicSettings.Builder(); private final DynamicSettings.Builder indexDynamicSettings = new DynamicSettings.Builder(); - private final ExtensionPoint.TypeExtensionPoint shardsAllocators = new ExtensionPoint.TypeExtensionPoint<>("shards_allocator", ShardsAllocator.class); - private final ExtensionPoint.SetExtensionPoint allocationDeciders = new ExtensionPoint.SetExtensionPoint<>("allocation_decider", AllocationDecider.class, AllocationDeciders.class); - private final ExtensionPoint.SetExtensionPoint indexTemplateFilters = new ExtensionPoint.SetExtensionPoint<>("index_template_filter", IndexTemplateFilter.class); + private final ExtensionPoint.SelectedType shardsAllocators = new ExtensionPoint.SelectedType<>("shards_allocator", ShardsAllocator.class); + private final ExtensionPoint.ClassSet allocationDeciders = new ExtensionPoint.ClassSet<>("allocation_decider", AllocationDecider.class, AllocationDeciders.class); + private final ExtensionPoint.ClassSet indexTemplateFilters = new ExtensionPoint.ClassSet<>("index_template_filter", IndexTemplateFilter.class); // pkg private so tests can mock Class clusterInfoServiceImpl = InternalClusterInfoService.class; diff --git a/core/src/main/java/org/elasticsearch/common/geo/ShapesAvailability.java b/core/src/main/java/org/elasticsearch/common/geo/ShapesAvailability.java index fce18337728..8af203f2ce8 100644 --- a/core/src/main/java/org/elasticsearch/common/geo/ShapesAvailability.java +++ b/core/src/main/java/org/elasticsearch/common/geo/ShapesAvailability.java @@ -19,8 +19,6 @@ package org.elasticsearch.common.geo; -import org.elasticsearch.common.Classes; - /** */ public class ShapesAvailability { @@ -48,8 +46,5 @@ public class ShapesAvailability { JTS_AVAILABLE = xJTS_AVAILABLE; } - - private ShapesAvailability() { - - } + private ShapesAvailability() {} } diff --git a/core/src/main/java/org/elasticsearch/common/inject/spi/ProviderLookup.java b/core/src/main/java/org/elasticsearch/common/inject/spi/ProviderLookup.java index 44c35779def..06a732b192a 100644 --- a/core/src/main/java/org/elasticsearch/common/inject/spi/ProviderLookup.java +++ b/core/src/main/java/org/elasticsearch/common/inject/spi/ProviderLookup.java @@ -34,6 +34,31 @@ import static com.google.common.base.Preconditions.checkState; * @since 2.0 */ public final class ProviderLookup implements Element { + + // NOTE: this class is not part of guice and was added so the provder lookup's key can be acessible for tests + public static class ProviderImpl implements Provider { + private ProviderLookup lookup; + + private ProviderImpl(ProviderLookup lookup) { + this.lookup = lookup; + } + + @Override + public T get() { + checkState(lookup.delegate != null, + "This Provider cannot be used until the Injector has been created."); + return lookup.delegate.get(); + } + + @Override + public String toString() { + return "Provider<" + lookup.key.getTypeLiteral() + ">"; + } + + public Key getKey() { + return lookup.getKey(); + } + } private final Object source; private final Key key; private Provider delegate; @@ -86,18 +111,6 @@ public final class ProviderLookup implements Element { * IllegalStateException} if you try to use it beforehand. */ public Provider getProvider() { - return new Provider() { - @Override - public T get() { - checkState(delegate != null, - "This Provider cannot be used until the Injector has been created."); - return delegate.get(); - } - - @Override - public String toString() { - return "Provider<" + key.getTypeLiteral() + ">"; - } - }; + return new ProviderImpl<>(this); } } diff --git a/core/src/main/java/org/elasticsearch/common/util/ExtensionPoint.java b/core/src/main/java/org/elasticsearch/common/util/ExtensionPoint.java index 5414c4eb7a6..258aa30c1b8 100644 --- a/core/src/main/java/org/elasticsearch/common/util/ExtensionPoint.java +++ b/core/src/main/java/org/elasticsearch/common/util/ExtensionPoint.java @@ -31,21 +31,18 @@ import java.util.*; * all extensions by a single name and ensures that extensions are not registered * more than once. */ -public abstract class ExtensionPoint { +public abstract class ExtensionPoint { protected final String name; - protected final Class extensionClass; protected final Class[] singletons; /** * Creates a new extension point * * @param name the human readable underscore case name of the extension point. This is used in error messages etc. - * @param extensionClass the base class that should be extended * @param singletons a list of singletons to bind with this extension point - these are bound in {@link #bind(Binder)} */ - public ExtensionPoint(String name, Class extensionClass, Class... singletons) { + public ExtensionPoint(String name, Class... singletons) { this.name = name; - this.extensionClass = extensionClass; this.singletons = singletons; } @@ -62,29 +59,30 @@ public abstract class ExtensionPoint { } /** - * Subclasses can bind their type, map or set exentions here. + * Subclasses can bind their type, map or set extensions here. */ protected abstract void bindExtensions(Binder binder); /** * A map based extension point which allows to register keyed implementations ie. parsers or some kind of strategies. */ - public static class MapExtensionPoint extends ExtensionPoint { + public static class ClassMap extends ExtensionPoint { + protected final Class extensionClass; private final Map> extensions = new HashMap<>(); private final Set reservedKeys; /** - * Creates a new {@link org.elasticsearch.common.util.ExtensionPoint.MapExtensionPoint} + * Creates a new {@link ClassMap} * * @param name the human readable underscore case name of the extension poing. This is used in error messages etc. * @param extensionClass the base class that should be extended * @param singletons a list of singletons to bind with this extension point - these are bound in {@link #bind(Binder)} * @param reservedKeys a set of reserved keys by internal implementations */ - public MapExtensionPoint(String name, Class extensionClass, Set reservedKeys, Class... singletons) { - super(name, extensionClass, singletons); + public ClassMap(String name, Class extensionClass, Set reservedKeys, Class... singletons) { + super(name, singletons); + this.extensionClass = extensionClass; this.reservedKeys = reservedKeys; - } /** @@ -118,13 +116,13 @@ public abstract class ExtensionPoint { } /** - * A Type extension point which basically allows to registerd keyed extensions like {@link org.elasticsearch.common.util.ExtensionPoint.MapExtensionPoint} + * A Type extension point which basically allows to registerd keyed extensions like {@link ClassMap} * but doesn't instantiate and bind all the registered key value pairs but instead replace a singleton based on a given setting via {@link #bindType(Binder, Settings, String, String)} * Note: {@link #bind(Binder)} is not supported by this class */ - public static final class TypeExtensionPoint extends MapExtensionPoint { + public static final class SelectedType extends ClassMap { - public TypeExtensionPoint(String name, Class extensionClass) { + public SelectedType(String name, Class extensionClass) { super(name, extensionClass, Collections.EMPTY_SET); } @@ -153,18 +151,20 @@ public abstract class ExtensionPoint { /** * A set based extension point which allows to register extended classes that might be used to chain additional functionality etc. */ - public final static class SetExtensionPoint extends ExtensionPoint { + public final static class ClassSet extends ExtensionPoint { + protected final Class extensionClass; private final Set> extensions = new HashSet<>(); /** - * Creates a new {@link org.elasticsearch.common.util.ExtensionPoint.SetExtensionPoint} + * Creates a new {@link ClassSet} * * @param name the human readable underscore case name of the extension poing. This is used in error messages etc. * @param extensionClass the base class that should be extended * @param singletons a list of singletons to bind with this extension point - these are bound in {@link #bind(Binder)} */ - public SetExtensionPoint(String name, Class extensionClass, Class... singletons) { - super(name, extensionClass, singletons); + public ClassSet(String name, Class extensionClass, Class... singletons) { + super(name, singletons); + this.extensionClass = extensionClass; } /** @@ -188,4 +188,46 @@ public abstract class ExtensionPoint { } } } + + /** + * A an instance of a map, mapping one instance value to another. Both key and value are instances, not classes + * like with other extension points. + */ + public final static class InstanceMap extends ExtensionPoint { + private final Map map = new HashMap<>(); + private final Class keyType; + private final Class valueType; + + /** + * Creates a new {@link ClassSet} + * + * @param name the human readable underscore case name of the extension point. This is used in error messages. + * @param singletons a list of singletons to bind with this extension point - these are bound in {@link #bind(Binder)} + */ + public InstanceMap(String name, Class keyType, Class valueType, Class... singletons) { + super(name, singletons); + this.keyType = keyType; + this.valueType = valueType; + } + + /** + * Registers a mapping from {@param key} to {@param value} + * + * @throws IllegalArgumentException iff the key is already registered + */ + public final void registerExtension(K key, V value) { + V old = map.put(key, value); + if (old != null) { + throw new IllegalArgumentException("Cannot register [" + this.name + "] with key [" + key + "] to [" + value + "], already registered to [" + old + "]"); + } + } + + @Override + protected void bindExtensions(Binder binder) { + MapBinder mapBinder = MapBinder.newMapBinder(binder, keyType, valueType); + for (Map.Entry entry : map.entrySet()) { + mapBinder.addBinding(entry.getKey()).toInstance(entry.getValue()); + } + } + } } diff --git a/core/src/main/java/org/elasticsearch/indices/IndicesModule.java b/core/src/main/java/org/elasticsearch/indices/IndicesModule.java index 4e8946b5339..2704478ed42 100644 --- a/core/src/main/java/org/elasticsearch/indices/IndicesModule.java +++ b/core/src/main/java/org/elasticsearch/indices/IndicesModule.java @@ -19,15 +19,18 @@ package org.elasticsearch.indices; -import com.google.common.collect.ImmutableList; - +import org.apache.lucene.analysis.hunspell.Dictionary; import org.elasticsearch.action.update.UpdateHelper; import org.elasticsearch.cluster.metadata.MetaDataIndexUpgradeService; +import org.elasticsearch.common.geo.ShapesAvailability; import org.elasticsearch.common.inject.AbstractModule; -import org.elasticsearch.common.inject.Module; -import org.elasticsearch.common.inject.SpawnModules; +import org.elasticsearch.common.inject.multibindings.MapBinder; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; +import org.elasticsearch.common.util.ExtensionPoint; +import org.elasticsearch.index.query.*; +import org.elasticsearch.index.query.functionscore.FunctionScoreQueryParser; +import org.elasticsearch.indices.analysis.HunspellService; +import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.indices.cache.query.IndicesQueryCache; import org.elasticsearch.indices.cache.request.IndicesRequestCache; import org.elasticsearch.indices.cluster.IndicesClusterStateService; @@ -35,7 +38,6 @@ import org.elasticsearch.indices.fielddata.cache.IndicesFieldDataCache; import org.elasticsearch.indices.fielddata.cache.IndicesFieldDataCacheListener; import org.elasticsearch.indices.flush.SyncedFlushService; import org.elasticsearch.indices.memory.IndexingMemoryController; -import org.elasticsearch.indices.query.IndicesQueriesModule; import org.elasticsearch.indices.recovery.RecoverySettings; import org.elasticsearch.indices.recovery.RecoverySource; import org.elasticsearch.indices.recovery.RecoveryTarget; @@ -43,28 +45,100 @@ import org.elasticsearch.indices.store.IndicesStore; import org.elasticsearch.indices.store.TransportNodesListShardStoreMetaData; import org.elasticsearch.indices.ttl.IndicesTTLService; +import java.security.cert.Extension; +import java.util.HashMap; +import java.util.Map; + /** - * + * Configures classes and services that are shared by indices on each node. */ -public class IndicesModule extends AbstractModule implements SpawnModules { +public class IndicesModule extends AbstractModule { private final Settings settings; + private final ExtensionPoint.ClassSet queryParsers + = new ExtensionPoint.ClassSet<>("query_parser", QueryParser.class); + private final ExtensionPoint.InstanceMap hunspellDictionaries + = new ExtensionPoint.InstanceMap<>("hunspell_dictionary", String.class, Dictionary.class); + public IndicesModule(Settings settings) { this.settings = settings; + registerBuiltinQueryParsers(); + } + + private void registerBuiltinQueryParsers() { + registerQueryParser(MatchQueryParser.class); + registerQueryParser(MultiMatchQueryParser.class); + registerQueryParser(NestedQueryParser.class); + registerQueryParser(HasChildQueryParser.class); + registerQueryParser(HasParentQueryParser.class); + registerQueryParser(DisMaxQueryParser.class); + registerQueryParser(IdsQueryParser.class); + registerQueryParser(MatchAllQueryParser.class); + registerQueryParser(QueryStringQueryParser.class); + registerQueryParser(BoostingQueryParser.class); + registerQueryParser(BoolQueryParser.class); + registerQueryParser(TermQueryParser.class); + registerQueryParser(TermsQueryParser.class); + registerQueryParser(FuzzyQueryParser.class); + registerQueryParser(RegexpQueryParser.class); + registerQueryParser(RangeQueryParser.class); + registerQueryParser(PrefixQueryParser.class); + registerQueryParser(WildcardQueryParser.class); + registerQueryParser(FilteredQueryParser.class); + registerQueryParser(ConstantScoreQueryParser.class); + registerQueryParser(SpanTermQueryParser.class); + registerQueryParser(SpanNotQueryParser.class); + registerQueryParser(SpanWithinQueryParser.class); + registerQueryParser(SpanContainingQueryParser.class); + registerQueryParser(FieldMaskingSpanQueryParser.class); + registerQueryParser(SpanFirstQueryParser.class); + registerQueryParser(SpanNearQueryParser.class); + registerQueryParser(SpanOrQueryParser.class); + registerQueryParser(MoreLikeThisQueryParser.class); + registerQueryParser(WrapperQueryParser.class); + registerQueryParser(IndicesQueryParser.class); + registerQueryParser(CommonTermsQueryParser.class); + registerQueryParser(SpanMultiTermQueryParser.class); + registerQueryParser(FunctionScoreQueryParser.class); + registerQueryParser(SimpleQueryStringParser.class); + registerQueryParser(TemplateQueryParser.class); + registerQueryParser(TypeQueryParser.class); + registerQueryParser(LimitQueryParser.class); + registerQueryParser(ScriptQueryParser.class); + registerQueryParser(GeoDistanceQueryParser.class); + registerQueryParser(GeoDistanceRangeQueryParser.class); + registerQueryParser(GeoBoundingBoxQueryParser.class); + registerQueryParser(GeohashCellQuery.Parser.class); + registerQueryParser(GeoPolygonQueryParser.class); + registerQueryParser(QueryFilterParser.class); + registerQueryParser(FQueryFilterParser.class); + registerQueryParser(AndQueryParser.class); + registerQueryParser(OrQueryParser.class); + registerQueryParser(NotQueryParser.class); + registerQueryParser(ExistsQueryParser.class); + registerQueryParser(MissingQueryParser.class); + + if (ShapesAvailability.JTS_AVAILABLE) { + registerQueryParser(GeoShapeQueryParser.class); + } } - @Override - public Iterable spawnModules() { - return ImmutableList.of(new IndicesQueriesModule(), new IndicesAnalysisModule()); + public void registerQueryParser(Class queryParser) { + queryParsers.registerExtension(queryParser); + } + + public void registerHunspellDictionary(String name, Dictionary dictionary) { + hunspellDictionaries.registerExtension(name, dictionary); } @Override protected void configure() { + bindQueryParsersExtension(); + bindHunspellExtension(); + bind(IndicesLifecycle.class).to(InternalIndicesLifecycle.class).asEagerSingleton(); - bind(IndicesService.class).asEagerSingleton(); - bind(RecoverySettings.class).asEagerSingleton(); bind(RecoveryTarget.class).asEagerSingleton(); bind(RecoverySource.class).asEagerSingleton(); @@ -80,7 +154,16 @@ public class IndicesModule extends AbstractModule implements SpawnModules { bind(IndicesWarmer.class).asEagerSingleton(); bind(UpdateHelper.class).asEagerSingleton(); bind(MetaDataIndexUpgradeService.class).asEagerSingleton(); - bind(IndicesFieldDataCacheListener.class).asEagerSingleton(); } + + protected void bindQueryParsersExtension() { + queryParsers.bind(binder()); + } + + protected void bindHunspellExtension() { + hunspellDictionaries.bind(binder()); + bind(HunspellService.class).asEagerSingleton(); + bind(IndicesAnalysisService.class).asEagerSingleton(); + } } diff --git a/core/src/main/java/org/elasticsearch/indices/analysis/IndicesAnalysisModule.java b/core/src/main/java/org/elasticsearch/indices/analysis/IndicesAnalysisModule.java deleted file mode 100644 index 5c5de5f4356..00000000000 --- a/core/src/main/java/org/elasticsearch/indices/analysis/IndicesAnalysisModule.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.indices.analysis; - -import com.google.common.collect.Maps; -import org.apache.lucene.analysis.hunspell.Dictionary; -import org.elasticsearch.common.inject.AbstractModule; -import org.elasticsearch.common.inject.multibindings.MapBinder; - -import java.util.Map; - -public class IndicesAnalysisModule extends AbstractModule { - - private final Map hunspellDictionaries = Maps.newHashMap(); - - public void addHunspellDictionary(String lang, Dictionary dictionary) { - hunspellDictionaries.put(lang, dictionary); - } - - @Override - protected void configure() { - bind(IndicesAnalysisService.class).asEagerSingleton(); - - MapBinder dictionariesBinder = MapBinder.newMapBinder(binder(), String.class, Dictionary.class); - for (Map.Entry entry : hunspellDictionaries.entrySet()) { - dictionariesBinder.addBinding(entry.getKey()).toInstance(entry.getValue()); - } - bind(HunspellService.class).asEagerSingleton(); - } -} \ No newline at end of file diff --git a/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesModule.java b/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesModule.java deleted file mode 100644 index fb7ca1784e3..00000000000 --- a/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesModule.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.indices.query; - -import com.google.common.collect.Sets; -import org.elasticsearch.common.geo.ShapesAvailability; -import org.elasticsearch.common.inject.AbstractModule; -import org.elasticsearch.common.inject.multibindings.Multibinder; -import org.elasticsearch.index.query.*; -import org.elasticsearch.index.query.functionscore.FunctionScoreQueryParser; - -import java.util.Set; - -public class IndicesQueriesModule extends AbstractModule { - - private Set> queryParsersClasses = Sets.newHashSet(); - - public synchronized IndicesQueriesModule addQuery(Class queryParser) { - queryParsersClasses.add(queryParser); - return this; - } - - @Override - protected void configure() { - bind(IndicesQueriesRegistry.class).asEagerSingleton(); - - Multibinder qpBinders = Multibinder.newSetBinder(binder(), QueryParser.class); - for (Class queryParser : queryParsersClasses) { - qpBinders.addBinding().to(queryParser).asEagerSingleton(); - } - qpBinders.addBinding().to(MatchQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(MultiMatchQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(NestedQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(HasChildQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(HasParentQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(DisMaxQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(IdsQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(MatchAllQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(QueryStringQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(BoostingQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(BoolQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(TermQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(TermsQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(FuzzyQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(RegexpQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(RangeQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(PrefixQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(WildcardQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(FilteredQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(ConstantScoreQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SpanTermQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SpanNotQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SpanWithinQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SpanContainingQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(FieldMaskingSpanQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SpanFirstQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SpanNearQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SpanOrQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(MoreLikeThisQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(WrapperQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(IndicesQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(CommonTermsQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SpanMultiTermQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(FunctionScoreQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(SimpleQueryStringParser.class).asEagerSingleton(); - qpBinders.addBinding().to(TemplateQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(TypeQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(LimitQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(TermsQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(ScriptQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(GeoDistanceQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(GeoDistanceRangeQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(GeoBoundingBoxQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(GeohashCellQuery.Parser.class).asEagerSingleton(); - qpBinders.addBinding().to(GeoPolygonQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(QueryFilterParser.class).asEagerSingleton(); - qpBinders.addBinding().to(FQueryFilterParser.class).asEagerSingleton(); - qpBinders.addBinding().to(AndQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(OrQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(NotQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(ExistsQueryParser.class).asEagerSingleton(); - qpBinders.addBinding().to(MissingQueryParser.class).asEagerSingleton(); - - if (ShapesAvailability.JTS_AVAILABLE) { - qpBinders.addBinding().to(GeoShapeQueryParser.class).asEagerSingleton(); - } - } -} diff --git a/core/src/main/java/org/elasticsearch/search/highlight/Highlighters.java b/core/src/main/java/org/elasticsearch/search/highlight/Highlighters.java index 349227f5c57..1e519957aac 100644 --- a/core/src/main/java/org/elasticsearch/search/highlight/Highlighters.java +++ b/core/src/main/java/org/elasticsearch/search/highlight/Highlighters.java @@ -29,7 +29,7 @@ import java.util.*; /** * An extensions point and registry for all the highlighters a node supports. */ -public class Highlighters extends ExtensionPoint.MapExtensionPoint { +public class Highlighters extends ExtensionPoint.ClassMap { @Deprecated // remove in 3.0 private static final String FAST_VECTOR_HIGHLIGHTER = "fast-vector-highlighter"; diff --git a/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java b/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java index 1be80b57502..25703e80b6a 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java @@ -18,7 +18,6 @@ */ package org.elasticsearch.search.suggest; -import org.elasticsearch.common.inject.Binder; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.util.ExtensionPoint; import org.elasticsearch.script.ScriptService; @@ -31,7 +30,7 @@ import java.util.*; /** * */ -public final class Suggesters extends ExtensionPoint.MapExtensionPoint { +public final class Suggesters extends ExtensionPoint.ClassMap { private final Map parsers; public Suggesters() { diff --git a/core/src/test/java/org/elasticsearch/common/inject/ModuleTestCase.java b/core/src/test/java/org/elasticsearch/common/inject/ModuleTestCase.java index 323b9f5ca4a..2b1330abe63 100644 --- a/core/src/test/java/org/elasticsearch/common/inject/ModuleTestCase.java +++ b/core/src/test/java/org/elasticsearch/common/inject/ModuleTestCase.java @@ -24,12 +24,15 @@ import org.elasticsearch.common.inject.spi.Elements; import org.elasticsearch.common.inject.spi.InstanceBinding; import org.elasticsearch.common.inject.spi.LinkedKeyBinding; import org.elasticsearch.common.inject.spi.ProviderInstanceBinding; +import org.elasticsearch.common.inject.spi.ProviderLookup; import org.elasticsearch.test.ESTestCase; import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -77,7 +80,7 @@ public abstract class ModuleTestCase extends ESTestCase { /** * Configures the module and checks a Map of the "to" class - * is bound to "theClas". + * is bound to "theClass". */ public void assertMapMultiBinding(Module module, Class to, Class theClass) { List elements = Elements.getElements(module); @@ -138,10 +141,18 @@ public abstract class ModuleTestCase extends ESTestCase { assertTrue("Did not find provider for set of " + to.getName(), providerFound); } + /** + * Configures the module, and ensures an instance is bound to the "to" class, and the + * provided tester returns true on the instance. + */ public void assertInstanceBinding(Module module, Class to, Predicate tester) { assertInstanceBindingWithAnnotation(module, to, tester, null); } + /** + * Like {@link #assertInstanceBinding(Module, Class, Predicate)}, but filters the + * classes checked by the given annotation. + */ public void assertInstanceBindingWithAnnotation(Module module, Class to, Predicate tester, Class annotation) { List elements = Elements.getElements(module); for (Element element : elements) { @@ -161,4 +172,39 @@ public abstract class ModuleTestCase extends ESTestCase { } fail("Did not find any instance binding to " + to.getName() + ". Found these bindings:\n" + s); } + + /** + * Configures the module, and ensures a map exists between the "keyType" and "valueType", + * and that all of the "expected" values are bound. + */ + @SuppressWarnings("unchecked") + public void assertMapInstanceBinding(Module module, Class keyType, Class valueType, Map expected) throws Exception { + // this method is insane because java type erasure makes it incredibly difficult... + Map keys = new HashMap<>(); + Map values = new HashMap<>(); + List elements = Elements.getElements(module); + for (Element element : elements) { + if (element instanceof InstanceBinding) { + InstanceBinding binding = (InstanceBinding) element; + if (binding.getKey().getRawType().equals(valueType)) { + values.put(binding.getKey(), (V)binding.getInstance()); + } else if (binding.getInstance() instanceof Map.Entry) { + Map.Entry entry = (Map.Entry)binding.getInstance(); + Object key = entry.getKey(); + Object providerValue = entry.getValue(); + if (key.getClass().equals(keyType) && providerValue instanceof ProviderLookup.ProviderImpl) { + ProviderLookup.ProviderImpl provider = (ProviderLookup.ProviderImpl)providerValue; + keys.put((K)key, provider.getKey()); + } + } + } + } + for (Map.Entry entry : expected.entrySet()) { + Key valueKey = keys.get(entry.getKey()); + assertNotNull("Could not find binding for key [" + entry.getKey() + "], found these keys:\n" + keys.keySet(), valueKey); + V value = values.get(valueKey); + assertNotNull("Could not find value for instance key [" + valueKey + "], found these bindings:\n" + elements); + assertEquals(entry.getValue(), value); + } + } } diff --git a/core/src/test/java/org/elasticsearch/index/analysis/AnalysisModuleTests.java b/core/src/test/java/org/elasticsearch/index/analysis/AnalysisModuleTests.java index 8a81705684d..4a09eeed6b6 100644 --- a/core/src/test/java/org/elasticsearch/index/analysis/AnalysisModuleTests.java +++ b/core/src/test/java/org/elasticsearch/index/analysis/AnalysisModuleTests.java @@ -40,7 +40,6 @@ import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.analysis.filter1.MyFilterTokenFilterFactory; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTestCase; import org.hamcrest.MatcherAssert; @@ -55,7 +54,9 @@ import java.nio.file.Path; import java.util.Set; import static org.elasticsearch.common.settings.Settings.settingsBuilder; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; /** * @@ -66,7 +67,7 @@ public class AnalysisModuleTests extends ESTestCase { public AnalysisService getAnalysisService(Settings settings) { Index index = new Index("test"); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); AnalysisModule analysisModule = new AnalysisModule(settings, parentInjector.getInstance(IndicesAnalysisService.class)); analysisModule.addTokenFilter("myfilter", MyFilterTokenFilterFactory.class); injector = new ModulesBuilder().add( diff --git a/core/src/test/java/org/elasticsearch/index/analysis/AnalysisTestsHelper.java b/core/src/test/java/org/elasticsearch/index/analysis/AnalysisTestsHelper.java index 74ff95d4a14..72eac6860ba 100644 --- a/core/src/test/java/org/elasticsearch/index/analysis/AnalysisTestsHelper.java +++ b/core/src/test/java/org/elasticsearch/index/analysis/AnalysisTestsHelper.java @@ -30,7 +30,7 @@ import org.elasticsearch.env.EnvironmentModule; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; +import org.elasticsearch.indices.IndicesModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import java.nio.file.Path; @@ -52,8 +52,15 @@ public class AnalysisTestsHelper { if (settings.get(IndexMetaData.SETTING_VERSION_CREATED) == null) { settings = Settings.builder().put(settings).put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT).build(); } + IndicesModule indicesModule = new IndicesModule(settings) { + @Override + public void configure() { + // skip services + bindHunspellExtension(); + } + }; Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), - new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + new EnvironmentModule(new Environment(settings)), indicesModule).createInjector(); AnalysisModule analysisModule = new AnalysisModule(settings, parentInjector.getInstance(IndicesAnalysisService.class)); diff --git a/core/src/test/java/org/elasticsearch/index/analysis/CharFilterTests.java b/core/src/test/java/org/elasticsearch/index/analysis/CharFilterTests.java index ef2c6d4e7fb..0171b4cc695 100644 --- a/core/src/test/java/org/elasticsearch/index/analysis/CharFilterTests.java +++ b/core/src/test/java/org/elasticsearch/index/analysis/CharFilterTests.java @@ -29,7 +29,6 @@ import org.elasticsearch.env.EnvironmentModule; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTokenStreamTestCase; import org.junit.Test; @@ -51,7 +50,7 @@ public class CharFilterTests extends ESTokenStreamTestCase { .putArray("index.analysis.analyzer.custom_with_char_filter.char_filter", "my_mapping") .put("path.home", createTempDir().toString()) .build(); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), new IndexNameModule(index), @@ -77,7 +76,7 @@ public class CharFilterTests extends ESTokenStreamTestCase { .putArray("index.analysis.analyzer.custom_with_char_filter.char_filter", "html_strip") .put("path.home", createTempDir().toString()) .build(); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), new IndexNameModule(index), diff --git a/core/src/test/java/org/elasticsearch/index/analysis/CompoundAnalysisTests.java b/core/src/test/java/org/elasticsearch/index/analysis/CompoundAnalysisTests.java index ad81450c336..28b30e9ff5d 100644 --- a/core/src/test/java/org/elasticsearch/index/analysis/CompoundAnalysisTests.java +++ b/core/src/test/java/org/elasticsearch/index/analysis/CompoundAnalysisTests.java @@ -37,7 +37,6 @@ import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.analysis.compound.DictionaryCompoundWordTokenFilterFactory; import org.elasticsearch.index.analysis.filter1.MyFilterTokenFilterFactory; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTestCase; import org.hamcrest.MatcherAssert; @@ -48,7 +47,9 @@ import java.util.ArrayList; import java.util.List; import static org.elasticsearch.common.settings.Settings.settingsBuilder; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.instanceOf; /** */ @@ -58,7 +59,7 @@ public class CompoundAnalysisTests extends ESTestCase { public void testDefaultsCompoundAnalysis() throws Exception { Index index = new Index("test"); Settings settings = getJsonSettings(); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); AnalysisModule analysisModule = new AnalysisModule(settings, parentInjector.getInstance(IndicesAnalysisService.class)); analysisModule.addTokenFilter("myfilter", MyFilterTokenFilterFactory.class); Injector injector = new ModulesBuilder().add( @@ -85,7 +86,7 @@ public class CompoundAnalysisTests extends ESTestCase { private List analyze(Settings settings, String analyzerName, String text) throws IOException { Index index = new Index("test"); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); AnalysisModule analysisModule = new AnalysisModule(settings, parentInjector.getInstance(IndicesAnalysisService.class)); analysisModule.addTokenFilter("myfilter", MyFilterTokenFilterFactory.class); Injector injector = new ModulesBuilder().add( diff --git a/core/src/test/java/org/elasticsearch/index/analysis/PatternCaptureTokenFilterTests.java b/core/src/test/java/org/elasticsearch/index/analysis/PatternCaptureTokenFilterTests.java index 2796367f07f..6a7275b73e1 100644 --- a/core/src/test/java/org/elasticsearch/index/analysis/PatternCaptureTokenFilterTests.java +++ b/core/src/test/java/org/elasticsearch/index/analysis/PatternCaptureTokenFilterTests.java @@ -30,7 +30,6 @@ import org.elasticsearch.env.EnvironmentModule; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTokenStreamTestCase; import org.junit.Test; @@ -48,7 +47,7 @@ public class PatternCaptureTokenFilterTests extends ESTokenStreamTestCase { .loadFromStream(json, getClass().getResourceAsStream(json)) .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT) .build(); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), new IndexNameModule(index), diff --git a/core/src/test/java/org/elasticsearch/index/analysis/StopAnalyzerTests.java b/core/src/test/java/org/elasticsearch/index/analysis/StopAnalyzerTests.java index 5ec0178cea0..9265587929c 100644 --- a/core/src/test/java/org/elasticsearch/index/analysis/StopAnalyzerTests.java +++ b/core/src/test/java/org/elasticsearch/index/analysis/StopAnalyzerTests.java @@ -30,7 +30,6 @@ import org.elasticsearch.env.EnvironmentModule; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTokenStreamTestCase; import org.junit.Test; @@ -48,7 +47,7 @@ public class StopAnalyzerTests extends ESTokenStreamTestCase { .put("path.home", createTempDir().toString()) .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT) .build(); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), new IndexNameModule(index), diff --git a/core/src/test/java/org/elasticsearch/index/analysis/synonyms/SynonymsAnalysisTest.java b/core/src/test/java/org/elasticsearch/index/analysis/synonyms/SynonymsAnalysisTest.java index e38ab9a0024..371a092ff6e 100644 --- a/core/src/test/java/org/elasticsearch/index/analysis/synonyms/SynonymsAnalysisTest.java +++ b/core/src/test/java/org/elasticsearch/index/analysis/synonyms/SynonymsAnalysisTest.java @@ -39,7 +39,6 @@ import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.analysis.AnalysisModule; import org.elasticsearch.index.analysis.AnalysisService; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTestCase; import org.hamcrest.MatcherAssert; @@ -80,8 +79,7 @@ public class SynonymsAnalysisTest extends ESTestCase { Injector parentInjector = new ModulesBuilder().add( new SettingsModule(settings), - new EnvironmentModule(new Environment(settings)), - new IndicesAnalysisModule()) + new EnvironmentModule(new Environment(settings))) .createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), diff --git a/core/src/test/java/org/elasticsearch/index/query/TemplateQueryParserTest.java b/core/src/test/java/org/elasticsearch/index/query/TemplateQueryParserTest.java index aab3c6fe1c4..34c890a5189 100644 --- a/core/src/test/java/org/elasticsearch/index/query/TemplateQueryParserTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/TemplateQueryParserTest.java @@ -21,6 +21,7 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.elasticsearch.Version; +import org.elasticsearch.action.ActionModule; import org.elasticsearch.cluster.ClusterService; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.inject.AbstractModule; @@ -39,15 +40,13 @@ import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.analysis.AnalysisModule; import org.elasticsearch.index.cache.IndexCacheModule; import org.elasticsearch.index.query.functionscore.ScoreFunctionParser; -import org.elasticsearch.index.query.functionscore.ScoreFunctionParserMapper; import org.elasticsearch.index.settings.IndexSettingsModule; import org.elasticsearch.index.similarity.SimilarityModule; +import org.elasticsearch.indices.IndicesModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.indices.breaker.CircuitBreakerService; import org.elasticsearch.indices.breaker.NoneCircuitBreakerService; -import org.elasticsearch.indices.query.IndicesQueriesModule; import org.elasticsearch.script.ScriptModule; -import org.elasticsearch.search.SearchModule; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.threadpool.ThreadPoolModule; @@ -80,7 +79,13 @@ public class TemplateQueryParserTest extends ESTestCase { new EnvironmentModule(new Environment(settings)), new SettingsModule(settings), new ThreadPoolModule(new ThreadPool(settings)), - new IndicesQueriesModule(), + new IndicesModule(settings) { + @Override + public void configure() { + // skip services + bindQueryParsersExtension(); + } + }, new ScriptModule(settings), new IndexSettingsModule(index, settings), new IndexCacheModule(settings), diff --git a/core/src/test/java/org/elasticsearch/index/query/plugin/DummyQueryParserPlugin.java b/core/src/test/java/org/elasticsearch/index/query/plugin/DummyQueryParserPlugin.java index 2e0356e4619..cdffcc8c36b 100644 --- a/core/src/test/java/org/elasticsearch/index/query/plugin/DummyQueryParserPlugin.java +++ b/core/src/test/java/org/elasticsearch/index/query/plugin/DummyQueryParserPlugin.java @@ -23,15 +23,13 @@ import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.Weight; -import org.elasticsearch.common.inject.Module; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.query.QueryParser; import org.elasticsearch.index.query.QueryParsingException; -import org.elasticsearch.indices.query.IndicesQueriesModule; +import org.elasticsearch.indices.IndicesModule; import org.elasticsearch.plugins.AbstractPlugin; import java.io.IOException; @@ -48,16 +46,8 @@ public class DummyQueryParserPlugin extends AbstractPlugin { return "dummy query"; } - @Override - public void processModule(Module module) { - if (module instanceof IndicesQueriesModule) { - IndicesQueriesModule indicesQueriesModule = (IndicesQueriesModule) module; - indicesQueriesModule.addQuery(DummyQueryParser.class); - } - } - - public Settings settings() { - return Settings.EMPTY; + public void onModule(IndicesModule module) { + module.registerQueryParser(DummyQueryParser.class); } public static class DummyQueryBuilder extends QueryBuilder { diff --git a/core/src/test/java/org/elasticsearch/indices/IndicesModuleTests.java b/core/src/test/java/org/elasticsearch/indices/IndicesModuleTests.java new file mode 100644 index 00000000000..7727d8c1b93 --- /dev/null +++ b/core/src/test/java/org/elasticsearch/indices/IndicesModuleTests.java @@ -0,0 +1,81 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.indices; + +import org.apache.lucene.analysis.hunspell.Dictionary; +import org.apache.lucene.search.Query; +import org.elasticsearch.common.inject.ModuleTestCase; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.QueryParser; +import org.elasticsearch.index.query.QueryParsingException; +import org.elasticsearch.index.query.TermQueryParser; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; + +public class IndicesModuleTests extends ModuleTestCase { + + static class FakeQueryParser implements QueryParser { + @Override + public String[] names() { + return new String[] {"fake-query-parser"}; + } + @Override + public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException { + return null; + } + } + + public void testRegisterQueryParser() { + IndicesModule module = new IndicesModule(Settings.EMPTY); + module.registerQueryParser(FakeQueryParser.class); + assertSetMultiBinding(module, QueryParser.class, FakeQueryParser.class); + } + + public void testRegisterQueryParserDuplicate() { + IndicesModule module = new IndicesModule(Settings.EMPTY); + try { + module.registerQueryParser(TermQueryParser.class); + } catch (IllegalArgumentException e) { + assertEquals(e.getMessage(), "Can't register the same [query_parser] more than once for [" + TermQueryParser.class.getName() + "]"); + } + } + + public void testRegisterHunspellDictionary() throws Exception { + IndicesModule module = new IndicesModule(Settings.EMPTY); + InputStream aff = getClass().getResourceAsStream("/indices/analyze/conf_dir/hunspell/en_US/en_US.aff"); + InputStream dic = getClass().getResourceAsStream("/indices/analyze/conf_dir/hunspell/en_US/en_US.dic"); + Dictionary dictionary = new Dictionary(aff, dic); + module.registerHunspellDictionary("foo", dictionary); + assertMapInstanceBinding(module, String.class, Dictionary.class, Collections.singletonMap("foo", dictionary)); + } + + public void testRegisterHunspellDictionaryDuplicate() { + IndicesModule module = new IndicesModule(Settings.EMPTY); + try { + module.registerQueryParser(TermQueryParser.class); + } catch (IllegalArgumentException e) { + assertEquals(e.getMessage(), "Can't register the same [query_parser] more than once for [" + TermQueryParser.class.getName() + "]"); + } + } + +} diff --git a/plugins/analysis-icu/src/test/java/org/elasticsearch/index/analysis/AnalysisTestUtils.java b/plugins/analysis-icu/src/test/java/org/elasticsearch/index/analysis/AnalysisTestUtils.java index dec0e5dd632..eceee3ef404 100644 --- a/plugins/analysis-icu/src/test/java/org/elasticsearch/index/analysis/AnalysisTestUtils.java +++ b/plugins/analysis-icu/src/test/java/org/elasticsearch/index/analysis/AnalysisTestUtils.java @@ -30,7 +30,6 @@ import org.elasticsearch.env.EnvironmentModule; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import static org.elasticsearch.common.settings.Settings.settingsBuilder; @@ -42,7 +41,7 @@ public class AnalysisTestUtils { Settings indexSettings = settingsBuilder().put(settings) .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT) .build(); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, indexSettings), new IndexNameModule(index), diff --git a/plugins/analysis-kuromoji/src/test/java/org/elasticsearch/index/analysis/KuromojiAnalysisTests.java b/plugins/analysis-kuromoji/src/test/java/org/elasticsearch/index/analysis/KuromojiAnalysisTests.java index 63a31effa47..b39103bb239 100644 --- a/plugins/analysis-kuromoji/src/test/java/org/elasticsearch/index/analysis/KuromojiAnalysisTests.java +++ b/plugins/analysis-kuromoji/src/test/java/org/elasticsearch/index/analysis/KuromojiAnalysisTests.java @@ -35,7 +35,6 @@ import org.elasticsearch.env.EnvironmentModule; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin; import org.elasticsearch.test.ESTestCase; @@ -48,7 +47,10 @@ import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Path; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.notNullValue; /** */ @@ -211,8 +213,7 @@ public class KuromojiAnalysisTests extends ESTestCase { Index index = new Index("test"); Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), - new EnvironmentModule(new Environment(settings)), - new IndicesAnalysisModule()) + new EnvironmentModule(new Environment(settings))) .createInjector(); AnalysisModule analysisModule = new AnalysisModule(settings, parentInjector.getInstance(IndicesAnalysisService.class)); diff --git a/plugins/analysis-phonetic/src/test/java/org/elasticsearch/index/analysis/SimplePhoneticAnalysisTests.java b/plugins/analysis-phonetic/src/test/java/org/elasticsearch/index/analysis/SimplePhoneticAnalysisTests.java index e501d06cf3e..1467626dd7b 100644 --- a/plugins/analysis-phonetic/src/test/java/org/elasticsearch/index/analysis/SimplePhoneticAnalysisTests.java +++ b/plugins/analysis-phonetic/src/test/java/org/elasticsearch/index/analysis/SimplePhoneticAnalysisTests.java @@ -30,7 +30,6 @@ import org.elasticsearch.env.EnvironmentModule; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTestCase; import org.hamcrest.MatcherAssert; @@ -59,8 +58,7 @@ public class SimplePhoneticAnalysisTests extends ESTestCase { Index index = new Index("test"); Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), - new EnvironmentModule(new Environment(settings)), - new IndicesAnalysisModule()).createInjector(); + new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), new IndexNameModule(index), diff --git a/plugins/analysis-smartcn/src/test/java/org/elasticsearch/index/analysis/SimpleSmartChineseAnalysisTests.java b/plugins/analysis-smartcn/src/test/java/org/elasticsearch/index/analysis/SimpleSmartChineseAnalysisTests.java index 70656159682..0f5d300465a 100644 --- a/plugins/analysis-smartcn/src/test/java/org/elasticsearch/index/analysis/SimpleSmartChineseAnalysisTests.java +++ b/plugins/analysis-smartcn/src/test/java/org/elasticsearch/index/analysis/SimpleSmartChineseAnalysisTests.java @@ -30,7 +30,6 @@ import org.elasticsearch.env.EnvironmentModule; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTestCase; import org.hamcrest.MatcherAssert; @@ -51,7 +50,7 @@ public class SimpleSmartChineseAnalysisTests extends ESTestCase { .put("path.home", createTempDir()) .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT) .build(); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(EMPTY_SETTINGS), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(EMPTY_SETTINGS), new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), new IndexNameModule(index), diff --git a/plugins/analysis-stempel/src/test/java/org/elasticsearch/index/analysis/PolishAnalysisTests.java b/plugins/analysis-stempel/src/test/java/org/elasticsearch/index/analysis/PolishAnalysisTests.java index a6a60d59a7d..b17f3a12e3a 100644 --- a/plugins/analysis-stempel/src/test/java/org/elasticsearch/index/analysis/PolishAnalysisTests.java +++ b/plugins/analysis-stempel/src/test/java/org/elasticsearch/index/analysis/PolishAnalysisTests.java @@ -34,7 +34,6 @@ import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.analysis.pl.PolishAnalysisBinderProcessor; import org.elasticsearch.index.analysis.pl.PolishStemTokenFilterFactory; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTestCase; import org.hamcrest.MatcherAssert; @@ -56,7 +55,7 @@ public class PolishAnalysisTests extends ESTestCase { .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT) .build(); - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(EMPTY_SETTINGS), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(EMPTY_SETTINGS), new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), new IndexNameModule(index), diff --git a/plugins/analysis-stempel/src/test/java/org/elasticsearch/index/analysis/SimplePolishTokenFilterTests.java b/plugins/analysis-stempel/src/test/java/org/elasticsearch/index/analysis/SimplePolishTokenFilterTests.java index 2e1638836af..70465417c6e 100644 --- a/plugins/analysis-stempel/src/test/java/org/elasticsearch/index/analysis/SimplePolishTokenFilterTests.java +++ b/plugins/analysis-stempel/src/test/java/org/elasticsearch/index/analysis/SimplePolishTokenFilterTests.java @@ -36,7 +36,6 @@ import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexNameModule; import org.elasticsearch.index.analysis.pl.PolishAnalysisBinderProcessor; import org.elasticsearch.index.settings.IndexSettingsModule; -import org.elasticsearch.indices.analysis.IndicesAnalysisModule; import org.elasticsearch.indices.analysis.IndicesAnalysisService; import org.elasticsearch.test.ESTestCase; import org.junit.Test; @@ -102,7 +101,7 @@ public class SimplePolishTokenFilterTests extends ESTestCase { } private AnalysisService createAnalysisService(Index index, Settings settings) { - Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings)), new IndicesAnalysisModule()).createInjector(); + Injector parentInjector = new ModulesBuilder().add(new SettingsModule(settings), new EnvironmentModule(new Environment(settings))).createInjector(); Injector injector = new ModulesBuilder().add( new IndexSettingsModule(index, settings), new IndexNameModule(index),