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 2018/01/23 16:54:31 UTC

[07/10] james-project git commit: JAMES-2292 add a proper createQueue method to MailQueueFactory

JAMES-2292 add a proper createQueue method to MailQueueFactory


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

Branch: refs/heads/master
Commit: 7574fdf83e6bb432668b2b4d715084e845bdc2d0
Parents: e144652
Author: Antoine Duprat <ad...@linagora.com>
Authored: Tue Jan 23 13:51:21 2018 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Jan 23 14:03:20 2018 +0100

----------------------------------------------------------------------
 .../mailetcontainer/impl/JamesMailSpooler.java  |  2 +-
 .../impl/JamesMailetContext.java                |  2 +-
 .../impl/JamesMailetContextTest.java            |  2 +-
 .../james/transport/mailets/RemoteDelivery.java |  2 +-
 .../delivery/RemoteDeliveryRunningTest.java     |  2 +-
 .../remote/delivery/RemoteDeliveryTest.java     |  2 +-
 .../apache/james/fetchmail/FetchScheduler.java  |  2 +-
 .../org/apache/james/jmap/send/MailSpool.java   |  2 +-
 .../apache/james/jmap/send/MailSpoolTest.java   |  2 +-
 .../james/smtpserver/SendMailHandler.java       |  2 +-
 .../apache/james/smtpserver/SMTPServerTest.java |  2 +-
 .../activemq/ActiveMQMailQueueFactory.java      |  2 +-
 .../activemq/ActiveMQMailQueueFactoryTest.java  |  3 +-
 .../james/queue/api/MailQueueFactory.java       |  5 +-
 .../queue/api/MailQueueFactoryContract.java     | 48 +++++++++++++++++---
 .../api/ManageableMailQueueFactoryContract.java | 45 ++++++++++++++++++
 .../james/queue/file/FileMailQueueFactory.java  | 29 +++++++-----
 .../queue/file/FileMailQueueFactoryTest.java    |  4 +-
 .../james/queue/jms/JMSMailQueueFactory.java    |  2 +-
 .../queue/library/AbstractMailQueueFactory.java | 25 +++++-----
 .../queue/jms/JMSMailQueueFactoryTest.java      |  3 +-
 .../library/AbstractMailQueueFactoryTest.java   | 16 +++----
 .../queue/memory/MemoryMailQueueFactory.java    | 10 ++--
 .../memory/MemoryMailQueueFactoryTest.java      | 33 +++-----------
 24 files changed, 163 insertions(+), 84 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java
