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 2016/04/07 05:10:11 UTC

[1/9] james-project git commit: JAMES-1617 SieveRepository no longer throws UserNotFoundException

Repository: james-project
Updated Branches:
  refs/heads/master d1d5712f9 -> 49b318080


JAMES-1617 SieveRepository no longer throws UserNotFoundException


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

Branch: refs/heads/master
Commit: 5f995abf430c33d0f5dbe777d553fd8a0d68cab0
Parents: f657ad7
Author: Erwan Guyomarch <co...@erwan-guyomarch.fr>
Authored: Sat Jan 23 23:02:32 2016 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:07:31 2016 +0700

----------------------------------------------------------------------
 .../james/managesieve/core/CoreProcessor.java   |  5 +-
 .../sieverepository/api/SieveRepository.java    | 30 +++++-----
 .../api/exception/UserNotFoundException.java    | 61 --------------------
 .../file/SieveDefaultRepository.java            | 27 +++++----
 .../file/SieveFileRepository.java               | 50 ++++++----------
 5 files changed, 46 insertions(+), 127 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/5f995abf/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
index 46a216e..f2b8679 100644
--- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
+++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
@@ -47,7 +47,6 @@ import org.apache.james.sieverepository.api.exception.QuotaExceededException;
 import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
 import org.apache.james.sieverepository.api.exception.SieveRepositoryException;
 import org.apache.james.sieverepository.api.exception.StorageException;
-import org.apache.james.sieverepository.api.exception.UserNotFoundException;
 import org.apache.james.user.api.UsersRepository;
 
 import java.io.IOException;
@@ -177,7 +176,7 @@ public class CoreProcessor implements CoreCommands {
         }, session);
     }
 
