improvements to the module system, allow for a module to spawn other modules, and pre process modules before injector creation

This commit is contained in:
kimchy 2010-08-22 10:42:25 +03:00
parent aa28b93610
commit 664f28492d
29 changed files with 324 additions and 172 deletions

View File

@ -44,9 +44,8 @@ import org.elasticsearch.cluster.ClusterNameModule;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.collect.Tuple;
import org.elasticsearch.common.inject.Guice;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.common.network.NetworkModule;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
@ -64,7 +63,6 @@ import org.elasticsearch.timer.TimerService;
import org.elasticsearch.transport.TransportModule;
import org.elasticsearch.transport.TransportService;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import static org.elasticsearch.common.settings.ImmutableSettings.*;
@ -125,7 +123,7 @@ public class TransportClient extends AbstractClient {
.build();
this.environment = tuple.v2();
ArrayList<Module> modules = new ArrayList<Module>();
ModulesBuilder modules = new ModulesBuilder();
modules.add(new EnvironmentModule(environment));
modules.add(new SettingsModule(settings));
modules.add(new NetworkModule());
@ -141,7 +139,7 @@ public class TransportClient extends AbstractClient {
modules.add(new TransportClientClusterModule(settings));
}
injector = Guice.createInjector(modules);
injector = modules.createInjector();
injector.getInstance(TransportService.class).start();
try {

View File

@ -28,13 +28,16 @@ import org.elasticsearch.cluster.metadata.*;
import org.elasticsearch.cluster.routing.RoutingService;
import org.elasticsearch.cluster.routing.allocation.ShardAllocationModule;
import org.elasticsearch.cluster.service.InternalClusterService;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
/**
* @author kimchy (shay.banon)
*/
public class ClusterModule extends AbstractModule {
public class ClusterModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -42,11 +45,12 @@ public class ClusterModule extends AbstractModule {
this.settings = settings;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(new ShardAllocationModule(settings));
}
@Override
protected void configure() {
new ShardAllocationModule().configure(binder());
bind(ClusterService.class).to(InternalClusterService.class).asEagerSingleton();
bind(MetaDataCreateIndexService.class).asEagerSingleton();
bind(MetaDataDeleteIndexService.class).asEagerSingleton();

View File

@ -21,12 +21,16 @@ package org.elasticsearch.cluster.routing.allocation;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.multibindings.Multibinder;
import org.elasticsearch.common.settings.Settings;
/**
* @author kimchy (shay.banon)
*/
public class ShardAllocationModule extends AbstractModule {
public ShardAllocationModule(Settings settings) {
}
@Override protected void configure() {
bind(ShardsAllocation.class).asEagerSingleton();
bind(PreferUnallocatedStrategy.class).to(PreferUnallocatedShardUnassignedStrategy.class).asEagerSingleton();

View File

@ -26,9 +26,9 @@ import javax.annotation.Nullable;
import java.lang.reflect.Constructor;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class ModulesFactory {
public class Modules {
public static Module createModule(String moduleClass, Settings settings) throws ClassNotFoundException {
return createModule((Class<? extends Module>) settings.getClassLoader().loadClass(moduleClass), settings);
@ -56,4 +56,14 @@ public class ModulesFactory {
}
}
}
public static void processModules(Iterable<Module> modules) {
for (Module module : modules) {
if (module instanceof PreProcessModule) {
for (Module module1 : modules) {
((PreProcessModule) module).processModule(module1);
}
}
}
}
}

View File

@ -0,0 +1,60 @@
/*
* Licensed to Elastic Search and Shay Banon under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Elastic Search 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.common.inject;
import org.elasticsearch.common.collect.Lists;
import java.util.List;
/**
* @author kimchy (shay.banon)
*/
public class ModulesBuilder {
private final List<Module> modules = Lists.newArrayList();
public ModulesBuilder add(Module... modules) {
for (Module module : modules) {
add(module);
}
return this;
}
public ModulesBuilder add(Module module) {
modules.add(module);
if (module instanceof SpawnModules) {
Iterable<? extends Module> spawned = ((SpawnModules) module).spawnModules();
for (Module spawn : spawned) {
add(spawn);
}
}
return this;
}
public Injector createInjector() {
Modules.processModules(modules);
return Guice.createInjector(modules);
}
public Injector createChildInjector(Injector injector) {
Modules.processModules(modules);
return injector.createChildInjector(modules);
}
}

View File

@ -0,0 +1,28 @@
/*
* Licensed to Elastic Search and Shay Banon under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Elastic Search 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.common.inject;
/**
* @author kimchy (shay.banon)
*/
public interface PreProcessModule {
void processModule(Module module);
}

View File

@ -0,0 +1,28 @@
/*
* Licensed to Elastic Search and Shay Banon under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Elastic Search 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.common.inject;
/**
* @author kimchy (shay.banon)
*/
public interface SpawnModules {
Iterable<? extends Module> spawnModules();
}

View File

@ -19,44 +19,37 @@
package org.elasticsearch.discovery;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.discovery.local.LocalDiscoveryModule;
import org.elasticsearch.discovery.zen.ZenDiscoveryModule;
import static org.elasticsearch.common.inject.ModulesFactory.*;
/**
* @author kimchy (shay.banon)
*/
public class DiscoveryModule extends AbstractModule {
public class DiscoveryModule extends AbstractModule implements SpawnModules {
private final Settings settings;
private Class<? extends Module> defaultDiscoModule;
public DiscoveryModule(Settings settings) {
this.settings = settings;
this.defaultDiscoModule = ZenDiscoveryModule.class;
}
public void replaceDefaultDiscoModule(Class<? extends Module> defaultDiscoModule) {
this.defaultDiscoModule = defaultDiscoModule;
}
@Override
protected void configure() {
@Override public Iterable<? extends Module> spawnModules() {
Class<? extends Module> defaultDiscoveryModule;
if (settings.getAsBoolean("node.local", false)) {
defaultDiscoveryModule = LocalDiscoveryModule.class;
} else {
defaultDiscoveryModule = defaultDiscoModule;
defaultDiscoveryModule = ZenDiscoveryModule.class;
}
return ImmutableList.of(Modules.createModule(settings.getAsClass("discovery.type", defaultDiscoveryModule, "org.elasticsearch.discovery.", "DiscoveryModule"), settings));
}
Class<? extends Module> moduleClass = settings.getAsClass("discovery.type", defaultDiscoveryModule, "org.elasticsearch.discovery.", "DiscoveryModule");
createModule(moduleClass, settings).configure(binder());
@Override protected void configure() {
bind(DiscoveryService.class).asEagerSingleton();
}
}

View File

@ -19,15 +19,18 @@
package org.elasticsearch.gateway;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.ModulesFactory;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.gateway.none.NoneGatewayModule;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class GatewayModule extends AbstractModule {
public class GatewayModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -35,8 +38,11 @@ public class GatewayModule extends AbstractModule {
this.settings = settings;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(Modules.createModule(settings.getAsClass("gateway.type", NoneGatewayModule.class, "org.elasticsearch.gateway.", "GatewayModule"), settings));
}
@Override protected void configure() {
ModulesFactory.createModule(settings.getAsClass("gateway.type", NoneGatewayModule.class, "org.elasticsearch.gateway.", "GatewayModule"), settings).configure(binder());
bind(GatewayService.class).asEagerSingleton();
}
}

View File

@ -19,17 +19,18 @@
package org.elasticsearch.http;
import org.elasticsearch.common.Classes;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import static org.elasticsearch.common.inject.ModulesFactory.*;
import org.elasticsearch.http.netty.NettyHttpServerTransportModule;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class HttpServerModule extends AbstractModule {
public class HttpServerModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -37,22 +38,11 @@ public class HttpServerModule extends AbstractModule {
this.settings = settings;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(Modules.createModule(settings.getAsClass("http.type", NettyHttpServerTransportModule.class, "org.elasticsearch.http.", "HttpServerTransportModule"), settings));
}
@SuppressWarnings({"unchecked"}) @Override protected void configure() {
bind(HttpServer.class).asEagerSingleton();
Class<? extends Module> defaultHttpServerTransportModule = null;
try {
Classes.getDefaultClassLoader().loadClass("org.elasticsearch.http.netty.NettyHttpServerTransport");
defaultHttpServerTransportModule = (Class<? extends Module>) Classes.getDefaultClassLoader().loadClass("org.elasticsearch.http.netty.NettyHttpServerTransportModule");
} catch (ClassNotFoundException e) {
// no netty one, ok...
if (settings.get("http.type") == null) {
// no explicit one is configured, bail
return;
}
}
Class<? extends Module> moduleClass = settings.getAsClass("http.type", defaultHttpServerTransportModule, "org.elasticsearch.http.", "HttpServerTransportModule");
createModule(moduleClass, settings).configure(binder());
}
}

View File

@ -19,14 +19,17 @@
package org.elasticsearch.index.engine;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.ModulesFactory;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class EngineModule extends AbstractModule {
public class EngineModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -34,7 +37,10 @@ public class EngineModule extends AbstractModule {
this.settings = settings;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(Modules.createModule(settings.getAsClass(IndexEngineModule.EngineSettings.ENGINE_TYPE, IndexEngineModule.EngineSettings.DEFAULT_ENGINE, "org.elasticsearch.index.engine.", "EngineModule"), settings));
}
@Override protected void configure() {
ModulesFactory.createModule(settings.getAsClass(IndexEngineModule.EngineSettings.ENGINE_TYPE, IndexEngineModule.EngineSettings.DEFAULT_ENGINE, "org.elasticsearch.index.engine.", "EngineModule"), settings).configure(binder());
}
}

View File

@ -19,18 +19,20 @@
package org.elasticsearch.index.engine;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.engine.robin.RobinEngineModule;
import org.elasticsearch.index.engine.robin.RobinIndexEngineModule;
import static org.elasticsearch.common.inject.ModulesFactory.*;
import static org.elasticsearch.common.inject.Modules.*;
/**
* @author kimchy (shay.banon)
*/
public class IndexEngineModule extends AbstractModule {
public class IndexEngineModule extends AbstractModule implements SpawnModules {
public static final class EngineSettings {
public static final String ENGINE_TYPE = "index.engine.type";
@ -44,7 +46,10 @@ public class IndexEngineModule extends AbstractModule {
this.settings = settings;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(createModule(settings.getAsClass(EngineSettings.ENGINE_TYPE, EngineSettings.DEFAULT_INDEX_ENGINE, "org.elasticsearch.index.engine.", "IndexEngineModule"), settings));
}
@Override protected void configure() {
createModule(settings.getAsClass(EngineSettings.ENGINE_TYPE, EngineSettings.DEFAULT_INDEX_ENGINE, "org.elasticsearch.index.engine.", "IndexEngineModule"), settings).configure(binder());
}
}

View File

@ -19,15 +19,18 @@
package org.elasticsearch.index.gateway;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.ModulesFactory;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.gateway.Gateway;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class IndexGatewayModule extends AbstractModule {
public class IndexGatewayModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -38,7 +41,10 @@ public class IndexGatewayModule extends AbstractModule {
this.gateway = gateway;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(Modules.createModule(settings.getAsClass("index.gateway.type", gateway.suggestIndexGateway(), "org.elasticsearch.index.gateway.", "IndexGatewayModule"), settings));
}
@Override protected void configure() {
ModulesFactory.createModule(settings.getAsClass("index.gateway.type", gateway.suggestIndexGateway(), "org.elasticsearch.index.gateway.", "IndexGatewayModule"), settings).configure(binder());
}
}

View File

@ -19,18 +19,21 @@
package org.elasticsearch.index.routing;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.routing.hash.HashFunction;
import org.elasticsearch.index.routing.hash.djb.DjbHashFunction;
import org.elasticsearch.index.routing.plain.PlainOperationRoutingModule;
import static org.elasticsearch.common.inject.ModulesFactory.*;
import static org.elasticsearch.common.inject.Modules.*;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class OperationRoutingModule extends AbstractModule {
public class OperationRoutingModule extends AbstractModule implements SpawnModules {
private final Settings indexSettings;
@ -38,8 +41,11 @@ public class OperationRoutingModule extends AbstractModule {
this.indexSettings = indexSettings;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(createModule(indexSettings.getAsClass("index.routing.type", PlainOperationRoutingModule.class, "org.elasticsearch.index.routing.", "OperationRoutingModule"), indexSettings));
}
@Override protected void configure() {
bind(HashFunction.class).to(indexSettings.getAsClass("index.routing.hash.type", DjbHashFunction.class, "org.elasticsearch.index.routing.hash.", "HashFunction")).asEagerSingleton();
createModule(indexSettings.getAsClass("index.routing.type", PlainOperationRoutingModule.class, "org.elasticsearch.index.routing.", "OperationRoutingModule"), indexSettings).configure(binder());
}
}

View File

@ -23,13 +23,12 @@ import org.elasticsearch.ElasticSearchException;
import org.elasticsearch.ElasticSearchInterruptedException;
import org.elasticsearch.common.collect.ImmutableMap;
import org.elasticsearch.common.collect.ImmutableSet;
import org.elasticsearch.common.collect.Lists;
import org.elasticsearch.common.collect.UnmodifiableIterator;
import org.elasticsearch.common.component.CloseableIndexComponent;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.Injectors;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.gateway.none.NoneGateway;
import org.elasticsearch.index.AbstractIndexComponent;
@ -69,7 +68,6 @@ import org.elasticsearch.threadpool.ThreadPool;
import javax.annotation.Nullable;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@ -249,7 +247,7 @@ public class InternalIndexService extends AbstractIndexComponent implements Inde
logger.debug("creating shard_id [{}]", shardId.id());
List<Module> modules = Lists.newArrayList();
ModulesBuilder modules = new ModulesBuilder();
modules.add(new ShardsPluginsModule(indexSettings, pluginsService));
modules.add(new IndexShardModule(shardId));
modules.add(new StoreModule(indexSettings, injector.getInstance(IndexStore.class)));
@ -260,9 +258,7 @@ public class InternalIndexService extends AbstractIndexComponent implements Inde
modules.add(new EngineModule(indexSettings));
modules.add(new IndexShardGatewayModule(injector.getInstance(IndexGateway.class)));
pluginsService.processModules(modules);
Injector shardInjector = injector.createChildInjector(modules);
Injector shardInjector = modules.createChildInjector(injector);
shardsInjectors = newMapBuilder(shardsInjectors).put(shardId.id(), shardInjector).immutableMap();

View File

@ -19,9 +19,11 @@
package org.elasticsearch.index.store;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.ModulesFactory;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.os.OsUtils;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.store.fs.MmapFsIndexStoreModule;
@ -31,9 +33,9 @@ import org.elasticsearch.index.store.memory.MemoryIndexStoreModule;
import org.elasticsearch.index.store.ram.RamIndexStoreModule;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class IndexStoreModule extends AbstractModule {
public class IndexStoreModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -41,7 +43,7 @@ public class IndexStoreModule extends AbstractModule {
this.settings = settings;
}
@Override protected void configure() {
@Override public Iterable<? extends Module> spawnModules() {
Class<? extends Module> indexStoreModule = NioFsIndexStoreModule.class;
if (OsUtils.WINDOWS) {
indexStoreModule = SimpleFsIndexStoreModule.class;
@ -62,6 +64,9 @@ public class IndexStoreModule extends AbstractModule {
} else if (storeType != null) {
indexStoreModule = settings.getAsClass("index.store.type", indexStoreModule, "org.elasticsearch.index.store.", "IndexStoreModule");
}
ModulesFactory.createModule(indexStoreModule, settings).configure(binder());
return ImmutableList.of(Modules.createModule(indexStoreModule, settings));
}
@Override protected void configure() {
}
}

View File

@ -33,7 +33,7 @@ import org.elasticsearch.common.component.CloseableIndexComponent;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.Injectors;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.util.concurrent.ThreadSafe;
import org.elasticsearch.gateway.Gateway;
@ -59,7 +59,6 @@ import org.elasticsearch.plugins.IndicesPluginsModule;
import org.elasticsearch.plugins.PluginsService;
import org.elasticsearch.threadpool.ThreadPool;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@ -211,7 +210,7 @@ public class InternalIndicesService extends AbstractLifecycleComponent<IndicesSe
.globalSettings(settings.getGlobalSettings())
.build();
ArrayList<Module> modules = new ArrayList<Module>();
ModulesBuilder modules = new ModulesBuilder();
modules.add(new IndexNameModule(index));
modules.add(new LocalNodeIdModule(localNodeId));
modules.add(new IndexSettingsModule(indexSettings));
@ -227,9 +226,7 @@ public class InternalIndicesService extends AbstractLifecycleComponent<IndicesSe
modules.add(new OperationRoutingModule(indexSettings));
modules.add(new IndexModule());
pluginsService.processModules(modules);
Injector indexInjector = injector.createChildInjector(modules);
Injector indexInjector = modules.createChildInjector(injector);
indicesInjectors.put(index.name(), indexInjector);

View File

@ -34,10 +34,9 @@ import org.elasticsearch.common.StopWatch;
import org.elasticsearch.common.collect.Tuple;
import org.elasticsearch.common.component.Lifecycle;
import org.elasticsearch.common.component.LifecycleComponent;
import org.elasticsearch.common.inject.Guice;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.Injectors;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.network.NetworkModule;
@ -78,7 +77,6 @@ import org.elasticsearch.timer.TimerService;
import org.elasticsearch.transport.TransportModule;
import org.elasticsearch.transport.TransportService;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import static org.elasticsearch.common.settings.ImmutableSettings.*;
@ -114,7 +112,7 @@ public final class InternalNode implements Node {
this.settings = pluginsService.updatedSettings();
this.environment = tuple.v2();
ArrayList<Module> modules = new ArrayList<Module>();
ModulesBuilder modules = new ModulesBuilder();
modules.add(new PluginsModule(settings, pluginsService));
modules.add(new SettingsModule(settings));
modules.add(new NodeModule(this));
@ -141,9 +139,7 @@ public final class InternalNode implements Node {
modules.add(new GatewayModule(settings));
modules.add(new NodeClientModule());
pluginsService.processModules(modules);
injector = Guice.createInjector(modules);
injector = modules.createInjector();
client = injector.getInstance(Client.class);

View File

@ -19,18 +19,21 @@
package org.elasticsearch.plugins;
import org.elasticsearch.common.collect.Lists;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import java.util.Collection;
import java.util.List;
import static org.elasticsearch.common.inject.ModulesFactory.*;
import static org.elasticsearch.common.inject.Modules.*;
/**
* @author kimchy (shay.banon)
*/
public class IndicesPluginsModule extends AbstractModule {
public class IndicesPluginsModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -41,10 +44,15 @@ public class IndicesPluginsModule extends AbstractModule {
this.pluginsService = pluginsService;
}
@Override protected void configure() {
Collection<Class<? extends Module>> modules = pluginsService.indexModules();
for (Class<? extends Module> module : modules) {
createModule(module, settings).configure(binder());
@Override public Iterable<? extends Module> spawnModules() {
List<Module> modules = Lists.newArrayList();
Collection<Class<? extends Module>> modulesClasses = pluginsService.indexModules();
for (Class<? extends Module> moduleClass : modulesClasses) {
modules.add(createModule(moduleClass, settings));
}
return modules;
}
@Override protected void configure() {
}
}

View File

@ -19,18 +19,22 @@
package org.elasticsearch.plugins;
import org.elasticsearch.common.collect.Lists;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.PreProcessModule;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import java.util.Collection;
import java.util.List;
import static org.elasticsearch.common.inject.ModulesFactory.*;
import static org.elasticsearch.common.inject.Modules.*;
/**
* @author kimchy (shay.banon)
*/
public class PluginsModule extends AbstractModule {
public class PluginsModule extends AbstractModule implements SpawnModules, PreProcessModule {
private final Settings settings;
@ -41,12 +45,22 @@ public class PluginsModule extends AbstractModule {
this.pluginsService = pluginsService;
}
@Override protected void configure() {
bind(PluginsService.class).toInstance(pluginsService);
@Override public Iterable<? extends Module> spawnModules() {
List<Module> modules = Lists.newArrayList();
Collection<Class<? extends Module>> modulesClasses = pluginsService.modules();
for (Class<? extends Module> moduleClass : modulesClasses) {
modules.add(createModule(moduleClass, settings));
}
return modules;
}
Collection<Class<? extends Module>> modules = pluginsService.modules();
for (Class<? extends Module> module : modules) {
createModule(module, settings).configure(binder());
@Override public void processModule(Module module) {
for (Plugin plugin : pluginsService.plugins().values()) {
plugin.processModule(module);
}
}
@Override protected void configure() {
bind(PluginsService.class).toInstance(pluginsService);
}
}

View File

@ -66,16 +66,12 @@ public class PluginsService extends AbstractComponent {
this.plugins = ImmutableMap.copyOf(plugins);
}
public Settings updatedSettings() {
return this.settings;
public ImmutableMap<String, Plugin> plugins() {
return plugins;
}
public void processModules(Iterable<Module> modules) {
for (Module module : modules) {
for (Plugin plugin : plugins.values()) {
plugin.processModule(module);
}
}
public Settings updatedSettings() {
return this.settings;
}
public Collection<Class<? extends Module>> modules() {

View File

@ -19,18 +19,21 @@
package org.elasticsearch.plugins;
import org.elasticsearch.common.collect.Lists;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import java.util.Collection;
import java.util.List;
import static org.elasticsearch.common.inject.ModulesFactory.*;
import static org.elasticsearch.common.inject.Modules.*;
/**
* @author kimchy (shay.banon)
*/
public class ShardsPluginsModule extends AbstractModule {
public class ShardsPluginsModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -41,10 +44,15 @@ public class ShardsPluginsModule extends AbstractModule {
this.pluginsService = pluginsService;
}
@Override protected void configure() {
Collection<Class<? extends Module>> modules = pluginsService.shardModules();
for (Class<? extends Module> module : modules) {
createModule(module, settings).configure(binder());
@Override public Iterable<? extends Module> spawnModules() {
List<Module> modules = Lists.newArrayList();
Collection<Class<? extends Module>> modulesClasses = pluginsService.shardModules();
for (Class<? extends Module> moduleClass : modulesClasses) {
modules.add(createModule(moduleClass, settings));
}
return modules;
}
@Override protected void configure() {
}
}

View File

@ -19,17 +19,18 @@
package org.elasticsearch.threadpool;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.threadpool.cached.CachedThreadPoolModule;
import static org.elasticsearch.common.inject.ModulesFactory.*;
/**
* @author kimchy (shay.banon)
*/
public class ThreadPoolModule extends AbstractModule {
public class ThreadPoolModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -37,8 +38,10 @@ public class ThreadPoolModule extends AbstractModule {
this.settings = settings;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(Modules.createModule(settings.getAsClass("transport.type", CachedThreadPoolModule.class, "org.elasticsearch.threadpool.", "ThreadPoolModule"), settings));
}
@Override protected void configure() {
Class<? extends Module> moduleClass = settings.getAsClass("transport.type", CachedThreadPoolModule.class, "org.elasticsearch.threadpool.", "ThreadPoolModule");
createModule(moduleClass, settings).configure(binder());
}
}

View File

@ -19,18 +19,19 @@
package org.elasticsearch.transport;
import org.elasticsearch.common.Classes;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.transport.local.LocalTransportModule;
import static org.elasticsearch.common.inject.ModulesFactory.*;
import org.elasticsearch.transport.netty.NettyTransportModule;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class TransportModule extends AbstractModule {
public class TransportModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -38,24 +39,18 @@ public class TransportModule extends AbstractModule {
this.settings = settings;
}
@Override
protected void configure() {
bind(TransportService.class).asEagerSingleton();
bind(TransportServiceManagement.class).asEagerSingleton();
@Override public Iterable<? extends Module> spawnModules() {
Class<? extends Module> defaultTransportModule;
if (settings.getAsBoolean("node.local", false)) {
defaultTransportModule = LocalTransportModule.class;
} else {
try {
Classes.getDefaultClassLoader().loadClass("org.elasticsearch.transport.netty.NettyTransport");
defaultTransportModule = (Class<? extends Module>) Classes.getDefaultClassLoader().loadClass("org.elasticsearch.transport.netty.NettyTransportModule");
} catch (ClassNotFoundException e) {
defaultTransportModule = LocalTransportModule.class;
}
defaultTransportModule = NettyTransportModule.class;
}
return ImmutableList.of(Modules.createModule(settings.getAsClass("transport.type", defaultTransportModule, "org.elasticsearch.transport.", "TransportModule"), settings));
}
Class<? extends Module> moduleClass = settings.getAsClass("transport.type", defaultTransportModule, "org.elasticsearch.transport.", "TransportModule");
createModule(moduleClass, settings).configure(binder());
@Override protected void configure() {
bind(TransportService.class).asEagerSingleton();
bind(TransportServiceManagement.class).asEagerSingleton();
}
}

View File

@ -20,8 +20,8 @@
package org.elasticsearch.index.analysis;
import org.apache.lucene.analysis.Analyzer;
import org.elasticsearch.common.inject.Guice;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.common.lucene.analysis.HTMLStripCharFilter;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.Index;
@ -50,10 +50,10 @@ public class AnalysisModuleTests {
private void testSimpleConfiguration(Settings settings) {
Index index = new Index("test");
Injector injector = Guice.createInjector(
Injector injector = new ModulesBuilder().add(
new IndexSettingsModule(settings),
new IndexNameModule(index),
new AnalysisModule(settings));
new AnalysisModule(settings)).createInjector();
AnalysisService analysisService = injector.getInstance(AnalysisService.class);

View File

@ -19,8 +19,8 @@
package org.elasticsearch.index.query.xcontent.guice;
import org.elasticsearch.common.inject.Guice;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsModule;
import org.elasticsearch.index.Index;
@ -56,7 +56,7 @@ public class IndexQueryParserModuleTests {
.build();
Index index = new Index("test");
Injector injector = Guice.createInjector(
Injector injector = new ModulesBuilder().add(
new SettingsModule(settings),
new ScriptModule(),
new IndexSettingsModule(settings),
@ -66,7 +66,7 @@ public class IndexQueryParserModuleTests {
new SimilarityModule(settings),
new IndexQueryParserModule(settings),
new IndexNameModule(index)
);
).createInjector();
IndexQueryParserService indexQueryParserService = injector.getInstance(IndexQueryParserService.class);

View File

@ -19,8 +19,8 @@
package org.elasticsearch.index.query.xcontent.plugin;
import org.elasticsearch.common.inject.Guice;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsModule;
@ -61,7 +61,7 @@ public class IndexQueryParserPluginTests {
});
Index index = new Index("test");
Injector injector = Guice.createInjector(
Injector injector = new ModulesBuilder().add(
new SettingsModule(settings),
new ScriptModule(),
new IndexSettingsModule(settings),
@ -71,7 +71,7 @@ public class IndexQueryParserPluginTests {
new SimilarityModule(settings),
queryParserModule,
new IndexNameModule(index)
);
).createInjector();
IndexQueryParserService indexQueryParserService = injector.getInstance(IndexQueryParserService.class);

View File

@ -19,8 +19,8 @@
package org.elasticsearch.index.analysis;
import org.elasticsearch.common.inject.Guice;
import org.elasticsearch.common.inject.Injector;
import org.elasticsearch.common.inject.ModulesBuilder;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.IndexNameModule;
import org.elasticsearch.index.settings.IndexSettingsModule;
@ -37,10 +37,10 @@ public class SimpleIcuAnalysisTests {
@Test public void testDefaultsIcuAnalysis() {
Index index = new Index("test");
Injector injector = Guice.createInjector(
Injector injector = new ModulesBuilder().add(
new IndexSettingsModule(EMPTY_SETTINGS),
new IndexNameModule(index),
new AnalysisModule(EMPTY_SETTINGS).addProcessor(new IcuAnalysisBinderProcessor()));
new AnalysisModule(EMPTY_SETTINGS).addProcessor(new IcuAnalysisBinderProcessor())).createInjector();
AnalysisService analysisService = injector.getInstance(AnalysisService.class);

View File

@ -19,17 +19,18 @@
package org.elasticsearch.memcached;
import org.elasticsearch.common.Classes;
import org.elasticsearch.common.collect.ImmutableList;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.inject.Modules;
import org.elasticsearch.common.inject.SpawnModules;
import org.elasticsearch.common.settings.Settings;
import static org.elasticsearch.common.inject.ModulesFactory.*;
import org.elasticsearch.memcached.netty.NettyMemcachedServerTransportModule;
/**
* @author kimchy (shay.banon)
*/
public class MemcachedServerModule extends AbstractModule {
public class MemcachedServerModule extends AbstractModule implements SpawnModules {
private final Settings settings;
@ -37,22 +38,11 @@ public class MemcachedServerModule extends AbstractModule {
this.settings = settings;
}
@Override public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(Modules.createModule(settings.getAsClass("memcached.type", NettyMemcachedServerTransportModule.class, "org.elasticsearch.memcached.", "MemcachedServerTransportModule"), settings));
}
@SuppressWarnings({"unchecked"}) @Override protected void configure() {
bind(MemcachedServer.class).asEagerSingleton();
Class<? extends Module> defaultMemcachedServerTransportModule = null;
try {
Classes.getDefaultClassLoader().loadClass("org.elasticsearch.memcached.netty.NettyMemcachedServerTransport");
defaultMemcachedServerTransportModule = (Class<? extends Module>) Classes.getDefaultClassLoader().loadClass("org.elasticsearch.memcached.netty.NettyMemcachedServerTransportModule");
} catch (ClassNotFoundException e) {
// no netty one, ok...
if (settings.get("memcached.type") == null) {
// no explicit one is configured, bail
return;
}
}
Class<? extends Module> moduleClass = settings.getAsClass("memcached.type", defaultMemcachedServerTransportModule, "org.elasticsearch.memcached.", "MemcachedServerTransportModule");
createModule(moduleClass, settings).configure(binder());
}
}