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/06/07 10:59:15 UTC

[james-project] 07/07: JAMES-2279 Write a WithPriority mailet and HasPriority matchers

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 f9fe42c18456c31810d2827b7a3270762af40135
Author: ilker yıldırım <il...@gmail.com>
AuthorDate: Sun Feb 3 03:22:45 2019 +0300

    JAMES-2279 Write a WithPriority mailet and HasPriority matchers
    
    Many thanks to ilker yıldırım for this nice contribution!
---
 server/app/src/main/resources/mailetcontainer.xml  | 11 ++-
 .../james/transport/mailets/WithPriority.java      | 16 ++--
 .../AbstractPriorityMatcher.java}                  | 65 ++++++++--------
 .../james/transport/matchers/AtLeastPriority.java  | 31 ++++++++
 .../james/transport/matchers/AtMostPriority.java   | 31 ++++++++
 .../james/transport/matchers/HasPriority.java      | 31 ++++++++
 .../transport/matchers/AtLeastPriorityTest.java    | 86 ++++++++++++++++++++++
 .../transport/matchers/AtMostPriorityTest.java     | 85 +++++++++++++++++++++
 .../james/transport/matchers/HasPriorityTest.java  | 77 +++++++++++++++++++
 9 files changed, 393 insertions(+), 40 deletions(-)

diff --git a/server/app/src/main/resources/mailetcontainer.xml b/server/app/src/main/resources/mailetcontainer.xml
index ae84957..b193bfc 100644
--- a/server/app/src/main/resources/mailetcontainer.xml
+++ b/server/app/src/main/resources/mailetcontainer.xml
@@ -56,7 +56,16 @@
        <!-- Important check to avoid looping -->
        <mailet match="RelayLimit=30" class="Null"/>
 
-       <!-- Check attachment extensions for possible viruses -->
+        <mailet matcher="All" class="WithPriority">
+            <value>8</value>
+        </mailet>
+
+        <mailet matcher="HasPriority=8" class="Null"/>
+        <mailet matcher="AtLeastPriority=8" class="Null"/>
+        <mailet matcher="AtMostPriority=8" class="Null"/>
+
+
+        <!-- Check attachment extensions for possible viruses -->
        <!-- The "-z" option requests the check to be non-recursively applied -->
        <!-- to the contents of any attached '*.zip' file. -->
        <!-- 
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
index 3138f4b..3fc9776 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
@@ -50,17 +50,17 @@ public class WithPriority extends GenericMailet {
     @Override
     public void init() throws MessagingException {
         Integer priorityRaw = Optional.ofNullable(getInitParameter("priority", null))
-            .map(Integer::valueOf)
-            .orElseThrow(() -> new IllegalArgumentException("'priority' init parameter is compulsory"));
+                .map(Integer::valueOf)
+                .orElseThrow(() -> new IllegalArgumentException("'priority' init parameter is compulsory"));
 
         if (priorityRaw < 0 || priorityRaw > 9) {
             throw new IllegalArgumentException("Invalid priority: Priority should be from 0 to 9");
+            }
+            priority = new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priorityRaw));
         }
-        priority = new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priorityRaw));
-    }
 
-    @Override
-    public void service(Mail mail) throws MessagingException {
-        mail.setAttribute(priority);
+        @Override
+        public void service(Mail mail) throws MessagingException {
+            mail.setAttribute(priority);
+        }
     }
-}
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractPriorityMatcher.java
similarity index 51%
copy from server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
copy to server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractPriorityMatcher.java
index 3138f4b..18170fd 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractPriorityMatcher.java
@@ -16,51 +16,54 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
+package org.apache.james.transport.matchers;
 
-package org.apache.james.transport.mailets;
-
-import java.util.Optional;
-
+import java.util.Collection;
 import javax.mail.MessagingException;
 
+import org.apache.james.core.MailAddress;
 import org.apache.james.queue.api.MailPrioritySupport;
-import org.apache.mailet.Attribute;
-import org.apache.mailet.AttributeValue;
+import org.apache.mailet.AttributeUtils;
 import org.apache.mailet.Mail;
