blob: 000c9f40d05e2a46e7f58d497e029275718ef08f [file] [log] [blame]
/****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one *
* or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information *
* regarding copyright ownership. The ASF 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.apache.james.mailbox.opensearch;
import java.util.Objects;
import java.util.Optional;
import org.apache.commons.configuration2.Configuration;
import org.apache.james.backends.opensearch.IndexName;
import org.apache.james.backends.opensearch.ReadAliasName;
import org.apache.james.backends.opensearch.WriteAliasName;
public class ElasticSearchMailboxConfiguration {
public static class Builder {
private Optional<IndexName> indexMailboxName;
private Optional<ReadAliasName> readAliasMailboxName;
private Optional<WriteAliasName> writeAliasMailboxName;
private Optional<IndexAttachments> indexAttachment;
Builder() {
indexMailboxName = Optional.empty();
readAliasMailboxName = Optional.empty();
writeAliasMailboxName = Optional.empty();
indexAttachment = Optional.empty();
}
Builder indexMailboxName(Optional<IndexName> indexMailboxName) {
this.indexMailboxName = indexMailboxName;
return this;
}
Builder readAliasMailboxName(Optional<ReadAliasName> readAliasMailboxName) {
this.readAliasMailboxName = readAliasMailboxName;
return this;
}
Builder writeAliasMailboxName(Optional<WriteAliasName> writeAliasMailboxName) {
this.writeAliasMailboxName = writeAliasMailboxName;
return this;
}
Builder indexAttachment(IndexAttachments indexAttachment) {
this.indexAttachment = Optional.of(indexAttachment);
return this;
}
public ElasticSearchMailboxConfiguration build() {
return new ElasticSearchMailboxConfiguration(
indexMailboxName.orElse(MailboxElasticSearchConstants.DEFAULT_MAILBOX_INDEX),
readAliasMailboxName.orElse(MailboxElasticSearchConstants.DEFAULT_MAILBOX_READ_ALIAS),
writeAliasMailboxName.orElse(MailboxElasticSearchConstants.DEFAULT_MAILBOX_WRITE_ALIAS),
indexAttachment.orElse(IndexAttachments.YES));
}
}
public static Builder builder() {
return new Builder();
}
private static final String ELASTICSEARCH_INDEX_NAME = "elasticsearch.index.name";
private static final String ELASTICSEARCH_INDEX_MAILBOX_NAME = "elasticsearch.index.mailbox.name";
private static final String ELASTICSEARCH_ALIAS_READ_NAME = "elasticsearch.alias.read.name";
private static final String ELASTICSEARCH_ALIAS_WRITE_NAME = "elasticsearch.alias.write.name";
private static final String ELASTICSEARCH_ALIAS_READ_MAILBOX_NAME = "elasticsearch.alias.read.mailbox.name";
private static final String ELASTICSEARCH_ALIAS_WRITE_MAILBOX_NAME = "elasticsearch.alias.write.mailbox.name";
private static final String ELASTICSEARCH_INDEX_ATTACHMENTS = "elasticsearch.indexAttachments";
private static final boolean DEFAULT_INDEX_ATTACHMENTS = true;
public static final ElasticSearchMailboxConfiguration DEFAULT_CONFIGURATION = builder().build();
public static ElasticSearchMailboxConfiguration fromProperties(Configuration configuration) {
return builder()
.indexMailboxName(computeMailboxIndexName(configuration))
.readAliasMailboxName(computeMailboxReadAlias(configuration))
.writeAliasMailboxName(computeMailboxWriteAlias(configuration))
.indexAttachment(provideIndexAttachments(configuration))
.build();
}
static Optional<IndexName> computeMailboxIndexName(Configuration configuration) {
return Optional.ofNullable(configuration.getString(ELASTICSEARCH_INDEX_MAILBOX_NAME))
.map(IndexName::new)
.or(() -> Optional.ofNullable(configuration.getString(ELASTICSEARCH_INDEX_NAME))
.map(IndexName::new));
}
static Optional<WriteAliasName> computeMailboxWriteAlias(Configuration configuration) {
return Optional.ofNullable(configuration.getString(ELASTICSEARCH_ALIAS_WRITE_MAILBOX_NAME))
.map(WriteAliasName::new)
.or(() -> Optional.ofNullable(configuration.getString(ELASTICSEARCH_ALIAS_WRITE_NAME))
.map(WriteAliasName::new));
}
static Optional<ReadAliasName> computeMailboxReadAlias(Configuration configuration) {
return Optional.ofNullable(configuration.getString(ELASTICSEARCH_ALIAS_READ_MAILBOX_NAME))
.map(ReadAliasName::new)
.or(() -> Optional.ofNullable(configuration.getString(ELASTICSEARCH_ALIAS_READ_NAME))
.map(ReadAliasName::new));
}
private static IndexAttachments provideIndexAttachments(Configuration configuration) {
if (configuration.getBoolean(ELASTICSEARCH_INDEX_ATTACHMENTS, DEFAULT_INDEX_ATTACHMENTS)) {
return IndexAttachments.YES;
}
return IndexAttachments.NO;
}
private final IndexName indexMailboxName;
private final ReadAliasName readAliasMailboxName;
private final WriteAliasName writeAliasMailboxName;
private final IndexAttachments indexAttachment;
private ElasticSearchMailboxConfiguration(IndexName indexMailboxName, ReadAliasName readAliasMailboxName,
WriteAliasName writeAliasMailboxName, IndexAttachments indexAttachment) {
this.indexMailboxName = indexMailboxName;
this.readAliasMailboxName = readAliasMailboxName;
this.writeAliasMailboxName = writeAliasMailboxName;
this.indexAttachment = indexAttachment;
}
public IndexName getIndexMailboxName() {
return indexMailboxName;
}
public ReadAliasName getReadAliasMailboxName() {
return readAliasMailboxName;
}
public WriteAliasName getWriteAliasMailboxName() {
return writeAliasMailboxName;
}
public IndexAttachments getIndexAttachment() {
return indexAttachment;
}
@Override
public final boolean equals(Object o) {
if (o instanceof ElasticSearchMailboxConfiguration) {
ElasticSearchMailboxConfiguration that = (ElasticSearchMailboxConfiguration) o;
return Objects.equals(this.indexAttachment, that.indexAttachment)
&& Objects.equals(this.indexMailboxName, that.indexMailboxName)
&& Objects.equals(this.readAliasMailboxName, that.readAliasMailboxName)
&& Objects.equals(this.writeAliasMailboxName, that.writeAliasMailboxName);
}
return false;
}
@Override
public final int hashCode() {
return Objects.hash(indexMailboxName, readAliasMailboxName, writeAliasMailboxName, indexAttachment, writeAliasMailboxName);
}
}