blob: ba1a9243380415a513f05c7b8789a687cf94301c [file] [log] [blame]
/*
* Copyright 2014 The Apache Software Foundation.
*
* Licensed 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.apache.usergrid.corepersistence;
import com.google.inject.*;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.google.inject.multibindings.Multibinder;
import org.apache.usergrid.corepersistence.asyncevents.*;
import org.apache.usergrid.corepersistence.export.ExportService;
import org.apache.usergrid.corepersistence.export.ExportServiceImpl;
import org.apache.usergrid.corepersistence.index.*;
import org.apache.usergrid.corepersistence.migration.CoreMigration;
import org.apache.usergrid.corepersistence.migration.CoreMigrationPlugin;
import org.apache.usergrid.corepersistence.migration.DeDupConnectionDataMigration;
import org.apache.usergrid.corepersistence.pipeline.PipelineModule;
import org.apache.usergrid.corepersistence.rx.impl.*;
import org.apache.usergrid.corepersistence.service.*;
import org.apache.usergrid.locking.guice.LockModule;
import org.apache.usergrid.persistence.cache.guice.CacheModule;
import org.apache.usergrid.persistence.collection.guice.CollectionModule;
import org.apache.usergrid.persistence.collection.serialization.impl.migration.EntityIdScope;
import org.apache.usergrid.persistence.core.executor.TaskExecutorFactory;
import org.apache.usergrid.persistence.core.guice.CommonModule;
import org.apache.usergrid.persistence.core.migration.data.DataMigration;
import org.apache.usergrid.persistence.core.migration.data.MigrationDataProvider;
import org.apache.usergrid.persistence.core.migration.data.MigrationPlugin;
import org.apache.usergrid.persistence.core.rx.RxTaskScheduler;
import org.apache.usergrid.persistence.core.rx.RxTaskSchedulerImpl;
import org.apache.usergrid.persistence.core.scope.ApplicationScope;
import org.apache.usergrid.persistence.graph.GraphManagerFactory;
import org.apache.usergrid.persistence.graph.guice.GraphModule;
import org.apache.usergrid.persistence.graph.serialization.impl.GraphManagerFactoryImpl;
import org.apache.usergrid.persistence.graph.serialization.impl.migration.GraphNode;
import org.apache.usergrid.persistence.index.guice.IndexModule;
import org.apache.usergrid.persistence.token.guice.TokenModule;
import org.safehaus.guicyfig.GuicyFigModule;
import java.util.Properties;
import java.util.concurrent.ThreadPoolExecutor;
/**
* Guice Module that encapsulates Core Persistence.
*/
public class CoreModule extends AbstractModule {
private final Properties properties;
public CoreModule( Properties properties ) {
this.properties = properties;
}
@Override
protected void configure() {
install( new CommonModule());
install( new LockModule());
install( new CacheModule());
install( new TokenModule());
install( new CollectionModule() {
/**
* configure our migration data provider for all entities in the system
*/
@Override
public void configureMigrationProvider() {
bind( new TypeLiteral<MigrationDataProvider<EntityIdScope>>() {} ).to( AllEntitiesInSystemImpl.class );
}
} );
install( new GraphModule() {
/**
* Override the observable that needs to be used for migration
*/
@Override
public void configureMigrationProvider() {
bind( new TypeLiteral<MigrationDataProvider<GraphNode>>() {} ).to( AllNodesInGraphImpl.class );
}
} );
install( new IndexModule( properties ) {
@Override
public void configureMigrationProvider() {
bind( new TypeLiteral<MigrationDataProvider<ApplicationScope>>() {} )
.to( AllApplicationsObservableImpl.class );
}
} );
// install(new MapModule()); TODO, re-enable when index module doesn't depend on queue
// install(new QueueModule());
bind( ManagerCache.class ).to( CpManagerCache.class );
bind( ApplicationIdCacheFactory.class );
bind( CollectionSettingsFactory.class );
bind( CollectionSettingsCache.class );
bind( CollectionVersionManagerFactory.class );
bind( CollectionVersionCache.class );
/**
* Create our migrations for within our core plugin
*/
Multibinder<DataMigration> dataMigrationMultibinder =
Multibinder.newSetBinder( binder(), new TypeLiteral<DataMigration>() {}, CoreMigration.class );
dataMigrationMultibinder.addBinding().to( DeDupConnectionDataMigration.class );
//wire up the collection migration plugin
final Multibinder<MigrationPlugin> plugins = Multibinder.newSetBinder( binder(), MigrationPlugin.class );
plugins.addBinding().to( CoreMigrationPlugin.class );
bind( AllApplicationsObservable.class ).to( AllApplicationsObservableImpl.class );
bind( AllEntityIdsObservable.class ).to( AllEntityIdsObservableImpl.class );
/*****
* Indexing service
*****/
bind( IndexService.class ).to( IndexServiceImpl.class );
//bind the event handlers
bind( EventBuilder.class ).to( EventBuilderImpl.class );
bind( ApplicationIndexBucketLocator.class );
//bind the queue provider
bind( AsyncEventService.class ).toProvider( AsyncIndexProvider.class );
bind( ReIndexService.class ).to( ReIndexServiceImpl.class );
bind( CollectionClearService.class ).to( CollectionClearServiceImpl.class );
bind( ExportService.class ).to( ExportServiceImpl.class );
install( new FactoryModuleBuilder().implement( AggregationService.class, AggregationServiceImpl.class )
.build( AggregationServiceFactory.class ) );
bind( IndexLocationStrategyFactory.class ).to( IndexLocationStrategyFactoryImpl.class );
install( new GuicyFigModule( IndexProcessorFig.class ) );
install( new GuicyFigModule( CoreIndexFig.class ) );
install( new GuicyFigModule( ApplicationIdCacheFig.class ) );
install( new GuicyFigModule( CollectionSettingsCacheFig.class ) );
install( new GuicyFigModule( CollectionVersionFig.class ) );
install( new GuicyFigModule( EntityManagerFig.class ) );
install( new GuicyFigModule( AsyncEventsSchedulerFig.class ) );
install( new GuicyFigModule( ServiceSchedulerFig.class ) );
//install our pipeline modules
install( new PipelineModule() );
/**
* Install our service operations
*/
bind( CollectionService.class ).to( CollectionServiceImpl.class );
bind( ConnectionService.class ).to( ConnectionServiceImpl.class );
bind( ApplicationService.class ).to( ApplicationServiceImpl.class );
bind( StatusService.class ).to( StatusServiceImpl.class );
bind( GraphManagerFactory.class ).to(GraphManagerFactoryImpl.class);
}
@Provides
@Inject
@EventExecutionScheduler
@Singleton
public RxTaskScheduler getSqsTaskScheduler( final AsyncEventsSchedulerFig asyncEventsSchedulerFig ) {
final String poolName = asyncEventsSchedulerFig.getIoSchedulerName();
final int threadCount = asyncEventsSchedulerFig.getMaxIoThreads();
final ThreadPoolExecutor executor = TaskExecutorFactory
.createTaskExecutor( poolName, threadCount, threadCount, TaskExecutorFactory.RejectionAction.CALLERRUNS );
final RxTaskScheduler taskScheduler = new RxTaskSchedulerImpl( executor );
return taskScheduler;
}
@Provides
@Inject
@AsyncRepair
@Singleton
public RxTaskScheduler getAsyncRepairScheduler( final AsyncEventsSchedulerFig asyncEventsSchedulerFig ) {
final String poolName = asyncEventsSchedulerFig.getRepairPoolName();
final int threadCount = asyncEventsSchedulerFig.getMaxRepairThreads();
final ThreadPoolExecutor executor = TaskExecutorFactory
.createTaskExecutor( poolName, threadCount, 0, TaskExecutorFactory.RejectionAction.DROP );
final RxTaskScheduler taskScheduler = new RxTaskSchedulerImpl( executor );
return taskScheduler;
}
@Provides
@Inject
@ResponseImportTasks
@Singleton
public RxTaskScheduler getResponseImportScheduler(final ServiceSchedulerFig serviceSchedulerFig ) {
final String poolName = serviceSchedulerFig.getRepairPoolName();
final int threadCount = serviceSchedulerFig.getImportThreadPoolSize();
final ThreadPoolExecutor executor = TaskExecutorFactory
.createTaskExecutor( poolName, threadCount, 0, TaskExecutorFactory.RejectionAction.CALLERRUNS );
final RxTaskScheduler taskScheduler = new RxTaskSchedulerImpl( executor );
return taskScheduler;
}
}