index 6f8cb6f..26bf267 100644
--- a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java
+++ b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java
@@ -122,7 +122,7 @@ public class JamesMailSpooler implements Runnable, Disposable, Configurable, Mai
     public void init() {
         LOGGER.info("{} init...", getClass().getName());
 
-        queue = queueFactory.getQueue(MailQueueFactory.SPOOL);
+        queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
 
         LOGGER.info("{} uses {} Thread(s)", getClass().getName(), numThreads);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
index 80d9172..8081cac 100644
--- a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
+++ b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
@@ -83,7 +83,7 @@ public class JamesMailetContext implements MailetContext, Configurable {
 
     @Inject
     public void retrieveRootMailQueue(MailQueueFactory mailQueueFactory) {
-        this.rootMailQueue = mailQueueFactory.getQueue(MailQueueFactory.SPOOL);
+        this.rootMailQueue = mailQueueFactory.createQueue(MailQueueFactory.SPOOL);
     }
 
     @Inject

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
index a8c4391..56b3ef6 100644
--- a/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
+++ b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
@@ -80,7 +80,7 @@ public class JamesMailetContextTest {
         testee = new JamesMailetContext();
         MailQueueFactory mailQueueFactory = mock(MailQueueFactory.class);
         spoolMailQueue = mock(MailQueue.class);
-        when(mailQueueFactory.getQueue(MailQueueFactory.SPOOL)).thenReturn(spoolMailQueue);
+        when(mailQueueFactory.createQueue(MailQueueFactory.SPOOL)).thenReturn(spoolMailQueue);
         testee.retrieveRootMailQueue(mailQueueFactory);
         testee.setDomainList(domainList);
         testee.setUsersRepository(usersRepository);

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/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 e75b510..602f749 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
@@ -156,7 +156,7 @@ public class RemoteDelivery extends GenericMailet {
 
     public void init() throws MessagingException {
         configuration = new RemoteDeliveryConfiguration(getMailetConfig(), domainList);
-        queue = queueFactory.getQueue(configuration.getOutGoingQueueName());
+        queue = queueFactory.createQueue(configuration.getOutGoingQueueName());
         try {
             if (configuration.isBindUsed()) {
                 RemoteDeliverySocketFactory.setBindAdress(configuration.getBindAddress());

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java
index 11d5f79..fa04dc2 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java
@@ -52,7 +52,7 @@ public class RemoteDeliveryRunningTest {
             mock(MetricFactory.class), RemoteDelivery.ThreadState.START_THREADS);
 
         mailQueue = mock(MailQueue.class);
-        when(mailQueueFactory.getQueue(QUEUE_NAME)).thenReturn(mailQueue);
+        when(mailQueueFactory.createQueue(QUEUE_NAME)).thenReturn(mailQueue);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
index 4fad57d..fd68601 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
@@ -96,7 +96,7 @@ public class RemoteDeliveryTest {
     public void setUp() {
         MailQueueFactory queueFactory = mock(MailQueueFactory.class);
         mailQueue = new FakeMailQueue("any");
-        when(queueFactory.getQueue(RemoteDeliveryConfiguration.OUTGOING)).thenReturn(mailQueue);
+        when(queueFactory.createQueue(RemoteDeliveryConfiguration.OUTGOING)).thenReturn(mailQueue);
         remoteDelivery = new RemoteDelivery(mock(DNSService.class), mock(DomainList.class), queueFactory, mock(MetricFactory.class), RemoteDelivery.ThreadState.DO_NOT_START_THREADS);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FetchScheduler.java
----------------------------------------------------------------------
diff --git a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FetchScheduler.java b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FetchScheduler.java
index be69206..44f579e 100644
--- a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FetchScheduler.java
+++ b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FetchScheduler.java
@@ -107,7 +107,7 @@ public class FetchScheduler implements FetchSchedulerMBean, Configurable {
       The scheduler service that is used to trigger fetch tasks.
      */
             ScheduledExecutorService scheduler = new JMXEnabledScheduledThreadPoolExecutor(numThreads, jmxPath, "scheduler");
-            MailQueue queue = queueFactory.getQueue(MailQueueFactory.SPOOL);
+            MailQueue queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
 
             List<HierarchicalConfiguration> fetchConfs = conf.configurationsAt("fetch");
             for (HierarchicalConfiguration fetchConf : fetchConfs) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailSpool.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailSpool.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailSpool.java
index a5b686d..312abab 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailSpool.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailSpool.java
@@ -34,7 +34,7 @@ public class MailSpool {
 
     @Inject
     @VisibleForTesting MailSpool(MailQueueFactory queueFactory) {
-        queue = queueFactory.getQueue(MailQueueFactory.SPOOL);
+        queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
     }
 
     public void send(Mail mail, MailMetadata metadata) throws MailQueueException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailSpoolTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailSpoolTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailSpoolTest.java
index 5912196..abc6291 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailSpoolTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailSpoolTest.java
@@ -42,7 +42,7 @@ public class MailSpoolTest {
     @Before
     public void setup() {
         MemoryMailQueueFactory mailQueueFactory = new MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory());
-        myQueue = mailQueueFactory.getQueue(MailQueueFactory.SPOOL);
+        myQueue = mailQueueFactory.createQueue(MailQueueFactory.SPOOL);
 
         mailSpool = new MailSpool(mailQueueFactory);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
index 5ef55a6..a637fd7 100644
--- a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
+++ b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java
@@ -50,7 +50,7 @@ public class SendMailHandler implements JamesMessageHook {
 
     @Override
     public void init(Configuration config) throws ConfigurationException {
-        queue = queueFactory.getQueue(MailQueueFactory.SPOOL);
+        queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
index 3453882..1f2382c 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
@@ -308,7 +308,7 @@ public class SMTPServerTest {
         });
     
         queueFactory = new MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory());
-        queue = (MemoryMailQueueFactory.MemoryMailQueue) queueFactory.getQueue(MailQueueFactory.SPOOL);
+        queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
         chain.put("mailqueuefactory", MailQueueFactory.class, queueFactory);
         chain.put("domainlist", DomainList.class, new SimpleDomainList() {
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java
index 8512d49..011143f 100644
--- a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java
+++ b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java
@@ -49,7 +49,7 @@ public class ActiveMQMailQueueFactory extends JMSMailQueueFactory {
     }
 
     @Override
-    protected MailQueue createMailQueue(String name) {
+    protected ManageableMailQueue createMailQueue(String name) {
         return new ActiveMQMailQueue(connectionFactory, mailQueueItemDecoratorFactory, name, useBlob, metricFactory);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactoryTest.java b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactoryTest.java
index 37c9c85..7ac74a0 100644
--- a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactoryTest.java
+++ b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactoryTest.java
@@ -27,6 +27,7 @@ import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueFactoryContract;
 import org.apache.james.queue.api.ManageableMailQueue;
+import org.apache.james.queue.api.ManageableMailQueueFactoryContract;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.apache.james.queue.jms.BrokerExtension;
 import org.junit.jupiter.api.AfterEach;
@@ -34,7 +35,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith(BrokerExtension.class)
-public class ActiveMQMailQueueFactoryTest implements MailQueueFactoryContract<ManageableMailQueue> {
+public class ActiveMQMailQueueFactoryTest implements MailQueueFactoryContract<ManageableMailQueue>, ManageableMailQueueFactoryContract {
 
     private ActiveMQMailQueueFactory mailQueueFactory;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
index c39d28a..125dd5b 100644
--- a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
+++ b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.queue.api;
 
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -37,7 +38,9 @@ public interface MailQueueFactory<T extends MailQueue> {
      * @param name
      * @return queue
      */
-    T getQueue(String name);
+    Optional<T> getQueue(String name);
+
+    T createQueue(String name);
 
     Set<T> listCreatedMailQueues();
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java
index 93c2e18..dd3bd0d 100644
--- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java
@@ -38,10 +38,10 @@ public interface MailQueueFactoryContract<T extends MailQueue> {
 
     @Test
     default void getUsedMailQueuesShouldReturnPreviouslyCreatedMailQueues() {
-        MailQueueFactory mailQueueFactory = getMailQueueFactory();
+        MailQueueFactory<T> mailQueueFactory = getMailQueueFactory();
 
-        mailQueueFactory.getQueue(NAME_1);
-        mailQueueFactory.getQueue(NAME_2);
+        mailQueueFactory.createQueue(NAME_1);
+        mailQueueFactory.createQueue(NAME_2);
 
         assertThat(mailQueueFactory.listCreatedMailQueues())
             .extracting(MailQueue::getName)
@@ -50,14 +50,50 @@ public interface MailQueueFactoryContract<T extends MailQueue> {
 
     @Test
     default void getUsedMailQueuesShouldNotReturnDuplicate() {
-        MailQueueFactory mailQueueFactory = getMailQueueFactory();
+        MailQueueFactory<T> mailQueueFactory = getMailQueueFactory();
 
-        mailQueueFactory.getQueue(NAME_1);
-        mailQueueFactory.getQueue(NAME_1);
+        mailQueueFactory.createQueue(NAME_1);
+        mailQueueFactory.createQueue(NAME_1);
 
         assertThat(mailQueueFactory.listCreatedMailQueues())
             .extracting(MailQueue::getName)
             .containsOnly(NAME_1);
     }
 
+    @Test
+    default void getMailQueueShouldReturnEmptyIfNotCreated() {
+        MailQueueFactory<T> mailQueueFactory = getMailQueueFactory();
+
+        assertThat(mailQueueFactory.getQueue(NAME_1)).isEmpty();
+    }
+
+    @Test
+    default void getMailQueueShouldReturnMailQueueIfCreated() {
+        MailQueueFactory<T> mailQueueFactory = getMailQueueFactory();
+
+        mailQueueFactory.createQueue(NAME_1);
+
+        assertThat(mailQueueFactory.getQueue(NAME_1).map(MailQueue::getName)).contains(NAME_1);
+    }
+
+    @Test
+    default void getMailQueueShouldReturnEmptyIfQueueDoesNotExist() {
+        MailQueueFactory<T> mailQueueFactory = getMailQueueFactory();
+
+        mailQueueFactory.createQueue(NAME_1);
+
+        assertThat(mailQueueFactory.getQueue(NAME_2)).isEmpty();
+    }
+
+    @Test
+    default void getMailQueueShouldNotReturnTheSameQueueForTwoDifferentNames() {
+        MailQueueFactory<T> mailQueueFactory = getMailQueueFactory();
+
+        mailQueueFactory.createQueue(NAME_1);
+        mailQueueFactory.createQueue(NAME_2);
+
+        assertThat(mailQueueFactory.getQueue(NAME_1)).isNotEqualTo(mailQueueFactory.getQueue(NAME_2));
+    }
+
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java
new file mode 100644
index 0000000..aa61299
--- /dev/null
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java
@@ -0,0 +1,45 @@
+/****************************************************************
+ * 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.queue.api;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import javax.mail.MessagingException;
+
+import org.junit.jupiter.api.Test;
+
+public interface ManageableMailQueueFactoryContract {
+
+    String NAME_1 = "name1";
+
+    MailQueueFactory<ManageableMailQueue> getMailQueueFactory();
+
+    @Test
+    default void createMailQueueShouldNotConflictIfAlreadyExists() throws MessagingException {
+        MailQueueFactory<ManageableMailQueue> mailQueueFactory = getMailQueueFactory();
+        MailQueue firstCreation = mailQueueFactory.createQueue(NAME_1);
+
+        firstCreation.enQueue(Mails.defaultMail().build());
+
+        ManageableMailQueue secondCreation = mailQueueFactory.createQueue(NAME_1);
+        assertThat(secondCreation.getSize()).isEqualTo(1);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java b/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java
index 8c18e30..16e0bc8 100644
--- a/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java
+++ b/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java
@@ -21,6 +21,7 @@ package org.apache.james.queue.file;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 
 import javax.inject.Inject;
@@ -66,19 +67,25 @@ public class FileMailQueueFactory implements MailQueueFactory<ManageableMailQueu
     }
 
     @Override
-    public ManageableMailQueue getQueue(String name) {
-        ManageableMailQueue queue = queues.get(name);
-        if (queue == null) {
-            synchronized (queues) {
-                try {
-                    queue = new FileMailQueue(mailQueueActionItemDecoratorFactory, fs.getFile("file://var/store/queue"), name, sync);
-                    queues.put(name, queue);
-                } catch (IOException e) {
-                    throw new RuntimeException("Unable to access queue " + name, e);
-                }
+    public Optional<ManageableMailQueue> getQueue(String name) {
+        return Optional.ofNullable(queues.get(name));
+    }
+
+    @Override
+    public ManageableMailQueue createQueue(String name) {
+        return getQueue(name).orElseGet(() -> createAndRegisterQueue(name));
+    }
+
+    private ManageableMailQueue createAndRegisterQueue(String name) {
+        synchronized (queues) {
+            try {
+                FileMailQueue queue = new FileMailQueue(mailQueueActionItemDecoratorFactory, fs.getFile("file://var/store/queue"), name, sync);
+                queues.put(name, queue);
+                return queue;
+            } catch (IOException e) {
+                throw new RuntimeException("Unable to access queue " + name, e);
             }
         }
-        return queue;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueFactoryTest.java b/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueFactoryTest.java
index e953d32..bd09fd4 100644
--- a/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueFactoryTest.java
+++ b/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueFactoryTest.java
@@ -22,11 +22,13 @@ package org.apache.james.queue.file;
 import org.apache.james.filesystem.api.mock.MockFileSystem;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueFactoryContract;
+import org.apache.james.queue.api.ManageableMailQueue;
+import org.apache.james.queue.api.ManageableMailQueueFactoryContract;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
-public class FileMailQueueFactoryTest implements MailQueueFactoryContract {
+public class FileMailQueueFactoryTest implements MailQueueFactoryContract, ManageableMailQueueFactoryContract {
     private FileMailQueueFactory mailQueueFactory;
     private MockFileSystem fileSystem;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
index 6329ffc..dbc47dd 100644
--- a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
+++ b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
@@ -45,7 +45,7 @@ public class JMSMailQueueFactory extends AbstractMailQueueFactory<ManageableMail
     }
 
     @Override
-    protected MailQueue createMailQueue(String name) {
+    protected ManageableMailQueue createMailQueue(String name) {
         return new JMSMailQueue(connectionFactory, mailQueueItemDecoratorFactory, name, metricFactory);
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java b/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java
index ec3537f..e1a29dd 100644
--- a/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java
+++ b/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 
 import javax.annotation.PostConstruct;
@@ -91,19 +92,21 @@ public abstract class AbstractMailQueueFactory<T extends MailQueue> implements M
     }
 
     @Override
-    public final synchronized T getQueue(String name) {
-        
-        T queue = queues.get(name);
+    public final synchronized Optional<T> getQueue(String name) {
+        return Optional.ofNullable(queues.get(name));
+    }
 
-        if (queue == null) {
-            queue = createMailQueue(name);
-            if (useJMX) {
-                registerMBean(name, queue);
+    @Override
+    public synchronized T createQueue(String name) {
+        return getQueue(name).orElseGet(() -> createAndRegisterQueue(name));
+    }
 
-            }
-            queues.put(name, queue);
+    private T createAndRegisterQueue(String name) {
+        T queue = createMailQueue(name);
+        if (useJMX) {
+            registerMBean(name, queue);
         }
-
+        queues.put(name, queue);
         return queue;
     }
 
@@ -113,7 +116,7 @@ public abstract class AbstractMailQueueFactory<T extends MailQueue> implements M
      * @param name
      * @return queue
      */
-    protected abstract MailQueue createMailQueue(String name);
+    protected abstract T createMailQueue(String name);
 
     protected synchronized void registerMBean(String queuename, MailQueue queue) {
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueFactoryTest.java b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueFactoryTest.java
index 5e064c9..5211ce6 100644
--- a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueFactoryTest.java
+++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueFactoryTest.java
@@ -27,6 +27,7 @@ import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueFactoryContract;
 import org.apache.james.queue.api.ManageableMailQueue;
+import org.apache.james.queue.api.ManageableMailQueueFactoryContract;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -34,7 +35,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 
 
 @ExtendWith(BrokerExtension.class)
-public class JMSMailQueueFactoryTest implements MailQueueFactoryContract<ManageableMailQueue> {
+public class JMSMailQueueFactoryTest implements MailQueueFactoryContract<ManageableMailQueue>, ManageableMailQueueFactoryContract {
 
     private JMSMailQueueFactory mailQueueFactory;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java b/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java
index 500a0cd..b439bad 100644
--- a/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java
+++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java
@@ -105,15 +105,15 @@ public class AbstractMailQueueFactoryTest {
 
     @Test
     public void destroyShouldRegisterManageableQueues() throws Exception {
-        abstractMailQueueFactory.getQueue(QUEUE_1);
+        abstractMailQueueFactory.createQueue(QUEUE_1);
         verify(mBeanServer).registerMBean(any(MailQueue.class), eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1)));
     }
 
     @Test
     public void destroyShouldUnregisterAllRegisterQueue() throws Exception {
-        abstractMailQueueFactory.getQueue(QUEUE_1);
-        abstractMailQueueFactory.getQueue(QUEUE_2);
-        abstractMailQueueFactory.getQueue(QUEUE_3);
+        abstractMailQueueFactory.createQueue(QUEUE_1);
+        abstractMailQueueFactory.createQueue(QUEUE_2);
+        abstractMailQueueFactory.createQueue(QUEUE_3);
         abstractMailQueueFactory.destroy();
         verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1)));
         verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_2)));
@@ -122,16 +122,16 @@ public class AbstractMailQueueFactoryTest {
 
     @Test
     public void unregisterMBeanShouldWork() throws Exception {
-        abstractMailQueueFactory.getQueue(QUEUE_1);
+        abstractMailQueueFactory.createQueue(QUEUE_1);
         abstractMailQueueFactory.unregisterMBean(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1);
         verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1)));
     }
 
     @Test
     public void destroyShouldNotBeStoppedByExceptions() throws Exception {
-        abstractMailQueueFactory.getQueue(QUEUE_1);
-        abstractMailQueueFactory.getQueue(QUEUE_2);
-        abstractMailQueueFactory.getQueue(QUEUE_3);
+        abstractMailQueueFactory.createQueue(QUEUE_1);
+        abstractMailQueueFactory.createQueue(QUEUE_2);
+        abstractMailQueueFactory.createQueue(QUEUE_3);
         doThrow(InstanceNotFoundException.class)
             .doNothing()
             .when(mBeanServer)

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
index b4322e4..48bb10d 100644
--- a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
+++ b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
@@ -63,13 +63,13 @@ public class MemoryMailQueueFactory implements MailQueueFactory<ManageableMailQu
     }
 
     @Override
-    public MailQueue getQueue(String name) {
-        return Optional.ofNullable(mailQueues.get(name))
-            .orElseGet(() -> tryInsertNewMailQueue(name));
+    public Optional<ManageableMailQueue> getQueue(String name) {
+        return Optional.ofNullable(mailQueues.get(name));
     }
 
-    private MailQueue tryInsertNewMailQueue(String name) {
-        MailQueue newMailQueue = new MemoryMailQueue(name, mailQueueItemDecoratorFactory);
+    @Override
+    public MemoryMailQueueFactory.MemoryMailQueue createQueue(String name) {
+        MemoryMailQueueFactory.MemoryMailQueue newMailQueue = new MemoryMailQueue(name, mailQueueItemDecoratorFactory);
         return Optional.ofNullable(mailQueues.putIfAbsent(name, newMailQueue))
             .orElse(newMailQueue);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7574fdf8/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueFactoryTest.java b/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueFactoryTest.java
index f9a3ca3..28002ca 100644
--- a/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueFactoryTest.java
+++ b/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueFactoryTest.java
@@ -19,43 +19,24 @@
 
 package org.apache.james.queue.memory;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueFactoryContract;
+import org.apache.james.queue.api.ManageableMailQueue;
+import org.apache.james.queue.api.ManageableMailQueueFactoryContract;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-public class MemoryMailQueueFactoryTest implements MailQueueFactoryContract {
 
-    private static final String KEY = "key";
-    private static final String BIS = "keyBis";
+class MemoryMailQueueFactoryTest implements MailQueueFactoryContract<ManageableMailQueue>, ManageableMailQueueFactoryContract {
 
-    private MemoryMailQueueFactory memoryMailQueueFactory;
+    MemoryMailQueueFactory memoryMailQueueFactory;
 
     @BeforeEach
-    public void setUp() {
+    void setup() {
         memoryMailQueueFactory = new MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory());
     }
 
-    @Test
-    public void getQueueShouldNotReturnNull() {
-        assertThat(memoryMailQueueFactory.getQueue(KEY)).isNotNull();
-    }
-
-    @Test
-    public void getQueueShouldReturnTwoTimeTheSameResultWhenUsedWithTheSameKey() {
-        assertThat(memoryMailQueueFactory.getQueue(KEY)).isEqualTo(memoryMailQueueFactory.getQueue(KEY));
-    }
-
-    @Test
-    public void getQueueShouldNotReturnTheSameQueueForTwoDifferentNames() {
-        assertThat(memoryMailQueueFactory.getQueue(KEY)).isNotEqualTo(memoryMailQueueFactory.getQueue(BIS));
-    }
-
     @Override
-    public MailQueueFactory getMailQueueFactory() {
+    public MailQueueFactory<ManageableMailQueue> getMailQueueFactory() {
         return memoryMailQueueFactory;
     }
-}
+}
\ No newline at end of file


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