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 ro...@apache.org on 2017/01/10 14:18:19 UTC

[04/50] [abbrv] james-project git commit: JAMES-1877 Extract Delay

JAMES-1877 Extract Delay


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1193b6b4
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1193b6b4
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1193b6b4

Branch: refs/heads/master
Commit: 1193b6b4a542a0cd61bd2e7b74567b3a92207554
Parents: 03fc53a
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Nov 29 10:56:27 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Tue Jan 10 14:35:31 2017 +0700

----------------------------------------------------------------------
 .../james/transport/mailets/RemoteDelivery.java | 118 +------------
 .../transport/mailets/remoteDelivery/Delay.java | 166 +++++++++++++++++++
 .../mailets/remoteDelivery/DelayTest.java       |  96 +++++++++++
 3 files changed, 264 insertions(+), 116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1193b6b4/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
index 89a4987..b23f79d 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
@@ -39,8 +39,6 @@ import java.util.Properties;
 import java.util.StringTokenizer;
 import java.util.Vector;
 import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import javax.inject.Inject;
 import javax.mail.Address;
@@ -65,10 +63,9 @@ import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueue.MailQueueException;
 import org.apache.james.queue.api.MailQueue.MailQueueItem;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.transport.mailets.remoteDelivery.Delay;
 import org.apache.james.transport.mailets.remoteDelivery.HeloNameProvider;
 import org.apache.james.transport.mailets.remoteDelivery.RemoteDeliverySocketFactory;
-import org.apache.james.transport.util.Patterns;
-import org.apache.james.util.TimeConverter;
 import org.apache.mailet.HostAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
