You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/05/28 04:00:30 UTC
[james-project] 03/11: JAMES-2767 replace old mailbox-quota-es
module by the new one
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 bd16e73ea33dba86cb7a2a6f004218ee757652a2
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu May 23 11:10:54 2019 +0700
JAMES-2767 replace old mailbox-quota-es module by the new one
---
.../plugin/quota-search-elasticsearch-v6/pom.xml | 142 -------------------
.../ElasticSearchQuotaConfiguration.java | 151 ---------------------
.../elasticsearch/ElasticSearchQuotaSearcher.java | 111 ---------------
.../search/elasticsearch/QuotaQueryConverter.java | 103 --------------
.../QuotaRatioElasticSearchConstants.java | 35 -----
.../elasticsearch/QuotaRatioMappingFactory.java | 60 --------
.../QuotaSearchIndexCreationUtil.java | 56 --------
.../events/ElasticSearchQuotaMailboxListener.java | 69 ----------
.../elasticsearch/json/JsonMessageConstants.java | 28 ----
.../elasticsearch/json/QuotaRatioAsJson.java | 120 ----------------
.../json/QuotaRatioToElasticSearchJson.java | 49 -------
.../ElasticSearchQuotaConfigurationTest.java | 103 --------------
...lasticSearchQuotaSearchTestSystemExtension.java | 104 --------------
.../ElasticSearchQuotaSearcherTest.java | 88 ------------
.../elasticsearch/QuotaQueryConverterTest.java | 83 -----------
.../ElasticSearchQuotaMailboxListenerTest.java | 103 --------------
.../elasticsearch/json/QuotaRatioAsJsonTest.java | 107 ---------------
.../json/QuotaRatioToElasticSearchJsonTest.java | 79 -----------
.../src/test/resources/quotaRatio.json | 1 -
.../src/test/resources/quotaRatioNoDomain.json | 1 -
.../ElasticSearchQuotaConfiguration.java | 3 +-
.../elasticsearch/ElasticSearchQuotaSearcher.java | 82 ++++++-----
.../search/elasticsearch/QuotaQueryConverter.java | 6 +-
.../QuotaRatioElasticSearchConstants.java | 2 -
.../elasticsearch/QuotaRatioMappingFactory.java | 31 ++---
.../QuotaSearchIndexCreationUtil.java | 11 +-
.../events/ElasticSearchQuotaMailboxListener.java | 15 +-
.../json/QuotaRatioToElasticSearchJson.java | 4 +-
.../ElasticSearchQuotaConfigurationTest.java | 17 ++-
...lasticSearchQuotaSearchTestSystemExtension.java | 20 +--
.../ElasticSearchQuotaSearcherTest.java | 62 ++++++++-
.../ElasticSearchQuotaMailboxListenerTest.java | 44 +++---
.../elasticsearch/json/QuotaRatioAsJsonTest.java | 16 +--
.../json/QuotaRatioToElasticSearchJsonTest.java | 5 +-
mailbox/pom.xml | 1 -
35 files changed, 189 insertions(+), 1723 deletions(-)
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/pom.xml b/mailbox/plugin/quota-search-elasticsearch-v6/pom.xml
deleted file mode 100644
index 7135337..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/pom.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <artifactId>apache-james-mailbox</artifactId>
- <groupId>org.apache.james</groupId>
- <version>3.4.0-SNAPSHOT</version>
- <relativePath>../../pom.xml</relativePath>
- </parent>
-
- <artifactId>apache-james-mailbox-quota-search-elasticsearch-v6</artifactId>
- <name>Apache James :: Mailbox :: Plugin :: Quota Search :: ElasticSearch :: v6</name>
- <description>Apache James Mailbox ElasticSearch v6 implementation for quota search</description>
-
- <dependencies>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>apache-james-backends-es-v6</artifactId>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>apache-james-backends-es-v6</artifactId>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>apache-james-mailbox-api</artifactId>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>apache-james-mailbox-api</artifactId>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>apache-james-mailbox-memory</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>apache-james-mailbox-memory</artifactId>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>apache-james-mailbox-quota-search</artifactId>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>apache-james-mailbox-quota-search</artifactId>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>james-core</artifactId>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>james-server-data-api</artifactId>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>james-server-data-memory</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${james.groupId}</groupId>
- <artifactId>james-server-testing</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.datatype</groupId>
- <artifactId>jackson-datatype-jdk8</artifactId>
- </dependency>
- <dependency>
- <groupId>nl.jqno.equalsverifier</groupId>
- <artifactId>equalsverifier</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.assertj</groupId>
- <artifactId>assertj-core</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.junit.jupiter</groupId>
- <artifactId>junit-jupiter-engine</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.junit.jupiter</groupId>
- <artifactId>junit-jupiter-migrationsupport</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.junit.platform</groupId>
- <artifactId>junit-platform-launcher</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>net.javacrumbs.json-unit</groupId>
- <artifactId>json-unit-assertj</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
-
-</project>
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfiguration.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfiguration.java
deleted file mode 100644
index 2c0e6a1..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfiguration.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * 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.elasticsearch;
-
-import java.util.Objects;
-import java.util.Optional;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.james.backends.es.v6.IndexName;
-import org.apache.james.backends.es.v6.ReadAliasName;
-import org.apache.james.backends.es.v6.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);
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
deleted file mode 100644
index e3f6ab5..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************
- * 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.elasticsearch;
-
-import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.USER;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Stream;
-
-import org.apache.james.backends.es.v6.AliasName;
-import org.apache.james.backends.es.v6.NodeMappingFactory;
-import org.apache.james.backends.es.v6.ReadAliasName;
-import org.apache.james.backends.es.v6.search.ScrollIterable;
-import org.apache.james.core.User;
-import org.apache.james.quota.search.QuotaQuery;
-import org.apache.james.quota.search.QuotaSearcher;
-import org.elasticsearch.action.search.SearchRequest;
-import org.elasticsearch.client.RequestOptions;
-import org.elasticsearch.client.RestHighLevelClient;
-import org.elasticsearch.common.unit.TimeValue;
-import org.elasticsearch.search.SearchHit;
-import org.elasticsearch.search.builder.SearchSourceBuilder;
-import org.elasticsearch.search.sort.SortBuilders;
-import org.elasticsearch.search.sort.SortOrder;
-
-import com.github.steveash.guavate.Guavate;
-
-public class ElasticSearchQuotaSearcher implements QuotaSearcher {
- private static final TimeValue TIMEOUT = TimeValue.timeValueMinutes(1);
-
- private final RestHighLevelClient client;
- private final AliasName readAlias;
- private final QuotaQueryConverter quotaQueryConverter;
-
- public ElasticSearchQuotaSearcher(RestHighLevelClient client, ReadAliasName readAlias) {
- this.client = client;
- this.readAlias = readAlias;
- this.quotaQueryConverter = new QuotaQueryConverter();
- }
-
- @Override
- public List<User> search(QuotaQuery query) {
- try {
- return searchHits(query)
- .map(SearchHit::getId)
- .map(User::fromUsername)
- .collect(Guavate.toImmutableList());
- } catch (IOException e) {
- throw new RuntimeException("Unexpected exception while executing " + query, e);
- }
- }
-
- private Stream<SearchHit> searchHits(QuotaQuery query) throws IOException {
- if (query.getLimit().isLimited()) {
- return executeSingleSearch(query);
- } else {
- return executeScrolledSearch(query);
- }
- }
-
- private Stream<SearchHit> executeSingleSearch(QuotaQuery query) throws IOException {
- SearchSourceBuilder searchSourceBuilder = searchSourceBuilder(query)
- .from(query.getOffset().getValue());
- query.getLimit().getValue()
- .ifPresent(searchSourceBuilder::size);
-
- SearchRequest searchRequest = new SearchRequest(readAlias.getValue())
- .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
- .source(searchSourceBuilder);
-
- return Arrays.stream(client.search(searchRequest, RequestOptions.DEFAULT)
- .getHits()
- .getHits());
- }
-
- private Stream<SearchHit> executeScrolledSearch(QuotaQuery query) {
- return new ScrollIterable(client,
- new SearchRequest(readAlias.getValue())
- .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
- .source(searchSourceBuilder(query))
- .scroll(TIMEOUT))
- .stream()
- .flatMap(searchResponse -> Arrays.stream(searchResponse.getHits().getHits()))
- .skip(query.getOffset().getValue());
- }
-
- private SearchSourceBuilder searchSourceBuilder(QuotaQuery query) {
- return new SearchSourceBuilder()
- .query(quotaQueryConverter.from(query))
- .sort(SortBuilders.fieldSort(USER).order(SortOrder.ASC));
- }
-}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverter.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverter.java
deleted file mode 100644
index a67d063..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverter.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/****************************************************************
- * 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.elasticsearch;
-
-import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.DOMAIN;
-import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.QUOTA_RATIO;
-import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
-import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
-import static org.elasticsearch.index.query.QueryBuilders.termQuery;
-
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-
-import org.apache.james.quota.search.QuotaClause;
-import org.apache.james.quota.search.QuotaClause.And;
-import org.apache.james.quota.search.QuotaClause.HasDomain;
-import org.apache.james.quota.search.QuotaClause.LessThan;
-import org.apache.james.quota.search.QuotaClause.MoreThan;
-import org.apache.james.quota.search.QuotaQuery;
-import org.elasticsearch.index.query.BoolQueryBuilder;
-import org.elasticsearch.index.query.QueryBuilder;
-import org.elasticsearch.index.query.RangeQueryBuilder;
-import org.elasticsearch.index.query.TermQueryBuilder;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
-
-class QuotaQueryConverter {
- private final Map<Class<? extends QuotaClause>, Function<QuotaClause, QueryBuilder>> clauseConverter;
-
- QuotaQueryConverter() {
- Builder<Class<? extends QuotaClause>, Function<QuotaClause, QueryBuilder>> builder = ImmutableMap.builder();
-
- builder.put(HasDomain.class, this::convertHasDomain);
- builder.put(And.class, this::disableNestedAnd);
- builder.put(MoreThan.class, this::convertMoreThan);
- builder.put(LessThan.class, this::convertLessThan);
-
- clauseConverter = builder.build();
- }
-
- QueryBuilder from(QuotaQuery query) {
- List<QuotaClause> clauses = query.getClause().getClauses();
- if (clauses.isEmpty()) {
- return matchAllQuery();
- }
- if (clauses.size() == 1) {
- return singleClauseAsESQuery(clauses.get(0));
- }
-
- return clausesAsAndESQuery(clauses);
- }
-
- private BoolQueryBuilder clausesAsAndESQuery(List<QuotaClause> clauses) {
- BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
- clauses.stream()
- .map(this::singleClauseAsESQuery)
- .forEach(boolQueryBuilder::must);
- return boolQueryBuilder;
- }
-
- private QueryBuilder disableNestedAnd(QuotaClause clause) {
- throw new IllegalArgumentException("Nested \"And\" clauses are not supported");
- }
-
- private TermQueryBuilder convertHasDomain(QuotaClause clause) {
- HasDomain hasDomain = (HasDomain) clause;
- return termQuery(DOMAIN, hasDomain.getDomain().asString());
- }
-
- private RangeQueryBuilder convertMoreThan(QuotaClause clause) {
- MoreThan moreThan = (MoreThan) clause;
- return rangeQuery(QUOTA_RATIO).gte(moreThan.getQuotaBoundary().getRatio());
- }
-
- private RangeQueryBuilder convertLessThan(QuotaClause clause) {
- LessThan lessThan = (LessThan) clause;
- return rangeQuery(QUOTA_RATIO).lte(lessThan.getQuotaBoundary().getRatio());
- }
-
- private QueryBuilder singleClauseAsESQuery(QuotaClause clause) {
- return clauseConverter.get(clause.getClass()).apply(clause);
- }
-
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioElasticSearchConstants.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioElasticSearchConstants.java
deleted file mode 100644
index 43cb89e..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioElasticSearchConstants.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.elasticsearch;
-
-import org.apache.james.backends.es.v6.IndexName;
-import org.apache.james.backends.es.v6.ReadAliasName;
-import org.apache.james.backends.es.v6.WriteAliasName;
-
-public interface QuotaRatioElasticSearchConstants {
-
- interface InjectionNames {
- String QUOTA_RATIO = "quotaRatio";
- }
-
- WriteAliasName DEFAULT_QUOTA_RATIO_WRITE_ALIAS = new WriteAliasName("quota_ratio_write_alias");
- ReadAliasName DEFAULT_QUOTA_RATIO_READ_ALIAS = new ReadAliasName("quota_ratio_read_alias");
- IndexName DEFAULT_QUOTA_RATIO_INDEX = new IndexName("quota_ratio_v1");
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioMappingFactory.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioMappingFactory.java
deleted file mode 100644
index 78d7aa3..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioMappingFactory.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************
- * 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.elasticsearch;
-
-import static org.apache.james.backends.es.v6.NodeMappingFactory.DOUBLE;
-import static org.apache.james.backends.es.v6.NodeMappingFactory.KEYWORD;
-import static org.apache.james.backends.es.v6.NodeMappingFactory.PROPERTIES;
-import static org.apache.james.backends.es.v6.NodeMappingFactory.TYPE;
-import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.DOMAIN;
-import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.QUOTA_RATIO;
-import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.USER;
-import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
-
-import java.io.IOException;
-
-import org.elasticsearch.common.xcontent.XContentBuilder;
-
-class QuotaRatioMappingFactory {
-
- public static XContentBuilder getMappingContent() {
- try {
- return jsonBuilder()
- .startObject()
- .startObject(PROPERTIES)
-
- .startObject(USER)
- .field(TYPE, KEYWORD)
- .endObject()
-
- .startObject(DOMAIN)
- .field(TYPE, KEYWORD)
- .endObject()
-
- .startObject(QUOTA_RATIO)
- .field(TYPE, DOUBLE)
- .endObject()
- .endObject()
- .endObject();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaSearchIndexCreationUtil.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaSearchIndexCreationUtil.java
deleted file mode 100644
index 3555b28..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaSearchIndexCreationUtil.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/****************************************************************
- * 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.elasticsearch;
-
-import java.io.IOException;
-
-import org.apache.james.backends.es.v6.AliasName;
-import org.apache.james.backends.es.v6.ElasticSearchConfiguration;
-import org.apache.james.backends.es.v6.IndexCreationFactory;
-import org.apache.james.backends.es.v6.IndexName;
-import org.apache.james.backends.es.v6.NodeMappingFactory;
-import org.elasticsearch.client.RestHighLevelClient;
-
-public class QuotaSearchIndexCreationUtil {
-
- public static RestHighLevelClient prepareClient(RestHighLevelClient client,
- AliasName readAlias,
- AliasName writeAlias,
- IndexName indexName,
- ElasticSearchConfiguration configuration) throws IOException {
-
- return NodeMappingFactory.applyMapping(
- new IndexCreationFactory(configuration)
- .useIndex(indexName)
- .addAlias(readAlias)
- .addAlias(writeAlias)
- .createIndexAndAliases(client),
- indexName,
- QuotaRatioMappingFactory.getMappingContent());
- }
-
- public static RestHighLevelClient prepareDefaultClient(RestHighLevelClient client, ElasticSearchConfiguration configuration) throws IOException {
- return prepareClient(client,
- QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_READ_ALIAS,
- QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS,
- QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_INDEX,
- configuration);
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
deleted file mode 100644
index 1b48778..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************
- * 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.elasticsearch.events;
-
-import java.io.IOException;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.apache.james.backends.es.v6.ElasticSearchIndexer;
-import org.apache.james.mailbox.events.Event;
-import org.apache.james.mailbox.events.Group;
-import org.apache.james.mailbox.events.MailboxListener;
-import org.apache.james.quota.search.elasticsearch.QuotaRatioElasticSearchConstants;
-import org.apache.james.quota.search.elasticsearch.json.QuotaRatioToElasticSearchJson;
-
-public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupMailboxListener {
- public static class ElasticSearchQuotaMailboxListenerGroup extends Group {
- }
-
- private static final Group GROUP = new ElasticSearchQuotaMailboxListenerGroup();
-
- private final ElasticSearchIndexer indexer;
- private final QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson;
-
- @Inject
- public ElasticSearchQuotaMailboxListener(
- @Named(QuotaRatioElasticSearchConstants.InjectionNames.QUOTA_RATIO) ElasticSearchIndexer indexer,
- QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson) {
- this.indexer = indexer;
- this.quotaRatioToElasticSearchJson = quotaRatioToElasticSearchJson;
- }
-
- @Override
- public Group getDefaultGroup() {
- return GROUP;
- }
-
- @Override
- public boolean isHandling(Event event) {
- return event instanceof QuotaUsageUpdatedEvent;
- }
-
- @Override
- public void event(Event event) throws IOException {
- handleEvent((QuotaUsageUpdatedEvent) event);
- }
-
- private void handleEvent(QuotaUsageUpdatedEvent event) throws IOException {
- indexer.index(event.getUser().asString(),
- quotaRatioToElasticSearchJson.convertToJson(event));
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/JsonMessageConstants.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/JsonMessageConstants.java
deleted file mode 100644
index 8f930ff..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/JsonMessageConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/****************************************************************
- * 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.elasticsearch.json;
-
-public interface JsonMessageConstants {
-
- String USER = "user";
- String DOMAIN = "domain";
- String QUOTA_RATIO = "quotaRatio";
-
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJson.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJson.java
deleted file mode 100644
index 4084727..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJson.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************
- * 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.elasticsearch.json;
-
-import java.util.Objects;
-import java.util.Optional;
-
-import org.apache.james.mailbox.model.QuotaRatio;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-
-public class QuotaRatioAsJson {
-
- public static Builder builder() {
- return new Builder();
- }
-
- public static class Builder {
-
- private String user;
- private Optional<String> domain;
- private QuotaRatio quotaRatio;
-
- private Builder() {
- domain = Optional.empty();
- }
-
- public Builder user(String user) {
- this.user = user;
- return this;
- }
-
- public Builder domain(Optional<String> domain) {
- this.domain = domain;
- return this;
- }
-
- public Builder quotaRatio(QuotaRatio quotaRatio) {
- this.quotaRatio = quotaRatio;
- return this;
- }
-
- public QuotaRatioAsJson build() {
- Preconditions.checkState(!Strings.isNullOrEmpty(user), "'user' is mandatory");
- Preconditions.checkNotNull(quotaRatio, "'quotaRatio' is mandatory");
-
- return new QuotaRatioAsJson(user, domain, quotaRatio);
- }
- }
-
- private final String user;
- private final Optional<String> domain;
- private final QuotaRatio quotaRatio;
-
- private QuotaRatioAsJson(String user, Optional<String> domain, QuotaRatio quotaRatio) {
- this.user = user;
- this.domain = domain;
- this.quotaRatio = quotaRatio;
- }
-
- @JsonProperty(JsonMessageConstants.USER)
- public String getUser() {
- return user;
- }
-
- @JsonProperty(JsonMessageConstants.DOMAIN)
- public Optional<String> getDomain() {
- return domain;
- }
-
- @JsonProperty(JsonMessageConstants.QUOTA_RATIO)
- public double getMaxQuotaRatio() {
- return quotaRatio.max();
- }
-
- @Override
- public final boolean equals(Object o) {
- if (o instanceof QuotaRatioAsJson) {
- QuotaRatioAsJson that = (QuotaRatioAsJson) o;
-
- return Objects.equals(this.quotaRatio, that.quotaRatio)
- && Objects.equals(this.user, that.user)
- && Objects.equals(this.domain, that.domain);
- }
- return false;
- }
-
- @Override
- public final int hashCode() {
- return Objects.hash(user, domain, quotaRatio);
- }
-
- @Override
- public String toString() {
- return MoreObjects.toStringHelper(this)
- .add("quotaRatio", quotaRatio)
- .add("user", user)
- .add("domain", domain)
- .toString();
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
deleted file mode 100644
index b9b0937..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/****************************************************************
- * 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.elasticsearch.json;
-
-import javax.inject.Inject;
-
-import org.apache.james.core.Domain;
-import org.apache.james.mailbox.events.MailboxListener.QuotaUsageUpdatedEvent;
-import org.apache.james.mailbox.model.QuotaRatio;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
-
-public class QuotaRatioToElasticSearchJson {
-
- private final ObjectMapper mapper;
-
- @Inject
- public QuotaRatioToElasticSearchJson() {
- this.mapper = new ObjectMapper();
- this.mapper.registerModule(new Jdk8Module());
- }
-
- public String convertToJson(QuotaUsageUpdatedEvent event) throws JsonProcessingException {
- return mapper.writeValueAsString(QuotaRatioAsJson.builder()
- .user(event.getUser().asString())
- .domain(event.getQuotaRoot().getDomain().map(Domain::asString))
- .quotaRatio(QuotaRatio.from(event.getSizeQuota(), event.getCountQuota()))
- .build());
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfigurationTest.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfigurationTest.java
deleted file mode 100644
index 7966d8d..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfigurationTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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.elasticsearch;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.james.backends.es.v6.IndexName;
-import org.apache.james.backends.es.v6.ReadAliasName;
-import org.apache.james.backends.es.v6.WriteAliasName;
-import org.junit.jupiter.api.Test;
-
-class ElasticSearchQuotaConfigurationTest {
-
- @Test
- void getReadAliasQuotaRatioNameShouldReturnConfiguredValue() {
- PropertiesConfiguration configuration = new PropertiesConfiguration();
- String name = "name";
- configuration.addProperty("elasticsearch.alias.read.quota.ratio.name", name);
- configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
-
- ElasticSearchQuotaConfiguration elasticSearchConfiguration = ElasticSearchQuotaConfiguration.fromProperties(configuration);
-
- assertThat(elasticSearchConfiguration.getReadAliasQuotaRatioName())
- .isEqualTo(new ReadAliasName(name));
- }
-
- @Test
- void getReadAliasQuotaRatioNameShouldReturnDefaultValueWhenMissing() {
- PropertiesConfiguration configuration = new PropertiesConfiguration();
- configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
-
- ElasticSearchQuotaConfiguration elasticSearchConfiguration = ElasticSearchQuotaConfiguration.fromProperties(configuration);
-
- assertThat(elasticSearchConfiguration.getReadAliasQuotaRatioName())
- .isEqualTo(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_READ_ALIAS);
- }
-
- @Test
- void getWriteAliasQuotaRatioNameShouldReturnConfiguredValue() {
- PropertiesConfiguration configuration = new PropertiesConfiguration();
- String name = "name";
- configuration.addProperty("elasticsearch.alias.write.quota.ratio.name", name);
- configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
-
- ElasticSearchQuotaConfiguration elasticSearchConfiguration = ElasticSearchQuotaConfiguration.fromProperties(configuration);
-
- assertThat(elasticSearchConfiguration.getWriteAliasQuotaRatioName())
- .isEqualTo(new WriteAliasName(name));
- }
-
- @Test
- void getWriteAliasQuotaRatioNameShouldReturnDefaultValueWhenMissing() {
- PropertiesConfiguration configuration = new PropertiesConfiguration();
- configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
-
- ElasticSearchQuotaConfiguration elasticSearchConfiguration = ElasticSearchQuotaConfiguration.fromProperties(configuration);
-
- assertThat(elasticSearchConfiguration.getWriteAliasQuotaRatioName())
- .isEqualTo(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS);
- }
-
- @Test
- void getIndexQuotaRatioNameShouldReturnConfiguredValue() {
- PropertiesConfiguration configuration = new PropertiesConfiguration();
- String name = "name";
- configuration.addProperty("elasticsearch.index.quota.ratio.name", name);
- configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
-
- ElasticSearchQuotaConfiguration elasticSearchConfiguration = ElasticSearchQuotaConfiguration.fromProperties(configuration);
-
- assertThat(elasticSearchConfiguration.getIndexQuotaRatioName())
- .isEqualTo(new IndexName(name));
- }
-
- @Test
- void getIndexQuotaRatioNameShouldReturnDefaultValueWhenMissing() {
- PropertiesConfiguration configuration = new PropertiesConfiguration();
- configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
-
- ElasticSearchQuotaConfiguration elasticSearchConfiguration = ElasticSearchQuotaConfiguration.fromProperties(configuration);
-
- assertThat(elasticSearchConfiguration.getIndexQuotaRatioName())
- .isEqualTo(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_INDEX);
- }
-}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearchTestSystemExtension.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearchTestSystemExtension.java
deleted file mode 100644
index 054b845..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearchTestSystemExtension.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************
- * 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.elasticsearch;
-
-import static org.mockito.Mockito.mock;
-
-import org.apache.james.backends.es.v6.DockerElasticSearch;
-import org.apache.james.backends.es.v6.DockerElasticSearchSingleton;
-import org.apache.james.backends.es.v6.ElasticSearchConfiguration;
-import org.apache.james.backends.es.v6.ElasticSearchIndexer;
-import org.apache.james.dnsservice.api.DNSService;
-import org.apache.james.domainlist.memory.MemoryDomainList;
-import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
-import org.apache.james.mailbox.store.quota.QuotaComponents;
-import org.apache.james.quota.search.QuotaSearchTestSystem;
-import org.apache.james.quota.search.elasticsearch.events.ElasticSearchQuotaMailboxListener;
-import org.apache.james.quota.search.elasticsearch.json.QuotaRatioToElasticSearchJson;
-import org.apache.james.user.memory.MemoryUsersRepository;
-import org.elasticsearch.client.RestHighLevelClient;
-import org.junit.jupiter.api.extension.AfterEachCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-import org.junit.jupiter.api.extension.ParameterContext;
-import org.junit.jupiter.api.extension.ParameterResolutionException;
-import org.junit.jupiter.api.extension.ParameterResolver;
-
-public class ElasticSearchQuotaSearchTestSystemExtension implements ParameterResolver, BeforeEachCallback, AfterEachCallback {
-
- private final DockerElasticSearch elasticSearch = DockerElasticSearchSingleton.INSTANCE;
-
- @Override
- public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
- return (parameterContext.getParameter().getType() == QuotaSearchTestSystem.class);
- }
-
- @Override
- public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
- try {
- RestHighLevelClient client = QuotaSearchIndexCreationUtil.prepareDefaultClient(
- elasticSearch.clientProvider().get(),
- ElasticSearchConfiguration.builder()
- .addHost(elasticSearch.getHttpHost())
- .build());
-
- InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
-
- MemoryUsersRepository usersRepository = MemoryUsersRepository.withVirtualHosting();
-
- DNSService dnsService = mock(DNSService.class);
- MemoryDomainList domainList = new MemoryDomainList(dnsService);
- usersRepository.setDomainList(domainList);
-
- ElasticSearchQuotaMailboxListener listener = new ElasticSearchQuotaMailboxListener(
- new ElasticSearchIndexer(client,
- QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS),
- new QuotaRatioToElasticSearchJson());
-
- resources.getMailboxManager().getEventBus().register(listener);
-
- QuotaComponents quotaComponents = resources.getMailboxManager().getQuotaComponents();
-
- return new QuotaSearchTestSystem(
- quotaComponents.getMaxQuotaManager(),
- resources.getMailboxManager(),
- quotaComponents.getQuotaManager(),
- resources.getDefaultUserQuotaRootResolver(),
- new ElasticSearchQuotaSearcher(client,
- QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_READ_ALIAS),
- usersRepository,
- domainList,
- resources.getCurrentQuotaManager(),
- elasticSearch::awaitForElasticSearch);
- } catch (Exception e) {
- throw new ParameterResolutionException("Error while resolving parameter", e);
- }
- }
-
- @Override
- public void beforeEach(ExtensionContext context) {
- elasticSearch.start();
- }
-
- @Override
- public void afterEach(ExtensionContext context) {
- elasticSearch.cleanUpData();
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
deleted file mode 100644
index 8c41989..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************
- * 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.elasticsearch;
-
-import static org.apache.james.core.CoreFixture.Domains.SIMPSON_COM;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.stream.IntStream;
-
-import org.apache.james.core.User;
-import org.apache.james.core.quota.QuotaSize;
-import org.apache.james.quota.search.Limit;
-import org.apache.james.quota.search.Offset;
-import org.apache.james.quota.search.QuotaQuery;
-import org.apache.james.quota.search.QuotaSearchTestSystem;
-import org.apache.james.quota.search.QuotaSearcherContract;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-
-@ExtendWith(ElasticSearchQuotaSearchTestSystemExtension.class)
-class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
- @Test
- void searchShouldNotBeLimitedByElasticSearchDefaultSearchLimit(QuotaSearchTestSystem testSystem) throws Exception {
- int userCount = 11;
- testSystem.getDomainList().addDomain(SIMPSON_COM);
- testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
-
- IntStream.range(0, userCount)
- .boxed()
- .map(i -> User.fromLocalPartWithDomain("user" + i, SIMPSON_COM))
- .forEach(user -> provisionUser(testSystem, user));
- testSystem.await();
-
- assertThat(
- testSystem.getQuotaSearcher()
- .search(QuotaQuery.builder()
- .withLimit(Limit.unlimited())
- .build()))
- .hasSize(userCount);
- }
-
- @Test
- void searchShouldNotBeLimitedByElasticSearchDefaultSearchLimitWhenUsingOffset(QuotaSearchTestSystem testSystem) throws Exception {
- int userCount = 12;
- testSystem.getDomainList().addDomain(SIMPSON_COM);
- testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
-
- IntStream.range(0, userCount)
- .boxed()
- .map(i -> User.fromLocalPartWithDomain("user" + i, SIMPSON_COM))
- .forEach(user -> provisionUser(testSystem, user));
- testSystem.await();
-
- assertThat(
- testSystem.getQuotaSearcher()
- .search(QuotaQuery.builder()
- .withLimit(Limit.unlimited())
- .withOffset(Offset.of(1))
- .build()))
- .hasSize(userCount - 1);
- }
-
- private void provisionUser(QuotaSearchTestSystem testSystem, User user) {
- try {
- testSystem.getUsersRepository().addUser(user.asString(), PASSWORD);
- appendMessage(testSystem, user, withSize(49));
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverterTest.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverterTest.java
deleted file mode 100644
index 86daa88..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverterTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/****************************************************************
- * 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.elasticsearch;
-
-import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.QUOTA_RATIO;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
-import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
-import static org.elasticsearch.index.query.QueryBuilders.termQuery;
-
-import org.apache.james.core.Domain;
-import org.apache.james.quota.search.QuotaBoundary;
-import org.apache.james.quota.search.QuotaQuery;
-import org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants;
-import org.elasticsearch.index.query.QueryBuilder;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-class QuotaQueryConverterTest {
- private QuotaQueryConverter testee;
-
- @BeforeEach
- void setup() {
- testee = new QuotaQueryConverter();
- }
-
- @Test
- void fromShouldReturnMatchAllWhenEmptyClauses() {
- QuotaQuery query = QuotaQuery.builder().build();
- QueryBuilder expected = matchAllQuery();
-
- QueryBuilder actual = testee.from(query);
-
- assertThat(actual).isEqualToComparingFieldByField(expected);
- }
-
- @Test
- void fromShouldReturnDomainMatchWhenOnlyDomain() {
- QuotaQuery query = QuotaQuery.builder().hasDomain(Domain.of("my.tld")).build();
- QueryBuilder expected = termQuery(JsonMessageConstants.DOMAIN, "my.tld");
-
- QueryBuilder actual = testee.from(query);
-
- assertThat(actual).isEqualToComparingFieldByField(expected);
- }
-
- @Test
- void fromShouldReturnQuotaRatioMatchWhenLessThan() {
- QuotaQuery query = QuotaQuery.builder().lessThan(new QuotaBoundary(0.1)).build();
- QueryBuilder expected = rangeQuery(QUOTA_RATIO).lte(0.1);
-
- QueryBuilder actual = testee.from(query);
-
- assertThat(actual).isEqualToComparingFieldByField(expected);
- }
-
- @Test
- void fromShouldReturnQuotaRatioMatchWhenMoreThan() {
- QuotaQuery query = QuotaQuery.builder().moreThan(new QuotaBoundary(0.1)).build();
- QueryBuilder expected = rangeQuery(QUOTA_RATIO).gte(0.1);
-
- QueryBuilder actual = testee.from(query);
-
- assertThat(actual).isEqualToComparingFieldByField(expected);
- }
-
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
deleted file mode 100644
index bfead33..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/****************************************************************
- * 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.elasticsearch.events;
-
-import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.BOB_USER;
-import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.NOW;
-import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.QUOTAROOT;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.io.IOException;
-
-import org.apache.james.backends.es.v6.DockerElasticSearchRule;
-import org.apache.james.backends.es.v6.ElasticSearchConfiguration;
-import org.apache.james.backends.es.v6.ElasticSearchIndexer;
-import org.apache.james.backends.es.v6.NodeMappingFactory;
-import org.apache.james.mailbox.events.Event;
-import org.apache.james.mailbox.events.Group;
-import org.apache.james.mailbox.quota.QuotaFixture.Counts;
-import org.apache.james.mailbox.quota.QuotaFixture.Sizes;
-import org.apache.james.mailbox.store.event.EventFactory;
-import org.apache.james.quota.search.elasticsearch.QuotaRatioElasticSearchConstants;
-import org.apache.james.quota.search.elasticsearch.QuotaSearchIndexCreationUtil;
-import org.apache.james.quota.search.elasticsearch.json.QuotaRatioToElasticSearchJson;
-import org.elasticsearch.action.search.SearchRequest;
-import org.elasticsearch.action.search.SearchResponse;
-import org.elasticsearch.client.RequestOptions;
-import org.elasticsearch.client.RestHighLevelClient;
-import org.elasticsearch.index.query.QueryBuilders;
-import org.elasticsearch.search.builder.SearchSourceBuilder;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-public class ElasticSearchQuotaMailboxListenerTest {
- private static Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
-
- private static final int BATCH_SIZE = 1;
-
- @Rule
- public DockerElasticSearchRule elasticSearch = new DockerElasticSearchRule();
- private ElasticSearchQuotaMailboxListener quotaMailboxListener;
- private RestHighLevelClient client;
-
- @Before
- public void setUp() throws IOException {
- client = elasticSearch.clientProvider().get();
-
- QuotaSearchIndexCreationUtil.prepareDefaultClient(client, ElasticSearchConfiguration.builder()
- .addHost(elasticSearch.getDockerElasticSearch().getHttpHost())
- .build());
-
- quotaMailboxListener = new ElasticSearchQuotaMailboxListener(
- new ElasticSearchIndexer(client,
- QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS,
- BATCH_SIZE),
- new QuotaRatioToElasticSearchJson());
- }
-
- @Test
- public void deserializeElasticSearchQuotaMailboxListenerGroup() throws Exception {
- assertThat(Group.deserialize("org.apache.james.quota.search.elasticsearch.events.ElasticSearchQuotaMailboxListener$ElasticSearchQuotaMailboxListenerGroup"))
- .isEqualTo(new ElasticSearchQuotaMailboxListener.ElasticSearchQuotaMailboxListenerGroup());
- }
-
- @Test
- public void eventShouldIndexEventWhenQuotaEvent() throws Exception {
- quotaMailboxListener.event(EventFactory.quotaUpdated()
- .eventId(EVENT_ID)
- .user(BOB_USER)
- .quotaRoot(QUOTAROOT)
- .quotaCount(Counts._52_PERCENT)
- .quotaSize(Sizes._55_PERCENT)
- .instant(NOW)
- .build());
-
- elasticSearch.awaitForElasticSearch();
-
- SearchResponse searchResponse = client.search(new SearchRequest(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_READ_ALIAS.getValue())
- .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
- .source(new SearchSourceBuilder()
- .query(QueryBuilders.matchAllQuery())),
- RequestOptions.DEFAULT);
-
- assertThat(searchResponse.getHits().getTotalHits()).isEqualTo(1);
- }
-}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
deleted file mode 100644
index 68ff7d9..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/****************************************************************
- * 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.elasticsearch.json;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-
-import java.util.Optional;
-
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
-import org.apache.james.mailbox.model.Quota;
-import org.apache.james.mailbox.model.QuotaRatio;
-import org.junit.jupiter.api.Test;
-
-import nl.jqno.equalsverifier.EqualsVerifier;
-
-class QuotaRatioAsJsonTest {
-
- private static final Quota<QuotaSize> QUOTA_SIZE = Quota.<QuotaSize>builder()
- .used(QuotaSize.size(15))
- .computedLimit(QuotaSize.size(60))
- .build();
- private static final Quota<QuotaCount> QUOTA_COUNT = Quota.<QuotaCount>builder()
- .used(QuotaCount.count(1))
- .computedLimit(QuotaCount.count(2))
- .build();
-
- @Test
- void shouldMatchBeanContract() {
- EqualsVerifier.forClass(QuotaRatioAsJson.class)
- .verify();
- }
-
- @Test
- void buildShouldThrownWhenUserIsNull() {
- assertThatThrownBy(() -> QuotaRatioAsJson.builder()
- .build())
- .isInstanceOf(IllegalStateException.class);
- }
-
- @Test
- void buildShouldThrownWhenUserIsEmpty() {
- assertThatThrownBy(() -> QuotaRatioAsJson.builder()
- .user("")
- .build())
- .isInstanceOf(IllegalStateException.class);
- }
-
- @Test
- void buildShouldThrownWhenQuotaRatioIsNull() {
- assertThatThrownBy(() -> QuotaRatioAsJson.builder()
- .user("user")
- .build())
- .isInstanceOf(NullPointerException.class);
- }
-
- @Test
- void getDomainShouldReturnEmptyWhenNone() {
- QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
- .user("user")
- .quotaRatio(QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT))
- .build();
-
- assertThat(quotaRatioAsJson.getDomain()).isEmpty();
- }
-
- @Test
- void getDomainShouldReturnTheDomainWhenGiven() {
- String domain = "domain";
- QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
- .user("user")
- .domain(Optional.of(domain))
- .quotaRatio(QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT))
- .build();
-
- assertThat(quotaRatioAsJson.getDomain()).contains(domain);
- }
-
- @Test
- void getMaxQuotaRatioShouldReturnTheMaxQuotaRatio() {
- String domain = "domain";
- QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
- .user("user")
- .domain(Optional.of(domain))
- .quotaRatio(QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT))
- .build();
-
- assertThat(quotaRatioAsJson.getMaxQuotaRatio()).isEqualTo(0.5);
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
deleted file mode 100644
index 83e7b28..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************
- * 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.elasticsearch.json;
-
-import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
-import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER;
-
-import java.io.IOException;
-import java.time.Instant;
-import java.util.Optional;
-
-import org.apache.james.core.Domain;
-import org.apache.james.core.User;
-import org.apache.james.mailbox.events.Event;
-import org.apache.james.mailbox.events.MailboxListener.QuotaUsageUpdatedEvent;
-import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.quota.QuotaFixture;
-import org.apache.james.mailbox.store.event.EventFactory;
-import org.apache.james.util.ClassLoaderUtils;
-import org.junit.jupiter.api.Test;
-
-class QuotaRatioToElasticSearchJsonTest {
- private static Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
-
- @Test
- void quotaRatioShouldBeWellConvertedToJson() throws IOException {
- String user = "user@domain.org";
- QuotaUsageUpdatedEvent event = EventFactory.quotaUpdated()
- .eventId(EVENT_ID)
- .user(User.fromUsername(user))
- .quotaRoot(QuotaRoot.quotaRoot(user, Optional.of(Domain.of("domain.org"))))
- .quotaCount(QuotaFixture.Counts._52_PERCENT)
- .quotaSize(QuotaFixture.Sizes._55_PERCENT)
- .instant(Instant.now())
- .build();
- QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson = new QuotaRatioToElasticSearchJson();
- String convertToJson = quotaRatioToElasticSearchJson.convertToJson(event);
-
- assertThatJson(convertToJson)
- .when(IGNORING_ARRAY_ORDER)
- .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("quotaRatio.json"));
- }
-
- @Test
- void quotaRatioShouldBeWellConvertedToJsonWhenNoDomain() throws IOException {
- String user = "user";
- QuotaUsageUpdatedEvent event = EventFactory.quotaUpdated()
- .eventId(EVENT_ID)
- .user(User.fromUsername(user))
- .quotaRoot(QuotaRoot.quotaRoot(user, Optional.empty()))
- .quotaCount(QuotaFixture.Counts._52_PERCENT)
- .quotaSize(QuotaFixture.Sizes._55_PERCENT)
- .instant(Instant.now())
- .build();
-
- QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson = new QuotaRatioToElasticSearchJson();
- String convertToJson = quotaRatioToElasticSearchJson.convertToJson( event);
-
- assertThatJson(convertToJson)
- .when(IGNORING_ARRAY_ORDER)
- .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("quotaRatioNoDomain.json"));
- }
-}
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/resources/quotaRatio.json b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/resources/quotaRatio.json
deleted file mode 100644
index 8b39489..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/resources/quotaRatio.json
+++ /dev/null
@@ -1 +0,0 @@
-{"user":"user@domain.org","domain":"domain.org","quotaRatio":0.55}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/resources/quotaRatioNoDomain.json b/mailbox/plugin/quota-search-elasticsearch-v6/src/test/resources/quotaRatioNoDomain.json
deleted file mode 100644
index b3e2f2e..0000000
--- a/mailbox/plugin/quota-search-elasticsearch-v6/src/test/resources/quotaRatioNoDomain.json
+++ /dev/null
@@ -1 +0,0 @@
-{"user":"user","domain":null,"quotaRatio":0.55}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfiguration.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfiguration.java
index c14f339..a34b351 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfiguration.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfiguration.java
@@ -23,7 +23,6 @@ import java.util.Objects;
import java.util.Optional;
import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationException;
import org.apache.james.backends.es.IndexName;
import org.apache.james.backends.es.ReadAliasName;
import org.apache.james.backends.es.WriteAliasName;
@@ -88,7 +87,7 @@ public class ElasticSearchQuotaConfiguration {
public static final ElasticSearchQuotaConfiguration DEFAULT_CONFIGURATION = builder().build();
- public static ElasticSearchQuotaConfiguration fromProperties(Configuration configuration) throws ConfigurationException {
+ public static ElasticSearchQuotaConfiguration fromProperties(Configuration configuration) {
return builder()
.indexQuotaRatioName(computeQuotaSearchIndexName(configuration))
.readAliasQuotaRatioName(computeQuotaSearchReadAlias(configuration))
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
index 21d55a8..315b7ab 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
@@ -19,35 +19,39 @@
package org.apache.james.quota.search.elasticsearch;
-import static org.apache.james.quota.search.elasticsearch.QuotaRatioElasticSearchConstants.QUOTA_RATIO_TYPE;
import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.USER;
+import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
import org.apache.james.backends.es.AliasName;
+import org.apache.james.backends.es.NodeMappingFactory;
import org.apache.james.backends.es.ReadAliasName;
import org.apache.james.backends.es.search.ScrollIterable;
import org.apache.james.core.User;
import org.apache.james.quota.search.QuotaQuery;
import org.apache.james.quota.search.QuotaSearcher;
-import org.elasticsearch.action.search.SearchRequestBuilder;
-import org.elasticsearch.client.Client;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import com.github.steveash.guavate.Guavate;
public class ElasticSearchQuotaSearcher implements QuotaSearcher {
- private static final TimeValue TIMEOUT = new TimeValue(60000);
+ private static final TimeValue TIMEOUT = TimeValue.timeValueMinutes(1);
- private final Client client;
+ private final RestHighLevelClient client;
private final AliasName readAlias;
private final QuotaQueryConverter quotaQueryConverter;
- public ElasticSearchQuotaSearcher(Client client, ReadAliasName readAlias) {
+ public ElasticSearchQuotaSearcher(RestHighLevelClient client, ReadAliasName readAlias) {
this.client = client;
this.readAlias = readAlias;
this.quotaQueryConverter = new QuotaQueryConverter();
@@ -55,37 +59,53 @@ public class ElasticSearchQuotaSearcher implements QuotaSearcher {
@Override
public List<User> search(QuotaQuery query) {
- Stream<User> results = new ScrollIterable(client, prepareSearch(query))
- .stream()
- .flatMap(searchResponse -> Arrays.stream(searchResponse.getHits()
- .getHits()))
- .map(hit -> hit.field(USER))
- .map(field -> (String) field.getValue())
- .map(User::fromUsername)
- .skip(query.getOffset().getValue());
+ try {
+ return searchHits(query)
+ .map(SearchHit::getId)
+ .map(User::fromUsername)
+ .collect(Guavate.toImmutableList());
+ } catch (IOException e) {
+ throw new RuntimeException("Unexpected exception while executing " + query, e);
+ }
+ }
- return query.getLimit().getValue()
- .map(results::limit)
- .orElse(results)
- .collect(Guavate.toImmutableList());
+ private Stream<SearchHit> searchHits(QuotaQuery query) throws IOException {
+ if (query.getLimit().isLimited()) {
+ return executeSingleSearch(query);
+ } else {
+ return executeScrolledSearch(query);
+ }
}
- public SearchRequestBuilder prepareSearch(QuotaQuery query) {
- SearchRequestBuilder searchRequestBuilder = client.prepareSearch(readAlias.getValue())
- .setTypes(QUOTA_RATIO_TYPE.getValue())
- .setScroll(TIMEOUT)
- .addFields(USER)
- .setQuery(quotaQueryConverter.from(query));
+ private Stream<SearchHit> executeSingleSearch(QuotaQuery query) throws IOException {
+ SearchSourceBuilder searchSourceBuilder = searchSourceBuilder(query)
+ .from(query.getOffset().getValue());
+ query.getLimit().getValue()
+ .ifPresent(searchSourceBuilder::size);
- query.getLimit()
- .getValue()
- .ifPresent(searchRequestBuilder::setSize);
+ SearchRequest searchRequest = new SearchRequest(readAlias.getValue())
+ .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
+ .source(searchSourceBuilder);
- searchRequestBuilder.addSort(
- SortBuilders.fieldSort(USER)
- .order(SortOrder.ASC));
+ return Arrays.stream(client.search(searchRequest, RequestOptions.DEFAULT)
+ .getHits()
+ .getHits());
+ }
- return searchRequestBuilder;
+ private Stream<SearchHit> executeScrolledSearch(QuotaQuery query) {
+ return new ScrollIterable(client,
+ new SearchRequest(readAlias.getValue())
+ .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
+ .source(searchSourceBuilder(query))
+ .scroll(TIMEOUT))
+ .stream()
+ .flatMap(searchResponse -> Arrays.stream(searchResponse.getHits().getHits()))
+ .skip(query.getOffset().getValue());
}
+ private SearchSourceBuilder searchSourceBuilder(QuotaQuery query) {
+ return new SearchSourceBuilder()
+ .query(quotaQueryConverter.from(query))
+ .sort(SortBuilders.fieldSort(USER).order(SortOrder.ASC));
+ }
}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverter.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverter.java
index b02d8ac..a67d063 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverter.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaQueryConverter.java
@@ -43,10 +43,10 @@ import org.elasticsearch.index.query.TermQueryBuilder;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
-public class QuotaQueryConverter {
+class QuotaQueryConverter {
private final Map<Class<? extends QuotaClause>, Function<QuotaClause, QueryBuilder>> clauseConverter;
- public QuotaQueryConverter() {
+ QuotaQueryConverter() {
Builder<Class<? extends QuotaClause>, Function<QuotaClause, QueryBuilder>> builder = ImmutableMap.builder();
builder.put(HasDomain.class, this::convertHasDomain);
@@ -57,7 +57,7 @@ public class QuotaQueryConverter {
clauseConverter = builder.build();
}
- public QueryBuilder from(QuotaQuery query) {
+ QueryBuilder from(QuotaQuery query) {
List<QuotaClause> clauses = query.getClause().getClauses();
if (clauses.isEmpty()) {
return matchAllQuery();
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioElasticSearchConstants.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioElasticSearchConstants.java
index e3ceadd..e8e1904 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioElasticSearchConstants.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioElasticSearchConstants.java
@@ -21,7 +21,6 @@ package org.apache.james.quota.search.elasticsearch;
import org.apache.james.backends.es.IndexName;
import org.apache.james.backends.es.ReadAliasName;
-import org.apache.james.backends.es.TypeName;
import org.apache.james.backends.es.WriteAliasName;
public interface QuotaRatioElasticSearchConstants {
@@ -33,5 +32,4 @@ public interface QuotaRatioElasticSearchConstants {
WriteAliasName DEFAULT_QUOTA_RATIO_WRITE_ALIAS = new WriteAliasName("quota_ratio_write_alias");
ReadAliasName DEFAULT_QUOTA_RATIO_READ_ALIAS = new ReadAliasName("quota_ratio_read_alias");
IndexName DEFAULT_QUOTA_RATIO_INDEX = new IndexName("quota_ratio_v1");
- TypeName QUOTA_RATIO_TYPE = new TypeName("quota_ratio");
}
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioMappingFactory.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioMappingFactory.java
index 128f1d1..41883f7 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioMappingFactory.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaRatioMappingFactory.java
@@ -20,10 +20,8 @@
package org.apache.james.quota.search.elasticsearch;
import static org.apache.james.backends.es.NodeMappingFactory.DOUBLE;
-import static org.apache.james.backends.es.NodeMappingFactory.INDEX;
-import static org.apache.james.backends.es.NodeMappingFactory.NOT_ANALYZED;
+import static org.apache.james.backends.es.NodeMappingFactory.KEYWORD;
import static org.apache.james.backends.es.NodeMappingFactory.PROPERTIES;
-import static org.apache.james.backends.es.NodeMappingFactory.STRING;
import static org.apache.james.backends.es.NodeMappingFactory.TYPE;
import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.DOMAIN;
import static org.apache.james.quota.search.elasticsearch.json.JsonMessageConstants.QUOTA_RATIO;
@@ -34,29 +32,24 @@ import java.io.IOException;
import org.elasticsearch.common.xcontent.XContentBuilder;
-public class QuotaRatioMappingFactory {
+class QuotaRatioMappingFactory {
public static XContentBuilder getMappingContent() {
try {
return jsonBuilder()
.startObject()
+ .startObject(PROPERTIES)
- .startObject(QuotaRatioElasticSearchConstants.QUOTA_RATIO_TYPE.getValue())
- .startObject(PROPERTIES)
-
- .startObject(USER)
- .field(TYPE, STRING)
- .field(INDEX, NOT_ANALYZED)
- .endObject()
+ .startObject(USER)
+ .field(TYPE, KEYWORD)
+ .endObject()
- .startObject(DOMAIN)
- .field(TYPE, STRING)
- .field(INDEX, NOT_ANALYZED)
- .endObject()
+ .startObject(DOMAIN)
+ .field(TYPE, KEYWORD)
+ .endObject()
- .startObject(QUOTA_RATIO)
- .field(TYPE, DOUBLE)
- .endObject()
+ .startObject(QUOTA_RATIO)
+ .field(TYPE, DOUBLE)
.endObject()
.endObject()
.endObject();
@@ -64,4 +57,4 @@ public class QuotaRatioMappingFactory {
throw new RuntimeException(e);
}
}
-}
+}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaSearchIndexCreationUtil.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaSearchIndexCreationUtil.java
index f546230..c1918a9 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaSearchIndexCreationUtil.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/QuotaSearchIndexCreationUtil.java
@@ -19,20 +19,22 @@
package org.apache.james.quota.search.elasticsearch;
+import java.io.IOException;
+
import org.apache.james.backends.es.AliasName;
import org.apache.james.backends.es.ElasticSearchConfiguration;
import org.apache.james.backends.es.IndexCreationFactory;
import org.apache.james.backends.es.IndexName;
import org.apache.james.backends.es.NodeMappingFactory;
-import org.elasticsearch.client.Client;
+import org.elasticsearch.client.RestHighLevelClient;
public class QuotaSearchIndexCreationUtil {
- public static Client prepareClient(Client client,
+ public static RestHighLevelClient prepareClient(RestHighLevelClient client,
AliasName readAlias,
AliasName writeAlias,
IndexName indexName,
- ElasticSearchConfiguration configuration) {
+ ElasticSearchConfiguration configuration) throws IOException {
return NodeMappingFactory.applyMapping(
new IndexCreationFactory(configuration)
@@ -41,11 +43,10 @@ public class QuotaSearchIndexCreationUtil {
.addAlias(writeAlias)
.createIndexAndAliases(client),
indexName,
- QuotaRatioElasticSearchConstants.QUOTA_RATIO_TYPE,
QuotaRatioMappingFactory.getMappingContent());
}
- public static Client prepareDefaultClient(Client client, ElasticSearchConfiguration configuration) {
+ public static RestHighLevelClient prepareDefaultClient(RestHighLevelClient client, ElasticSearchConfiguration configuration) throws IOException {
return prepareClient(client,
QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_READ_ALIAS,
QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS,
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
index 2b828f2..4e5f1ad 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
@@ -18,19 +18,18 @@
****************************************************************/
package org.apache.james.quota.search.elasticsearch.events;
+import java.io.IOException;
+
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.james.backends.es.ElasticSearchIndexer;
-import org.apache.james.core.User;
import org.apache.james.mailbox.events.Event;
import org.apache.james.mailbox.events.Group;
import org.apache.james.mailbox.events.MailboxListener;
import org.apache.james.quota.search.elasticsearch.QuotaRatioElasticSearchConstants;
import org.apache.james.quota.search.elasticsearch.json.QuotaRatioToElasticSearchJson;
-import com.fasterxml.jackson.core.JsonProcessingException;
-
public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupMailboxListener {
public static class ElasticSearchQuotaMailboxListenerGroup extends Group {
}
@@ -59,12 +58,12 @@ public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupM
}
@Override
- public void event(Event event) throws JsonProcessingException {
- handleEvent(event.getUser(), (QuotaUsageUpdatedEvent) event);
+ public void event(Event event) throws IOException {
+ handleEvent((QuotaUsageUpdatedEvent) event);
}
- private void handleEvent(User user, QuotaUsageUpdatedEvent event) throws JsonProcessingException {
- indexer.index(user.asString(),
- quotaRatioToElasticSearchJson.convertToJson(user.asString(), event));
+ private void handleEvent(QuotaUsageUpdatedEvent event) throws IOException {
+ indexer.index(event.getUser().asString(),
+ quotaRatioToElasticSearchJson.convertToJson(event));
}
}
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
index 12f9629..b9b0937 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
@@ -39,9 +39,9 @@ public class QuotaRatioToElasticSearchJson {
this.mapper.registerModule(new Jdk8Module());
}
- public String convertToJson(String user, QuotaUsageUpdatedEvent event) throws JsonProcessingException {
+ public String convertToJson(QuotaUsageUpdatedEvent event) throws JsonProcessingException {
return mapper.writeValueAsString(QuotaRatioAsJson.builder()
- .user(user)
+ .user(event.getUser().asString())
.domain(event.getQuotaRoot().getDomain().map(Domain::asString))
.quotaRatio(QuotaRatio.from(event.getSizeQuota(), event.getCountQuota()))
.build());
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfigurationTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfigurationTest.java
index a57a10e..db513aa 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfigurationTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaConfigurationTest.java
@@ -21,17 +21,16 @@ package org.apache.james.quota.search.elasticsearch;
import static org.assertj.core.api.Assertions.assertThat;
-import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.james.backends.es.IndexName;
import org.apache.james.backends.es.ReadAliasName;
import org.apache.james.backends.es.WriteAliasName;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
-public class ElasticSearchQuotaConfigurationTest {
+class ElasticSearchQuotaConfigurationTest {
@Test
- public void getReadAliasQuotaRatioNameShouldReturnConfiguredValue() throws ConfigurationException {
+ void getReadAliasQuotaRatioNameShouldReturnConfiguredValue() {
PropertiesConfiguration configuration = new PropertiesConfiguration();
String name = "name";
configuration.addProperty("elasticsearch.alias.read.quota.ratio.name", name);
@@ -44,7 +43,7 @@ public class ElasticSearchQuotaConfigurationTest {
}
@Test
- public void getReadAliasQuotaRatioNameShouldReturnDefaultValueWhenMissing() throws ConfigurationException {
+ void getReadAliasQuotaRatioNameShouldReturnDefaultValueWhenMissing() {
PropertiesConfiguration configuration = new PropertiesConfiguration();
configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
@@ -55,7 +54,7 @@ public class ElasticSearchQuotaConfigurationTest {
}
@Test
- public void getWriteAliasQuotaRatioNameShouldReturnConfiguredValue() throws ConfigurationException {
+ void getWriteAliasQuotaRatioNameShouldReturnConfiguredValue() {
PropertiesConfiguration configuration = new PropertiesConfiguration();
String name = "name";
configuration.addProperty("elasticsearch.alias.write.quota.ratio.name", name);
@@ -68,7 +67,7 @@ public class ElasticSearchQuotaConfigurationTest {
}
@Test
- public void getWriteAliasQuotaRatioNameShouldReturnDefaultValueWhenMissing() throws ConfigurationException {
+ void getWriteAliasQuotaRatioNameShouldReturnDefaultValueWhenMissing() {
PropertiesConfiguration configuration = new PropertiesConfiguration();
configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
@@ -79,7 +78,7 @@ public class ElasticSearchQuotaConfigurationTest {
}
@Test
- public void getIndexQuotaRatioNameShouldReturnConfiguredValue() throws ConfigurationException {
+ void getIndexQuotaRatioNameShouldReturnConfiguredValue() {
PropertiesConfiguration configuration = new PropertiesConfiguration();
String name = "name";
configuration.addProperty("elasticsearch.index.quota.ratio.name", name);
@@ -92,7 +91,7 @@ public class ElasticSearchQuotaConfigurationTest {
}
@Test
- public void getIndexQuotaRatioNameShouldReturnDefaultValueWhenMissing() throws ConfigurationException {
+ void getIndexQuotaRatioNameShouldReturnDefaultValueWhenMissing() {
PropertiesConfiguration configuration = new PropertiesConfiguration();
configuration.addProperty("elasticsearch.hosts", "127.0.0.1");
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearchTestSystemExtension.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearchTestSystemExtension.java
index 5e63c46..d4bc928 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearchTestSystemExtension.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearchTestSystemExtension.java
@@ -21,9 +21,6 @@ package org.apache.james.quota.search.elasticsearch;
import static org.mockito.Mockito.mock;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-
import org.apache.james.backends.es.DockerElasticSearch;
import org.apache.james.backends.es.DockerElasticSearchSingleton;
import org.apache.james.backends.es.ElasticSearchConfiguration;
@@ -36,8 +33,7 @@ import org.apache.james.quota.search.QuotaSearchTestSystem;
import org.apache.james.quota.search.elasticsearch.events.ElasticSearchQuotaMailboxListener;
import org.apache.james.quota.search.elasticsearch.json.QuotaRatioToElasticSearchJson;
import org.apache.james.user.memory.MemoryUsersRepository;
-import org.apache.james.util.concurrent.NamedThreadFactory;
-import org.elasticsearch.client.Client;
+import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
@@ -57,10 +53,10 @@ public class ElasticSearchQuotaSearchTestSystemExtension implements ParameterRes
@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
try {
- Client client = QuotaSearchIndexCreationUtil.prepareDefaultClient(
+ RestHighLevelClient client = QuotaSearchIndexCreationUtil.prepareDefaultClient(
elasticSearch.clientProvider().get(),
ElasticSearchConfiguration.builder()
- .addHost(elasticSearch.getTcpHost())
+ .addHost(elasticSearch.getHttpHost())
.build());
InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
@@ -71,11 +67,9 @@ public class ElasticSearchQuotaSearchTestSystemExtension implements ParameterRes
MemoryDomainList domainList = new MemoryDomainList(dnsService);
usersRepository.setDomainList(domainList);
- ThreadFactory threadFactory = NamedThreadFactory.withClassName(getClass());
ElasticSearchQuotaMailboxListener listener = new ElasticSearchQuotaMailboxListener(
- new ElasticSearchIndexer(client, Executors.newSingleThreadExecutor(threadFactory),
- QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS,
- QuotaRatioElasticSearchConstants.QUOTA_RATIO_TYPE),
+ new ElasticSearchIndexer(client,
+ QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS),
new QuotaRatioToElasticSearchJson());
resources.getMailboxManager().getEventBus().register(listener);
@@ -92,14 +86,14 @@ public class ElasticSearchQuotaSearchTestSystemExtension implements ParameterRes
usersRepository,
domainList,
resources.getCurrentQuotaManager(),
- () -> elasticSearch.awaitForElasticSearch());
+ elasticSearch::awaitForElasticSearch);
} catch (Exception e) {
throw new ParameterResolutionException("Error while resolving parameter", e);
}
}
@Override
- public void beforeEach(ExtensionContext context) throws Exception {
+ public void beforeEach(ExtensionContext context) {
elasticSearch.start();
}
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
index ad26532..8c41989 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
@@ -19,10 +19,70 @@
package org.apache.james.quota.search.elasticsearch;
+import static org.apache.james.core.CoreFixture.Domains.SIMPSON_COM;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.stream.IntStream;
+
+import org.apache.james.core.User;
+import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.quota.search.Limit;
+import org.apache.james.quota.search.Offset;
+import org.apache.james.quota.search.QuotaQuery;
+import org.apache.james.quota.search.QuotaSearchTestSystem;
import org.apache.james.quota.search.QuotaSearcherContract;
+import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(ElasticSearchQuotaSearchTestSystemExtension.class)
-public class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
+class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
+ @Test
+ void searchShouldNotBeLimitedByElasticSearchDefaultSearchLimit(QuotaSearchTestSystem testSystem) throws Exception {
+ int userCount = 11;
+ testSystem.getDomainList().addDomain(SIMPSON_COM);
+ testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+
+ IntStream.range(0, userCount)
+ .boxed()
+ .map(i -> User.fromLocalPartWithDomain("user" + i, SIMPSON_COM))
+ .forEach(user -> provisionUser(testSystem, user));
+ testSystem.await();
+
+ assertThat(
+ testSystem.getQuotaSearcher()
+ .search(QuotaQuery.builder()
+ .withLimit(Limit.unlimited())
+ .build()))
+ .hasSize(userCount);
+ }
+
+ @Test
+ void searchShouldNotBeLimitedByElasticSearchDefaultSearchLimitWhenUsingOffset(QuotaSearchTestSystem testSystem) throws Exception {
+ int userCount = 12;
+ testSystem.getDomainList().addDomain(SIMPSON_COM);
+ testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+
+ IntStream.range(0, userCount)
+ .boxed()
+ .map(i -> User.fromLocalPartWithDomain("user" + i, SIMPSON_COM))
+ .forEach(user -> provisionUser(testSystem, user));
+ testSystem.await();
+
+ assertThat(
+ testSystem.getQuotaSearcher()
+ .search(QuotaQuery.builder()
+ .withLimit(Limit.unlimited())
+ .withOffset(Offset.of(1))
+ .build()))
+ .hasSize(userCount - 1);
+ }
+ private void provisionUser(QuotaSearchTestSystem testSystem, User user) {
+ try {
+ testSystem.getUsersRepository().addUser(user.asString(), PASSWORD);
+ appendMessage(testSystem, user, withSize(49));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
}
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
index d3f7811..92dc9f5 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
@@ -23,15 +23,13 @@ import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.BOB
import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.NOW;
import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.QUOTAROOT;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
-import static org.mockito.Mockito.mock;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
+import java.io.IOException;
import org.apache.james.backends.es.DockerElasticSearchRule;
import org.apache.james.backends.es.ElasticSearchConfiguration;
import org.apache.james.backends.es.ElasticSearchIndexer;
+import org.apache.james.backends.es.NodeMappingFactory;
import org.apache.james.mailbox.events.Event;
import org.apache.james.mailbox.events.Group;
import org.apache.james.mailbox.quota.QuotaFixture.Counts;
@@ -40,9 +38,12 @@ import org.apache.james.mailbox.store.event.EventFactory;
import org.apache.james.quota.search.elasticsearch.QuotaRatioElasticSearchConstants;
import org.apache.james.quota.search.elasticsearch.QuotaSearchIndexCreationUtil;
import org.apache.james.quota.search.elasticsearch.json.QuotaRatioToElasticSearchJson;
-import org.apache.james.util.concurrent.NamedThreadFactory;
+import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
-import org.elasticsearch.client.Client;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -51,27 +52,23 @@ public class ElasticSearchQuotaMailboxListenerTest {
private static Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
private static final int BATCH_SIZE = 1;
- private static final Event DUMB_EVENT = mock(Event.class);
@Rule
public DockerElasticSearchRule elasticSearch = new DockerElasticSearchRule();
private ElasticSearchQuotaMailboxListener quotaMailboxListener;
- private Client client;
+ private RestHighLevelClient client;
@Before
- public void setUp() {
- client = QuotaSearchIndexCreationUtil.prepareDefaultClient(
- elasticSearch.clientProvider().get(),
- ElasticSearchConfiguration.builder()
- .addHost(elasticSearch.getTcpHost())
- .build());
+ public void setUp() throws IOException {
+ client = elasticSearch.clientProvider().get();
+
+ QuotaSearchIndexCreationUtil.prepareDefaultClient(client, ElasticSearchConfiguration.builder()
+ .addHost(elasticSearch.getDockerElasticSearch().getHttpHost())
+ .build());
- ThreadFactory threadFactory = NamedThreadFactory.withClassName(getClass());
quotaMailboxListener = new ElasticSearchQuotaMailboxListener(
new ElasticSearchIndexer(client,
- Executors.newSingleThreadExecutor(threadFactory),
QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_WRITE_ALIAS,
- QuotaRatioElasticSearchConstants.QUOTA_RATIO_TYPE,
BATCH_SIZE),
new QuotaRatioToElasticSearchJson());
}
@@ -95,11 +92,12 @@ public class ElasticSearchQuotaMailboxListenerTest {
elasticSearch.awaitForElasticSearch();
- SearchResponse searchResponse = client.prepareSearch(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_READ_ALIAS.getValue())
- .setTypes(QuotaRatioElasticSearchConstants.QUOTA_RATIO_TYPE.getValue())
- .setQuery(matchAllQuery())
- .execute()
- .get();
- assertThat(searchResponse.getHits().totalHits()).isEqualTo(1);
+ SearchResponse searchResponse = client.search(new SearchRequest(QuotaRatioElasticSearchConstants.DEFAULT_QUOTA_RATIO_READ_ALIAS.getValue())
+ .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
+ .source(new SearchSourceBuilder()
+ .query(QueryBuilders.matchAllQuery())),
+ RequestOptions.DEFAULT);
+
+ assertThat(searchResponse.getHits().getTotalHits()).isEqualTo(1);
}
}
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
index b2c6411..68ff7d9 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.api.Test;
import nl.jqno.equalsverifier.EqualsVerifier;
-public class QuotaRatioAsJsonTest {
+class QuotaRatioAsJsonTest {
private static final Quota<QuotaSize> QUOTA_SIZE = Quota.<QuotaSize>builder()
.used(QuotaSize.size(15))
@@ -43,20 +43,20 @@ public class QuotaRatioAsJsonTest {
.build();
@Test
- public void shouldMatchBeanContract() {
+ void shouldMatchBeanContract() {
EqualsVerifier.forClass(QuotaRatioAsJson.class)
.verify();
}
@Test
- public void buildShouldThrownWhenUserIsNull() {
+ void buildShouldThrownWhenUserIsNull() {
assertThatThrownBy(() -> QuotaRatioAsJson.builder()
.build())
.isInstanceOf(IllegalStateException.class);
}
@Test
- public void buildShouldThrownWhenUserIsEmpty() {
+ void buildShouldThrownWhenUserIsEmpty() {
assertThatThrownBy(() -> QuotaRatioAsJson.builder()
.user("")
.build())
@@ -64,7 +64,7 @@ public class QuotaRatioAsJsonTest {
}
@Test
- public void buildShouldThrownWhenQuotaRatioIsNull() {
+ void buildShouldThrownWhenQuotaRatioIsNull() {
assertThatThrownBy(() -> QuotaRatioAsJson.builder()
.user("user")
.build())
@@ -72,7 +72,7 @@ public class QuotaRatioAsJsonTest {
}
@Test
- public void getDomainShouldReturnEmptyWhenNone() {
+ void getDomainShouldReturnEmptyWhenNone() {
QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
.user("user")
.quotaRatio(QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT))
@@ -82,7 +82,7 @@ public class QuotaRatioAsJsonTest {
}
@Test
- public void getDomainShouldReturnTheDomainWhenGiven() {
+ void getDomainShouldReturnTheDomainWhenGiven() {
String domain = "domain";
QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
.user("user")
@@ -94,7 +94,7 @@ public class QuotaRatioAsJsonTest {
}
@Test
- public void getMaxQuotaRatioShouldReturnTheMaxQuotaRatio() {
+ void getMaxQuotaRatioShouldReturnTheMaxQuotaRatio() {
String domain = "domain";
QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
.user("user")
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
index 4f42c92..df9cd7a 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
@@ -50,7 +50,7 @@ class QuotaRatioToElasticSearchJsonTest {
.instant(Instant.now())
.build();
QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson = new QuotaRatioToElasticSearchJson();
- String convertToJson = quotaRatioToElasticSearchJson.convertToJson(user, event);
+ String convertToJson = quotaRatioToElasticSearchJson.convertToJson(event);
assertThatJson(convertToJson)
.when(IGNORING_ARRAY_ORDER)
@@ -69,9 +69,8 @@ class QuotaRatioToElasticSearchJsonTest {
.instant(Instant.now())
.build();
-
QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson = new QuotaRatioToElasticSearchJson();
- String convertToJson = quotaRatioToElasticSearchJson.convertToJson(user, event);
+ String convertToJson = quotaRatioToElasticSearchJson.convertToJson(event);
assertThatJson(convertToJson)
.when(IGNORING_ARRAY_ORDER)
diff --git a/mailbox/pom.xml b/mailbox/pom.xml
index 449bb35..7e3dcd2 100644
--- a/mailbox/pom.xml
+++ b/mailbox/pom.xml
@@ -57,7 +57,6 @@
<module>plugin/quota-mailing-memory</module>
<module>plugin/quota-search</module>
<module>plugin/quota-search-elasticsearch</module>
- <module>plugin/quota-search-elasticsearch-v6</module>
<module>plugin/quota-search-scanning</module>
<module>plugin/spamassassin</module>
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org