-    private String listScriptsInternals(Session session) throws AuthenticationRequiredException, UserNotFoundException, StorageException {
+    private String listScriptsInternals(Session session) throws AuthenticationRequiredException, StorageException {
         authenticationCheck(session);
         String list = Joiner.on("\r\n").join(
             Iterables.transform(sieveRepository.listScripts(session.getUser()), new Function<ScriptSummary, String>() {
@@ -317,8 +316,6 @@ public class CoreProcessor implements CoreCommands {
             return "NO (NONEXISTENT) \"There is no script by that name\"";
         } catch (IsActiveException ex) {
             return "NO (ACTIVE) \"You may not delete an active script\"";
-        }  catch (UserNotFoundException e) {
-            return "NO : Invalid user " + session.getUser();
         } catch (StorageException e) {
             return "NO : Storage Exception : " + e.getMessage();
         } catch (SyntaxException e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/5f995abf/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
index 1806077..8e0a999 100644
--- a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
+++ b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
@@ -29,7 +29,6 @@ import org.apache.james.sieverepository.api.exception.QuotaExceededException;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
 import org.apache.james.sieverepository.api.exception.StorageException;
-import org.apache.james.sieverepository.api.exception.UserNotFoundException;
 import org.joda.time.DateTime;
 
 
@@ -38,7 +37,7 @@ import org.joda.time.DateTime;
  */
 public interface SieveRepository {
 
-    void haveSpace(String user, String name, long size) throws UserNotFoundException, QuotaExceededException, StorageException;
+    void haveSpace(String user, String name, long size) throws QuotaExceededException, StorageException;
     
     /**
      * PutScript.
@@ -48,25 +47,24 @@ public interface SieveRepository {
      * @param user
      * @param name
      * @param content
-     * @throws UserNotFoundException
      * @throws StorageException
      * @throws QuotaExceededException
      */
-    void putScript(String user, String name, String content) throws UserNotFoundException, StorageException, QuotaExceededException;
+    void putScript(String user, String name, String content) throws StorageException, QuotaExceededException;
     
-    List<ScriptSummary> listScripts(String user) throws UserNotFoundException, StorageException;
-    
-    InputStream getActive(String user) throws UserNotFoundException, ScriptNotFoundException, StorageException;
+    List<ScriptSummary> listScripts(String user) throws StorageException;
+
+    DateTime getActivationDateForActiveScript(String user) throws StorageException, ScriptNotFoundException;
 
-    DateTime getActivationDateForActiveScript(String user) throws StorageException, UserNotFoundException, ScriptNotFoundException;
+    InputStream getActive(String user) throws ScriptNotFoundException, StorageException;
     
-    void setActive(String user, String name) throws UserNotFoundException, ScriptNotFoundException, StorageException;
+    void setActive(String user, String name) throws ScriptNotFoundException, StorageException;
     
-    InputStream getScript(String user, String name) throws UserNotFoundException, ScriptNotFoundException, StorageException;
+    InputStream getScript(String user, String name) throws ScriptNotFoundException, StorageException;
     
-    void deleteScript(String user, String name) throws UserNotFoundException, ScriptNotFoundException, IsActiveException, StorageException;
+    void deleteScript(String user, String name) throws ScriptNotFoundException, IsActiveException, StorageException;
     
-    void renameScript(String user, String oldName, String newName) throws UserNotFoundException, ScriptNotFoundException, DuplicateException, StorageException;
+    void renameScript(String user, String oldName, String newName) throws ScriptNotFoundException, DuplicateException, StorageException;
 
     boolean hasQuota() throws StorageException;
     
@@ -76,12 +74,12 @@ public interface SieveRepository {
     
     void removeQuota() throws QuotaNotFoundException, StorageException;
     
-    boolean hasQuota(String user) throws UserNotFoundException, StorageException;
+    boolean hasQuota(String user) throws StorageException;
     
-    long getQuota(String user) throws UserNotFoundException, QuotaNotFoundException, StorageException;
+    long getQuota(String user) throws QuotaNotFoundException, StorageException;
     
-    void setQuota(String user, long quota) throws UserNotFoundException, StorageException;
+    void setQuota(String user, long quota) throws StorageException;
     
-    void removeQuota(String user) throws UserNotFoundException, QuotaNotFoundException, StorageException;
+    void removeQuota(String user) throws QuotaNotFoundException, StorageException;
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/5f995abf/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/UserNotFoundException.java
----------------------------------------------------------------------
diff --git a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/UserNotFoundException.java b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/UserNotFoundException.java
deleted file mode 100644
index e5a1219..0000000
--- a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/UserNotFoundException.java
+++ /dev/null
@@ -1,61 +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.sieverepository.api.exception;
-
-public class UserNotFoundException extends SieveRepositoryException {
-    /**
-     * Creates a new instance of UserNotFoundException.
-     *
-     */
-    public UserNotFoundException() {
-        super();
-    }
-
-    /**
-     * Creates a new instance of UserNotFoundException.
-     *
-     * @param message
-     * @param cause
-     */
-    public UserNotFoundException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    /**
-     * Creates a new instance of UserNotFoundException.
-     *
-     * @param message
-     */
-    public UserNotFoundException(String message) {
-        super(message);
-    }
-
-    /**
-     * Creates a new instance of UserNotFoundException.
-     *
-     * @param cause
-     */
-    public UserNotFoundException(Throwable cause) {
-        super(cause);
-    }
-
-    private static final long serialVersionUID = -5075227645788455698L;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/5f995abf/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java
index 469b8c3..dd865e2 100644
--- a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java
@@ -37,7 +37,6 @@ import org.apache.james.sieverepository.api.exception.QuotaExceededException;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
 import org.apache.james.sieverepository.api.exception.StorageException;
-import org.apache.james.sieverepository.api.exception.UserNotFoundException;
 import org.joda.time.DateTime;
 
 /**
@@ -56,22 +55,22 @@ public class SieveDefaultRepository implements SieveRepository {
     }
 
     @Override
-    public void haveSpace(String user, String name, long size) throws UserNotFoundException, QuotaExceededException, StorageException {
+    public void haveSpace(String user, String name, long size) throws QuotaExceededException, StorageException {
         throw apologizeForQuotas();
     }
 
     @Override
-    public void putScript(String user, String name, String content) throws UserNotFoundException, StorageException, QuotaExceededException {
+    public void putScript(String user, String name, String content) throws StorageException, QuotaExceededException {
         throw new StorageException("This implementation is deprecated and does not support script put operation. You must directly position your scripts in the .sieve folder. Please consider using a SieveFileRepository.");
     }
 
     @Override
-    public List<ScriptSummary> listScripts(String user) throws UserNotFoundException, StorageException {
+    public List<ScriptSummary> listScripts(String user) throws StorageException {
         throw new StorageException("This implementation is deprecated and does not support listScripts operation. Please consider using a SieveFileRepository.");
     }
 
     @Override
-    public InputStream getActive(String user) throws UserNotFoundException, ScriptNotFoundException, StorageException {
+    public InputStream getActive(String user) throws ScriptNotFoundException, StorageException {
         try {
             return new FileInputStream(retrieveUserFile(user));
         } catch (FileNotFoundException e) {
@@ -80,7 +79,7 @@ public class SieveDefaultRepository implements SieveRepository {
     }
 
     @Override
-    public DateTime getActivationDateForActiveScript(String user) throws StorageException, UserNotFoundException, ScriptNotFoundException {
+    public DateTime getActivationDateForActiveScript(String user) throws StorageException, ScriptNotFoundException {
         return new DateTime(retrieveUserFile(user).lastModified());
     }
 
@@ -99,22 +98,22 @@ public class SieveDefaultRepository implements SieveRepository {
     }
 
     @Override
-    public void setActive(String user, String name) throws UserNotFoundException, ScriptNotFoundException, StorageException {
+    public void setActive(String user, String name) throws ScriptNotFoundException, StorageException {
         throw new StorageException("This implementation is deprecated and does not support script SetActive operation. Your uploaded script is by default the active script. Please consider using a SieveFileRepository.");
     }
 
     @Override
-    public InputStream getScript(String user, String name) throws UserNotFoundException, ScriptNotFoundException, StorageException {
+    public InputStream getScript(String user, String name) throws ScriptNotFoundException, StorageException {
         return getActive(user);
     }
 
     @Override
-    public void deleteScript(String user, String name) throws UserNotFoundException, ScriptNotFoundException, IsActiveException, StorageException {
+    public void deleteScript(String user, String name) throws ScriptNotFoundException, IsActiveException, StorageException {
         throw new StorageException("This implementation is deprecated and does not support delete script operation. Please consider using a SieveFileRepository.");
     }
 
     @Override
-    public void renameScript(String user, String oldName, String newName) throws UserNotFoundException, ScriptNotFoundException, DuplicateException, StorageException {
+    public void renameScript(String user, String oldName, String newName) throws ScriptNotFoundException, DuplicateException, StorageException {
         throw new StorageException("This implementation is deprecated and does not support rename script operation. Please consider using a SieveFileRepository.");
     }
 
@@ -139,22 +138,22 @@ public class SieveDefaultRepository implements SieveRepository {
     }
 
     @Override
-    public boolean hasQuota(String user) throws UserNotFoundException, StorageException {
+    public boolean hasQuota(String user) throws StorageException {
         throw apologizeForQuotas();
     }
 
     @Override
-    public long getQuota(String user) throws UserNotFoundException, QuotaNotFoundException, StorageException {
+    public long getQuota(String user) throws QuotaNotFoundException, StorageException {
         throw apologizeForQuotas();
     }
 
     @Override
-    public void setQuota(String user, long quota) throws UserNotFoundException, StorageException {
+    public void setQuota(String user, long quota) throws StorageException {
         throw apologizeForQuotas();
     }
 
     @Override
-    public void removeQuota(String user) throws UserNotFoundException, QuotaNotFoundException, StorageException {
+    public void removeQuota(String user) throws QuotaNotFoundException, StorageException {
         throw apologizeForQuotas();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/5f995abf/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
index a0b9cc0..4628040 100644
--- a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
@@ -31,7 +31,6 @@ import org.apache.james.sieverepository.api.exception.QuotaExceededException;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
 import org.apache.james.sieverepository.api.exception.StorageException;
-import org.apache.james.sieverepository.api.exception.UserNotFoundException;
 import org.joda.time.DateTime;
 
 import javax.inject.Inject;
@@ -157,8 +156,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public void deleteScript(String user, String name) throws UserNotFoundException,
-            ScriptNotFoundException, IsActiveException, StorageException {
+    public void deleteScript(String user, String name) throws ScriptNotFoundException, IsActiveException, StorageException {
         synchronized (lock) {
             File file = getScriptFile(user, name);
             if (isActiveFile(user, file)) {
@@ -173,8 +171,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public InputStream getScript(String user, String name) throws UserNotFoundException,
-            ScriptNotFoundException, StorageException {
+    public InputStream getScript(String user, String name) throws ScriptNotFoundException, StorageException {
         InputStream script;
         try {
             script = new FileInputStream(getScriptFile(user, name));
@@ -193,8 +190,7 @@ public class SieveFileRepository implements SieveRepository {
      * @see SieveRepository#haveSpace(java.lang.String, java.lang.String, long)
      */
     @Override
-    public void haveSpace(String user, String name, long size) throws UserNotFoundException,
-            QuotaExceededException, StorageException {
+    public void haveSpace(String user, String name, long size) throws QuotaExceededException, StorageException {
         long usedSpace = 0;
         for (File file : getUserDirectory(user).listFiles()) {
             if (!(file.getName().equals(name) || SYSTEM_FILES.contains(file.getName()))) {
@@ -228,8 +224,7 @@ public class SieveFileRepository implements SieveRepository {
         }
     }
 
-    @Override
-    public List<ScriptSummary> listScripts(String user) throws UserNotFoundException, StorageException {
+    public List<ScriptSummary> listScripts(String user) throws StorageException {
         File[] files = getUserDirectory(user).listFiles();
         List<ScriptSummary> summaries = new ArrayList<ScriptSummary>(files.length);
         File activeFile = null;
@@ -252,8 +247,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public void putScript(String user, String name, String content)
-            throws UserNotFoundException, StorageException, QuotaExceededException {
+    public void putScript(String user, String name, String content) throws StorageException, QuotaExceededException {
         synchronized (lock) {
             File file = new File(getUserDirectory(user), name);
             haveSpace(user, name, content.length());
@@ -263,8 +257,7 @@ public class SieveFileRepository implements SieveRepository {
 
     @Override
     public void renameScript(String user, String oldName, String newName)
-            throws UserNotFoundException, ScriptNotFoundException,
-            DuplicateException, StorageException {
+            throws ScriptNotFoundException, DuplicateException, StorageException {
         synchronized (lock) {
             File oldFile = getScriptFile(user, oldName);
             File newFile = new File(getUserDirectory(user), newName);
@@ -284,8 +277,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public InputStream getActive(String user) throws UserNotFoundException,
-            ScriptNotFoundException, StorageException {
+    public InputStream getActive(String user) throws ScriptNotFoundException, StorageException {
         InputStream script;
         try {
             script = new FileInputStream(getActiveFile(user));
@@ -296,13 +288,11 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public DateTime getActivationDateForActiveScript(String user) throws StorageException, UserNotFoundException, ScriptNotFoundException {
+    public DateTime getActivationDateForActiveScript(String user) throws StorageException, ScriptNotFoundException {
         return new DateTime(getActiveFile(user).lastModified());
     }
 
-    @Override
-    public void setActive(String user, String name) throws UserNotFoundException,
-            ScriptNotFoundException, StorageException {
+    public void setActive( String user, String name) throws ScriptNotFoundException, StorageException {
         synchronized (lock) {
             // Turn off currently active script, if any
             File oldActive = null;
@@ -334,7 +324,7 @@ public class SieveFileRepository implements SieveRepository {
         }
     }
 
-    protected File getUserDirectory(String user) throws UserNotFoundException, StorageException {
+    protected File getUserDirectory(String user) throws StorageException {
         File file = getUserDirectoryFile(user);
         if (!file.exists()) {
             ensureUser(user);
@@ -346,8 +336,7 @@ public class SieveFileRepository implements SieveRepository {
         return new File(getSieveRootDirectory(), user + '/');
     }
 
-    protected File getActiveFile(String user) throws UserNotFoundException,
-            ScriptNotFoundException, StorageException {
+    protected File getActiveFile(String user) throws ScriptNotFoundException, StorageException {
         File dir = getUserDirectory(user);
         String content;
         try {
@@ -358,7 +347,7 @@ public class SieveFileRepository implements SieveRepository {
         return new File(dir, content);
     }
 
-    protected boolean isActiveFile(String user, File file) throws UserNotFoundException, StorageException {
+    protected boolean isActiveFile(String user, File file) throws StorageException {
         try {
             return 0 == getActiveFile(user).compareTo(file);
         } catch (ScriptNotFoundException ex) {
@@ -388,8 +377,7 @@ public class SieveFileRepository implements SieveRepository {
         }
     }
 
-    protected File getScriptFile(String user, String name) throws UserNotFoundException,
-            ScriptNotFoundException, StorageException {
+    protected File getScriptFile(String user, String name) throws ScriptNotFoundException, StorageException {
         File file = new File(getUserDirectory(user), name);
         if (!file.exists()) {
             throw new ScriptNotFoundException("User: " + user + "Script: " + name);
@@ -461,17 +449,17 @@ public class SieveFileRepository implements SieveRepository {
         toFile(file, content);
     }
 
-    protected File getQuotaFile(String user) throws UserNotFoundException, StorageException {
+    protected File getQuotaFile(String user) throws StorageException {
         return new File(getUserDirectory(user), FILE_NAME_QUOTA);
     }
 
     @Override
-    public boolean hasQuota(String user) throws UserNotFoundException, StorageException {
+    public boolean hasQuota(String user) throws StorageException {
         return getQuotaFile(user).exists();
     }
 
     @Override
-    public long getQuota(String user) throws UserNotFoundException, QuotaNotFoundException, StorageException {
+    public long getQuota(String user) throws QuotaNotFoundException, StorageException {
         Long quota = null;
         File file = getQuotaFile(user);
         if (file.exists()) {
@@ -496,8 +484,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public void removeQuota(String user) throws UserNotFoundException,
-            QuotaNotFoundException, StorageException {
+    public void removeQuota(String user) throws QuotaNotFoundException, StorageException {
         synchronized (lock) {
             File file = getQuotaFile(user);
             if (!file.exists()) {
@@ -512,8 +499,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public void setQuota(String user, long quota) throws UserNotFoundException,
-            StorageException {
+    public void setQuota(String user, long quota) throws StorageException {
         synchronized (lock) {
             File file = getQuotaFile(user);
             String content = Long.toString(quota);


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


[7/9] james-project git commit: JAMES-1617 Guice should take UsersRepository configuration into account

Posted by bt...@apache.org.
JAMES-1617 Guice should take UsersRepository configuration into account


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

Branch: refs/heads/master
Commit: f054e2c782925d416f00c33a467840d02a34ce98
Parents: 777d101
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Mar 15 11:25:36 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:13:35 2016 +0700

----------------------------------------------------------------------
 .../src/test/resources/usersrepository.xml      | 25 ++++++++++++++++
 .../data/CassandraUsersRepositoryModule.java    | 31 ++++++++++++++++++++
 2 files changed, 56 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f054e2c7/server/container/cassandra-guice/src/test/resources/usersrepository.xml
----------------------------------------------------------------------
diff --git a/server/container/cassandra-guice/src/test/resources/usersrepository.xml b/server/container/cassandra-guice/src/test/resources/usersrepository.xml
new file mode 100644
index 0000000..85046b3
--- /dev/null
+++ b/server/container/cassandra-guice/src/test/resources/usersrepository.xml
@@ -0,0 +1,25 @@
+<?xml version="1.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.                                           
+ -->
+
+<usersrepository name="LocalUsers">
+    <algorithm>MD5</algorithm>
+    <enableVirtualHosting>true</enableVirtualHosting>    
+</usersrepository>
+

http://git-wip-us.apache.org/repos/asf/james-project/blob/f054e2c7/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java
index a776626..dd1f881 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java
@@ -19,20 +19,51 @@
 package org.apache.james.modules.data;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.rrt.cassandra.CassandraRecipientRewriteTable;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.cassandra.CassandraUsersRepository;
+import org.apache.james.utils.ConfigurationPerformer;
+import org.apache.james.utils.ConfigurationProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Scopes;
+import com.google.inject.Singleton;
 import com.google.inject.multibindings.Multibinder;
 
 public class CassandraUsersRepositoryModule extends AbstractModule {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(CassandraUsersRepositoryModule.class);
+
     @Override
     public void configure() {
+        bind(CassandraUsersRepository.class).in(Scopes.SINGLETON);
         bind(UsersRepository.class).to(CassandraUsersRepository.class);
         Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
         cassandraDataDefinitions.addBinding().to(org.apache.james.user.cassandra.CassandraUsersRepositoryModule.class);
 
+        Multibinder.newSetBinder(binder(), ConfigurationPerformer.class).addBinding().to(CassandraUsersRepositoryConfigurationPerformer.class);
+    }
+
+    @Singleton
+    public static class CassandraUsersRepositoryConfigurationPerformer implements ConfigurationPerformer {
+
+        private final ConfigurationProvider configurationProvider;
+        private final CassandraUsersRepository usersRepository;
+
+        @Inject
+        public CassandraUsersRepositoryConfigurationPerformer(ConfigurationProvider configurationProvider, CassandraUsersRepository usersRepository) {
+            this.configurationProvider = configurationProvider;
+            this.usersRepository = usersRepository;
+        }
+
+        @Override
+        public void initModule() throws Exception {
+            usersRepository.setLog(LOGGER);
+            usersRepository.configure(configurationProvider.getConfiguration("usersrepository"));
+        }
     }
 
 }


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


[9/9] james-project git commit: JAMES-1617 Spring integration

Posted by bt...@apache.org.
JAMES-1617 Spring integration


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

Branch: refs/heads/master
Commit: 4f02b963964841204064e846b3344508c274eb5a
Parents: a37c0c3
Author: Benoit Tellier <bt...@apache.org>
Authored: Wed Jan 27 00:09:02 2016 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:13:35 2016 +0700

----------------------------------------------------------------------
 .../cassandra/src/main/resources/META-INF/cassandra-session.xml | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/4f02b963/backends-common/cassandra/src/main/resources/META-INF/cassandra-session.xml
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/resources/META-INF/cassandra-session.xml b/backends-common/cassandra/src/main/resources/META-INF/cassandra-session.xml
index de27dbc..e8bda8d 100644
--- a/backends-common/cassandra/src/main/resources/META-INF/cassandra-session.xml
+++ b/backends-common/cassandra/src/main/resources/META-INF/cassandra-session.xml
@@ -75,6 +75,10 @@
           class="org.apache.james.rrt.cassandra.CassandraRRTModule"
           lazy-init="true"/>
 
+    <bean id="cassandra-sieve-repository-module"
+          class="org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule"
+          lazy-init="true"/>
+
     <bean id="cassandra-usersrepository-module"
           class="org.apache.james.user.cassandra.CassandraUsersRepositoryModule"
           lazy-init="true"/>
@@ -99,6 +103,7 @@
                 <ref bean="cassandra-rrt-module"/>
                 <ref bean="cassandra-usersrepository-module"/>
                 <ref bean="cassandra-domainlist-module"/>
+                <ref bean="cassandra-sieve-repository-module"/>
             </list>
         </constructor-arg>
     </bean>


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


[3/9] james-project git commit: JAMES-1617 Implement CassandraSieveRepository

Posted by bt...@apache.org.
JAMES-1617 Implement CassandraSieveRepository


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

Branch: refs/heads/master
Commit: 96dfc5d59a634b9a478bd312e1f1b87fdbd4ba95
Parents: 5f995ab
Author: Benoit Tellier <bt...@apache.org>
Authored: Thu Feb 18 10:55:36 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:13:30 2016 +0700

----------------------------------------------------------------------
 backends-common/cassandra/pom.xml               |   5 +
 .../cassandra/utils/CassandraAsyncExecutor.java |  66 ++++
 .../cassandra/utils/CassandraUtils.java         |   5 +-
 .../sieverepository/api/SieveRepository.java    |   2 +
 .../sieve/cassandra/CassandraSieveDAO.java      | 316 +++++++++++++++++++
 .../cassandra/CassandraSieveRepository.java     | 240 ++++++++++++++
 .../CassandraSieveRepositoryModule.java         |  97 ++++++
 .../model/ScriptContentAndActivation.java       |  39 +++
 .../james/sieve/cassandra/model/SieveQuota.java |  51 +++
 .../tables/CassandraSieveClusterQuotaTable.java |  29 ++
 .../tables/CassandraSieveQuotaTable.java        |  27 ++
 .../tables/CassandraSieveSpaceTable.java        |  27 ++
 .../cassandra/tables/CassandraSieveTable.java   |  31 ++
 .../cassandra/CassandraSieveRepositoryTest.java |  82 +++++
 .../sieve/cassandra/model/SieveQuotaTest.java   |  59 ++++
 .../lib/AbstractSieveRepositoryTest.java        |  28 +-
 16 files changed, 1096 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/backends-common/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/pom.xml b/backends-common/cassandra/pom.xml
index b74080b..d8d158a 100644
--- a/backends-common/cassandra/pom.xml
+++ b/backends-common/cassandra/pom.xml
@@ -149,6 +149,11 @@
                 <artifactId>javax.inject</artifactId>
             </dependency>
                 <dependency>
+                    <groupId>net.javacrumbs.future-converter</groupId>
+                    <artifactId>future-converter-java8-guava</artifactId>
+                    <version>0.3.0</version>
+                </dependency>
+                <dependency>
                     <groupId>org.assertj</groupId>
                     <artifactId>assertj-core</artifactId>
                     <version>${assertj-3.version}</version>

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraAsyncExecutor.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraAsyncExecutor.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraAsyncExecutor.java
new file mode 100644
index 0000000..4559b67
--- /dev/null
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraAsyncExecutor.java
@@ -0,0 +1,66 @@
+/****************************************************************
+ * 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.backends.cassandra.utils;
+
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+import javax.inject.Inject;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.Statement;
+
+import net.javacrumbs.futureconverter.java8guava.FutureConverter;
+
+public class CassandraAsyncExecutor {
+
+    private final Session session;
+
+    @Inject
+    public CassandraAsyncExecutor(Session session) {
+        this.session = session;
+    }
+
+    public CompletableFuture<ResultSet> execute(Statement statement) {
+        return FutureConverter.toCompletableFuture(session.executeAsync(statement));
+    }
+
+
+    public CompletableFuture<Boolean> executeReturnApplied(Statement statement) {
+        return FutureConverter.toCompletableFuture(session.executeAsync(statement))
+            .thenApply(ResultSet::one)
+            .thenApply(row -> row.getBool(CassandraConstants.LIGHTWEIGHT_TRANSACTION_APPLIED));
+    }
+
+    public CompletableFuture<Void> executeVoid(Statement statement) {
+        return FutureConverter.toCompletableFuture(session.executeAsync(statement))
+            .thenAccept(this::consume);
+    }
+
+    public CompletableFuture<Optional<Row>> executeSingleRow(Statement statement) {
+        return execute(statement)
+            .thenApply(ResultSet::one)
+            .thenApply(Optional::ofNullable);
+    }
+
+    private <U> void consume(U value) {}
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraUtils.java
----------------------------------------------------------------------
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraUtils.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraUtils.java
index 40c44e4..a9916bc 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraUtils.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraUtils.java
@@ -19,11 +19,12 @@
 
 package org.apache.james.backends.cassandra.utils;
 
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+
 public class CassandraUtils {
 
     public static Stream<Row> convertToStream(ResultSet resultSet) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
index 8e0a999..9bdb55e 100644
--- a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
+++ b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
@@ -37,6 +37,8 @@ import org.joda.time.DateTime;
  */
 public interface SieveRepository {
 
+    String NO_SCRIPT_NAME = "";
+
     void haveSpace(String user, String name, long size) throws QuotaExceededException, StorageException;
     
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
new file mode 100644
index 0000000..3ba2810
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
@@ -0,0 +1,316 @@
+/****************************************************************
+ * 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.sieve.cassandra;
+
+import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.delete;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.incr;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.set;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.update;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.sieve.cassandra.model.ScriptContentAndActivation;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveClusterQuotaTable;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveQuotaTable;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveSpaceTable;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveTable;
+import org.apache.james.sieverepository.api.ScriptSummary;
+import org.joda.time.DateTime;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.querybuilder.Select;
+
+public class CassandraSieveDAO {
+
+    private final CassandraAsyncExecutor cassandraAsyncExecutor;
+    private final PreparedStatement insertScriptStatement;
+    private final PreparedStatement selectActiveScriptStatement;
+    private final PreparedStatement selectActiveScriptMetadataStatement;
+    private final PreparedStatement selectActiveScriptNameStatement;
+    private final PreparedStatement selectClusterQuotaStatement;
+    private final PreparedStatement selectScriptsStatement;
+    private final PreparedStatement selectScriptStatement;
+    private final PreparedStatement selectScriptMetadataStatement;
+    private final PreparedStatement selectSpaceUsedByUserStatement;
+    private final PreparedStatement selectUserQuotaStatement;
+    private final PreparedStatement updateClusterQuotaStatement;
+    private final PreparedStatement updateUserQuotaStatement;
+    private final PreparedStatement updateScriptActivationStatement;
+    private final PreparedStatement updateSpaceUsedStatement;
+    private final PreparedStatement deleteClusterQuotaStatement;
+    private final PreparedStatement deleteScriptStatement;
+    private final PreparedStatement deleteUserQuotaStatement;
+
+    @Inject
+    public CassandraSieveDAO(Session session) {
+        this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
+
+        insertScriptStatement = session.prepare(
+            insertInto(CassandraSieveTable.TABLE_NAME)
+                .value(CassandraSieveTable.USER_NAME, bindMarker(CassandraSieveTable.USER_NAME))
+                .value(CassandraSieveTable.SCRIPT_NAME, bindMarker(CassandraSieveTable.SCRIPT_NAME))
+                .value(CassandraSieveTable.SCRIPT_CONTENT, bindMarker(CassandraSieveTable.SCRIPT_CONTENT))
+                .value(CassandraSieveTable.IS_ACTIVE, bindMarker(CassandraSieveTable.IS_ACTIVE))
+                .value(CassandraSieveTable.SIZE, bindMarker(CassandraSieveTable.SIZE))
+                .value(CassandraSieveTable.DATE, bindMarker(CassandraSieveTable.DATE)));
+
+        selectActiveScriptStatement = session.prepare(getScriptQuery(CassandraSieveTable.SCRIPT_CONTENT, CassandraSieveTable.DATE)
+            .and(eq(CassandraSieveTable.IS_ACTIVE, bindMarker(CassandraSieveTable.IS_ACTIVE))));
+
+        selectActiveScriptMetadataStatement = session.prepare(getScriptQuery(CassandraSieveTable.DATE)
+            .and(eq(CassandraSieveTable.IS_ACTIVE, bindMarker(CassandraSieveTable.IS_ACTIVE))));
+
+        selectActiveScriptNameStatement = session.prepare(getScriptQuery(CassandraSieveTable.SCRIPT_NAME)
+            .and(eq(CassandraSieveTable.IS_ACTIVE, bindMarker(CassandraSieveTable.IS_ACTIVE))));
+
+        selectClusterQuotaStatement = session.prepare(
+            select(CassandraSieveClusterQuotaTable.VALUE)
+                .from(CassandraSieveClusterQuotaTable.TABLE_NAME)
+                .where(eq(CassandraSieveClusterQuotaTable.NAME, bindMarker(CassandraSieveClusterQuotaTable.NAME))));
+
+        selectScriptsStatement = session.prepare(
+            select()
+                .from(CassandraSieveTable.TABLE_NAME)
+                .where(eq(CassandraSieveTable.USER_NAME, bindMarker(CassandraSieveTable.USER_NAME))));
+
+        selectScriptStatement = session.prepare(getScriptQuery(CassandraSieveTable.SCRIPT_CONTENT, CassandraSieveTable.IS_ACTIVE)
+            .and(eq(CassandraSieveTable.SCRIPT_NAME, bindMarker(CassandraSieveTable.SCRIPT_NAME))));
+
+        selectScriptMetadataStatement = session.prepare(getScriptQuery(CassandraSieveTable.SIZE, CassandraSieveTable.IS_ACTIVE, CassandraSieveTable.DATE)
+            .and(eq(CassandraSieveTable.SCRIPT_NAME, bindMarker(CassandraSieveTable.SCRIPT_NAME))));
+
+        selectSpaceUsedByUserStatement = session.prepare(
+            select(CassandraSieveSpaceTable.SPACE_USED)
+                .from(CassandraSieveSpaceTable.TABLE_NAME)
+                .where(eq(CassandraSieveSpaceTable.USER_NAME, bindMarker(CassandraSieveSpaceTable.USER_NAME))));
+
+        selectUserQuotaStatement = session.prepare(
+            select(CassandraSieveQuotaTable.QUOTA)
+                .from(CassandraSieveQuotaTable.TABLE_NAME)
+                .where(eq(CassandraSieveQuotaTable.USER_NAME, bindMarker(CassandraSieveQuotaTable.USER_NAME))));
+
+        updateClusterQuotaStatement = session.prepare(
+            update(CassandraSieveClusterQuotaTable.TABLE_NAME)
+                .with(set(CassandraSieveClusterQuotaTable.VALUE, bindMarker(CassandraSieveClusterQuotaTable.VALUE)))
+                .where(eq(CassandraSieveClusterQuotaTable.NAME, bindMarker(CassandraSieveClusterQuotaTable.NAME))));
+
+        updateScriptActivationStatement = session.prepare(
+            update(CassandraSieveTable.TABLE_NAME)
+                .with(set(CassandraSieveTable.IS_ACTIVE, bindMarker(CassandraSieveTable.IS_ACTIVE)))
+                .where(eq(CassandraSieveTable.USER_NAME, bindMarker(CassandraSieveTable.USER_NAME)))
+                .and(eq(CassandraSieveTable.SCRIPT_NAME, bindMarker(CassandraSieveTable.SCRIPT_NAME)))
+                .ifExists());
+
+        updateSpaceUsedStatement = session.prepare(
+            update(CassandraSieveSpaceTable.TABLE_NAME)
+                .with(incr(CassandraSieveSpaceTable.SPACE_USED, bindMarker(CassandraSieveSpaceTable.SPACE_USED)))
+                .where(eq(CassandraSieveSpaceTable.USER_NAME, bindMarker(CassandraSieveSpaceTable.USER_NAME))));
+
+        updateUserQuotaStatement = session.prepare(
+            update(CassandraSieveQuotaTable.TABLE_NAME)
+                .with(set(CassandraSieveQuotaTable.QUOTA, bindMarker(CassandraSieveQuotaTable.QUOTA)))
+                .where(eq(CassandraSieveQuotaTable.USER_NAME, bindMarker(CassandraSieveQuotaTable.USER_NAME))));
+
+        deleteScriptStatement = session.prepare(
+            delete()
+                .from(CassandraSieveTable.TABLE_NAME)
+                .where(eq(CassandraSieveTable.USER_NAME, bindMarker(CassandraSieveTable.USER_NAME)))
+                .and(eq(CassandraSieveTable.SCRIPT_NAME, bindMarker(CassandraSieveTable.SCRIPT_NAME)))
+                .ifExists());
+
+        deleteClusterQuotaStatement = session.prepare(
+            delete()
+                .from(CassandraSieveClusterQuotaTable.TABLE_NAME)
+                .where(eq(CassandraSieveClusterQuotaTable.NAME, bindMarker(CassandraSieveClusterQuotaTable.NAME)))
+                .ifExists());
+
+        deleteUserQuotaStatement = session.prepare(
+            delete()
+                .from(CassandraSieveQuotaTable.TABLE_NAME)
+                .where(eq(CassandraSieveQuotaTable.USER_NAME, bindMarker(CassandraSieveQuotaTable.USER_NAME)))
+                .ifExists());
+    }
+
+    private Select.Where getScriptQuery(String... selectedRows) {
+        return select(selectedRows)
+            .from(CassandraSieveTable.TABLE_NAME)
+            .where(eq(CassandraSieveTable.USER_NAME, bindMarker(CassandraSieveTable.USER_NAME)));
+    }
+
+    public CompletableFuture<Long> spaceUsedBy(String user) {
+        return cassandraAsyncExecutor.executeSingleRow(
+            selectSpaceUsedByUserStatement.bind()
+                .setString(CassandraSieveSpaceTable.USER_NAME, user))
+            .thenApply(optional -> optional.map(row -> row.getLong(CassandraSieveSpaceTable.SPACE_USED))
+                .orElse(0L));
+    }
+
+    public CompletableFuture<Void> insertScript(String user, String name, String content, boolean isActive) {
+        return cassandraAsyncExecutor.executeVoid(
+            insertScriptStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user)
+                .setString(CassandraSieveTable.SCRIPT_NAME, name)
+                .setString(CassandraSieveTable.SCRIPT_CONTENT, content)
+                .setBool(CassandraSieveTable.IS_ACTIVE, isActive)
+                .setLong(CassandraSieveTable.SIZE, content.getBytes().length)
+                .setDate(CassandraSieveTable.DATE, new Date()));
+    }
+
+    public CompletableFuture<List<ScriptSummary>> listScripts(String user) {
+        return cassandraAsyncExecutor.execute(
+            selectScriptsStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user))
+            .thenApply(resultSet -> resultSet.all()
+                .stream()
+                .map(row -> new ScriptSummary(
+                    row.getString(CassandraSieveTable.SCRIPT_NAME),
+                    row.getBool(CassandraSieveTable.IS_ACTIVE)))
+                .collect(Collectors.toList()));
+    }
+
+    public CompletableFuture<Void> updateSpaceUsed(String user, long spaceUsed) {
+        return cassandraAsyncExecutor.executeVoid(
+            updateSpaceUsedStatement.bind()
+                .setLong(CassandraSieveSpaceTable.SPACE_USED, spaceUsed)
+                .setString(CassandraSieveSpaceTable.USER_NAME, user));
+    }
+
+    public CompletableFuture<Boolean> updateScriptActivation(String user, String scriptName, boolean active) {
+        return cassandraAsyncExecutor.executeReturnApplied(
+            updateScriptActivationStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user)
+                .setString(CassandraSieveTable.SCRIPT_NAME, scriptName)
+                .setBool(CassandraSieveTable.IS_ACTIVE, active));
+    }
+
+    public CompletableFuture<Optional<ScriptContentAndActivation>> getScriptContentAndActivation(String user, String name) {
+        return getScriptRow(user, name).thenApply(opt -> opt.map(row -> new ScriptContentAndActivation(
+            row.getString(CassandraSieveTable.SCRIPT_CONTENT),
+            row.getBool(CassandraSieveTable.IS_ACTIVE))));
+    }
+
+    public CompletableFuture<Optional<String>> getScriptContent(String user, String name) {
+        return getScriptRow(user, name).thenApply(opt -> opt.map(row -> row.getString(CassandraSieveTable.SCRIPT_CONTENT)));
+    }
+
+    public CompletableFuture<Optional<Long>> getScriptSize(String user, String name) {
+        return cassandraAsyncExecutor.executeSingleRow(
+            selectScriptMetadataStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user)
+                .setString(CassandraSieveTable.SCRIPT_NAME, name))
+            .thenApply(rowOptional -> rowOptional.map(row -> row.getLong(CassandraSieveTable.SIZE)));
+    }
+
+    public CompletableFuture<Optional<DateTime>> getActiveScriptActivationDate(String user) {
+        return cassandraAsyncExecutor.executeSingleRow(
+            selectActiveScriptMetadataStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user)
+                .setBool(CassandraSieveTable.IS_ACTIVE, true))
+            .thenApply(rowOptional -> rowOptional.map(row -> new DateTime(row.getDate(CassandraSieveTable.DATE).getTime())));
+    }
+
+    public CompletableFuture<Boolean> deleteScriptInCassandra(String user, String name) {
+        return cassandraAsyncExecutor.executeReturnApplied(
+            deleteScriptStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user)
+                .setString(CassandraSieveTable.SCRIPT_NAME, name));
+    }
+
+    public CompletableFuture<Boolean> scriptExists(String user, String name) {
+        return getScriptSize(user, name).thenApply(Optional::isPresent);
+    }
+
+    public CompletableFuture<Optional<Long>> getQuota() {
+        return cassandraAsyncExecutor.executeSingleRow(
+            selectClusterQuotaStatement.bind()
+                .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME))
+            .thenApply(optional -> optional.map(row -> row.getLong(CassandraSieveClusterQuotaTable.VALUE)));
+    }
+
+    public CompletableFuture<Void> setQuota(long quota) {
+        return cassandraAsyncExecutor.executeVoid(
+            updateClusterQuotaStatement.bind()
+                .setLong(CassandraSieveClusterQuotaTable.VALUE, quota)
+                .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME));
+    }
+
+    public CompletableFuture<Boolean> removeQuota() {
+        return cassandraAsyncExecutor.executeReturnApplied(
+            deleteClusterQuotaStatement.bind()
+                .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME));
+    }
+
+    public CompletableFuture<Optional<Long>> getQuota(String user) {
+        return cassandraAsyncExecutor.executeSingleRow(
+            selectUserQuotaStatement.bind()
+                .setString(CassandraSieveQuotaTable.USER_NAME, user))
+            .thenApply(optional -> optional.map(row -> row.getLong(CassandraSieveQuotaTable.QUOTA)));
+    }
+
+    public CompletableFuture<Optional<String>> getActiveName(String user) {
+        return cassandraAsyncExecutor.executeSingleRow(
+            selectActiveScriptNameStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user)
+                .setBool(CassandraSieveTable.IS_ACTIVE, true))
+            .thenApply(optional -> optional.map(row -> row.getString(CassandraSieveTable.SCRIPT_NAME)));
+    }
+
+    public CompletableFuture<Void> setQuota(String user, long quota) {
+        return cassandraAsyncExecutor.executeVoid(
+            updateUserQuotaStatement.bind()
+                .setLong(CassandraSieveQuotaTable.QUOTA, quota)
+                .setString(CassandraSieveQuotaTable.USER_NAME, user));
+    }
+
+    public CompletableFuture<Boolean> removeQuota(String user)  {
+        return cassandraAsyncExecutor.executeReturnApplied(
+            deleteUserQuotaStatement.bind()
+                .setString(CassandraSieveQuotaTable.USER_NAME, user));
+    }
+
+    public CompletableFuture<Optional<String>> getActive(String user) {
+        return cassandraAsyncExecutor.executeSingleRow(
+            selectActiveScriptStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user)
+                .setBool(CassandraSieveTable.IS_ACTIVE, true))
+            .thenApply(rowOptional -> rowOptional.map(row -> row.getString(CassandraSieveTable.SCRIPT_CONTENT)));
+    }
+
+    private CompletableFuture<Optional<Row>> getScriptRow(String user, String name) {
+        return cassandraAsyncExecutor.executeSingleRow(
+            selectScriptStatement.bind()
+                .setString(CassandraSieveTable.USER_NAME, user)
+                .setString(CassandraSieveTable.SCRIPT_NAME, name));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
new file mode 100644
index 0000000..2a36a91
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
@@ -0,0 +1,240 @@
+/****************************************************************
+ * 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.sieve.cassandra;
+
+import java.io.InputStream;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+import javax.inject.Inject;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.james.sieve.cassandra.model.ScriptContentAndActivation;
+import org.apache.james.sieverepository.api.ScriptSummary;
+import org.apache.james.sieve.cassandra.model.SieveQuota;
+import org.apache.james.sieverepository.api.SieveRepository;
+import org.apache.james.sieverepository.api.exception.DuplicateException;
+import org.apache.james.sieverepository.api.exception.IsActiveException;
+import org.apache.james.sieverepository.api.exception.QuotaExceededException;
+import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
+import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
+import org.apache.james.sieverepository.api.exception.StorageException;
+import org.joda.time.DateTime;
+
+public class CassandraSieveRepository implements SieveRepository {
+
+    private final CassandraSieveDAO cassandraSieveDAO;
+
+    @Inject
+    public CassandraSieveRepository(CassandraSieveDAO cassandraSieveDAO) {
+        this.cassandraSieveDAO = cassandraSieveDAO;
+    }
+
+    @Override
+    public DateTime getActivationDateForActiveScript(String user) throws StorageException, ScriptNotFoundException {
+        return cassandraSieveDAO.getActiveScriptActivationDate(user)
+            .join()
+            .orElseThrow(ScriptNotFoundException::new);
+    }
+
+    @Override
+    public void haveSpace(String user, String name, long newSize) throws QuotaExceededException, StorageException {
+        throwOnOverQuota(user, spaceThatWillBeUsedByNewScript(user, name, newSize));
+    }
+
+    private void throwOnOverQuota(String user, CompletableFuture<Long> sizeDifference) throws QuotaExceededException, StorageException {
+        CompletableFuture<Optional<Long>> userQuotaFuture = cassandraSieveDAO.getQuota(user);
+        CompletableFuture<Optional<Long>> globalQuotaFuture = cassandraSieveDAO.getQuota();
+        CompletableFuture<Long> spaceUsedFuture = cassandraSieveDAO.spaceUsedBy(user);
+
+        new SieveQuota(spaceUsedFuture.join(), limitToUse(userQuotaFuture, globalQuotaFuture)).checkOverQuotaUponModification(sizeDifference.join());
+    }
+
+    public CompletableFuture<Long> spaceThatWillBeUsedByNewScript(String user, String name, long scriptSize) {
+        return cassandraSieveDAO.getScriptSize(user, name)
+            .thenApply(sizeOfStoredScript -> scriptSize - sizeOfStoredScript.orElse(0L));
+    }
+
+    private Optional<Long> limitToUse(CompletableFuture<Optional<Long>> userQuota, CompletableFuture<Optional<Long>> globalQuota) {
+        if (userQuota.join().isPresent()) {
+            return userQuota.join();
+        }
+        return globalQuota.join();
+    }
+
+    @Override
+    public void putScript(String user, String name, String content) throws QuotaExceededException, StorageException {
+        CompletableFuture<Long> spaceUsed = spaceThatWillBeUsedByNewScript(user, name, content.length());
+        throwOnOverQuota(user, spaceUsed);
+
+        CompletableFuture.allOf(
+            updateSpaceUsed(user, spaceUsed.join()),
+            cassandraSieveDAO.insertScript(user, name, content, false))
+            .join();
+    }
+
+    public CompletableFuture<Void> updateSpaceUsed(String user, long spaceUsed) {
+        if (spaceUsed == 0) {
+            return CompletableFuture.completedFuture(null);
+        }
+        return cassandraSieveDAO.updateSpaceUsed(user, spaceUsed);
+    }
+
+    @Override
+    public List<ScriptSummary> listScripts(String user) {
+        return cassandraSieveDAO.listScripts(user).join();
+    }
+
+    @Override
+    public InputStream getActive(String user) throws ScriptNotFoundException {
+        return IOUtils.toInputStream(
+            cassandraSieveDAO.getActive(user)
+                .join()
+                .orElseThrow(ScriptNotFoundException::new));
+    }
+
+    @Override
+    public void setActive(String user, String name) throws ScriptNotFoundException {
+        CompletableFuture<Void> unactivateOldScriptFuture = unactivateOldScript(user);
+        CompletableFuture<Boolean> activateNewScript = updateScriptActivation(user, name, true);
+
+        unactivateOldScriptFuture.join();
+        if (!activateNewScript.join()) {
+            throw new ScriptNotFoundException();
+        }
+    }
+
+    private CompletableFuture<Void> unactivateOldScript(String user) {
+        return cassandraSieveDAO.getActiveName(user)
+            .thenCompose(scriptNameOptional -> scriptNameOptional
+                .map(scriptName -> updateScriptActivation(user, scriptName, false)
+                    .<Void>thenApply(any -> null))
+                .orElse(CompletableFuture.completedFuture(null)));
+    }
+
+    private CompletableFuture<Boolean> updateScriptActivation(String user, String scriptName, boolean active) {
+        if (!scriptName.equals(SieveRepository.NO_SCRIPT_NAME)) {
+            return cassandraSieveDAO.updateScriptActivation(user, scriptName, active);
+        }
+        return CompletableFuture.completedFuture(true);
+    }
+
+    @Override
+    public InputStream getScript(String user, String name) throws ScriptNotFoundException {
+        return  cassandraSieveDAO.getScriptContent(user, name)
+            .join()
+            .map(IOUtils::toInputStream)
+            .orElseThrow(ScriptNotFoundException::new);
+    }
+
+    @Override
+    public void deleteScript(String user, String name) throws ScriptNotFoundException, IsActiveException {
+        ensureIsNotActive(user, name);
+        if (!cassandraSieveDAO.deleteScriptInCassandra(user, name).join()) {
+            throw new ScriptNotFoundException();
+        }
+    }
+
+    private void ensureIsNotActive(String user, String name) throws IsActiveException {
+        Optional<String> activeName = cassandraSieveDAO.getActiveName(user).join();
+        if (activeName.isPresent() && name.equals(activeName.get())) {
+            throw new IsActiveException();
+        }
+    }
+
+    @Override
+    public void renameScript(String user, String oldName, String newName) throws ScriptNotFoundException, DuplicateException {
+        CompletableFuture<Boolean> scriptExistsFuture = cassandraSieveDAO.scriptExists(user, newName);
+        CompletableFuture<Optional<ScriptContentAndActivation>> oldScriptFuture = cassandraSieveDAO.getScriptContentAndActivation(user, oldName);
+
+        oldScriptFuture.join();
+        if (scriptExistsFuture.join()) {
+            throw new DuplicateException();
+        }
+
+        performScriptRename(user,
+            oldName,
+            newName,
+            oldScriptFuture.join().orElseThrow(ScriptNotFoundException::new));
+    }
+
+    private void performScriptRename(String user, String oldName, String newName, ScriptContentAndActivation oldScript) {
+        CompletableFuture.allOf(
+            cassandraSieveDAO.insertScript(user, newName, oldScript.getContent(), oldScript.isActive()),
+            cassandraSieveDAO.deleteScriptInCassandra(user, oldName))
+            .join();
+    }
+
+    @Override
+    public boolean hasQuota() {
+        return cassandraSieveDAO.getQuota()
+            .join()
+            .isPresent();
+    }
+
+    @Override
+    public long getQuota() throws QuotaNotFoundException {
+        return cassandraSieveDAO.getQuota()
+            .join()
+            .orElseThrow(QuotaNotFoundException::new);
+    }
+
+    @Override
+    public void setQuota(long quota) {
+        cassandraSieveDAO.setQuota(quota).join();
+    }
+
+    @Override
+    public void removeQuota() throws QuotaNotFoundException {
+        if (!cassandraSieveDAO.removeQuota().join()) {
+            throw new QuotaNotFoundException();
+        }
+    }
+
+    @Override
+    public boolean hasQuota(String user) {
+        CompletableFuture<Boolean> userQuotaIsPresent = cassandraSieveDAO.getQuota(user).thenApply(Optional::isPresent);
+        CompletableFuture<Boolean> globalQuotaIsPresent = cassandraSieveDAO.getQuota().thenApply(Optional::isPresent);
+        CompletableFuture.allOf(userQuotaIsPresent, globalQuotaIsPresent).join();
+
+        return userQuotaIsPresent.join() || globalQuotaIsPresent.join();
+    }
+
+    @Override
+    public long getQuota(String user) throws QuotaNotFoundException {
+        return cassandraSieveDAO.getQuota(user)
+            .join()
+            .orElseThrow(QuotaNotFoundException::new);
+    }
+
+    @Override
+    public void setQuota(String user, long quota) {
+        cassandraSieveDAO.setQuota(user, quota).join();
+    }
+
+    @Override
+    public void removeQuota(String user) throws QuotaNotFoundException {
+        if (!cassandraSieveDAO.removeQuota(user).join()) {
+            throw new QuotaNotFoundException();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java
new file mode 100644
index 0000000..c59053d
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java
@@ -0,0 +1,97 @@
+/****************************************************************
+ * 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.sieve.cassandra;
+
+import static com.datastax.driver.core.DataType.bigint;
+import static com.datastax.driver.core.DataType.cboolean;
+import static com.datastax.driver.core.DataType.counter;
+import static com.datastax.driver.core.DataType.text;
+import static com.datastax.driver.core.DataType.timestamp;
+
+import java.util.List;
+
+import org.apache.james.backends.cassandra.components.CassandraIndex;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.components.CassandraTable;
+import org.apache.james.backends.cassandra.components.CassandraType;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveClusterQuotaTable;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveQuotaTable;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveSpaceTable;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveTable;
+
+import com.datastax.driver.core.schemabuilder.SchemaBuilder;
+import com.google.common.collect.ImmutableList;
+
+public class CassandraSieveRepositoryModule implements CassandraModule {
+
+    private final List<CassandraTable> tables;
+    private final List<CassandraIndex> index;
+    private final List<CassandraType> types;
+
+    public CassandraSieveRepositoryModule() {
+        tables = ImmutableList.of(
+            new CassandraTable(CassandraSieveTable.TABLE_NAME,
+                SchemaBuilder.createTable(CassandraSieveTable.TABLE_NAME)
+                    .ifNotExists()
+                    .addPartitionKey(CassandraSieveTable.USER_NAME, text())
+                    .addClusteringColumn(CassandraSieveTable.SCRIPT_NAME, text())
+                    .addColumn(CassandraSieveTable.SCRIPT_CONTENT, text())
+                    .addColumn(CassandraSieveTable.IS_ACTIVE, cboolean())
+                    .addColumn(CassandraSieveTable.DATE, timestamp())
+                    .addColumn(CassandraSieveTable.SIZE, bigint())),
+            new CassandraTable(CassandraSieveSpaceTable.TABLE_NAME,
+                SchemaBuilder.createTable(CassandraSieveSpaceTable.TABLE_NAME)
+                    .ifNotExists()
+                    .addPartitionKey(CassandraSieveSpaceTable.USER_NAME, text())
+                    .addColumn(CassandraSieveSpaceTable.SPACE_USED, counter())),
+            new CassandraTable(CassandraSieveQuotaTable.TABLE_NAME,
+                SchemaBuilder.createTable(CassandraSieveQuotaTable.TABLE_NAME)
+                    .ifNotExists()
+                    .addPartitionKey(CassandraSieveQuotaTable.USER_NAME, text())
+                    .addColumn(CassandraSieveQuotaTable.QUOTA, bigint())),
+            new CassandraTable(CassandraSieveClusterQuotaTable.TABLE_NAME,
+                SchemaBuilder.createTable(CassandraSieveClusterQuotaTable.TABLE_NAME)
+                    .ifNotExists()
+                    .addPartitionKey(CassandraSieveClusterQuotaTable.NAME, text())
+                    .addColumn(CassandraSieveClusterQuotaTable.VALUE, bigint())));
+        index = ImmutableList.of(
+            new CassandraIndex(
+                SchemaBuilder.createIndex(CassandraIndex.INDEX_PREFIX + CassandraSieveTable.TABLE_NAME + CassandraSieveTable.IS_ACTIVE)
+                    .ifNotExists()
+                    .onTable(CassandraSieveTable.TABLE_NAME)
+                    .andColumn(CassandraSieveTable.IS_ACTIVE)));
+        types = ImmutableList.of();
+    }
+
+    @Override
+    public List<CassandraTable> moduleTables() {
+        return tables;
+    }
+
+    @Override
+    public List<CassandraIndex> moduleIndex() {
+        return index;
+    }
+
+    @Override
+    public List<CassandraType> moduleTypes() {
+        return types;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ScriptContentAndActivation.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ScriptContentAndActivation.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ScriptContentAndActivation.java
new file mode 100644
index 0000000..0e26b7b
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ScriptContentAndActivation.java
@@ -0,0 +1,39 @@
+/****************************************************************
+ * 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.sieve.cassandra.model;
+
+public class ScriptContentAndActivation {
+
+    private final String content;
+    private final boolean activation;
+
+    public ScriptContentAndActivation(String content, boolean activation) {
+        this.content = content;
+        this.activation = activation;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public boolean isActive() {
+        return activation;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java
new file mode 100644
index 0000000..c1a44d6
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java
@@ -0,0 +1,51 @@
+/*
+ *   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.sieve.cassandra.model;
+
+import java.util.Optional;
+
+import org.apache.james.sieverepository.api.exception.QuotaExceededException;
+
+import com.google.common.base.Preconditions;
+
+public class SieveQuota {
+
+    private final long currentUsage;
+    private final Optional<Long> limit;
+
+    public SieveQuota(long currentUsage, Optional<Long> limit) {
+        Preconditions.checkArgument(currentUsage >= 0, "Current usage should be positive or equal to zero");
+        limit.ifPresent(limitValue -> Preconditions.checkArgument(limitValue >= 0, "Limit value should be positive or equal to zero"));
+        this.currentUsage = currentUsage;
+        this.limit = limit;
+    }
+
+    public void checkOverQuotaUponModification(long sizeDifference) throws QuotaExceededException {
+        if (isExceededUponModification(sizeDifference)) {
+            throw new QuotaExceededException();
+        }
+    }
+
+    public boolean isExceededUponModification(long sizeDifference) {
+        return limit.map(limitContent -> currentUsage + sizeDifference > limitContent)
+                .orElse(false);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java
new file mode 100644
index 0000000..16beb0f
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java
@@ -0,0 +1,29 @@
+/****************************************************************
+ * 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.sieve.cassandra.tables;
+
+public interface CassandraSieveClusterQuotaTable {
+    String TABLE_NAME = "sieve_cluster_quota";
+
+    String NAME = "name";
+    String VALUE = "value";
+
+    String DEFAULT_NAME = "cluster_quota";
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java
new file mode 100644
index 0000000..94c6425
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java
@@ -0,0 +1,27 @@
+/****************************************************************
+ * 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.sieve.cassandra.tables;
+
+public interface CassandraSieveQuotaTable {
+    String TABLE_NAME = "sieve_quota";
+
+    String USER_NAME = "user_name";
+    String QUOTA = "quota";
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java
new file mode 100644
index 0000000..8156e77
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java
@@ -0,0 +1,27 @@
+/****************************************************************
+ * 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.sieve.cassandra.tables;
+
+public interface CassandraSieveSpaceTable {
+    String TABLE_NAME = "sieve_space";
+
+    String USER_NAME = "user_name";
+    String SPACE_USED = "space_used";
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.java
new file mode 100644
index 0000000..9479ea3
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.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.sieve.cassandra.tables;
+
+public interface CassandraSieveTable {
+    String TABLE_NAME = "sieve";
+
+    String USER_NAME = "user_name";
+    String SCRIPT_NAME = "script_name";
+    String SCRIPT_CONTENT = "script_content";
+    String IS_ACTIVE = "is_active";
+    String DATE = "date";
+    String SIZE = "size";
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryTest.java
new file mode 100644
index 0000000..14ff4e8
--- /dev/null
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryTest.java
@@ -0,0 +1,82 @@
+/****************************************************************
+ * 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.sieve.cassandra;
+
+import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Date;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.sieve.cassandra.tables.CassandraSieveTable;
+import org.apache.james.sieverepository.api.SieveRepository;
+import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
+import org.apache.james.sieverepository.lib.AbstractSieveRepositoryTest;
+import org.joda.time.DateTime;
+import org.junit.Test;
+
+public class CassandraSieveRepositoryTest extends AbstractSieveRepositoryTest {
+    public static final int DATE_TIMESTAMP = 123456141;
+    private CassandraCluster cassandra;
+
+    public CassandraSieveRepositoryTest() {
+        cassandra = CassandraCluster.create(new CassandraSieveRepositoryModule());
+    }
+
+    @Override
+    protected SieveRepository createSieveRepository() throws Exception {
+        return new CassandraSieveRepository(new CassandraSieveDAO(cassandra.getConf()));
+    }
+
+    @Override
+    protected void cleanUp() throws Exception {
+        cassandra.clearAllTables();
+    }
+
+    @Test
+    public void getActivationDateForActiveScriptShouldWork() throws Exception {
+        cassandra.getConf().execute(
+            insertInto(CassandraSieveTable.TABLE_NAME)
+                .value(CassandraSieveTable.USER_NAME, USER)
+                .value(CassandraSieveTable.SCRIPT_NAME, SCRIPT_NAME)
+                .value(CassandraSieveTable.SCRIPT_CONTENT, SCRIPT_CONTENT)
+                .value(CassandraSieveTable.IS_ACTIVE, true)
+                .value(CassandraSieveTable.SIZE, SCRIPT_CONTENT.length())
+                .value(CassandraSieveTable.DATE, new Date(DATE_TIMESTAMP))
+        );
+        assertThat(sieveRepository.getActivationDateForActiveScript(USER)).isEqualTo(new DateTime(DATE_TIMESTAMP));
+    }
+
+
+    @Test(expected = ScriptNotFoundException.class)
+    public void getActivationDateForActiveScriptShouldThrowOnMissingActiveScript() throws Exception {
+        cassandra.getConf().execute(
+            insertInto(CassandraSieveTable.TABLE_NAME)
+                .value(CassandraSieveTable.USER_NAME, USER)
+                .value(CassandraSieveTable.SCRIPT_NAME, SCRIPT_NAME)
+                .value(CassandraSieveTable.SCRIPT_CONTENT, SCRIPT_CONTENT)
+                .value(CassandraSieveTable.IS_ACTIVE, false)
+                .value(CassandraSieveTable.SIZE, SCRIPT_CONTENT.length())
+                .value(CassandraSieveTable.DATE, DATE_TIMESTAMP)
+        );
+        sieveRepository.getActivationDateForActiveScript(USER);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java
new file mode 100644
index 0000000..fe93a82
--- /dev/null
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java
@@ -0,0 +1,59 @@
+/****************************************************************
+ * 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.sieve.cassandra.model;
+
+import java.util.Optional;
+
+import org.apache.james.sieverepository.api.exception.QuotaExceededException;
+import org.junit.Test;
+
+public class SieveQuotaTest {
+
+    public static final long INVALID_VALUE = -1L;
+    public static final long LIMIT_LOW_VALUE = 10L;
+    public static final long SIZE_DIFFERENCE = 20L;
+    public static final int CURRENT_USAGE = 0;
+    public static final long LIMIT_HIGH_VALUE = 100L;
+
+    @Test(expected = IllegalArgumentException.class)
+    public void sieveQuotaShouldThrowOnNegativeCurrentValue() {
+        new SieveQuota(INVALID_VALUE, Optional.empty());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void sieveQuotaShouldThrowOnNegativeLimitValue() {
+        new SieveQuota(0, Optional.of(INVALID_VALUE));
+    }
+
+    @Test(expected = QuotaExceededException.class)
+    public void checkOverQuotaUponModificationShouldThrowIfLimitExceeded() throws Exception {
+        new SieveQuota(CURRENT_USAGE, Optional.of(LIMIT_LOW_VALUE)).checkOverQuotaUponModification(SIZE_DIFFERENCE);
+    }
+
+    @Test
+    public void checkOverQuotaShouldNotThrowWhenNoLimit() throws Exception {
+        new SieveQuota(CURRENT_USAGE, Optional.empty()).checkOverQuotaUponModification(SIZE_DIFFERENCE);
+    }
+
+    @Test
+    public void checkOverQuotaUponModificationShouldNotThrowIfLimitNotExceeded() throws Exception {
+        new SieveQuota(CURRENT_USAGE, Optional.of(LIMIT_HIGH_VALUE)).checkOverQuotaUponModification(SIZE_DIFFERENCE);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/96dfc5d5/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
index 1488791..b07d3dc 100644
--- a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
@@ -31,22 +31,24 @@ import org.apache.james.sieverepository.api.exception.IsActiveException;
 import org.apache.james.sieverepository.api.exception.QuotaExceededException;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
+import org.joda.time.DateTime;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
 public abstract class AbstractSieveRepositoryTest {
 
-    private static final String USER = "test";
-    private static final String SCRIPT_NAME = "script";
-    private static final String SCRIPT_CONTENT = "\u0048\u0065\u006C\u006C\u006F World"; // test utf-8
+    protected static final String USER = "test";
+    protected static final String SCRIPT_NAME = "script";
+    protected static final String SCRIPT_CONTENT = "\u0048\u0065\u006C\u006C\u006F World"; // test utf-8
+
     private static final String OTHER_SCRIPT_NAME = "other_script";
     private static final String OTHER_SCRIPT_CONTENT = "Other script content";
     private static final long DEFAULT_QUOTA = Long.MAX_VALUE - 1L;
     private static final long USER_QUOTA = Long.MAX_VALUE / 2;
     private static final String UTF8_ENCODING = "UTF-8";
 
-    private SieveRepository sieveRepository;
+    protected SieveRepository sieveRepository;
 
     @Before
     public void setUp() throws Exception {
@@ -70,6 +72,20 @@ public abstract class AbstractSieveRepositoryTest {
     }
 
     @Test
+    public void getActivationDateForActiveScriptShouldReturnNonNullAndNonZeroResult() throws Exception {
+        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USER, SCRIPT_NAME);
+        assertThat(sieveRepository.getActivationDateForActiveScript(USER)).isNotNull();
+        assertThat(sieveRepository.getActivationDateForActiveScript(USER)).isNotEqualTo(new DateTime(0L));
+    }
+
+    @Test(expected = ScriptNotFoundException.class)
+    public void getActivationDateForActiveScriptShouldThrowOnMissingActiveScript() throws Exception {
+        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.getActivationDateForActiveScript(USER);
+    }
+
+    @Test
     public void haveSpaceShouldNotThrowWhenUserDoesNotHaveQuota() throws Exception {
         sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA + 1L);
     }
@@ -185,7 +201,7 @@ public abstract class AbstractSieveRepositoryTest {
     public void switchOffActiveScriptShouldWork() throws Exception {
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.setActive(USER, "");
+        sieveRepository.setActive(USER, SieveRepository.NO_SCRIPT_NAME);
         sieveRepository.getActive(USER);
     }
 
@@ -193,7 +209,7 @@ public abstract class AbstractSieveRepositoryTest {
     public void switchOffActiveScriptShouldNotThrow() throws Exception {
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.setActive(USER, "");
+        sieveRepository.setActive(USER, SieveRepository.NO_SCRIPT_NAME);
     }
 
     @Test(expected = ScriptNotFoundException.class)


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


[6/9] james-project git commit: JAMES-1617 Missing license

Posted by bt...@apache.org.
JAMES-1617 Missing license


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

Branch: refs/heads/master
Commit: 777d10147f3d0a46f751dfd69332740a6caa99f3
Parents: 4f02b96
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Mar 9 09:44:00 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:13:35 2016 +0700

----------------------------------------------------------------------
 .../managesieve/file/host/FileHostSystem.java    | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/777d1014/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java b/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
index a6260bf..5ff4e50 100644
--- a/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
+++ b/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
@@ -1,3 +1,22 @@
+/****************************************************************
+ * 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.mpt.managesieve.file.host;
 
 import java.io.File;


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


[5/9] james-project git commit: JAMES-1617 MPT test for ManageSieve with Cassandra Storage

Posted by bt...@apache.org.
JAMES-1617 MPT test for ManageSieve with Cassandra Storage


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

Branch: refs/heads/master
Commit: a081bfd8689a7818207e2fad10c44a0ef719ab1c
Parents: 96dfc5d
Author: Benoit Tellier <bt...@apache.org>
Authored: Wed Feb 17 14:20:26 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:13:35 2016 +0700

----------------------------------------------------------------------
 mpt/impl/managesieve/cassandra/pom.xml          | 216 +++++++++++++++++++
 .../managesieve/cassandra/CassandraModule.java  |  40 ++++
 .../cassandra/ManageSieveCassandraTest.java     |  60 ++++++
 .../cassandra/host/CassandraHostSystem.java     |  59 +++++
 mpt/impl/managesieve/file/pom.xml               |   2 -
 .../managesieve/file/host/FileHostSystem.java   |   1 +
 mpt/impl/managesieve/pom.xml                    |  71 ++++++
 mpt/pom.xml                                     |   5 +
 .../cassandra/CassandraUsersRepository.java     |  10 +-
 .../james/user/lib/AbstractUsersRepository.java |   6 +-
 10 files changed, 462 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/mpt/impl/managesieve/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/pom.xml b/mpt/impl/managesieve/cassandra/pom.xml
new file mode 100644
index 0000000..c823357
--- /dev/null
+++ b/mpt/impl/managesieve/cassandra/pom.xml
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>apache-james-mpt-managesieve</artifactId>
+        <groupId>org.apache.james</groupId>
+        <version>0.2-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>apache-james-mpt-managesieve-cassandra</artifactId>
+
+    <name>Apache James MPT ManageSieve Cassandra</name>
+
+    <profiles>
+        <profile>
+            <id>disable-build-for-older-jdk</id>
+            <activation>
+                <jdk>(,1.8)</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>default-jar</id>
+                                <phase>none</phase>
+                            </execution>
+                            <execution>
+                                <id>jar</id>
+                                <phase>none</phase>
+                            </execution>
+                            <execution>
+                                <id>test-jar</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>default-compile</id>
+                                <phase>none</phase>
+                            </execution>
+                            <execution>
+                                <id>default-testCompile</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>default-test</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-install-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>default-install</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-resources-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>default-resources</id>
+                                <phase>none</phase>
+                            </execution>
+                            <execution>
+                                <id>default-testResources</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-site-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-descriptor</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>build-for-jdk-8</id>
+            <activation>
+                <jdk>[1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.james</groupId>
+                    <artifactId>apache-james-mpt-managesieve-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.james</groupId>
+                    <artifactId>apache-james-backends-cassandra</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.james</groupId>
+                    <artifactId>apache-james-backends-cassandra</artifactId>
+                    <type>test-jar</type>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.james</groupId>
+                    <artifactId>james-server-data-cassandra</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>org.cassandraunit</groupId>
+                    <artifactId>cassandra-unit</artifactId>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <configuration>
+                            <archive>
+                                <manifest>
+                                    <mainClass>fully.qualified.MainClass</mainClass>
+                                </manifest>
+                            </archive>
+                            <descriptorRefs>
+                                <descriptorRef>jar-with-dependencies</descriptorRef>
+                            </descriptorRefs>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <configuration>
+                            <source>1.8</source>
+                            <target>1.8</target>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>disable-animal-sniffer</id>
+            <activation>
+                <jdk>[1.6,)</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>animal-sniffer-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>check_java_6</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>**/suite/*.java</exclude>
+                        <exclude>**/suite/**/*.java</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraModule.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraModule.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraModule.java
new file mode 100644
index 0000000..6c22f05
--- /dev/null
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraModule.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * 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.mpt.managesieve.cassandra;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import org.apache.james.mpt.host.ManageSieveHostSystem;
+import org.apache.james.mpt.managesieve.cassandra.host.CassandraHostSystem;
+
+public class CassandraModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+
+    }
+
+    @Provides
+    @Singleton
+    public ManageSieveHostSystem provideHostSystem() throws Exception {
+        return new CassandraHostSystem();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/ManageSieveCassandraTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/ManageSieveCassandraTest.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/ManageSieveCassandraTest.java
new file mode 100644
index 0000000..f41af26
--- /dev/null
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/ManageSieveCassandraTest.java
@@ -0,0 +1,60 @@
+/****************************************************************
+ * 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.mpt.managesieve.cassandra;
+
+import org.apache.james.mpt.testsuite.AuthenticateTest;
+import org.apache.james.mpt.testsuite.CapabilityTest;
+import org.apache.james.mpt.testsuite.CheckScriptTest;
+import org.apache.james.mpt.testsuite.DeleteScriptTest;
+import org.apache.james.mpt.testsuite.GetScriptTest;
+import org.apache.james.mpt.testsuite.HaveSpaceTest;
+import org.apache.james.mpt.testsuite.ListScriptsTest;
+import org.apache.james.mpt.testsuite.LogoutTest;
+import org.apache.james.mpt.testsuite.NoopTest;
+import org.apache.james.mpt.testsuite.PutScriptTest;
+import org.apache.james.mpt.testsuite.RenameScriptTest;
+import org.apache.james.mpt.testsuite.SetActiveTest;
+import org.apache.james.mpt.testsuite.StartTlsTest;
+import org.apache.james.mpt.testsuite.UnauthenticatedTest;
+import org.apache.onami.test.OnamiSuite;
+import org.apache.onami.test.annotation.GuiceModules;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@GuiceModules({ CassandraModule.class })
+@RunWith(OnamiSuite.class)
+@Suite.SuiteClasses({
+    NoopTest.class,
+    UnauthenticatedTest.class,
+    LogoutTest.class,
+    AuthenticateTest.class,
+    StartTlsTest.class,
+    CapabilityTest.class,
+    HaveSpaceTest.class,
+    PutScriptTest.class,
+    SetActiveTest.class,
+    GetScriptTest.class,
+    DeleteScriptTest.class,
+    RenameScriptTest.class,
+    CheckScriptTest.class,
+    ListScriptsTest.class
+})
+public class ManageSieveCassandraTest {
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
new file mode 100644
index 0000000..4f317e8
--- /dev/null
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
@@ -0,0 +1,59 @@
+/****************************************************************
+ * 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.mpt.managesieve.cassandra.host;
+
+import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.mpt.host.JamesManageSieveHostSystem;
+import org.apache.james.sieve.cassandra.CassandraSieveDAO;
+import org.apache.james.sieve.cassandra.CassandraSieveRepository;
+import org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule;
+import org.apache.james.sieverepository.api.SieveRepository;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.cassandra.CassandraUsersRepository;
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.user.cassandra.CassandraUsersRepositoryModule;
+
+public class CassandraHostSystem extends JamesManageSieveHostSystem {
+    private static CassandraCluster CASSANDRA_CLUSTER = CassandraCluster.create(new CassandraModuleComposite(
+        new CassandraSieveRepositoryModule(),
+        new CassandraUsersRepositoryModule()));
+
+    public CassandraHostSystem() throws Exception {
+        super(createUsersRepository(), createSieveRepository());
+    }
+
+    protected static SieveRepository createSieveRepository() throws Exception {
+        return new CassandraSieveRepository(new CassandraSieveDAO(CASSANDRA_CLUSTER.getConf()));
+    }
+
+    protected static UsersRepository createUsersRepository() {
+        CassandraUsersRepository cassandraUsersRepository = new CassandraUsersRepository();
+        cassandraUsersRepository.setSession(CASSANDRA_CLUSTER.getConf());
+        cassandraUsersRepository.setEnableVirtualHosting(false);
+        return cassandraUsersRepository;
+    }
+
+    @Override
+    protected void resetData() throws Exception {
+        CASSANDRA_CLUSTER.clearAllTables();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/mpt/impl/managesieve/file/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/file/pom.xml b/mpt/impl/managesieve/file/pom.xml
index 937df41..4fa2df9 100644
--- a/mpt/impl/managesieve/file/pom.xml
+++ b/mpt/impl/managesieve/file/pom.xml
@@ -35,7 +35,6 @@
         <dependency>
             <groupId>org.apache.james</groupId>
             <artifactId>apache-james-mpt-managesieve-core</artifactId>
-            <version>0.2-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.james</groupId>
@@ -45,7 +44,6 @@
         <dependency>
             <groupId>org.apache.james</groupId>
             <artifactId>james-server-data-memory</artifactId>
-            <version>${james.version}</version>
         </dependency>
     </dependencies>
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java b/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
index 2ed61f3..a6260bf 100644
--- a/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
+++ b/mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java
@@ -11,6 +11,7 @@ import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.mpt.host.JamesManageSieveHostSystem;
 import org.apache.james.sieverepository.api.SieveRepository;
 import org.apache.james.sieverepository.file.SieveFileRepository;
+import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.memory.MemoryUsersRepository;
 
 public class FileHostSystem extends JamesManageSieveHostSystem {

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/mpt/impl/managesieve/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/pom.xml b/mpt/impl/managesieve/pom.xml
index a802e5d..7c604a7 100644
--- a/mpt/impl/managesieve/pom.xml
+++ b/mpt/impl/managesieve/pom.xml
@@ -14,10 +14,81 @@
 
     <artifactId>apache-james-mpt-managesieve</artifactId>
     <packaging>pom</packaging>
+
     <modules>
         <module>core</module>
         <module>file</module>
+        <module>cassandra</module>
     </modules>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.james</groupId>
+                <artifactId>apache-james-mpt-managesieve-cassandra</artifactId>
+                <version>${project.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.james</groupId>
+                <artifactId>apache-james-mpt-managesieve-file</artifactId>
+                <version>${project.version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.james</groupId>
+                <artifactId>apache-james-mpt-managesieve-core</artifactId>
+                <version>0.2-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.james</groupId>
+                <artifactId>james-server-data-memory</artifactId>
+                <version>${james.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <profiles>
+        <profile>
+            <id>cassandra</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <includes>
+                                <include>**/cassandra/**/*.java</include>
+                            </includes>
+                            <excludes>
+                                <exclude>**/suite/*.java</exclude>
+                                <exclude>**/suite/**/*.java</exclude>
+                            </excludes>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>file</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <includes>
+                                <include>**/file/**/*.java</include>
+                            </includes>
+                            <excludes>
+                                <exclude>**/suite/*.java</exclude>
+                                <exclude>**/suite/**/*.java</exclude>
+                            </excludes>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/mpt/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/pom.xml b/mpt/pom.xml
index afc2fd6..fbe5819 100644
--- a/mpt/pom.xml
+++ b/mpt/pom.xml
@@ -251,6 +251,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.james</groupId>
+                <artifactId>james-server-data-cassandra</artifactId>
+                <version>${james.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.james</groupId>
                 <artifactId>james-server-dnsservice-api</artifactId>
                 <version>${james.version}</version>
             </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java
index a51fbfa..958dca9 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java
@@ -60,11 +60,6 @@ public class CassandraUsersRepository extends AbstractUsersRepository {
     public void setSession(Session session) {
         this.session = session;
     }
-
-    @Override
-    public boolean supportVirtualHosting() {
-        return true;
-    }
     
     @Override
     public User getUserByName(String name){
@@ -163,4 +158,9 @@ public class CassandraUsersRepository extends AbstractUsersRepository {
             throw new UsersRepositoryException("User with username " + username + " already exist!");
         }
     }
+
+    @Override
+    protected boolean getDefaultVirtualHostingValue() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a081bfd8/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
index b3988ab..3f57dba 100644
--- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
+++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
@@ -55,11 +55,15 @@ public abstract class AbstractUsersRepository implements UsersRepository, LogEna
      */
     public void configure(HierarchicalConfiguration configuration) throws ConfigurationException {
 
-        virtualHosting = configuration.getBoolean("enableVirtualHosting", false);
+        virtualHosting = configuration.getBoolean("enableVirtualHosting", getDefaultVirtualHostingValue());
 
         doConfigure(configuration);
     }
 
+    protected boolean getDefaultVirtualHostingValue() {
+        return false;
+    }
+
     protected void doConfigure(HierarchicalConfiguration config) throws ConfigurationException {
     }
 


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


[4/9] james-project git commit: JAMES-1617 CassandraSieveRepository should be a singleton

Posted by bt...@apache.org.
JAMES-1617 CassandraSieveRepository should be a singleton


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

Branch: refs/heads/master
Commit: 49b318080201a9e4a1a99851133fed88e5ad8df3
Parents: f054e2c
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Mar 15 11:40:59 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:13:35 2016 +0700

----------------------------------------------------------------------
 .../apache/james/modules/data/CassandraSieveRepositoryModule.java  | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/49b31808/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
----------------------------------------------------------------------
diff --git a/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java b/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
index ffce858..4ea5aa7 100644
--- a/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
+++ b/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
@@ -19,6 +19,7 @@
 package org.apache.james.modules.data;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Scopes;
 import com.google.inject.multibindings.Multibinder;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.sieve.cassandra.CassandraSieveRepository;
@@ -28,6 +29,7 @@ public class CassandraSieveRepositoryModule extends AbstractModule {
     
     @Override
     public void configure() {
+        bind(CassandraSieveRepository.class).in(Scopes.SINGLETON);
         bind(SieveRepository.class).to(CassandraSieveRepository.class);
         Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
         cassandraDataDefinitions.addBinding().to(org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule.class);


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


[8/9] james-project git commit: JAMES-1617 Cassandra Guice project should use CassandraSieveRepository

Posted by bt...@apache.org.
JAMES-1617 Cassandra Guice project should use CassandraSieveRepository


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

Branch: refs/heads/master
Commit: a37c0c3466568ee8e0b64b2780b709168f09c5c6
Parents: a081bfd
Author: Benoit Tellier <bt...@apache.org>
Authored: Wed Feb 17 14:21:52 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:13:35 2016 +0700

----------------------------------------------------------------------
 .../data/CassandraSieveRepositoryModule.java    | 36 +++++++++++++++++++
 .../apache/james/CassandraJamesServerMain.java  |  2 ++
 .../data/CassandraSieveRepositoryModule.java    | 38 ++++++++++++++++++++
 .../james/modules/server/SieveModule.java       |  1 -
 .../james/modules/data/MemoryDataModule.java    |  6 ++++
 5 files changed, 82 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a37c0c34/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
----------------------------------------------------------------------
diff --git a/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java b/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
new file mode 100644
index 0000000..ffce858
--- /dev/null
+++ b/server/container/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
@@ -0,0 +1,36 @@
+/****************************************************************
+ * 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.modules.data;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.sieve.cassandra.CassandraSieveRepository;
+import org.apache.james.sieverepository.api.SieveRepository;
+
+public class CassandraSieveRepositoryModule extends AbstractModule {
+    
+    @Override
+    public void configure() {
+        bind(SieveRepository.class).to(CassandraSieveRepository.class);
+        Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
+        cassandraDataDefinitions.addBinding().to(org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule.class);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a37c0c34/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index 7057e7c..e5f3bd2 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -22,6 +22,7 @@ package org.apache.james;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.modules.data.CassandraDomainListModule;
 import org.apache.james.modules.data.CassandraRecipientRewriteTableModule;
+import org.apache.james.modules.data.CassandraSieveRepositoryModule;
 import org.apache.james.modules.data.CassandraUsersRepositoryModule;
 import org.apache.james.modules.mailbox.CassandraMailboxModule;
 import org.apache.james.modules.mailbox.CassandraSessionModule;
@@ -41,6 +42,7 @@ public class CassandraJamesServerMain {
         new CassandraUsersRepositoryModule(),
         new CassandraDomainListModule(),
         new CassandraRecipientRewriteTableModule(),
+        new CassandraSieveRepositoryModule(),
         new CassandraMailboxModule(),
         new CassandraSessionModule(),
         new ElasticSearchMailboxModule(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/a37c0c34/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
new file mode 100644
index 0000000..036aa99
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java
@@ -0,0 +1,38 @@
+/****************************************************************
+ * 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.modules.data;
+
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.sieve.cassandra.CassandraSieveRepository;
+import org.apache.james.sieverepository.api.SieveRepository;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+
+public class CassandraSieveRepositoryModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+        bind(SieveRepository.class).to(CassandraSieveRepository.class);
+
+        Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
+        cassandraDataDefinitions.addBinding().to(org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a37c0c34/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/SieveModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/SieveModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/SieveModule.java
index 229b479..8777a25 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/SieveModule.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/SieveModule.java
@@ -31,7 +31,6 @@ public class SieveModule extends AbstractModule {
     @Override
     protected void configure() {
         bind(SieveParser.class).to(Parser.class);
-        bind(SieveRepository.class).to(SieveFileRepository.class);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a37c0c34/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
index ca11b1f..9663255 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
@@ -23,6 +23,8 @@ import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.memory.MemoryDomainList;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.memory.MemoryRecipientRewriteTable;
+import org.apache.james.sieverepository.api.SieveRepository;
+import org.apache.james.sieverepository.file.SieveFileRepository;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.memory.MemoryUsersRepository;
 import org.apache.james.utils.ConfigurationPerformer;
@@ -50,6 +52,10 @@ public class MemoryDataModule extends AbstractModule {
 
         bind(MemoryUsersRepository.class).toInstance(MemoryUsersRepository.withVirtualHosting());
         bind(UsersRepository.class).to(MemoryUsersRepository.class);
+
+        bind(SieveFileRepository.class).in(Scopes.SINGLETON);
+        bind(SieveRepository.class).to(SieveFileRepository.class);
+
         Multibinder.newSetBinder(binder(), ConfigurationPerformer.class).addBinding().to(MemoryDataConfigurationPerformer.class);
     }
 


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


[2/9] james-project git commit: JAMES-1617 Cassandra Domain list tables should be contained in the appropriate package

Posted by bt...@apache.org.
JAMES-1617 Cassandra Domain list tables should be contained in the appropriate package


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

Branch: refs/heads/master
Commit: f657ad709c252775a74e40a9ca37397fc7418cd1
Parents: d1d5712
Author: Benoit Tellier <bt...@apache.org>
Authored: Wed Feb 17 14:30:36 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Thu Apr 7 09:07:31 2016 +0700

----------------------------------------------------------------------
 .../cassandra/CassandraDomainList.java          |  2 +-
 .../cassandra/CassandraDomainListModule.java    |  2 +-
 .../cassandra/tables/CassandraDomainsTable.java | 26 ++++++++++++++++++++
 .../james/tables/CassandraDomainsTable.java     | 26 --------------------
 4 files changed, 28 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f657ad70/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
index 233868e..6114453 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
@@ -34,7 +34,7 @@ import org.apache.james.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.domainlist.lib.AbstractDomainList;
-import org.apache.james.tables.CassandraDomainsTable;
+import org.apache.james.domainlist.cassandra.tables.CassandraDomainsTable;
 
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Session;

http://git-wip-us.apache.org/repos/asf/james-project/blob/f657ad70/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java
index e709e27..181c5ba 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java
@@ -27,7 +27,7 @@ import org.apache.james.backends.cassandra.components.CassandraIndex;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.components.CassandraTable;
 import org.apache.james.backends.cassandra.components.CassandraType;
-import org.apache.james.tables.CassandraDomainsTable;
+import org.apache.james.domainlist.cassandra.tables.CassandraDomainsTable;
 
 import com.datastax.driver.core.schemabuilder.SchemaBuilder;
 import com.google.common.collect.ImmutableList;

http://git-wip-us.apache.org/repos/asf/james-project/blob/f657ad70/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java
new file mode 100644
index 0000000..4513467
--- /dev/null
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java
@@ -0,0 +1,26 @@
+/****************************************************************
+ * 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.domainlist.cassandra.tables;
+
+public interface CassandraDomainsTable {
+    String TABLE_NAME = "domains";
+
+    String DOMAIN = "domain";
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f657ad70/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java
----------------------------------------------------------------------
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java b/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java
deleted file mode 100644
index 2e93d91..0000000
--- a/server/data/data-cassandra/src/main/java/org/apache/james/tables/CassandraDomainsTable.java
+++ /dev/null
@@ -1,26 +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.tables;
-
-public interface CassandraDomainsTable {
-    String TABLE_NAME = "domains";
-
-    String DOMAIN = "domain";
-}


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