blob: 1d9f5ed3ac7a763bfbaa2a48bc2648cc19c3c7a8 [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.quota.search.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 ElasticSearchQuotaConfiguration {
public static class Builder {
private Optional<IndexName> indexQuotaRatioName;
private Optional<ReadAliasName> readAliasQuotaRatioName;
private Optional<WriteAliasName> writeAliasQuotaRatioName;
public Builder() {
indexQuotaRatioName = Optional.empty();
readAliasQuotaRatioName = Optional.empty();
writeAliasQuotaRatioName = Optional.empty();
}
public Builder indexQuotaRatioName(IndexName indexQuotaRatioName) {
return indexQuotaRatioName(Optional.of(indexQuotaRatioName));
}
public Builder indexQuotaRatioName(Optional<IndexName> indexQuotaRatioName) {
this.indexQuotaRatioName = indexQuotaRatioName;
return this;
}
public Builder readAliasQuotaRatioName(ReadAliasName readAliasQuotaRatioName) {
return readAliasQuotaRatioName(Optional.of(readAliasQuotaRatioName));
}
public Builder readAliasQuotaRatioName(Optional<ReadAliasName> readAliasQuotaRatioName) {
this.readAliasQuotaRatioName = readAliasQuotaRatioName;
return this;
}
public Builder writeAliasQuotaRatioName(WriteAliasName writeAliasQuotaRatioName) {
return writeAliasQuotaRatioName(Optional.of(writeAliasQuotaRatioName));
}
public Builder writeAliasQuotaRatioName(Optional<WriteAliasName> writeAliasQuotaRatioName) {
this.writeAliasQuotaRatioName = writeAliasQuotaRatioName;
return this;
}
public ElasticSearchQuotaConfiguration build() {
return new ElasticSearchQuotaConfiguration(
indexQuotaRatioName.orElse(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_INDEX),
readAliasQuotaRatioName.orElse(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_READ_ALIAS),
writeAliasQuotaRatioName.orElse(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS));
}
}
public static Builder builder() {
return new Builder();
}
public static final String ELASTICSEARCH_INDEX_QUOTA_RATIO_NAME = "elasticsearch.index.quota.ratio.name";
public static final String ELASTICSEARCH_ALIAS_READ_QUOTA_RATIO_NAME = "elasticsearch.alias.read.quota.ratio.name";
public static final String ELASTICSEARCH_ALIAS_WRITE_QUOTA_RATIO_NAME = "elasticsearch.alias.write.quota.ratio.name";
public static final ElasticSearchQuotaConfiguration DEFAULT_CONFIGURATION = builder().build();
public static ElasticSearchQuotaConfiguration fromProperties(Configuration configuration) {
return builder()
.indexQuotaRatioName(computeQuotaSearchIndexName(configuration))
.readAliasQuotaRatioName(computeQuotaSearchReadAlias(configuration))
.writeAliasQuotaRatioName(computeQuotaSearchWriteAlias(configuration))
.build();
}
public static Optional<IndexName> computeQuotaSearchIndexName(Configuration configuration) {
return Optional.ofNullable(configuration.getString(ELASTICSEARCH_INDEX_QUOTA_RATIO_NAME))
.map(IndexName::new);
}
public static Optional<WriteAliasName> computeQuotaSearchWriteAlias(Configuration configuration) {
return Optional.ofNullable(configuration.getString(ELASTICSEARCH_ALIAS_WRITE_QUOTA_RATIO_NAME))
.map(WriteAliasName::new);
}
public static Optional<ReadAliasName> computeQuotaSearchReadAlias(Configuration configuration) {
return Optional.ofNullable(configuration.getString(ELASTICSEARCH_ALIAS_READ_QUOTA_RATIO_NAME))
.map(ReadAliasName::new);
}
private final IndexName indexQuotaRatioName;
private final ReadAliasName readAliasQuotaRatioName;
private final WriteAliasName writeAliasQuotaRatioName;
private ElasticSearchQuotaConfiguration(IndexName indexQuotaRatioName, ReadAliasName readAliasQuotaRatioName, WriteAliasName writeAliasQuotaRatioName) {
this.indexQuotaRatioName = indexQuotaRatioName;
this.readAliasQuotaRatioName = readAliasQuotaRatioName;
this.writeAliasQuotaRatioName = writeAliasQuotaRatioName;
}
public IndexName getIndexQuotaRatioName() {
return indexQuotaRatioName;
}
public ReadAliasName getReadAliasQuotaRatioName() {
return readAliasQuotaRatioName;
}
public WriteAliasName getWriteAliasQuotaRatioName() {
return writeAliasQuotaRatioName;
}
@Override
public final boolean equals(Object o) {
if (o instanceof ElasticSearchQuotaConfiguration) {
ElasticSearchQuotaConfiguration that = (ElasticSearchQuotaConfiguration) o;
return Objects.equals(this.indexQuotaRatioName, that.indexQuotaRatioName)
&& Objects.equals(this.readAliasQuotaRatioName, that.readAliasQuotaRatioName)
&& Objects.equals(this.writeAliasQuotaRatioName, that.writeAliasQuotaRatioName);
}
return false;
}
@Override
public final int hashCode() {
return Objects.hash(indexQuotaRatioName, readAliasQuotaRatioName);
}
}