Author: btellier
Date: Thu Dec 17 14:51:18 2015
New Revision: 1720561

URL: http://svn.apache.org/viewvc?rev=1720561&view=rev
Log:
PROTOCOLS-68 Clean ManageSieve code

Added:
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/RoleTest.java
Removed:
    
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/mock/
    
james/project/trunk/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/MockMail.java
    
james/project/trunk/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/MockMailetConfig.java
    
james/project/trunk/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/MockMailetContext.java
Modified:
    
james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java
    
james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
    james/project/trunk/protocols/managesieve/pom.xml
    
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java
    
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
    
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java
    
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java
    james/project/trunk/protocols/pom.xml
    
james/project/trunk/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
    
james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java
    
james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
    
james/project/trunk/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
    
james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
    
james/project/trunk/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java

Modified: 
james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java
 (original)
+++ 
james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMail.java
 Thu Dec 17 14:51:18 2015
@@ -28,6 +28,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 
 import javax.mail.MessagingException;
+import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.mailet.Mail;
@@ -112,6 +113,13 @@ public class FakeMail implements Mail {
 
     public void setMessage(MimeMessage message) {
         this.msg = message;
+        try {
+            if (message != null && message.getSender() != null) {
+                this.sender = new MailAddress((InternetAddress) 
message.getSender());
+            }
+        } catch (MessagingException e) {
+            throw new RuntimeException("Exception caught", e);
+        }
     }
 
     public void setState(String state) {

Modified: 
james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
 (original)
+++ 
james/project/trunk/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
 Thu Dec 17 14:51:18 2015
@@ -38,6 +38,7 @@ import java.util.List;
 public class FakeMailContext implements MailetContext {
     
     HashMap<String, Object> attributes = new HashMap<String, Object>();
+    private MimeMessage sentMessage;
 
     public void bounce(Mail mail, String message) throws MessagingException {
         // trivial implementation
@@ -79,7 +80,7 @@ public class FakeMailContext implements
     }
 
     public boolean isLocalServer(String serverName) {
-        return false;  // trivial implementation
+        return serverName.equals("localhost");  // trivial implementation
     }
 
     /**
@@ -112,8 +113,8 @@ public class FakeMailContext implements
         // trivial implementation
     }
 
-    public void sendMail(MimeMessage msg) throws MessagingException {
-        throw new UnsupportedOperationException("MOCKed method");
+    public void sendMail(MimeMessage mimemessage) throws MessagingException {
+        sentMessage = mimemessage;
     }
 
     public void sendMail(MailAddress sender, Collection<MailAddress> 
recipients, MimeMessage msg) throws MessagingException {
@@ -159,4 +160,8 @@ public class FakeMailContext implements
     public List<String> dnsLookup(String name, RecordType type) throws 
TemporaryLookupException, LookupException {
         return null;   // trivial implementation
     }
+
+    public MimeMessage getSentMessage() {
+        return sentMessage;
+    }
 }

Modified: james/project/trunk/protocols/managesieve/pom.xml
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/pom.xml?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- james/project/trunk/protocols/managesieve/pom.xml (original)
+++ james/project/trunk/protocols/managesieve/pom.xml Thu Dec 17 14:51:18 2015
@@ -53,6 +53,17 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>${mockito-core.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 

Modified: 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java
 (original)
+++ 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java
 Thu Dec 17 14:51:18 2015
@@ -20,31 +20,10 @@
 
 package org.apache.james.managesieve.api;
 
-/**
- * <code>Session</code>
- */
 public interface Session {
-    
-    public interface UserListener
-    {
-        abstract public void notifyChange(String user);
-    }
-    
-    abstract public String getUser();
-    
-    abstract public void addUserListener(UserListener listener);
-    
-    abstract public void removeUserListener(UserListener listener);
-    
-    public interface AuthenticationListener
-    {
-        abstract public void notifyChange(boolean isAuthenticated);
-    }
-    
-    abstract public boolean isAuthenticated();
-    
-    abstract public void addAuthenticationListener(AuthenticationListener 
listener);
-    
-    abstract public void removeAuthenticationListener(AuthenticationListener 
listener);
+
+    boolean isAuthenticated();
+
+    String getUser();
 
 }

Modified: 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
 (original)
+++ 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
 Thu Dec 17 14:51:18 2015
@@ -20,11 +20,11 @@
 
 package org.apache.james.managesieve.core;
 
+import com.google.common.base.Throwables;
 import org.apache.commons.io.IOUtils;
 import org.apache.james.managesieve.api.AuthenticationRequiredException;
 import org.apache.james.managesieve.api.ManageSieveRuntimeException;
 import org.apache.james.managesieve.api.Session;
-import org.apache.james.managesieve.api.Session.UserListener;
 import org.apache.james.managesieve.api.SieveParser;
 import org.apache.james.managesieve.api.SyntaxException;
 import org.apache.james.managesieve.api.commands.CoreCommands;
@@ -37,160 +37,103 @@ import org.apache.james.sieverepository.
 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 org.apache.james.user.api.UsersRepositoryException;
 
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-/**
- * <code>CoreProcessor</code>
- */
 public class CoreProcessor implements CoreCommands {
     
     public static final String IMPLEMENTATION_DESCRIPTION = "Apache 
ManageSieve v1.0";
     public static final String MANAGE_SIEVE_VERSION = "1.0";
     
-    private SieveRepository _repository = null;
-    private Session _session = null;
-    private SieveParser _parser = null;
-
-    /**
-     * Creates a new instance of CoreProcessor.
-     *
-     */
-    private CoreProcessor() {
-        super();
-    }
-    
-    /**
-     * Creates a new instance of CoreProcessor.
-     *
-     */
-    public CoreProcessor(Session session, SieveRepository repository, 
SieveParser parser) {
-        this();
-        _session = session;
-        _repository = repository;
-        _parser = parser;
-
-        // Ensure the session user is defined in the repository
-        _session.addUserListener(new UserListener() {
-
-            public void notifyChange(String user) {
-                ensureUser(user);
-            }
-        });
+    private final SieveRepository sieveRepository;
+    private final UsersRepository usersRepository;
+    private final Session session;
+    private final SieveParser parser;
+
+    public CoreProcessor(Session session, SieveRepository repository, 
UsersRepository usersRepository, SieveParser parser) {
+        this.session = session;
+        this.sieveRepository = repository;
+        this.usersRepository = usersRepository;
+        this.parser = parser;
+        ensureUser();
     }
 
-    /**
-     * @see org.apache.james.managesieve.api.commands.Capability#capability()
-     */
     public Map<Capabilities, String> capability() {
         Map<Capabilities, String> capabilities = new HashMap<Capabilities, 
String>();
         capabilities.put(Capabilities.IMPLEMENTATION, 
IMPLEMENTATION_DESCRIPTION);
         capabilities.put(Capabilities.VERSION, MANAGE_SIEVE_VERSION);
         StringBuilder builder = new StringBuilder();
-        for (String extension : _parser.getExtensions())
-        {
+        for (String extension : parser.getExtensions()) {
             builder.append(extension).append(' ');
         }
         String extensions = builder.toString().trim();
-        if (!extensions.isEmpty())
-        {
+        if (!extensions.isEmpty()) {
             capabilities.put(Capabilities.SIEVE, extensions);
         }
-        if (isAuthenticated())
-        {
+        if (isAuthenticated()) {
             capabilities.put(Capabilities.OWNER, getUser());
         }
         capabilities.put(Capabilities.GETACTIVE, null);
         return capabilities;
     }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.commands.CheckScript#checkScript(String)
-     */
-    public List<String> checkScript(String content) throws 
AuthenticationRequiredException,
-            SyntaxException {
+    public List<String> checkScript(String content) throws 
AuthenticationRequiredException, SyntaxException {
         authenticationCheck();
-        return _parser.parse(content);
+        return parser.parse(content);
     }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.commands.DeleteScript#deleteScript(String)
-     */
-    public void deleteScript(String name) throws 
AuthenticationRequiredException,
-            ScriptNotFoundException, IsActiveException {
+    public void deleteScript(String name) throws 
AuthenticationRequiredException, ScriptNotFoundException, IsActiveException {
         authenticationCheck();
         try {
-            _repository.deleteScript(getUser(), name);
+            sieveRepository.deleteScript(getUser(), name);
         } catch (StorageException ex) {
             throw new ManageSieveRuntimeException(ex);
         } catch (UserNotFoundException ex) {
-            // Should not happen as the UserListener should ensure the session 
user is defined in the repository
             throw new ManageSieveRuntimeException(ex);
         }
     }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.commands.GetScript#getScript(String)
-     */
-    public String getScript(String name) throws 
AuthenticationRequiredException,
-        ScriptNotFoundException, StorageException {
+    public String getScript(String name) throws 
AuthenticationRequiredException, ScriptNotFoundException, StorageException {
         authenticationCheck();
-        String script;
         try {
-            script = IOUtils.toString(_repository.getScript(getUser(), name), 
"UTF-8");
+            return IOUtils.toString(sieveRepository.getScript(getUser(), 
name));
         } catch (UserNotFoundException ex) {
-            // Should not happen as the UserListener should ensure the session 
user is defined in the repository
             throw new ManageSieveRuntimeException(ex);
         } catch (IOException ex) {
             // Unable to read script InputStream
             throw new ManageSieveRuntimeException(ex);
         }
-        return script;
     }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.commands.HaveSpace#haveSpace(String, long)
-     */
-    public void haveSpace(String name, long size) throws 
AuthenticationRequiredException,
-            QuotaExceededException {
+    public void haveSpace(String name, long size) throws 
AuthenticationRequiredException, QuotaExceededException {
         authenticationCheck();
         try {
-            _repository.haveSpace(getUser(), name, size);
+            sieveRepository.haveSpace(getUser(), name, size);
         } catch (SieveRepositoryException ex) {
-            // Should not happen as the UserListener should ensure the session 
user is defined in the repository
             throw new ManageSieveRuntimeException(ex);
         }
     }
 
-    /**
-     * @see org.apache.james.managesieve.api.commands.ListScripts#listScripts()
-     */
     public List<ScriptSummary> listScripts() throws 
AuthenticationRequiredException {
         authenticationCheck();
-        List<ScriptSummary> summaries;
         try {
-            summaries = _repository.listScripts(getUser());
+            return sieveRepository.listScripts(getUser());
         } catch (SieveRepositoryException ex) {
-            // Should not happen as the UserListener should ensure the session 
user is defined in the repository
             throw new ManageSieveRuntimeException(ex);
         }
-        return summaries;
     }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.commands.PutScript#putScript(String, String)
-     */
-    public List<String> putScript(String name, String content)
-            throws AuthenticationRequiredException, SyntaxException, 
QuotaExceededException {
+    public List<String> putScript(String name, String content) throws 
AuthenticationRequiredException, SyntaxException, QuotaExceededException {
         authenticationCheck();
-        List<String> warnings = _parser.parse(content);
+        List<String> warnings = parser.parse(content);
         try {
-            _repository.putScript(getUser(), name, content);
+            sieveRepository.putScript(getUser(), name, content);
         } catch (UserNotFoundException ex) {
-            // Should not happen as the UserListener should ensure the session 
user is defined in the repository
             throw new ManageSieveRuntimeException(ex);
         } catch (StorageException ex) {
             throw new ManageSieveRuntimeException(ex);
@@ -198,85 +141,61 @@ public class CoreProcessor implements Co
         return warnings;
     }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.commands.RenameScript#renameScript(String, 
String)
-     */
-    public void renameScript(String oldName, String newName)
-            throws AuthenticationRequiredException, ScriptNotFoundException,
-            DuplicateException {
+    public void renameScript(String oldName, String newName) throws 
AuthenticationRequiredException, ScriptNotFoundException, DuplicateException {
         authenticationCheck();
         try {
-            _repository.renameScript(getUser(), oldName, newName);
+            sieveRepository.renameScript(getUser(), oldName, newName);
         } catch (UserNotFoundException ex) {
-            // Should not happen as the UserListener should ensure the session 
user is defined in the repository
             throw new ManageSieveRuntimeException(ex);
         } catch (StorageException ex) {
             throw new ManageSieveRuntimeException(ex);
         }
     }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.commands.SetActive#setActive(String)
-     */
-    public void setActive(String name) throws AuthenticationRequiredException,
-            ScriptNotFoundException {
+    public void setActive(String name) throws AuthenticationRequiredException, 
ScriptNotFoundException {
         authenticationCheck();
         try {
-            _repository.setActive(getUser(), name);
+            sieveRepository.setActive(getUser(), name);
         } catch (UserNotFoundException ex) {
-            // Should not happen as the UserListener should ensure the session 
user is defined in the repository
             throw new ManageSieveRuntimeException(ex);
         } catch (StorageException ex) {
             throw new ManageSieveRuntimeException(ex);
         }
-    }   
-    
-    protected String getUser()
-    {
-        return _session.getUser();
     }
-    
-    protected void ensureUser(String user) {
+
+    public String getActive() throws AuthenticationRequiredException, 
ScriptNotFoundException, StorageException {
+        authenticationCheck();
         try {
-            if (!_repository.hasUser(user)) {
-                _repository.addUser(user);
-            }
-        } catch (SieveRepositoryException ex) {
+            return IOUtils.toString(sieveRepository.getActive(getUser()));
+        } catch (UserNotFoundException ex) {
             throw new ManageSieveRuntimeException(ex);
+        } catch (IOException e) {
+            throw new ManageSieveRuntimeException(e);
         }
     }
     
-    protected void authenticationCheck() throws AuthenticationRequiredException
-    {
-        if (!isAuthenticated())
-        {
-            throw new AuthenticationRequiredException();
-        }
+    protected String getUser() {
+        return session.getUser();
     }
 
-    protected boolean isAuthenticated()
-    {
-        return _session.isAuthenticated();
+    private void ensureUser() {
+        try {
+            if (usersRepository.contains(session.getUser())) {
+                throw new RuntimeException("User " + session.getUser() + " not 
found");
+            }
+        } catch (UsersRepositoryException e) {
+            Throwables.propagate(e);
+        }
     }
+    
+    protected void authenticationCheck() throws 
AuthenticationRequiredException {
+        if (!isAuthenticated()) {
+            throw new AuthenticationRequiredException();
 
-    /**
-     * @see org.apache.james.managesieve.api.commands.GetActive#getActive()
-     */
-    public String getActive() throws AuthenticationRequiredException, 
ScriptNotFoundException, StorageException {
-        authenticationCheck();
-        
-        String script;
-        try {
-            script = IOUtils.toString(_repository.getActive(getUser()), 
"UTF-8");
-        } catch (UserNotFoundException ex) {
-            // Should not happen as the UserListener should ensure the session
-            // user is defined in the repository
-            throw new ManageSieveRuntimeException(ex);
-        } catch (IOException ex) {
-            // Unable to read script InputStream
-            throw new ManageSieveRuntimeException(ex);
         }
-        return script;
     }
 
-}
+    protected boolean isAuthenticated() {
+        return session.isAuthenticated();
+    }
+}
\ No newline at end of file

Modified: 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java
 (original)
+++ 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java
 Thu Dec 17 14:51:18 2015
@@ -20,77 +20,29 @@
 
 package org.apache.james.managesieve.util;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.apache.james.managesieve.api.Session;
 
-/**
- * <code>SettableSession</code>
- */
 public class SettableSession implements Session {
 
     String _user = null;
     boolean _isAuthenticated = false;
-    List<UserListener> _userListeners = new ArrayList<UserListener>();
-    List<AuthenticationListener> _authenticationListeners = new 
ArrayList<AuthenticationListener>(); 
-    
-    /**
-     * @see 
org.apache.james.managesieve.api.Session#addAuthenticationListener(org.apache.james.managesieve.api.Session.AuthenticationListener)
-     */
-    public void addAuthenticationListener(AuthenticationListener listener) {
-        _authenticationListeners.add(listener);
-    }
-
-    /**
-     * @see 
org.apache.james.managesieve.api.Session#addUserListener(org.apache.james.managesieve.api.Session.UserListener)
-     */
-    public void addUserListener(UserListener listener) {
-        _userListeners.add(listener);            
-    }
 
-    /**
-     * @see org.apache.james.managesieve.api.Session#getUser()
-     */
     public String getUser() {
         return _user;
     }
 
-    /**
-     * @see org.apache.james.managesieve.api.Session#isAuthenticated()
-     */
     public boolean isAuthenticated() {
         return _isAuthenticated;
     }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.Session#removeAuthenticationListener(org.apache.james.managesieve.api.Session.AuthenticationListener)
-     */
-    public void removeAuthenticationListener(AuthenticationListener listener) {
-        _authenticationListeners.remove(listener);
-    }
 
-    /**
-     * @see 
org.apache.james.managesieve.api.Session#removeUserListener(org.apache.james.managesieve.api.Session.UserListener)
-     */
-    public void removeUserListener(UserListener listener) {
-        _userListeners.remove(listener);       
-    }
-    
     public void setAuthentication(boolean isAuthenticated) {
         _isAuthenticated = isAuthenticated;
-        for(AuthenticationListener listener : _authenticationListeners)
-        {                  
-            listener.notifyChange(isAuthenticated);
-        }                
+
     }
 
     public void setUser(String user) {
         _user = user;
-        for(UserListener listener : _userListeners)
-        {                  
-            listener.notifyChange(user);
-        }
     }
 
 }

Modified: 
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java
 (original)
+++ 
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java
 Thu Dec 17 14:51:18 2015
@@ -20,346 +20,279 @@
 
 package org.apache.james.managesieve.core;
 
-import org.apache.commons.io.IOUtils;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.google.common.collect.Lists;
 import org.apache.james.managesieve.api.AuthenticationRequiredException;
+import org.apache.james.managesieve.api.SieveParser;
 import org.apache.james.managesieve.api.SyntaxException;
 import org.apache.james.managesieve.api.commands.Capability.Capabilities;
-import org.apache.james.managesieve.mock.MockSession;
-import org.apache.james.managesieve.mock.MockSieveParser;
-import org.apache.james.managesieve.mock.MockSieveRepository;
+import org.apache.james.managesieve.util.SettableSession;
+import org.apache.james.sieverepository.api.ScriptSummary;
+import org.apache.james.sieverepository.api.SieveRepository;
 import org.apache.james.sieverepository.api.exception.IsActiveException;
-import org.apache.james.sieverepository.api.exception.QuotaExceededException;
 import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
-import org.apache.james.sieverepository.api.ScriptSummary;
-import org.apache.james.sieverepository.api.exception.StorageException;
-import org.apache.james.sieverepository.api.exception.UserNotFoundException;
+import org.apache.james.user.api.UsersRepository;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
-import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * <code>CoreProcessorTestCase</code>
- */
 public class CoreProcessorTestCase {
 
-    private MockSession session;
-    private MockSieveParser parser;
-    private MockSieveRepository repository;
+    public static final String USER = "test";
+    public static final String SCRIPT = "script";
+    public static final String CONTENT = "content";
+    public static final String OLDNAME = "oldname";
+    public static final String NEW_NAME = "newName";
+    private SettableSession session;
+    private SieveParser sieveParser;
+    private SieveRepository sieveRepository;
+
     private CoreProcessor core;
 
     @Before
     public void setUp() throws Exception {
-        session = new MockSession();
-        parser = new MockSieveParser();
-        repository = new MockSieveRepository();
-        core = new CoreProcessor(session, repository, parser);
+        session = new SettableSession();
+        sieveParser = mock(SieveParser.class);
+        sieveRepository = mock(SieveRepository.class);
+        UsersRepository usersRepository = mock(UsersRepository.class);
+        core = new CoreProcessor(session, sieveRepository, usersRepository, 
sieveParser);
+        when(usersRepository.contains(USER)).thenAnswer(new Answer<Boolean>() {
+            public Boolean answer(InvocationOnMock invocationOnMock) throws 
Throwable {
+                return true;
+            }
+        });
     }
 
     @Test
-    public final void testCapability() {
-        // Unauthenticated
+    public final void testCapabilityUnauthenticated() {
         session.setAuthentication(false);
-        parser.setExtensions(Arrays.asList("a", "b", "c"));
-        Map<Capabilities, String> capabilities = core.capability();
-        assertEquals(CoreProcessor.IMPLEMENTATION_DESCRIPTION, 
capabilities.get(Capabilities.IMPLEMENTATION));
-        assertEquals(CoreProcessor.MANAGE_SIEVE_VERSION, 
capabilities.get(Capabilities.VERSION));
-        assertEquals("a b c", capabilities.get(Capabilities.SIEVE));
-        assertFalse(capabilities.containsKey(Capabilities.OWNER));
-        assertTrue(capabilities.containsKey(Capabilities.GETACTIVE));
-
-        // Authenticated
-        session.setAuthentication(true);
-        parser.setExtensions(Arrays.asList("a", "b", "c"));
-        session.setUser("test");
-        capabilities = core.capability();
-        assertEquals(CoreProcessor.IMPLEMENTATION_DESCRIPTION, 
capabilities.get(Capabilities.IMPLEMENTATION));
-        assertEquals(CoreProcessor.MANAGE_SIEVE_VERSION, 
capabilities.get(Capabilities.VERSION));
-        assertEquals("a b c", capabilities.get(Capabilities.SIEVE));
-        assertEquals("test", capabilities.get(Capabilities.OWNER));
-        assertTrue(capabilities.containsKey(Capabilities.GETACTIVE));
+        when(sieveParser.getExtensions()).thenAnswer(new 
Answer<List<String>>() {
+            public List<String> answer(InvocationOnMock invocationOnMock) 
throws Throwable {
+                return Lists.newArrayList("a", "b", "c");
+            }
+        });
+        
assertThat(core.capability()).containsEntry(Capabilities.IMPLEMENTATION, 
CoreProcessor.IMPLEMENTATION_DESCRIPTION)
+            .containsEntry(Capabilities.VERSION, 
CoreProcessor.MANAGE_SIEVE_VERSION)
+            .containsEntry(Capabilities.SIEVE, "a b c")
+            .containsKey(Capabilities.GETACTIVE);
     }
 
     @Test
-    public final void testCheckScript() throws 
AuthenticationRequiredException, SyntaxException {
-        // Unauthorised
-        boolean success = false;
+    public final void testCapabilityAuthenticated() {
+        session.setAuthentication(true);
+        when(sieveParser.getExtensions()).thenAnswer(new 
Answer<List<String>>() {
+            public List<String> answer(InvocationOnMock invocationOnMock) 
throws Throwable {
+                return Lists.newArrayList("a", "b", "c");
+            }
+        });
+        session.setUser(USER);
+        
assertThat(core.capability()).containsEntry(Capabilities.IMPLEMENTATION, 
CoreProcessor.IMPLEMENTATION_DESCRIPTION)
+            .containsEntry(Capabilities.VERSION, 
CoreProcessor.MANAGE_SIEVE_VERSION)
+            .containsEntry(Capabilities.SIEVE, "a b c")
+            .containsEntry(Capabilities.OWNER, USER)
+            .containsKey(Capabilities.GETACTIVE);
+    }
+
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testCheckScriptUnauthorised() throws 
AuthenticationRequiredException, SyntaxException {
         session.setAuthentication(false);
-        try {
-            core.checkScript("warning");
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
-
-        // Authorised
-        session.setAuthentication(true);
-        session.setUser("test");
-        List<String> warnings = core.checkScript("warning");
-        assertEquals(2, warnings.size());
-        assertEquals("warning1", warnings.get(0));
-        assertEquals("warning2", warnings.get(1));
-
-        // Syntax
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        try {
-            core.checkScript("SyntaxException");
-        } catch (SyntaxException ex) {
-            success = true;
-        }
-        assertTrue("Expected SyntaxException", success);
+        core.checkScript("warning");
     }
 
     @Test
-    public final void testDeleteScript() throws Exception {
-        // Unauthorised
-        boolean success = false;
+    public final void testCheckScript() throws Exception {
+        session.setAuthentication(true);
+        session.setUser(USER);
+        when(sieveParser.parse(CONTENT)).thenAnswer(new Answer<List<String>>() 
{
+            public List<String> answer(InvocationOnMock invocationOnMock) 
throws Throwable {
+                return Lists.newArrayList("warning1", "warning2");
+            }
+        });
+        assertThat(core.checkScript(CONTENT)).containsOnly("warning1", 
"warning2");
+    }
+
+    @Test(expected = SyntaxException.class)
+    public final void testCheckScriptSyntaxException() throws Exception {
+        doThrow(new SyntaxException("Syntax 
exception")).when(sieveParser).parse(CONTENT);
+        session.setAuthentication(true);
+        session.setUser(USER);
+        core.checkScript(CONTENT);
+    }
+
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testDeleteScriptUnauthorised() throws Exception {
         session.setAuthentication(false);
-        try {
-            core.deleteScript("script");
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
-
-        // Authorised - non-existent script
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        try {
-            core.deleteScript("script");
-        } catch (ScriptNotFoundException ex) {
-            success = true;
-        }
-        assertTrue("Expected ScriptNotFoundException", success);
-
-        // Authorised - existent script
-        session.setAuthentication(true);
-        session.setUser("test");
-        repository.putScript("test", "script", "content");
-        core.deleteScript("script");
-        success = false;
-        try {
-            repository.getScript("test", "script");
-        } catch (ScriptNotFoundException ex) {
-            success = true;
-        }
-        assertTrue("Expected ScriptNotFoundException", success);
-
-        // Authorised - active script
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        repository.putScript("test", "script", "content");
-        repository.setActive("test", "script");
-        try {
-            core.deleteScript("script");
-        } catch (IsActiveException ex) {
-            success = true;
-        }
-        assertTrue("Expected IsActiveException", success);
+        core.deleteScript(SCRIPT);
     }
 
+    @Test(expected = ScriptNotFoundException.class)
+    public final void testDeleteScriptNonExistent() throws Exception {
+        doThrow(new 
ScriptNotFoundException()).when(sieveRepository).deleteScript(USER, SCRIPT);
+        session.setAuthentication(true);
+        session.setUser(USER);
+        core.deleteScript(SCRIPT);
+    }
+
+
     @Test
-    public final void testGetScript() throws ScriptNotFoundException, 
AuthenticationRequiredException, UserNotFoundException, StorageException, 
QuotaExceededException {
-        // Unauthorised
-        boolean success = false;
+    public final void testDeleteScriptExistent() throws Exception {
+        session.setAuthentication(true);
+        session.setUser(USER);
+        sieveRepository.putScript(USER, SCRIPT, CONTENT);
+        core.deleteScript(SCRIPT);
+        verify(sieveRepository).deleteScript(USER, SCRIPT);
+    }
+
+    @Test(expected = IsActiveException.class)
+    public final void testDeleteScriptActive() throws Exception {
+        doThrow(new 
IsActiveException()).when(sieveRepository).deleteScript(USER, SCRIPT);
+        session.setAuthentication(true);
+        session.setUser(USER);
+        core.deleteScript(SCRIPT);
+    }
+
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testGetUnauthorisedScript() throws Exception {
         session.setAuthentication(false);
-        try {
-            core.getScript("script");
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
-
-        // Authorised - non-existent script
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        try {
-            core.getScript("script");
-            System.out.println("yop yop");
-        } catch (ScriptNotFoundException ex) {
-            success = true;
-            ex.printStackTrace();
-        } catch (Exception e) {
-            System.out.println("Euh ... ");
-            e.printStackTrace();
-            System.out.println("Yolo");
-        }
-        assertTrue("Expected ScriptNotFoundException", success);
-
-        // Authorised - existent script
-        session.setAuthentication(true);
-        session.setUser("test");
-        repository.putScript("test", "script", "content");
-        core.getScript("script");
+        core.getScript(SCRIPT);
+    }
+
+    @Test(expected = ScriptNotFoundException.class)
+    public final void testGetNonExistentScript() throws Exception {
+        doThrow(new 
ScriptNotFoundException()).when(sieveRepository).getScript(USER, SCRIPT);
+        session.setAuthentication(true);
+        session.setUser(USER);
+        core.getScript(SCRIPT);
     }
 
     @Test
-    public final void testHaveSpace() throws Exception {
-        // Unauthorised
-        boolean success = false;
+    public final void testGetScript() throws Exception {
+        session.setAuthentication(true);
+        session.setUser(USER);
+        when(sieveRepository.getScript(USER, SCRIPT)).thenAnswer(new 
Answer<String>() {
+            public String answer(InvocationOnMock invocationOnMock) throws 
Throwable {
+                return CONTENT;
+            }
+        });
+        assertThat(core.getScript(SCRIPT)).isEqualTo(CONTENT);
+    }
+
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testHaveSpaceUnauthorised() throws Exception {
         session.setAuthentication(false);
-        try {
-            core.haveSpace("script", Long.MAX_VALUE);
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
+        core.haveSpace(SCRIPT, Long.MAX_VALUE);
+    }
 
-        // Authorised - existent script
+    @Test
+    public final void testHaveSpace() throws Exception {
         session.setAuthentication(true);
-        session.setUser("test");
-        core.haveSpace("script", Long.MAX_VALUE);
+        session.setUser(USER);
+        core.haveSpace(SCRIPT, Long.MAX_VALUE);
+        verify(sieveRepository).haveSpace(USER, SCRIPT, Long.MAX_VALUE);
+    }
+
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testListScriptsUnauthorised() throws Exception {
+        session.setAuthentication(false);
+        core.listScripts();
     }
 
     @Test
     public final void testListScripts() throws Exception {
-        // Unauthorised
-        boolean success = false;
+        session.setAuthentication(true);
+        session.setUser(USER);
+        when(sieveRepository.listScripts(USER)).thenAnswer(new 
Answer<List<ScriptSummary>>() {
+            @Override
+            public List<ScriptSummary> answer(InvocationOnMock 
invocationOnMock) throws Throwable {
+                return Lists.newArrayList(new ScriptSummary(SCRIPT, false));
+            }
+        });
+        sieveRepository.putScript(USER, SCRIPT, CONTENT);
+        assertThat(core.listScripts()).containsOnly(new ScriptSummary(SCRIPT, 
false));
+    }
+
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testPutScriptUnauthorised() throws Exception {
         session.setAuthentication(false);
-        try {
-            core.listScripts();
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
+        core.putScript(SCRIPT, CONTENT);
+    }
 
-        // Authorised - non-existent script
-        success = false;
+    @Test
+    public final void testPutScriptAuthorized() throws Exception {
         session.setAuthentication(true);
-        session.setUser("test");
-        List<ScriptSummary> summaries = core.listScripts();
-        assertTrue(summaries.isEmpty());
+        session.setUser(USER);
+        core.putScript(SCRIPT, CONTENT);
+        verify(sieveRepository).putScript(USER, SCRIPT, CONTENT);
+    }
 
-        // Authorised - existent script
+    @Test(expected = SyntaxException.class)
+    public final void testPutScriptSyntaxException() throws Exception {
+        doThrow(new SyntaxException("Syntax 
exception")).when(sieveParser).parse(CONTENT);
         session.setAuthentication(true);
-        session.setUser("test");
-        repository.putScript("test", "script", "content");
-        summaries = core.listScripts();
-        assertEquals(1, summaries.size());
+        session.setUser(USER);
+        core.putScript(SCRIPT, CONTENT);
     }
 
-    @Test
-    public final void testPutScript() throws Exception {
-        // Unauthorised
-        boolean success = false;
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testRenameScriptUnauthorized() throws Exception {
         session.setAuthentication(false);
-        try {
-            core.putScript("script", "content");
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
-
-        // Authorised
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        core.putScript("script", "content");
-        assertEquals("content", IOUtils.toString(repository.getScript("test", 
"script")));
-
-        // Syntax
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        try {
-            core.putScript("script", "SyntaxException");
-        } catch (SyntaxException ex) {
-            success = true;
-        }
-        assertTrue("Expected SyntaxException", success);
+        core.renameScript(OLDNAME, NEW_NAME);
     }
 
     @Test
     public final void testRenameScript() throws Exception {
-        // Unauthorised
-        boolean success = false;
+        session.setAuthentication(true);
+        session.setUser(USER);
+        core.renameScript(OLDNAME, NEW_NAME);
+        verify(sieveRepository).renameScript(USER, OLDNAME, NEW_NAME);
+    }
+
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testSetActiveUnauthorised() throws Exception {
         session.setAuthentication(false);
-        try {
-            core.renameScript("oldName", "newName");
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
-
-        // Authorised
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        repository.putScript("test", "oldName", "content");
-        core.renameScript("oldName", "newName");
-        assertEquals("content", IOUtils.toString(repository.getScript("test", 
"oldName")));
+        core.setActive(SCRIPT);
     }
 
     @Test
     public final void testSetActive() throws Exception {
-        // Unauthorised
-        boolean success = false;
-        session.setAuthentication(false);
-        try {
-            core.setActive("script");
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
-
-        // Authorised
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        repository.putScript("test", "script", "content");
-        core.setActive("script");
-        assertEquals("content", 
IOUtils.toString(repository.getActive("test")));
+        session.setAuthentication(true);
+        session.setUser(USER);
+        core.setActive(SCRIPT);
+        verify(sieveRepository).setActive(USER, SCRIPT);
     }
 
-    @Test
-    public final void testGetActive() throws Exception {
-        // Unauthorised
-        boolean success = false;
+    @Test(expected = AuthenticationRequiredException.class)
+    public final void testGetUnauthorisedActive() throws Exception {
         session.setAuthentication(false);
-        try {
-            core.getActive();
-        } catch (AuthenticationRequiredException ex) {
-            success = true;
-        }
-        assertTrue("Expected AuthenticationRequiredException", success);
-
-        // Authorised - non-existent script
-        success = false;
-        session.setAuthentication(true);
-        session.setUser("test");
-        try {
-            core.getActive();
-        } catch (ScriptNotFoundException ex) {
-            success = true;
-        }
-        assertTrue("Expected ScriptNotFoundException", success);
-
-        // Authorised - existent script, inactive
-        session.setAuthentication(true);
-        session.setUser("test");
-        repository.putScript("test", "script", "content");
-        try {
-            core.getActive();
-        } catch (ScriptNotFoundException ex) {
-            success = true;
-        }
-        assertTrue("Expected ScriptNotFoundException", success);
+        core.getActive();
+    }
 
-        // Authorised - existent script, active
+    @Test(expected = ScriptNotFoundException.class)
+    public final void testGetNonExistentActive() throws Exception {
+        doThrow(new 
ScriptNotFoundException()).when(sieveRepository).getActive(USER);
         session.setAuthentication(true);
-        session.setUser("test");
-        repository.setActive("test", "script");
+        session.setUser(USER);
         core.getActive();
     }
+
+    @Test
+    public final void testGetActive() throws Exception {
+        session.setAuthentication(true);
+        session.setUser(USER);
+        sieveRepository.setActive(USER, SCRIPT);
+        when(sieveRepository.getActive(USER)).thenAnswer(new Answer<String>() {
+            public String answer(InvocationOnMock invocationOnMock) throws 
Throwable {
+                return CONTENT;
+            }
+        });
+        assertThat(core.getActive()).isEqualTo(CONTENT);
+    }
 }

Modified: james/project/trunk/protocols/pom.xml
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/pom.xml?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- james/project/trunk/protocols/pom.xml (original)
+++ james/project/trunk/protocols/pom.xml Thu Dec 17 14:51:18 2015
@@ -64,6 +64,7 @@
         <slf4j.version>1.6.3</slf4j.version>
         
<james-server-data-api.version>3.0.0-beta5-SNAPSHOT</james-server-data-api.version>
         <jsieve.version>0.6-SNAPSHOT</jsieve.version>
+        <mockito-core.version>1.9.0</mockito-core.version>
     </properties>
 
     <dependencyManagement>
@@ -244,6 +245,16 @@
                 <artifactId>geronimo-javamail_1.4_mail</artifactId>
                 <version>${geronimo-javamail.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.mockito</groupId>
+                <artifactId>mockito-core</artifactId>
+                <version>${mockito-core.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.assertj</groupId>
+                <artifactId>assertj-core</artifactId>
+                <version>1.7.1</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

Modified: 
james/project/trunk/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
 (original)
+++ 
james/project/trunk/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
 Thu Dec 17 14:51:18 2015
@@ -66,12 +66,6 @@ public interface SieveRepository {
     void deleteScript(String user, String name) throws UserNotFoundException, 
ScriptNotFoundException, IsActiveException, StorageException;
     
     void renameScript(String user, String oldName, String newName) throws 
UserNotFoundException, ScriptNotFoundException, DuplicateException, 
StorageException;
-    
-    boolean hasUser(String user) throws StorageException;
-    
-    void addUser(String user) throws DuplicateUserException, StorageException;
-    
-    void removeUser(String user) throws UserNotFoundException, 
StorageException;
 
     boolean hasQuota() throws StorageException;
     

Modified: 
james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java
 (original)
+++ 
james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveDefaultRepository.java
 Thu Dec 17 14:51:18 2015
@@ -109,21 +109,6 @@ public class SieveDefaultRepository impl
     }
 
     @Override
-    public boolean hasUser(String user) throws StorageException {
-        throw new StorageException("This implementation is deprecated and does 
not support user related operation. Please consider using a 
SieveFileRepository.");
-    }
-
-    @Override
-    public void addUser(String user) throws DuplicateUserException, 
StorageException {
-        throw new StorageException("This implementation is deprecated and does 
not support user related operation. Please consider using a 
SieveFileRepository.");
-    }
-
-    @Override
-    public void removeUser(String user) throws UserNotFoundException, 
StorageException {
-        throw new StorageException("This implementation is deprecated and does 
not support user related operation. Please consider using a 
SieveFileRepository.");
-    }
-
-    @Override
     public boolean hasQuota() throws StorageException {
         throw apologizeForQuotas();
     }

Modified: 
james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
 (original)
+++ 
james/project/trunk/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
 Thu Dec 17 14:51:18 2015
@@ -23,14 +23,13 @@ package org.apache.james.sieverepository
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.james.filesystem.api.FileSystem;
+import org.apache.james.sieverepository.api.ScriptSummary;
+import org.apache.james.sieverepository.api.SieveRepository;
 import org.apache.james.sieverepository.api.exception.DuplicateException;
-import org.apache.james.sieverepository.api.exception.DuplicateUserException;
 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.ScriptSummary;
-import org.apache.james.sieverepository.api.SieveRepository;
 import org.apache.james.sieverepository.api.exception.StorageException;
 import org.apache.james.sieverepository.api.exception.UserNotFoundException;
 
@@ -331,7 +330,7 @@ public class SieveFileRepository impleme
     protected File getUserDirectory(String user) throws UserNotFoundException, 
StorageException {
         File file = getUserDirectoryFile(user);
         if (!file.exists()) {
-            throw new UserNotFoundException("User: " + user);
+            ensureUser(user);
         }
         return file;
     }
@@ -391,47 +390,12 @@ public class SieveFileRepository impleme
         return file;
     }
 
-
-    @Override
-    public boolean hasUser(final String user) throws StorageException {
-        boolean userExists = true;
-        try {
-            getUserDirectory(user);
-        } catch (UserNotFoundException ex) {
-            userExists = false;
-        }
-        return userExists;
-    }
-
-    @Override
-    public void addUser(final String user) throws DuplicateUserException, 
StorageException {
+    public void ensureUser(final String user) throws StorageException {
         synchronized (lock) {
-            boolean userExists = true;
             try {
-                getUserDirectory(user);
-            } catch (UserNotFoundException ex) {
-                userExists = false;
-            }
-            if (userExists) {
-                throw new DuplicateUserException("User: " + user);
-            }
-            File dir = getUserDirectoryFile(user);
-            try {
-                FileUtils.forceMkdir(dir);
-            } catch (IOException ex) {
-                throw new StorageException(ex);
-            }
-        }
-    }
-
-    @Override
-    public void removeUser(final String user) throws UserNotFoundException, 
StorageException {
-        synchronized (lock) {
-            File dir = getUserDirectory(user);
-            try {
-                FileUtils.forceDelete(dir);
-            } catch (IOException ex) {
-                throw new StorageException(ex);
+                FileUtils.forceMkdir(getUserDirectoryFile(user));
+            } catch (IOException e) {
+                throw new StorageException("Error while creating directory for 
" + user, e);
             }
         }
     }

Modified: 
james/project/trunk/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
 (original)
+++ 
james/project/trunk/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
 Thu Dec 17 14:51:18 2015
@@ -59,52 +59,36 @@ public abstract class AbstractSieveRepos
         cleanUp();
     }
 
-    @Test(expected = UserNotFoundException.class)
-    public void getScriptShouldThrowIfUserDoesNotExist() throws Exception {
-        sieveRepository.getScript(USER, SCRIPT_NAME);
-    }
-
     @Test(expected = ScriptNotFoundException.class)
     public void getScriptShouldThrowIfUnableToFindScript() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.getScript(USER, SCRIPT_NAME);
     }
 
     @Test
     public void getScriptShouldReturnCorrectContent() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         assertThat(getScriptContent(sieveRepository.getScript(USER, 
SCRIPT_NAME))).isEqualTo(SCRIPT_CONTENT);
     }
 
-    @Test(expected = UserNotFoundException.class)
-    public void haveSpaceShouldThrowIfUserDoesNotExist() throws Exception {
-        sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA + 1L);
-    }
-
     @Test
     public void haveSpaceShouldNotThrowWhenUserDoesNotHaveQuota() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA + 1L);
     }
 
     @Test
     public void haveSpaceShouldNotThrowWhenQuotaIsNotReached() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(DEFAULT_QUOTA);
         sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA);
     }
 
     @Test(expected = QuotaExceededException.class)
     public void haveSpaceShouldThrowWhenQuotaIsExceed() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(DEFAULT_QUOTA);
         sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA + 1);
     }
 
     @Test
     public void haveSpaceShouldNotThrowWhenAttemptToReplaceOtherScript() 
throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(USER, USER_QUOTA);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA);
@@ -112,7 +96,6 @@ public abstract class AbstractSieveRepos
 
     @Test(expected = QuotaExceededException.class)
     public void 
haveSpaceShouldThrowWhenAttemptToReplaceOtherScriptWithTooLargeScript() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(USER, USER_QUOTA);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA + 1);
@@ -120,7 +103,6 @@ public abstract class AbstractSieveRepos
 
     @Test(expected = QuotaExceededException.class)
     public void haveSpaceShouldTakeAlreadyExistingScriptsIntoAccount() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(USER, USER_QUOTA);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.haveSpace(USER, OTHER_SCRIPT_NAME, USER_QUOTA - 1);
@@ -128,34 +110,30 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void haveSpaceShouldNotThrowAfterActivatingAScript() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(USER, USER_QUOTA);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA);
     }
 
-    @Test(expected = UserNotFoundException.class)
+    @Test
     public void listScriptsShouldThrowIfUserNotFound() throws Exception {
-        sieveRepository.listScripts(USER);
+        assertThat(sieveRepository.listScripts(USER)).isEmpty();
     }
 
     @Test
     public void listScriptsShouldReturnEmptyListWhenThereIsNoScript() throws 
Exception {
-        sieveRepository.addUser(USER);
         assertThat(sieveRepository.listScripts(USER)).isEmpty();
     }
 
     @Test
     public void putScriptShouldWork() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         assertThat(sieveRepository.listScripts(USER)).containsOnly(new 
ScriptSummary(SCRIPT_NAME, false));
     }
 
     @Test
     public void setActiveShouldWork() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         assertThat(sieveRepository.listScripts(USER)).containsOnly(new 
ScriptSummary(SCRIPT_NAME, true));
@@ -163,71 +141,33 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void listScriptShouldCombineActiveAndPassiveScripts() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         sieveRepository.putScript(USER, OTHER_SCRIPT_NAME, 
OTHER_SCRIPT_CONTENT);
         assertThat(sieveRepository.listScripts(USER)).containsOnly(new 
ScriptSummary(SCRIPT_NAME, true), new ScriptSummary(OTHER_SCRIPT_NAME, false));
     }
 
-    @Test(expected = UserNotFoundException.class)
-    public void putScriptShouldThrowIfUserDoesNotExist() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-    }
-
     @Test(expected = QuotaExceededException.class)
     public void putScriptShouldThrowWhenScriptTooBig() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(SCRIPT_CONTENT.length() - 1);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
     }
 
     @Test(expected = QuotaExceededException.class)
     public void putScriptShouldThrowWhenQuotaChangedInBetween() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(SCRIPT_CONTENT.length());
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setQuota(SCRIPT_CONTENT.length() - 1);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
     }
 
-    @Test
-    public void hasUserShouldReturnFalseOnNonExistingUser() throws Exception {
-        assertThat(sieveRepository.hasUser(USER)).isFalse();
-    }
-
-    @Test
-    public void hasUserShouldReturnTrueOnExistingUser() throws Exception {
-        sieveRepository.addUser(USER);
-        assertThat(sieveRepository.hasUser(USER)).isTrue();
-    }
-
-    @Test(expected = UserNotFoundException.class)
-    public void removeUserShouldThrowIfUserNotFound() throws Exception {
-        sieveRepository.removeUser(USER);
-    }
-
-    @Test
-    public void removeUserShouldWork() throws Exception {
-        sieveRepository.addUser(USER);
-        sieveRepository.removeUser(USER);
-        assertThat(sieveRepository.hasUser(USER)).isFalse();
-    }
-
-    @Test(expected = UserNotFoundException.class)
-    public void setActiveScriptShouldThrowIfUserNotFound() throws Exception {
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-    }
-
     @Test(expected = ScriptNotFoundException.class)
     public void setActiveScriptShouldThrowOnNonExistentScript() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setActive(USER, SCRIPT_NAME);
     }
 
     @Test
     public void setActiveScriptShouldWork() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         
assertThat(getScriptContent(sieveRepository.getActive(USER))).isEqualTo(SCRIPT_CONTENT);
@@ -235,7 +175,6 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void setActiveSwitchScriptShouldWork() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         sieveRepository.putScript(USER, OTHER_SCRIPT_NAME, 
OTHER_SCRIPT_CONTENT);
@@ -245,7 +184,6 @@ public abstract class AbstractSieveRepos
 
     @Test(expected = ScriptNotFoundException.class)
     public void switchOffActiveScriptShouldWork() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         sieveRepository.setActive(USER, "");
@@ -254,7 +192,6 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void switchOffActiveScriptShouldNotThrow() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         sieveRepository.setActive(USER, "");
@@ -262,24 +199,16 @@ public abstract class AbstractSieveRepos
 
     @Test(expected = ScriptNotFoundException.class)
     public void getActiveShouldThrowWhenNoActiveScript() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.getActive(USER);
     }
 
-    @Test(expected = UserNotFoundException.class)
-    public void deleteActiveScriptShouldThrowIfUserNotFound() throws Exception 
{
-        sieveRepository.deleteScript(USER, SCRIPT_NAME);
-    }
-
     @Test(expected = ScriptNotFoundException.class)
     public void deleteActiveScriptShouldThrowIfScriptDoNotExist() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.deleteScript(USER, SCRIPT_NAME);
     }
 
     @Test(expected = IsActiveException.class)
     public void deleteActiveScriptShouldThrow() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         sieveRepository.deleteScript(USER, SCRIPT_NAME);
@@ -287,27 +216,19 @@ public abstract class AbstractSieveRepos
 
     @Test(expected = IsActiveException.class)
     public void deleteScriptShouldWork() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         sieveRepository.deleteScript(USER, SCRIPT_NAME);
         sieveRepository.getScript(USER, SCRIPT_NAME);
     }
 
-    @Test(expected = UserNotFoundException.class)
-    public void renameScriptShouldThrowIfUserNotFound() throws Exception {
-        sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
-    }
-
     @Test(expected = ScriptNotFoundException.class)
     public void renameScriptShouldThrowIfScriptNotFound() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
     }
 
     @Test
     public void renameScriptShouldWork() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
         assertThat(getScriptContent(sieveRepository.getScript(USER, 
OTHER_SCRIPT_NAME))).isEqualTo(SCRIPT_CONTENT);
@@ -315,7 +236,6 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void renameScriptShouldPropagateActiveScript() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setActive(USER, SCRIPT_NAME);
         sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
@@ -324,17 +244,11 @@ public abstract class AbstractSieveRepos
 
     @Test(expected = DuplicateException.class)
     public void renameScriptShouldNotOverwriteExistingScript() throws 
Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.putScript(USER, OTHER_SCRIPT_NAME, 
OTHER_SCRIPT_CONTENT);
         sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
     }
 
-    @Test(expected = UserNotFoundException.class)
-    public void getQuotaShouldThrowIfUserNotFound() throws Exception {
-        sieveRepository.getQuota(USER);
-    }
-
     @Test(expected = QuotaNotFoundException.class)
     public void getQuotaShouldThrowIfQuotaNotFound() throws Exception {
         sieveRepository.getQuota();
@@ -348,16 +262,10 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void getQuotaShouldWorkOnUsers() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(USER, USER_QUOTA);
         assertThat(sieveRepository.getQuota(USER)).isEqualTo(USER_QUOTA);
     }
 
-    @Test(expected = UserNotFoundException.class)
-    public void hasQuotaShouldThrowIfUserNotFound() throws Exception {
-        sieveRepository.hasQuota(USER);
-    }
-
     @Test
     public void hasQuotaShouldReturnFalseWhenRepositoryDoesNotHaveQuota() 
throws Exception {
         assertThat(sieveRepository.hasQuota()).isFalse();
@@ -371,22 +279,15 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void hasQuotaShouldReturnFalseWhenUserDoesNotHaveQuota() throws 
Exception {
-        sieveRepository.addUser(USER);
         assertThat(sieveRepository.hasQuota()).isFalse();
     }
 
     @Test
     public void hasQuotaShouldReturnTrueWhenUserHaveQuota() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(USER, DEFAULT_QUOTA);
         assertThat(sieveRepository.hasQuota(USER)).isTrue();
     }
 
-    @Test(expected = UserNotFoundException.class)
-    public void removeQuotaShouldThrowIfUserNotFound() throws Exception {
-        sieveRepository.removeQuota(USER);
-    }
-
     @Test(expected = QuotaNotFoundException.class)
     public void removeQuotaShouldThrowIfRepositoryDoesNotHaveQuota() throws 
Exception {
         sieveRepository.removeQuota();
@@ -401,7 +302,6 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void removeQuotaShouldWorkOnUsers() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(USER, USER_QUOTA);
         sieveRepository.removeQuota(USER);
         assertThat(sieveRepository.hasQuota(USER)).isFalse();
@@ -409,7 +309,6 @@ public abstract class AbstractSieveRepos
 
     @Test(expected = QuotaNotFoundException.class)
     public void removeQuotaShouldWorkOnUsersWithGlobalQuota() throws Exception 
{
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(DEFAULT_QUOTA);
         sieveRepository.setQuota(USER, USER_QUOTA);
         sieveRepository.removeQuota(USER);
@@ -424,7 +323,6 @@ public abstract class AbstractSieveRepos
 
     @Test
     public void setQuotaShouldWorkOnUsers() throws Exception {
-        sieveRepository.addUser(USER);
         sieveRepository.setQuota(USER, DEFAULT_QUOTA);
         assertThat(sieveRepository.getQuota(USER)).isEqualTo(DEFAULT_QUOTA);
     }

Modified: 
james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java?rev=1720561&r1=1720560&r2=1720561&view=diff
==============================================================================
--- 
james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
 (original)
+++ 
james/project/trunk/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
 Thu Dec 17 14:51:18 2015
@@ -36,6 +36,7 @@ import org.apache.james.managesieve.tran
 import org.apache.james.managesieve.util.SettableSession;
 import org.apache.james.sieverepository.api.SieveRepository;
 import 
org.apache.james.transport.mailets.managesieve.transcode.MessageToCoreToMessage;
+import org.apache.james.user.api.UsersRepository;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 import org.apache.mailet.base.GenericMailet;
@@ -88,10 +89,6 @@ public class ManageSieveMailet extends G
             super();
         }
 
-        /**
-         * @param mail
-         *            the mail to set
-         */
         public void setMail(Mail mail) {
             setUser(getUser(mail.getSender()));
             setAuthentication(null != 
mail.getAttribute(SMTP_AUTH_USER_ATTRIBUTE_NAME));
@@ -105,86 +102,42 @@ public class ManageSieveMailet extends G
 
     public final static String SMTP_AUTH_USER_ATTRIBUTE_NAME = 
"org.apache.james.SMTPAuthUser";
 
-    private MailSession _session = null;
-
+    private MailSession session = null;
     // Injected
-    private SieveRepository _sieveRepository = null;
-
+    private SieveRepository sieveRepository = null;
     // Injected
-    private SieveParser _sieveParser = null;
+    private SieveParser sieveParser = null;
+    private UsersRepository usersRepository;
+    private MessageToCoreToMessage transcoder = null;
+    private URL helpURL = null;
+    private String help = null;
+    private boolean cache = true;
 
-    private MessageToCoreToMessage _transcoder = null;
-    
-    private URL _helpURL = null;
-    
-    private String _help = null;
-    
-    private boolean _cache = true;
-
-    /**
-     * Creates a new instance of ManageSieveMailet.
-     * 
-     */
-    public ManageSieveMailet() {
-        super();
-    }
-    
-    /**
-     * Creates a new instance of ManageSieveMailet.
-     *
-     * @param sieveRepository
-     * @param sieveParser
-     */
-    public ManageSieveMailet(SieveRepository sieveRepository, SieveParser 
sieveParser)
-    {
-        this();
-        setSieveRepository(sieveRepository);
-        setSieveParser(sieveParser);
-    }
-     
-    /**
-     * @see GenericMailet#init()
-     */
     @Override
     public void init() throws MessagingException {
         super.init();
         // Validate resources
-        if (null == _sieveParser)
-        {
+        if (null == sieveParser) {
             throw new MessagingException("Missing resource \"sieveparser\"");
         }
-        if (null == _sieveRepository)
-        {
+        if (null == sieveRepository) {
             throw new MessagingException("Missing resource 
\"sieverepository\"");
         }
         
         setHelpURL(getInitParameter("helpURL"));
-        _cache = getInitParameter("cache", true);
-        _session = new MailSession();
-        _transcoder = new MessageToCoreToMessage(new LineToCoreToLine(new 
LineToCore(new CoreProcessor(_session,
-                _sieveRepository, _sieveParser))), this);
-    }
-    
-    protected void setHelpURL(String helpURL) throws MessagingException
-    {
-        try
-        {
-            _helpURL = new URL(helpURL);
-        }
-        catch (MalformedURLException ex)
-        {
-            throw new MessagingException("Invalid helpURL", ex);
-        }
-    } 
+        cache = getInitParameter("cache", true);
+        session = new MailSession();
+        transcoder = new MessageToCoreToMessage(
+            new LineToCoreToLine(
+                new LineToCore(
+                    new CoreProcessor(session, sieveRepository, 
usersRepository, sieveParser))),
+            this);
+    }
 
-    /**
-     * @see GenericMailet#service(Mail)
-     */
     @Override
     public void service(Mail mail) throws MessagingException {
-
         // Sanity checks
-        if (null == mail.getSender()) {
+        if (mail.getSender() == null) {
             getMailetContext().log("ERROR: Sender is null");
             return;
         }
@@ -195,44 +148,65 @@ public class ManageSieveMailet extends G
         }
 
         // Update the Session for the current mail and execute
-        _session.setMail(mail);
-        getMailetContext().sendMail(_transcoder.execute(mail.getMessage()));
+        session.setMail(mail);
+        getMailetContext().sendMail(transcoder.execute(mail.getMessage()));
         mail.setState(Mail.GHOST);
         
         // And tidy up
         clearCaches();
     }
-    
-    protected void clearCaches()
-    {
-        if (!_cache)
-        {
-            _help = null;
+
+    @Inject
+    public void setSieveRepository(SieveRepository repository) {
+        sieveRepository = repository;
+    }
+
+    @Inject
+    public void setSieveParser(SieveParser sieveParser) {
+        this.sieveParser = sieveParser;
+    }
+
+    @Inject
+    public void setUsersRepository(UsersRepository usersRepository) {
+        this.usersRepository = usersRepository;
+    }
+
+    @Override
+    public String getMailetInfo() {
+        return getClass().getName();
+    }
+
+    protected void setHelpURL(String helpURL) throws MessagingException {
+        try {
+            this.helpURL = new URL(helpURL);
+        } catch (MalformedURLException ex) {
+            throw new MessagingException("Invalid helpURL", ex);
+        }
+    }
+
+    protected void clearCaches() {
+        if (!cache) {
+            help = null;
         }
     }
 
     public String getHelp() throws MessagingException {
-        if (null == _help)
-        {
-            _help = computeHelp();
-        }
-        return _help;
-    }
-    
-    protected String computeHelp() throws MessagingException
-    {
+        if (null == help) {
+            help = computeHelp();
+        }
+        return help;
+    }
+
+    protected String computeHelp() throws MessagingException {
         InputStream stream = null;
-        String help = null;
         try {
-            stream = _helpURL.openStream();
-            help = new Scanner(stream, "UTF-8").useDelimiter("\\A").next();
+            stream = helpURL.openStream();
+            return new Scanner(stream, "UTF-8").useDelimiter("\\A").next();
         } catch (IOException ex) {
-            throw new MessagingException("Unable to access help URL: " + 
_helpURL.toExternalForm(), ex);
+            throw new MessagingException("Unable to access help URL: " + 
helpURL.toExternalForm(), ex);
         }
-        finally
-        {
-            if (null != stream)
-            {
+        finally {
+            if (stream != null) {
                 try {
                     stream.close();
                 } catch (IOException ex) {
@@ -240,31 +214,6 @@ public class ManageSieveMailet extends G
                 }
             }
         }
-        return help;
-    }
-
-    /**
-     */
-    @Inject
-    public void setSieveRepository(SieveRepository repository) {
-        _sieveRepository = repository;
-    }
-
-    /**
-     * @param sieveParser
-     *            the sieveParser to set
-     */
-    @Inject
-    public void setSieveParser(SieveParser sieveParser) {
-        _sieveParser = sieveParser;
-    }
-
-    /**
-     * @see GenericMailet#getMailetInfo()
-     */
-    @Override
-    public String getMailetInfo() {
-        return getClass().getName();
     }
 
 }



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

Reply via email to