This is an automated email from the ASF dual-hosted git repository. rouazana pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit dd266ce4c79508269810b015dd51fb1c2eaa604a Author: Rémi Kowalski <[email protected]> AuthorDate: Thu Jul 18 15:34:04 2019 +0200 JAMES-2813 add Operator and expected value in criterion ValueMatcher --- .../apache/james/vault/dto/query/CriterionDTO.java | 3 +- .../james/vault/dto/query/QueryTranslator.java | 49 +++++++--------------- .../org/apache/james/vault/search/Criterion.java | 31 +++++++++++--- .../james/vault/search/CriterionFactory.java | 26 +++++++----- .../vault/search/{Criterion.java => Operator.java} | 45 ++++++-------------- .../dto/query/QueryElementDeserializerTest.java | 2 +- .../dto/query/QueryElementSerializerTest.java | 2 +- .../james/vault/dto/query/QueryTranslatorTest.java | 2 +- 8 files changed, 75 insertions(+), 85 deletions(-) diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java index 374d1ef..0497e27 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java @@ -22,6 +22,7 @@ package org.apache.james.vault.dto.query; import java.util.Objects; import org.apache.james.vault.search.FieldName; +import org.apache.james.vault.search.Operator; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -33,7 +34,7 @@ import com.google.common.base.MoreObjects; public class CriterionDTO implements QueryElement { @VisibleForTesting - static CriterionDTO from(FieldName fieldName, QueryTranslator.Operator operator, String value) { + static CriterionDTO from(FieldName fieldName, Operator operator, String value) { return new CriterionDTO(fieldName.getValue(), operator.getValue(), value); } diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java index e51dc83..2bd22fc 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java @@ -24,12 +24,12 @@ import static org.apache.james.vault.dto.query.QueryTranslator.FieldValueParser. import static org.apache.james.vault.dto.query.QueryTranslator.FieldValueParser.MAIL_ADDRESS_PARSER; import static org.apache.james.vault.dto.query.QueryTranslator.FieldValueParser.STRING_PARSER; import static org.apache.james.vault.dto.query.QueryTranslator.FieldValueParser.ZONED_DATE_TIME_PARSER; -import static org.apache.james.vault.dto.query.QueryTranslator.Operator.AFTER_OR_EQUALS; -import static org.apache.james.vault.dto.query.QueryTranslator.Operator.BEFORE_OR_EQUALS; -import static org.apache.james.vault.dto.query.QueryTranslator.Operator.CONTAINS; -import static org.apache.james.vault.dto.query.QueryTranslator.Operator.CONTAINS_IGNORE_CASE; -import static org.apache.james.vault.dto.query.QueryTranslator.Operator.EQUALS; -import static org.apache.james.vault.dto.query.QueryTranslator.Operator.EQUALS_IGNORE_CASE; +import static org.apache.james.vault.search.Operator.AFTER_OR_EQUALS; +import static org.apache.james.vault.search.Operator.BEFORE_OR_EQUALS; +import static org.apache.james.vault.search.Operator.CONTAINS; +import static org.apache.james.vault.search.Operator.CONTAINS_IGNORE_CASE; +import static org.apache.james.vault.search.Operator.EQUALS; +import static org.apache.james.vault.search.Operator.EQUALS_IGNORE_CASE; import java.time.ZonedDateTime; import java.util.Objects; @@ -45,6 +45,7 @@ import org.apache.james.mailbox.model.MailboxId; import org.apache.james.vault.search.Criterion; import org.apache.james.vault.search.CriterionFactory; import org.apache.james.vault.search.FieldName; +import org.apache.james.vault.search.Operator; import org.apache.james.vault.search.Query; import com.github.fge.lambdas.Throwing; @@ -68,6 +69,13 @@ public class QueryTranslator { .orElseThrow(() -> new QueryTranslator.QueryTranslatorException("fieldName: '" + fieldNameString + "' is not supported")); } + static Operator getOperator(String operator) throws QueryTranslatorException { + return Stream.of(Operator.values()) + .filter(operatorString -> operatorString.getValue().equals(operator)) + .findFirst() + .orElseThrow(() -> new QueryTranslatorException("operator: '" + operator + "' is not supported")); + } + enum Combinator { AND("and"); @@ -83,33 +91,6 @@ public class QueryTranslator { } - - enum Operator { - EQUALS("equals"), - EQUALS_IGNORE_CASE("equalsIgnoreCase"), - CONTAINS("contains"), - CONTAINS_IGNORE_CASE("containsIgnoreCase"), - BEFORE_OR_EQUALS("beforeOrEquals"), - AFTER_OR_EQUALS("afterOrEquals"); - - static Operator getOperator(String operator) throws QueryTranslatorException { - return Stream.of(values()) - .filter(operatorString -> operatorString.value.equals(operator)) - .findFirst() - .orElseThrow(() -> new QueryTranslatorException("operator: '" + operator + "' is not supported")); - } - - private final String value; - - Operator(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - } - interface FieldValueParser<T> { class MailboxIdValueParser implements FieldValueParser<MailboxId> { @@ -182,7 +163,7 @@ public class QueryTranslator { private Function<String, Criterion<?>> getCriterionParser(CriterionDTO dto) { return criterionRegistry.get( getField(dto.getFieldName()), - Operator.getOperator(dto.getOperator())); + getOperator(dto.getOperator())); } public Query translate(QueryElement queryElement) throws QueryTranslatorException { diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java index 0e18380..770c596 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java @@ -25,12 +25,33 @@ import org.apache.james.vault.DeletedMessage; public class Criterion<T> { - public interface ValueMatcher<T> { - boolean matches(T referenceValue); + public static class ValueMatcher<V, T> { + + private V expectedValue; + private Operator operator; + private Predicate<T> matchPredicate; + + public ValueMatcher(V expectedValue, Operator operator, Predicate<T> matchPredicate) { + this.expectedValue = expectedValue; + this.operator = operator; + this.matchPredicate = matchPredicate; + } + + public V expectedValue() { + return expectedValue; + } + + public Operator operator() { + return operator; + } + + public boolean matches(T value) { + return matchPredicate.test(value); + } } public interface ExpectMatcher<T> { - Criterion<T> withMatcher(ValueMatcher<T> valueMatcher); + Criterion<T> withMatcher(ValueMatcher<?, T> valueMatcher); } public interface Builder { @@ -42,9 +63,9 @@ public class Criterion<T> { private static final boolean DEFAULT_TO_NON_MATCHED_IF_NON_EXIST = false; private final DeletedMessageField<T> field; - private final ValueMatcher<T> valueMatcher; + private final ValueMatcher<?, T> valueMatcher; - private Criterion(DeletedMessageField<T> field, ValueMatcher<T> valueMatcher) { + private Criterion(DeletedMessageField<T> field, ValueMatcher<?, T> valueMatcher) { this.field = field; this.valueMatcher = valueMatcher; } diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java index ed2b0a4..aa0a330 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java @@ -26,6 +26,12 @@ import static org.apache.james.vault.search.DeletedMessageField.ORIGIN_MAILBOXES import static org.apache.james.vault.search.DeletedMessageField.RECIPIENTS; import static org.apache.james.vault.search.DeletedMessageField.SENDER; import static org.apache.james.vault.search.DeletedMessageField.SUBJECT; +import static org.apache.james.vault.search.Operator.AFTER_OR_EQUALS; +import static org.apache.james.vault.search.Operator.BEFORE_OR_EQUALS; +import static org.apache.james.vault.search.Operator.CONTAINS; +import static org.apache.james.vault.search.Operator.CONTAINS_IGNORE_CASE; +import static org.apache.james.vault.search.Operator.EQUALS; +import static org.apache.james.vault.search.Operator.EQUALS_IGNORE_CASE; import java.time.ZonedDateTime; import java.util.Collection; @@ -45,19 +51,19 @@ public interface CriterionFactory { } public Criterion<String> contains(String subString) { - return builder.withMatcher(value -> value.contains(subString)); + return builder.withMatcher(new Criterion.ValueMatcher<>(subString, CONTAINS, value -> value.contains(subString))); } public Criterion<String> containsIgnoreCase(String subString) { - return builder.withMatcher(value -> value.toLowerCase(Locale.US).contains(subString.toLowerCase(Locale.US))); + return builder.withMatcher(new Criterion.ValueMatcher<>(subString, CONTAINS_IGNORE_CASE, value -> value.toLowerCase(Locale.US).contains(subString.toLowerCase(Locale.US)))); } public Criterion<String> equals(String expectedString) { - return builder.withMatcher(expectedString::equals); + return builder.withMatcher(new Criterion.ValueMatcher<>(expectedString, EQUALS, expectedString::equals)); } public Criterion<String> equalsIgnoreCase(String expectedString) { - return builder.withMatcher(expectedString::equalsIgnoreCase); + return builder.withMatcher(new Criterion.ValueMatcher<>(expectedString, EQUALS_IGNORE_CASE, expectedString::equalsIgnoreCase)); } } @@ -70,11 +76,11 @@ public interface CriterionFactory { } public Criterion<ZonedDateTime> beforeOrEquals(ZonedDateTime expectedValue) { - return builder.withMatcher(actualValue -> !expectedValue.isBefore(actualValue)); + return builder.withMatcher(new Criterion.ValueMatcher<>(expectedValue, BEFORE_OR_EQUALS, value -> !expectedValue.isBefore(value))); } public Criterion<ZonedDateTime> afterOrEquals(ZonedDateTime expectedValue) { - return builder.withMatcher(actualValue -> !expectedValue.isAfter(actualValue)); + return builder.withMatcher(new Criterion.ValueMatcher<>(expectedValue, AFTER_OR_EQUALS, value -> !expectedValue.isAfter(value))); } } @@ -88,12 +94,12 @@ public interface CriterionFactory { static Criterion<Collection<MailAddress>> containsRecipient(MailAddress recipient) { return Criterion.Builder.forField(RECIPIENTS) - .withMatcher(actualValue -> actualValue.contains(recipient)); + .withMatcher(new Criterion.ValueMatcher<>(recipient, CONTAINS, value -> value.contains(recipient))); } static Criterion<MailAddress> hasSender(MailAddress sender) { return Criterion.Builder.forField(SENDER) - .withMatcher(sender::equals); + .withMatcher(new Criterion.ValueMatcher<>(sender, EQUALS, sender::equals)); } static Criterion<Boolean> hasAttachment() { @@ -106,7 +112,7 @@ public interface CriterionFactory { static Criterion<Boolean> hasAttachment(boolean hasAttachment) { return Criterion.Builder.forField(HAS_ATTACHMENT) - .withMatcher(actualValue -> hasAttachment == actualValue); + .withMatcher(new Criterion.ValueMatcher<>(hasAttachment, EQUALS, value -> hasAttachment == value)); } static StringCriterionFactory subject() { @@ -115,6 +121,6 @@ public interface CriterionFactory { static Criterion<Collection<MailboxId>> containsOriginMailbox(MailboxId mailboxId) { return Criterion.Builder.forField(ORIGIN_MAILBOXES) - .withMatcher(actualValue -> actualValue.contains(mailboxId)); + .withMatcher(new Criterion.ValueMatcher<>(mailboxId, CONTAINS, value -> value.contains(mailboxId))); } } diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Operator.java similarity index 54% copy from mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java copy to mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Operator.java index 0e18380..3689b0f 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Operator.java @@ -16,42 +16,23 @@ * specific language governing permissions and limitations * * under the License. * ****************************************************************/ - package org.apache.james.vault.search; -import java.util.function.Predicate; - -import org.apache.james.vault.DeletedMessage; - -public class Criterion<T> { - - public interface ValueMatcher<T> { - boolean matches(T referenceValue); - } - - public interface ExpectMatcher<T> { - Criterion<T> withMatcher(ValueMatcher<T> valueMatcher); - } - - public interface Builder { - static <U> ExpectMatcher<U> forField(DeletedMessageField<U> field) { - return matcher -> new Criterion<>(field, matcher); - } - } - - private static final boolean DEFAULT_TO_NON_MATCHED_IF_NON_EXIST = false; +public enum Operator { + EQUALS("equals"), + EQUALS_IGNORE_CASE("equalsIgnoreCase"), + CONTAINS("contains"), + CONTAINS_IGNORE_CASE("containsIgnoreCase"), + BEFORE_OR_EQUALS("beforeOrEquals"), + AFTER_OR_EQUALS("afterOrEquals"); - private final DeletedMessageField<T> field; - private final ValueMatcher<T> valueMatcher; + private final String value; - private Criterion(DeletedMessageField<T> field, ValueMatcher<T> valueMatcher) { - this.field = field; - this.valueMatcher = valueMatcher; + Operator(String value) { + this.value = value; } - Predicate<DeletedMessage> toPredicate() { - return deletedMessage -> field.valueExtractor().extract(deletedMessage) - .map(valueMatcher::matches) - .orElse(DEFAULT_TO_NON_MATCHED_IF_NON_EXIST); + public String getValue() { + return value; } -} +} \ No newline at end of file diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java index 1187003..d2b0932 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java @@ -23,8 +23,8 @@ import static org.apache.james.vault.DeletedMessageFixture.SUBJECT; import static org.apache.mailet.base.MailAddressFixture.SENDER; import static org.assertj.core.api.Assertions.assertThat; -import org.apache.james.vault.dto.query.QueryTranslator.Operator; import org.apache.james.vault.search.FieldName; +import org.apache.james.vault.search.Operator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java index 730034c..105de89 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java @@ -22,8 +22,8 @@ package org.apache.james.vault.dto.query; import static org.apache.james.vault.DeletedMessageFixture.SUBJECT; import static org.apache.mailet.base.MailAddressFixture.SENDER; -import org.apache.james.vault.dto.query.QueryTranslator.Operator; import org.apache.james.vault.search.FieldName; +import org.apache.james.vault.search.Operator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java index 75fa081..37986f7 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java @@ -23,8 +23,8 @@ import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.apache.james.mailbox.inmemory.InMemoryId; -import org.apache.james.vault.dto.query.QueryTranslator.Operator; import org.apache.james.vault.search.FieldName; +import org.apache.james.vault.search.Operator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
