This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 2d5473fd86aff3ce91fb64ada9e7fc4d5a39864f Author: Rene Cordier <[email protected]> AuthorDate: Thu May 16 10:31:26 2019 +0700 JAMES-2719 Refactor IndexCreationFactory to an immutable structure --- .../james/backends/es/v6/IndexCreationFactory.java | 224 ++++++++++++--------- .../backends/es/v6/IndexCreationFactoryTest.java | 1 + 2 files changed, 126 insertions(+), 99 deletions(-) diff --git a/backends-common/elasticsearch-v6/src/main/java/org/apache/james/backends/es/v6/IndexCreationFactory.java b/backends-common/elasticsearch-v6/src/main/java/org/apache/james/backends/es/v6/IndexCreationFactory.java index 1a520fa..2cba4ad 100644 --- a/backends-common/elasticsearch-v6/src/main/java/org/apache/james/backends/es/v6/IndexCreationFactory.java +++ b/backends-common/elasticsearch-v6/src/main/java/org/apache/james/backends/es/v6/IndexCreationFactory.java @@ -23,7 +23,6 @@ import static org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import java.io.IOException; -import java.util.ArrayList; import javax.inject.Inject; @@ -39,125 +38,152 @@ import org.slf4j.LoggerFactory; import com.github.fge.lambdas.Throwing; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; public class IndexCreationFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(IndexCreationFactory.class); - private static final String INDEX_ALREADY_EXISTS_EXCEPTION_MESSAGE = "type=resource_already_exists_exception"; - private static final String CASE_INSENSITIVE = "case_insensitive"; - private static final String KEEP_MAIL_AND_URL = "keep_mail_and_url"; - private static final String SNOWBALL_KEEP_MAIL_AND_URL = "snowball_keep_mail_and_token"; - private static final String ENGLISH_SNOWBALL = "english_snowball"; + static class AliasSpecificationStep { + private final int nbShards; + private final int nbReplica; + private final IndexName indexName; + private final ImmutableList.Builder<AliasName> aliases; + + AliasSpecificationStep(int nbShards, int nbReplica, IndexName indexName) { + this.nbShards = nbShards; + this.nbReplica = nbReplica; + this.indexName = indexName; + this.aliases = ImmutableList.builder(); + } - private IndexName indexName; - private ArrayList<AliasName> aliases; - private int nbShards; - private int nbReplica; + public AliasSpecificationStep addAlias(AliasName aliasName) { + Preconditions.checkNotNull(aliasName); + this.aliases.add(aliasName); + return this; + } - @Inject - public IndexCreationFactory(ElasticSearchConfiguration configuration) { - indexName = null; - aliases = new ArrayList<>(); - nbShards = configuration.getNbShards(); - nbReplica = configuration.getNbReplica(); + public RestHighLevelClient createIndexAndAliases(RestHighLevelClient client) { + return new IndexCreationPerformer(nbShards, nbReplica, indexName, aliases.build()).createIndexAndAliases(client); + } } - public IndexCreationFactory useIndex(IndexName indexName) { - Preconditions.checkNotNull(indexName); - this.indexName = indexName; - return this; - } + static class IndexCreationPerformer { + private final int nbShards; + private final int nbReplica; + private final IndexName indexName; + private final ImmutableList<AliasName> aliases; + + public IndexCreationPerformer(int nbShards, int nbReplica, IndexName indexName, ImmutableList<AliasName> aliases) { + this.nbShards = nbShards; + this.nbReplica = nbReplica; + this.indexName = indexName; + this.aliases = aliases; + } - public IndexCreationFactory addAlias(AliasName aliasName) { - Preconditions.checkNotNull(aliasName); - this.aliases.add(aliasName); - return this; - } + public RestHighLevelClient createIndexAndAliases(RestHighLevelClient client) { + Preconditions.checkNotNull(indexName); + try { + createIndexIfNeeded(client, indexName, generateSetting(nbShards, nbReplica)); + aliases.forEach(Throwing.consumer(alias -> createAliasIfNeeded(client, indexName, alias))); + } catch (IOException e) { + LOGGER.error("Error while creating index : ", e); + } + return client; + } - public RestHighLevelClient createIndexAndAliases(RestHighLevelClient client) { - Preconditions.checkNotNull(indexName); - try { - createIndexIfNeeded(client, indexName, generateSetting(nbShards, nbReplica)); - aliases.forEach(Throwing.consumer(alias -> createAliasIfNeeded(client, indexName, alias))); - } catch (IOException e) { - LOGGER.error("Error while creating index : ", e); + private void createAliasIfNeeded(RestHighLevelClient client, IndexName indexName, AliasName aliasName) throws IOException { + if (!aliasExist(client, aliasName)) { + client.indices() + .updateAliases( + new IndicesAliasesRequest().addAliasAction( + new AliasActions(AliasActions.Type.ADD) + .index(indexName.getValue()) + .alias(aliasName.getValue())), + RequestOptions.DEFAULT); + } } - return client; - } - private void createAliasIfNeeded(RestHighLevelClient client, IndexName indexName, AliasName aliasName) throws IOException { - if (!aliasExist(client, aliasName)) { - client.indices() - .updateAliases( - new IndicesAliasesRequest().addAliasAction( - new AliasActions(AliasActions.Type.ADD) - .index(indexName.getValue()) - .alias(aliasName.getValue())), + private boolean aliasExist(RestHighLevelClient client, AliasName aliasName) throws IOException { + return client.indices() + .existsAlias(new GetAliasesRequest().aliases(aliasName.getValue()), RequestOptions.DEFAULT); } - } - private boolean aliasExist(RestHighLevelClient client, AliasName aliasName) throws IOException { - return client.indices() - .existsAlias(new GetAliasesRequest().aliases(aliasName.getValue()), - RequestOptions.DEFAULT); - } - - private void createIndexIfNeeded(RestHighLevelClient client, IndexName indexName, XContentBuilder settings) throws IOException { - try { - client.indices() - .create( - new CreateIndexRequest(indexName.getValue()) - .source(settings), - RequestOptions.DEFAULT); - } catch (ElasticsearchStatusException exception) { - if (exception.getMessage().contains(INDEX_ALREADY_EXISTS_EXCEPTION_MESSAGE)) { - LOGGER.info("Index [{}] already exist", indexName); - } else { - throw exception; + private void createIndexIfNeeded(RestHighLevelClient client, IndexName indexName, XContentBuilder settings) throws IOException { + try { + client.indices() + .create( + new CreateIndexRequest(indexName.getValue()) + .source(settings), + RequestOptions.DEFAULT); + } catch (ElasticsearchStatusException exception) { + if (exception.getMessage().contains(INDEX_ALREADY_EXISTS_EXCEPTION_MESSAGE)) { + LOGGER.info("Index [{}] already exist", indexName); + } else { + throw exception; + } } } - } - private XContentBuilder generateSetting(int nbShards, int nbReplica) throws IOException { - return jsonBuilder() - .startObject() - .startObject("settings") - .field("number_of_shards", nbShards) - .field("number_of_replicas", nbReplica) - .startObject("analysis") - .startObject("analyzer") - .startObject(CASE_INSENSITIVE) - .field("tokenizer", "keyword") - .startArray("filter") - .value("lowercase") - .endArray() + private XContentBuilder generateSetting(int nbShards, int nbReplica) throws IOException { + return jsonBuilder() + .startObject() + .startObject("settings") + .field("number_of_shards", nbShards) + .field("number_of_replicas", nbReplica) + .startObject("analysis") + .startObject("analyzer") + .startObject(CASE_INSENSITIVE) + .field("tokenizer", "keyword") + .startArray("filter") + .value("lowercase") + .endArray() + .endObject() + .startObject(KEEP_MAIL_AND_URL) + .field("tokenizer", "uax_url_email") + .startArray("filter") + .value("lowercase") + .value("stop") + .endArray() + .endObject() + .startObject(SNOWBALL_KEEP_MAIL_AND_URL) + .field("tokenizer", "uax_url_email") + .startArray("filter") + .value("lowercase") + .value("stop") + .value(ENGLISH_SNOWBALL) + .endArray() + .endObject() .endObject() - .startObject(KEEP_MAIL_AND_URL) - .field("tokenizer", "uax_url_email") - .startArray("filter") - .value("lowercase") - .value("stop") - .endArray() - .endObject() - .startObject(SNOWBALL_KEEP_MAIL_AND_URL) - .field("tokenizer", "uax_url_email") - .startArray("filter") - .value("lowercase") - .value("stop") - .value(ENGLISH_SNOWBALL) - .endArray() - .endObject() - .endObject() - .startObject("filter") - .startObject(ENGLISH_SNOWBALL) - .field("type", "snowball") - .field("language", "English") + .startObject("filter") + .startObject(ENGLISH_SNOWBALL) + .field("type", "snowball") + .field("language", "English") + .endObject() .endObject() .endObject() .endObject() - .endObject() - .endObject(); + .endObject(); + } } + private static final Logger LOGGER = LoggerFactory.getLogger(IndexCreationFactory.class); + private static final String INDEX_ALREADY_EXISTS_EXCEPTION_MESSAGE = "type=resource_already_exists_exception"; + private static final String CASE_INSENSITIVE = "case_insensitive"; + private static final String KEEP_MAIL_AND_URL = "keep_mail_and_url"; + private static final String SNOWBALL_KEEP_MAIL_AND_URL = "snowball_keep_mail_and_token"; + private static final String ENGLISH_SNOWBALL = "english_snowball"; + + private final int nbShards; + private final int nbReplica; + + @Inject + public IndexCreationFactory(ElasticSearchConfiguration configuration) { + this.nbShards = configuration.getNbShards(); + this.nbReplica = configuration.getNbReplica(); + } + + public AliasSpecificationStep useIndex(IndexName indexName) { + Preconditions.checkNotNull(indexName); + return new AliasSpecificationStep(nbShards, nbReplica, indexName); + } } diff --git a/backends-common/elasticsearch-v6/src/test/java/org/apache/james/backends/es/v6/IndexCreationFactoryTest.java b/backends-common/elasticsearch-v6/src/test/java/org/apache/james/backends/es/v6/IndexCreationFactoryTest.java index 4f1efd3..49be066 100644 --- a/backends-common/elasticsearch-v6/src/test/java/org/apache/james/backends/es/v6/IndexCreationFactoryTest.java +++ b/backends-common/elasticsearch-v6/src/test/java/org/apache/james/backends/es/v6/IndexCreationFactoryTest.java @@ -62,6 +62,7 @@ public class IndexCreationFactoryTest { public void addAliasShouldThrowWhenNull() { assertThatThrownBy(() -> new IndexCreationFactory(ElasticSearchConfiguration.DEFAULT_CONFIGURATION) + .useIndex(INDEX_NAME) .addAlias(null)) .isInstanceOf(NullPointerException.class); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