@@ -151,17 +148,6 @@ import com.sun.mail.smtp.SMTPTransport;
 @SuppressWarnings("deprecation")
 public class RemoteDelivery extends GenericMailet implements Runnable {
 
-    /**
-     * Default Delay Time (Default is 6*60*60*1000 Milliseconds (6 hours)).
-     */
-    private static final long DEFAULT_DELAY_TIME = 21600000;
-
-    /**
-     * Pattern to match [attempts*]delay[units].
-     */
-    private static final String PATTERN_STRING = "\\s*([0-9]*\\s*[\\*])?\\s*([0-9]+)\\s*([a-z,A-Z]*)\\s*";
-
-    private static final Pattern PATTERN = Patterns.compilePatternUncheckedException(PATTERN_STRING);
     private static final String OUTGOING_MAILS = "outgoingMails";
 
     private final DNSService dnsServer;
@@ -502,111 +488,11 @@ public class RemoteDelivery extends GenericMailet implements Runnable {
      */
     private long getNextDelay(int retry_count) {
         if (retry_count > delayTimes.length) {
-            return DEFAULT_DELAY_TIME;
+            return Delay.DEFAULT_DELAY_TIME;
         }
         return delayTimes[retry_count - 1];
     }
 
-    /**
-     * This class is used to hold a delay time and its corresponding number of
-     * retries.
-     */
-    private final static class Delay {
-        private int attempts = 1;
-
-        private long delayTime = DEFAULT_DELAY_TIME;
-
-        /**
-         * <p>
-         * This constructor expects Strings of the form
-         * "[attempt\*]delaytime[unit]".
-         * </p>
-         * <p>
-         * The optional attempt is the number of tries this delay should be used
-         * (default = 1). The unit, if present, must be one of
-         * (msec,sec,minute,hour,day). The default value of unit is 'msec'.
-         * </p>
-         * <p>
-         * The constructor multiplies the delaytime by the relevant multiplier
-         * for the unit, so the delayTime instance variable is always in msec.
-         * </p>
-         *
-         * @param initString the string to initialize this Delay object from
-         */
-        public Delay(String initString) throws MessagingException {
-            // Default unit value to 'msec'.
-            String unit = "msec";
-
-            Matcher res = PATTERN.matcher(initString);
-            if (res.matches()) {
-                // The capturing groups will now hold:
-                // at 1: attempts * (if present)
-                // at 2: delaytime
-                // at 3: unit (if present)
-                if (res.group(1) != null && !res.group(1).equals("")) {
-                    // We have an attempt *
-                    String attemptMatch = res.group(1);
-
-                    // Strip the * and whitespace.
-                    attemptMatch = attemptMatch.substring(0, attemptMatch.length() - 1).trim();
-                    attempts = Integer.parseInt(attemptMatch);
-                }
-
-                delayTime = Long.parseLong(res.group(2));
-
-                if (!res.group(3).equals("")) {
-                    // We have a value for 'unit'.
-                    unit = res.group(3).toLowerCase(Locale.US);
-                }
-            } else {
-                throw new MessagingException(initString + " does not match " + PATTERN_STRING);
-            }
-
-            // calculate delayTime.
-            try {
-                delayTime = TimeConverter.getMilliSeconds(delayTime, unit);
-            } catch (NumberFormatException e) {
-                throw new MessagingException(e.getMessage());
-            }
-        }
-
-        /**
-         * This constructor makes a default Delay object with attempts = 1 and
-         * delayTime = DEFAULT_DELAY_TIME.
-         */
-        public Delay() {
-        }
-
-        /**
-         * @return the delayTime for this Delay
-         */
-        public long getDelayTime() {
-            return delayTime;
-        }
-
-        /**
-         * @return the number attempts this Delay should be used.
-         */
-        public int getAttempts() {
-            return attempts;
-        }
-
-        /**
-         * Set the number attempts this Delay should be used.
-         */
-        public void setAttempts(int value) {
-            attempts = value;
-        }
-
-        /**
-         * Pretty prints this Delay
-         */
-        @Override
-        public String toString() {
-            return getAttempts() + "*" + getDelayTime() + "msecs";
-        }
-    }
-
     @Override
     public String getMailetInfo() {
         return "RemoteDelivery Mailet";

http://git-wip-us.apache.org/repos/asf/james-project/blob/1193b6b4/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Delay.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Delay.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Delay.java
new file mode 100644
index 0000000..c066a63
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remoteDelivery/Delay.java
@@ -0,0 +1,166 @@
+/****************************************************************
+ * 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.mailets.remoteDelivery;
+
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.transport.util.Patterns;
+import org.apache.james.util.TimeConverter;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
+
+/**
+ * This class is used to hold a delay time and its corresponding number of
+ * retries.
+ */
+public class Delay {
+
+    /**
+     * Default Delay Time (Default is 6*60*60*1000 Milliseconds (6 hours)).
+     */
+    public static final long DEFAULT_DELAY_TIME = 21600000;
+    public static final int DEFAULT_ATTEMPTS = 1;
+    /**
+     * Pattern to match [attempts*]delay[units].
+     */
+    private static final String PATTERN_STRING = "\\s*([0-9]*\\s*[\\*])?\\s*([0-9]+)\\s*([a-z,A-Z]*)\\s*";
+    private static final Pattern PATTERN = Patterns.compilePatternUncheckedException(PATTERN_STRING);
+
+    private int attempts = DEFAULT_ATTEMPTS;
+
+    private long delayTime = DEFAULT_DELAY_TIME;
+
+    /**
+     * <p>
+     * This constructor expects Strings of the form
+     * "[attempt\*]delaytime[unit]".
+     * </p>
+     * <p>
+     * The optional attempt is the number of tries this delay should be used
+     * (default = 1). The unit, if present, must be one of
+     * (msec,sec,minute,hour,day). The default value of unit is 'msec'.
+     * </p>
+     * <p>
+     * The constructor multiplies the delaytime by the relevant multiplier
+     * for the unit, so the delayTime instance variable is always in msec.
+     * </p>
+     *
+     * @param initString the string to initialize this Delay object from
+     */
+    public Delay(String initString) throws MessagingException {
+        // Default unit value to 'msec'.
+        String unit = "msec";
+
+        Matcher res = PATTERN.matcher(initString);
+        if (res.matches()) {
+            // The capturing groups will now hold:
+            // at 1: attempts * (if present)
+            // at 2: delaytime
+            // at 3: unit (if present)
+            if (res.group(1) != null && !res.group(1).equals("")) {
+                // We have an attempt *
+                String attemptMatch = res.group(1);
+
+                // Strip the * and whitespace.
+                attemptMatch = attemptMatch.substring(0, attemptMatch.length() - 1).trim();
+                attempts = Integer.parseInt(attemptMatch);
+            }
+
+            delayTime = Long.parseLong(res.group(2));
+
+            if (!res.group(3).equals("")) {
+                // We have a value for 'unit'.
+                unit = res.group(3).toLowerCase(Locale.US);
+            }
+        } else {
+            throw new MessagingException(initString + " does not match " + PATTERN_STRING);
+        }
+
+        // calculate delayTime.
+        try {
+            delayTime = TimeConverter.getMilliSeconds(delayTime, unit);
+        } catch (NumberFormatException e) {
+            throw new MessagingException(e.getMessage());
+        }
+    }
+
+    /**
+     * This constructor makes a default Delay object with attempts = 1 and
+     * delayTime = DEFAULT_DELAY_TIME.
+     */
+    public Delay() {
+    }
+
+    @VisibleForTesting
+    Delay(int attempts, long delayTime) {
+        this.attempts = attempts;
+        this.delayTime = delayTime;
+    }
+
+    /**
+     * @return the delayTime for this Delay
+     */
+    public long getDelayTime() {
+        return delayTime;
+    }
+
+    /**
+     * @return the number attempts this Delay should be used.
+     */
+    public int getAttempts() {
+        return attempts;
+    }
+
+    /**
+     * Set the number attempts this Delay should be used.
+     */
+    public void setAttempts(int value) {
+        attempts = value;
+    }
+
+    /**
+     * Pretty prints this Delay
+     */
+    @Override
+    public String toString() {
+        return getAttempts() + "*" + getDelayTime() + "msecs";
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof Delay) {
+            Delay that = (Delay) o;
+
+            return Objects.equal(this.attempts, that.attempts)
+                && Objects.equal(this.delayTime, that.delayTime);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(attempts, delayTime);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/1193b6b4/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/DelayTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/DelayTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/DelayTest.java
new file mode 100644
index 0000000..92ce97b
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remoteDelivery/DelayTest.java
@@ -0,0 +1,96 @@
+/****************************************************************
+ * 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.mailets.remoteDelivery;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import javax.mail.MessagingException;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class DelayTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void defaultConstructorShouldConstructDefaultDelay() {
+        assertThat(new Delay())
+            .isEqualTo(new Delay(Delay.DEFAULT_ATTEMPTS, Delay.DEFAULT_DELAY_TIME));
+    }
+
+    @Test
+    public void stringConstructorShouldWorkForNumbers() throws Exception {
+        assertThat(new Delay("36")).isEqualTo(new Delay(Delay.DEFAULT_ATTEMPTS, 36));
+    }
+
+    @Test
+    public void stringConstructorShouldWorkForZero() throws Exception {
+        assertThat(new Delay("0")).isEqualTo(new Delay(Delay.DEFAULT_ATTEMPTS, 0));
+    }
+
+    @Test
+    public void stringConstructorShouldDefaultToZeroForNegatives() throws Exception {
+        assertThat(new Delay("0")).isEqualTo(new Delay(Delay.DEFAULT_ATTEMPTS, 0));
+    }
+
+    @Test
+    public void stringConstructorShouldWorkForNumberAndSecond() throws Exception {
+        assertThat(new Delay("1s")).isEqualTo(new Delay(Delay.DEFAULT_ATTEMPTS, 1000));
+    }
+
+    @Test
+    public void stringConstructorShouldWorkForNumberAndAttempts() throws Exception {
+        assertThat(new Delay("2*36")).isEqualTo(new Delay(2, 36));
+    }
+
+    @Test
+    public void stringConstructorShouldWorkForNumberAndZeroAttempts() throws Exception {
+        assertThat(new Delay("0*36")).isEqualTo(new Delay(0, 36));
+    }
+
+    @Test
+    public void stringConstructorShouldThrowOnNegativeAttempts() throws Exception {
+        expectedException.expect(MessagingException.class);
+
+        new Delay("-1*36");
+    }
+
+    @Test
+    public void stringConstructorShouldWorkForNumberAttemptsAndUnit() throws Exception {
+        assertThat(new Delay("2*36s")).isEqualTo(new Delay(2, 36000));
+    }
+
+    @Test
+    public void stringConstructorShouldThrowOnInvalidInput() throws Exception {
+        expectedException.expect(MessagingException.class);
+
+        new Delay("invalid");
+    }
+
+    @Test
+    public void stringConstructorShouldThrowOnInvalidUnit() throws Exception {
+        expectedException.expect(MessagingException.class);
+
+        new Delay("36invalid");
+    }
+}


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