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/11/15 02:41:32 UTC

[james-project] 23/30: [Refactoring] move code from AbstractMailRepository to FileMailRepository

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 071c8c324ce0d533888b1ae917bb90fe93a7292a
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Wed Nov 13 16:20:49 2019 +0100

    [Refactoring] move code from AbstractMailRepository to FileMailRepository
---
 .../mailrepository/file/FileMailRepository.java    | 123 +++++++++++++++-
 .../mailrepository/lib/AbstractMailRepository.java | 164 ---------------------
 2 files changed, 117 insertions(+), 170 deletions(-)

diff --git a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java
index 6ff41f8..98c6835 100644
--- a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java
@@ -37,8 +37,11 @@ import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.james.filesystem.api.FileSystem;
+import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.mailrepository.api.MailKey;
-import org.apache.james.mailrepository.lib.AbstractMailRepository;
+import org.apache.james.mailrepository.api.MailRepository;
+import org.apache.james.mailrepository.lib.Lock;
+import org.apache.james.repository.api.Initializable;
 import org.apache.james.repository.file.FilePersistentObjectRepository;
 import org.apache.james.repository.file.FilePersistentStreamRepository;
 import org.apache.james.server.core.MimeMessageCopyOnWriteProxy;
@@ -47,6 +50,10 @@ import org.apache.mailet.Mail;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.fge.lambdas.Throwing;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
+
 /**
  * <p>
  * Implementation of a MailRepository on a FileSystem.
@@ -63,9 +70,16 @@ import org.slf4j.LoggerFactory;
  * Requires a logger called MailRepository.
  * </p>
  */