-import org.apache.mailet.base.GenericMailet;
+import org.apache.mailet.base.GenericMatcher;
+import org.apache.mailet.base.MailetUtil;
 
-/**
- * This mailet sets the priority of the incoming mail.
- *
- * Example configuration:
- *
- * <mailet match="All" class="WithPriority">
- *     <priority>7</priority>
- * </mailet>
- */
-public class WithPriority extends GenericMailet {
+import com.google.common.collect.ImmutableList;
 
-    private Attribute priority;
 
-    @Override
-    public String getMailetInfo() {
-        return "With Priority Mailet";
+public abstract class AbstractPriorityMatcher extends GenericMatcher {
+    private final String priorityMatcherName;
+    private Integer priority;
+
+    public AbstractPriorityMatcher(String priorityMatcherName) {
+        this.priorityMatcherName = priorityMatcherName;
     }
 
     @Override
     public void init() throws MessagingException {
-        Integer priorityRaw = Optional.ofNullable(getInitParameter("priority", null))
-            .map(Integer::valueOf)
-            .orElseThrow(() -> new IllegalArgumentException("'priority' init parameter is compulsory"));
-
-        if (priorityRaw < 0 || priorityRaw > 9) {
-            throw new IllegalArgumentException("Invalid priority: Priority should be from 0 to 9");
-        }
-        priority = new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priorityRaw));
+        Integer priority = MailetUtil.getInitParameterAsStrictlyPositiveInteger(getCondition());
+        this.setPriority(priority);
     }
 
     @Override
-    public void service(Mail mail) throws MessagingException {
-        mail.setAttribute(priority);
+    public Collection<MailAddress> match(Mail mail) throws MessagingException {
+        return AttributeUtils.getValueAndCastFromMail(mail, MailPrioritySupport.MAIL_PRIORITY, Integer.class)
+                .filter(this::priorityMatch)
+                .map(any -> mail.getRecipients())
+                .orElse(ImmutableList.of());
+    }
+
+    public abstract boolean priorityMatch(Integer mailPriorityValue);
+
+    public Integer getPriority() {
+        return priority;
+    }
+
+    public void setPriority(Integer priority) {
+        this.priority = priority;
+    }
+
+    public String getPriorityMatcherName() {
+        return priorityMatcherName;
     }
 }
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtLeastPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtLeastPriority.java
new file mode 100644
index 0000000..0dc93be
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtLeastPriority.java
@@ -0,0 +1,31 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+public class AtLeastPriority extends AbstractPriorityMatcher {
+    public AtLeastPriority() {
+        super("AtLeastPriority");
+    }
+
+    @Override
+    public boolean priorityMatch(Integer mailPriorityValue) {
+        return this.getPriority() <= mailPriorityValue;
+    }
+
+}
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtMostPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtMostPriority.java
new file mode 100644
index 0000000..0faf109
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtMostPriority.java
@@ -0,0 +1,31 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+public class AtMostPriority extends AbstractPriorityMatcher {
+    public AtMostPriority() {
+        super("AtMostPriority");
+    }
+
+    @Override
+    public boolean priorityMatch(Integer mailPriorityValue) {
+        return this.getPriority() >= mailPriorityValue;
+    }
+
+}
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/HasPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/HasPriority.java
new file mode 100644
index 0000000..ec3197f
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/HasPriority.java
@@ -0,0 +1,31 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+public class HasPriority extends AbstractPriorityMatcher {
+    public HasPriority() {
+        super("HasPriority");
+    }
+
+    @Override
+    public boolean priorityMatch(Integer mailPriorityValue) {
+        return this.getPriority() == mailPriorityValue;
+    }
+
+}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtLeastPriorityTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtLeastPriorityTest.java
new file mode 100644
index 0000000..0b3d916
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtLeastPriorityTest.java
@@ -0,0 +1,86 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import java.util.Collection;
+import javax.mail.MessagingException;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.james.core.MailAddress;
+import org.apache.james.queue.api.MailPrioritySupport;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+
+public class AtLeastPriorityTest {
+    protected AtLeastPriority matcher;
+    protected MailAddress testRecipient;
+    private final String condition = "5";
+
+    private FakeMail createFakeMail(Integer priority) throws MessagingException {
+        FakeMail fakeMail = FakeMail.builder().name("test-message")
+                .recipient(testRecipient)
+                .attribute(new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priority)))
+                .build();
+        return fakeMail;
+    }
+
+    @Before
+    public void setup() throws MessagingException {
+        this.matcher = new AtLeastPriority();
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+                .matcherName(matcher.getPriorityMatcherName())
+                .condition(condition)
+                .build();
+
+        matcher.init(matcherConfig);
+        testRecipient = new MailAddress("test@james.apache.org");
+    }
+
+    @Test
+    public void shouldNotMatchWhenPriorityDoesNotMatch() throws MessagingException {
+        FakeMail fakeMail = createFakeMail(3);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @Test
+    public void shouldMatchWhenPriorityMatch() throws MessagingException {
+        FakeMail fakeMail = createFakeMail(5);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+    @Test
+    public void shouldMatchWhenMailHasHigherPriority() throws MessagingException {
+        FakeMail fakeMail = createFakeMail(7);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtMostPriorityTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtMostPriorityTest.java
new file mode 100644
index 0000000..cb9de9b
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtMostPriorityTest.java
@@ -0,0 +1,85 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import java.util.Collection;
+import javax.mail.MessagingException;
+import org.apache.james.core.MailAddress;
+import org.apache.james.queue.api.MailPrioritySupport;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AtMostPriorityTest{
+    protected AtMostPriority matcher;
+    protected MailAddress testRecipient;
+    private final String condition = "5";
+
+    private FakeMail createFakeMail(Integer priority) throws MessagingException {
+        FakeMail fakeMail = FakeMail.builder().name("test-message")
+                .recipient(testRecipient)
+                .attribute(new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priority)))
+                .build();
+        return fakeMail;
+    }
+
+    @Before
+    public void setup() throws MessagingException {
+        this.matcher = new AtMostPriority();
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+                .matcherName(matcher.getPriorityMatcherName())
+                .condition(condition)
+                .build();
+
+        matcher.init(matcherConfig);
+        testRecipient = new MailAddress("test@james.apache.org");
+    }
+
+    @Test
+    public void shouldMatchWhenMailHasLowerPriority() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(3);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+    @Test
+    public void shouldMatchWhenPriorityMatch() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(5);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+    @Test
+    public void shouldNotMatchWhenPriorityDoesNotMatch() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(7);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).isEmpty();
+    }
+
+}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/HasPriorityTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/HasPriorityTest.java
new file mode 100644
index 0000000..d521db3
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/HasPriorityTest.java
@@ -0,0 +1,77 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import org.apache.james.core.MailAddress;
+import org.apache.james.queue.api.MailPrioritySupport;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+
+import java.util.Collection;
+import javax.mail.MessagingException;
+import org.junit.Before;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class HasPriorityTest {
+    protected HasPriority matcher;
+    protected MailAddress testRecipient;
+    private final String condition = "5";
+
+    private FakeMail createFakeMail(Integer priority) throws MessagingException {
+        FakeMail fakeMail = FakeMail.builder().name("test-message")
+                .recipient(testRecipient)
+                .attribute(new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priority)))
+                .build();
+        return fakeMail;
+    }
+
+    @Before
+    public void setup() throws MessagingException {
+        this.matcher = new HasPriority();
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+                .matcherName(matcher.getPriorityMatcherName())
+                .condition(condition)
+                .build();
+
+        matcher.init(matcherConfig);
+        testRecipient = new MailAddress("test@james.apache.org");
+    }
+
+    @Test
+    public void shouldMatchWhenPriorityMatch() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(5);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+    @Test
+    public void shouldNotMatchWhenPriorityDoesNotMatch() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(7);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).isEmpty();
+    }
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org