| // Copyright (C) 2017 The Android Open Source Project | |
| // | |
| // 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 com.google.gerrit.pgm.init.index; | |
| import com.google.common.collect.FluentIterable; | |
| import com.google.common.collect.ImmutableCollection; | |
| import com.google.common.collect.ImmutableList; | |
| import com.google.common.collect.ImmutableMap; | |
| import com.google.gerrit.extensions.events.LifecycleListener; | |
| import com.google.gerrit.index.IndexDefinition; | |
| import com.google.gerrit.index.SchemaDefinitions; | |
| import com.google.gerrit.server.account.AccountCache; | |
| import com.google.gerrit.server.account.GroupCache; | |
| import com.google.gerrit.server.index.SingleVersionModule; | |
| import com.google.gerrit.server.index.SingleVersionModule.SingleVersionListener; | |
| import com.google.gerrit.server.index.account.AccountIndexCollection; | |
| import com.google.gerrit.server.index.account.AccountIndexDefinition; | |
| import com.google.gerrit.server.index.account.AccountSchemaDefinitions; | |
| import com.google.gerrit.server.index.account.AllAccountsIndexer; | |
| import com.google.gerrit.server.index.group.AllGroupsIndexer; | |
| import com.google.gerrit.server.index.group.GroupIndexDefinition; | |
| import com.google.gerrit.server.index.group.GroupSchemaDefinitions; | |
| import com.google.inject.AbstractModule; | |
| import com.google.inject.Provides; | |
| import com.google.inject.ProvisionException; | |
| import com.google.inject.TypeLiteral; | |
| import com.google.inject.name.Names; | |
| import com.google.inject.util.Providers; | |
| import java.util.Collection; | |
| import java.util.Map; | |
| import java.util.Set; | |
| public class IndexModuleOnInit extends AbstractModule { | |
| static final String INDEX_MANAGER = "IndexModuleOnInit/IndexManager"; | |
| private static final ImmutableCollection<SchemaDefinitions<?>> ALL_SCHEMA_DEFS = | |
| ImmutableList.of(AccountSchemaDefinitions.INSTANCE, GroupSchemaDefinitions.INSTANCE); | |
| @Override | |
| protected void configure() { | |
| // The LuceneAccountIndex needs AccountCache only for reading from the index. | |
| // On init we only want to write to the index, hence we don't need the | |
| // account cache. | |
| bind(AccountCache.class).toProvider(Providers.of(null)); | |
| // AccountIndexDefinition wants to have AllAccountsIndexer but it is only | |
| // used by the Reindex program and the OnlineReindexer which are both not | |
| // used during init, hence we don't need AllAccountsIndexer. | |
| bind(AllAccountsIndexer.class).toProvider(Providers.of(null)); | |
| bind(AccountIndexCollection.class); | |
| // The LuceneGroupIndex needs GroupCache only for reading from the index. On init we only want | |
| // to | |
| // write to the index, hence we don't need the group cache. | |
| bind(GroupCache.class).toProvider(Providers.of(null)); | |
| // GroupIndexDefinition wants to have AllGroupsIndexer but it is only used | |
| // by the Reindex program and the OnlineReindexer which are both not used | |
| // during init, hence we don't need AllGroupsIndexer. | |
| bind(AllGroupsIndexer.class).toProvider(Providers.of(null)); | |
| bind(new TypeLiteral<Map<String, Integer>>() {}) | |
| .annotatedWith(Names.named(SingleVersionModule.SINGLE_VERSIONS)) | |
| .toInstance(ImmutableMap.of()); | |
| bind(LifecycleListener.class) | |
| .annotatedWith(Names.named(INDEX_MANAGER)) | |
| .to(SingleVersionListener.class); | |
| } | |
| @Provides | |
| Collection<IndexDefinition<?, ?, ?>> getIndexDefinitions( | |
| AccountIndexDefinition accounts, GroupIndexDefinition groups) { | |
| Collection<IndexDefinition<?, ?, ?>> result = ImmutableList.of(accounts, groups); | |
| Set<String> expected = | |
| FluentIterable.from(ALL_SCHEMA_DEFS).transform(SchemaDefinitions::getName).toSet(); | |
| Set<String> actual = FluentIterable.from(result).transform(IndexDefinition::getName).toSet(); | |
| if (!expected.equals(actual)) { | |
| throw new ProvisionException( | |
| "need index definitions for all schemas: " + expected + " != " + actual); | |
| } | |
| return result; | |
| } | |
| } |