-public class FileMailRepository extends AbstractMailRepository {
+public class FileMailRepository implements MailRepository, Configurable, Initializable {
     private static final Logger LOGGER = LoggerFactory.getLogger(FileMailRepository.class);
 
+
+    /**
+     * Whether 'deep debugging' is turned on.
+     */
+    private static final boolean DEEP_DEBUG = false;
+
+
     private FilePersistentStreamRepository streamRepository;
     private FilePersistentObjectRepository objectRepository;
     private String destination;
@@ -76,14 +90,46 @@ public class FileMailRepository extends AbstractMailRepository {
     // repositories such as spam and error
     private FileSystem fileSystem;
 
+    /**
+     * A lock used to control access to repository elements, locking access
+     * based on the key
+     */
+    private final Lock accessControlLock = new Lock();
+
+    /**
+     * Releases a lock on a message identified the key
+     *
+     * @param key
+     *            the key of the message to be unlocked
+     *
+     * @return true if successfully released the lock, false otherwise
+     */
+    @Override
+    public boolean unlock(MailKey key) {
+        return accessControlLock.unlock(key);
+    }
+
+    /**
+     * Obtains a lock on a message identified by key
+     *
+     * @param key
+     *            the key of the message to be locked
+     *
+     * @return true if successfully obtained the lock, false otherwise
+     */
+    @Override
+    public boolean lock(MailKey key) {
+        return accessControlLock.lock(key);
+    }
+
+
     @Inject
     public void setFileSystem(FileSystem fileSystem) {
         this.fileSystem = fileSystem;
     }
 
     @Override
-    protected void doConfigure(HierarchicalConfiguration<ImmutableNode> config) throws org.apache.commons.configuration2.ex.ConfigurationException {
-        super.doConfigure(config);
+    public void configure(HierarchicalConfiguration<ImmutableNode> config) {
         destination = config.getString("[@destinationURL]");
         LOGGER.debug("FileMailRepository.destinationURL: {}", destination);
         fifo = config.getBoolean("[@FIFO]", false);
@@ -154,7 +200,37 @@ public class FileMailRepository extends AbstractMailRepository {
     }
 
     @Override
-    protected void internalStore(Mail mc) throws MessagingException, IOException {
+    public MailKey store(Mail mc) throws MessagingException {
+        boolean wasLocked = true;
+        MailKey key = MailKey.forMail(mc);
+        try {
+            synchronized (this) {
+                wasLocked = accessControlLock.isLocked(key);
+                if (!wasLocked) {
+                    // If it wasn't locked, we want a lock during the store
+                    lock(key);
+                }
+            }
+            internalStore(mc);
+            return key;
+        } catch (MessagingException e) {
+            LOGGER.error("Exception caught while storing mail {}", key, e);
+            throw e;
+        } catch (Exception e) {
+            LOGGER.error("Exception caught while storing mail {}", key, e);
+            throw new MessagingException("Exception caught while storing mail " + key, e);
+        } finally {
+            if (!wasLocked) {
+                // If it wasn't locked, we need to unlock now
+                unlock(key);
+                synchronized (this) {
+                    notify();
+                }
+            }
+        }
+    }
+
+    private void internalStore(Mail mc) throws MessagingException, IOException {
         String key = mc.getName();
         if (keys != null && !keys.contains(key)) {
             keys.add(key);
@@ -245,7 +321,42 @@ public class FileMailRepository extends AbstractMailRepository {
     }
 
     @Override
-    protected void internalRemove(MailKey key) throws MessagingException {
+    public void remove(Mail mail) throws MessagingException {
+        remove(MailKey.forMail(mail));
+    }
+
+    @Override
+    public void remove(Collection<Mail> mails) throws MessagingException {
+        for (Mail mail : mails) {
+            remove(mail);
+        }
+    }
+
+    @Override
+    public void remove(MailKey key) throws MessagingException {
+        if (lock(key)) {
+            try {
+                internalRemove(key);
+            } finally {
+                unlock(key);
+            }
+        } else {
+            throw new MessagingException("Cannot lock " + key + " to remove it");
+        }
+    }
+
+    @Override
+    public long size() {
+        return Iterators.size(list());
+    }
+
+    @Override
+    public void removeAll() {
+        ImmutableList.copyOf(list())
+            .forEach(Throwing.<MailKey>consumer(this::remove).sneakyThrow());
+    }
+
+    private void internalRemove(MailKey key) {
         if (keys != null) {
             keys.remove(key.asString());
         }
diff --git a/server/data/data-library/src/main/java/org/apache/james/mailrepository/lib/AbstractMailRepository.java b/server/data/data-library/src/main/java/org/apache/james/mailrepository/lib/AbstractMailRepository.java
deleted file mode 100644
index ecf7d46..0000000
--- a/server/data/data-library/src/main/java/org/apache/james/mailrepository/lib/AbstractMailRepository.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailrepository.lib;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import javax.mail.MessagingException;
-
-import org.apache.commons.configuration2.HierarchicalConfiguration;
-import org.apache.commons.configuration2.ex.ConfigurationException;
-import org.apache.commons.configuration2.tree.ImmutableNode;
-import org.apache.james.lifecycle.api.Configurable;
-import org.apache.james.mailrepository.api.MailKey;
-import org.apache.james.mailrepository.api.MailRepository;
-import org.apache.james.repository.api.Initializable;
-import org.apache.mailet.Mail;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.github.fge.lambdas.Throwing;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterators;
-
-/**
- * This class represents an AbstractMailRepository that may help implementing MailRepository interface
- */
-public abstract class AbstractMailRepository implements MailRepository, Configurable, Initializable {
-    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMailRepository.class);
-
-    /**
-     * Whether 'deep debugging' is turned on.
-     */
-    protected static final boolean DEEP_DEBUG = false;
-
-    /**
-     * A lock used to control access to repository elements, locking access
-     * based on the key
-     */
-    private final Lock lock = new Lock();
-
-    @Override
-    public void configure(HierarchicalConfiguration<ImmutableNode> configuration) throws ConfigurationException {
-        doConfigure(configuration);
-    }
-
-    protected void doConfigure(HierarchicalConfiguration<ImmutableNode> config) throws ConfigurationException {
-
-    }
-
-    /**
-     * Releases a lock on a message identified the key
-     * 
-     * @param key
-     *            the key of the message to be unlocked
-     * 
-     * @return true if successfully released the lock, false otherwise
-     */
-    @Override
-    public boolean unlock(MailKey key) {
-        return lock.unlock(key);
-    }
-
-    /**
-     * Obtains a lock on a message identified by key
-     * 
-     * @param key
-     *            the key of the message to be locked
-     * 
-     * @return true if successfully obtained the lock, false otherwise
-     */
-    @Override
-    public boolean lock(MailKey key) {
-        return lock.lock(key);
-    }
-
-    @Override
-    public MailKey store(Mail mc) throws MessagingException {
-        boolean wasLocked = true;
-        MailKey key = MailKey.forMail(mc);
-        try {
-            synchronized (this) {
-                wasLocked = lock.isLocked(key);
-                if (!wasLocked) {
-                    // If it wasn't locked, we want a lock during the store
-                    lock(key);
-                }
-            }
-            internalStore(mc);
-            return key;
-        } catch (MessagingException e) {
-            LOGGER.error("Exception caught while storing mail {}", key, e);
-            throw e;
-        } catch (Exception e) {
-            LOGGER.error("Exception caught while storing mail {}", key, e);
-            throw new MessagingException("Exception caught while storing mail " + key, e);
-        } finally {
-            if (!wasLocked) {
-                // If it wasn't locked, we need to unlock now
-                unlock(key);
-                synchronized (this) {
-                    notify();
-                }
-            }
-        }
-    }
-
-    protected abstract void internalStore(Mail mc) throws MessagingException, IOException;
-
-    @Override
-    public void remove(Mail mail) throws MessagingException {
-        remove(MailKey.forMail(mail));
-    }
-
-    @Override
-    public void remove(Collection<Mail> mails) throws MessagingException {
-        for (Mail mail : mails) {
-            remove(mail);
-        }
-    }
-
-    @Override
-    public void remove(MailKey key) throws MessagingException {
-        if (lock(key)) {
-            try {
-                internalRemove(key);
-            } finally {
-                unlock(key);
-            }
-        } else {
-            throw new MessagingException("Cannot lock " + key + " to remove it");
-        }
-    }
-
-    protected abstract void internalRemove(MailKey key) throws MessagingException;
-
-    @Override
-    public long size() throws MessagingException {
-        return Iterators.size(list());
-    }
-
-    @Override
-    public void removeAll() throws MessagingException {
-        ImmutableList.copyOf(list())
-            .forEach(Throwing.<MailKey>consumer(this::remove).sneakyThrow());
-    }
-}


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