MAILBOX-310 Mailbox query refactoring: Mailbox query should rely on 
MailboxNameExpression


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

Branch: refs/heads/master
Commit: d10305840f8f20b2e974bde0e66f796b0ff13110
Parents: 0cfb395
Author: benwa <btell...@linagora.com>
Authored: Wed Oct 4 13:06:31 2017 +0700
Committer: Matthieu Baechler <matth...@apache.org>
Committed: Thu Oct 5 20:00:38 2017 +0200

----------------------------------------------------------------------
 .../model/search/MailboxNameExpression.java     |  42 +++-
 .../mailbox/model/search/MailboxQuery.java      | 230 ++++---------------
 .../james/mailbox/model/search/Wildcard.java    |  18 ++
 .../james/mailbox/MailboxManagerTest.java       |  25 +-
 .../mailbox/model/search/MailboxQueryTest.java  | 115 +++-------
 .../mailbox/model/search/WildcardTest.java      |  10 +-
 .../inmemory/InMemoryMessageIdManager.java      |  14 +-
 .../InMemoryMessageIdManagerTestSystem.java     |   4 +-
 .../InMemoryMessageManagerTestSystem.java       |   5 +-
 .../mailbox/store/StoreMailboxManager.java      |  10 +-
 .../store/AbstractCombinationManagerTest.java   |  12 +-
 .../mailbox/store/StoreMailboxManagerTest.java  |  11 +-
 .../james/imap/processor/LSubProcessor.java     |  11 +-
 .../james/imap/processor/ListProcessor.java     |   9 +-
 .../apache/james/modules/MailboxProbeImpl.java  |  11 +-
 .../mailbox/MailboxManagerManagement.java       |  12 +-
 .../matchers/AbstractStorageQuota.java          |   7 +-
 .../james/jmap/methods/GetMailboxesMethod.java  |   4 +-
 .../jmap/utils/SystemMailboxesProviderImpl.java |   4 +-
 .../webadmin/service/UserMailboxesService.java  |  16 +-
 20 files changed, 221 insertions(+), 349 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java
 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java
index 04a26bc..2b9d4c8 100644
--- 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.mailbox.model.search;
 
-interface MailboxNameExpression {
+public interface MailboxNameExpression {
     /**
      * Use this wildcard to match every char including the hierarchy delimiter
      */
@@ -30,9 +30,49 @@ interface MailboxNameExpression {
      */
     char LOCALWILDCARD = '%';
 
+    /**
+     * Is the given name a match for this expression?
+     *
+     * @param name
+     *            name to be matched
+     * @return true if the given name matches this expression, false otherwise
+     */
     boolean isExpressionMatch(String name);
 
+    /**
+     * Get combined name formed by adding the expression to the base using the
+     * given hierarchy delimiter. Note that the wildcards are retained in the
+     * combined name.
+     *
+     * @return {@link #getBase()} combined with {@link #getExpression()},
+     *         notnull
+     */
     String getCombinedName();
 
+    /**
+     * Is this expression wild?
+     *
+     * @return true if wildcard contained, false otherwise
+     */
     boolean isWild();
+
+    /**
+     * Gets wildcard character that matches any series of characters.
+     *
+     * @return the freeWildcard
+     */
+    default char getFreeWildcard() {
+        return FREEWILDCARD;
+    }
+
+    /**
+     * Gets wildcard character that matches any series of characters excluding
+     * hierarchy delimiters. Effectively, this means that it matches any
+     * sequence within a name part.
+     *
+     * @return the localWildcard
+     */
+    default char getLocalWildcard() {
+        return LOCALWILDCARD;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
index 9d51b78..2afec92 100644
--- 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
@@ -20,8 +20,6 @@
 package org.apache.james.mailbox.model.search;
 
 import java.util.Optional;
-import java.util.StringTokenizer;
-import java.util.regex.Pattern;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxConstants;
@@ -36,17 +34,6 @@ import com.google.common.base.Preconditions;
  * Expresses select criteria for mailboxes.
  */
 public final class MailboxQuery {
-    /**
-     * Use this wildcard to match every char including the hierarchy delimiter
-     */
-    public final static char FREEWILDCARD = '*';
-
-    /**
-     * Use this wildcard to match every char except the hierarchy delimiter
-     */
-    public final static char LOCALWILDCARD = '%';
-
-    private static final String EMPTY_PATH_NAME = "";
 
     public static Builder builder() {
         return new Builder();
@@ -54,76 +41,72 @@ public final class MailboxQuery {
 
     public static Builder privateMailboxesBuilder(MailboxSession session) {
         return builder()
-            .mailboxSession(session)
-            .username(session.getUser().getUserName());
+            .namespace(MailboxConstants.USER_NAMESPACE)
+            .username(session.getUser().getUserName())
+            .matchesAllMailboxNames();
     }
 
     public static class Builder {
-        private String expression;
-        @VisibleForTesting Optional<Character> pathDelimiter;
-        @VisibleForTesting Optional<String> username;
-        @VisibleForTesting Optional<String> pathName;
-        @VisibleForTesting Optional<String> namespace;
+        private static final Wildcard DEFAULT_WILDCARD = Wildcard.INSTANCE;
+
+        Optional<String> username;
+        Optional<String> namespace;
+        Optional<MailboxNameExpression> mailboxNameExpression;
         
         private Builder() {
-            this.pathName = Optional.empty();
             this.namespace = Optional.empty();
             this.username = Optional.empty();
-            this.pathDelimiter = Optional.empty();
+            this.mailboxNameExpression = Optional.empty();
         }
         
-        public Builder base(MailboxPath base) {
+        public Builder userAndNamespaceFrom(MailboxPath base) {
+            Preconditions.checkState(!this.namespace.isPresent());
+            Preconditions.checkState(!this.username.isPresent());
+
             this.namespace = Optional.ofNullable(base.getNamespace());
             this.username = Optional.ofNullable(base.getUser());
-            this.pathName = Optional.ofNullable(base.getName());
             return this;
         }
-        
+
         public Builder username(String username) {
+            Preconditions.checkState(!this.username.isPresent());
+
             this.username = Optional.of(username);
             return this;
         }
-        
-        public Builder privateMailboxes() {
-            Preconditions.checkState(!pathName.isPresent());
-            Preconditions.checkState(!namespace.isPresent());
-            this.namespace = Optional.of(MailboxConstants.USER_NAMESPACE);
-            this.pathName = Optional.of(EMPTY_PATH_NAME);
-            return matchesAll();
-        }
-        
-        public Builder expression(String expression) {
-            this.expression = expression;
+
+        public Builder namespace(String namespace) {
+            Preconditions.checkState(!this.namespace.isPresent());
+
+            this.namespace = Optional.of(namespace);
             return this;
         }
-        
-        public Builder matchesAll() {
-            this.expression = String.valueOf(FREEWILDCARD);
+
+        public Builder privateNamespace() {
+            Preconditions.checkState(!this.namespace.isPresent());
+
+            this.namespace = Optional.of(MailboxConstants.USER_NAMESPACE);
             return this;
         }
-
-        public Builder mailboxSession(MailboxSession session) {
-            this.pathDelimiter = Optional.of(session.getPathDelimiter());
+        
+        public Builder expression(MailboxNameExpression expression) {
+            this.mailboxNameExpression = Optional.of(expression);
             return this;
         }
-
-        public Builder pathDelimiter(char pathDelimiter) {
-            this.pathDelimiter = Optional.of(pathDelimiter);
+        
+        public Builder matchesAllMailboxNames() {
+            this.mailboxNameExpression = Optional.of(Wildcard.INSTANCE);
             return this;
         }
         
         public MailboxQuery build() {
-            Preconditions.checkState(pathDelimiter.isPresent());
-            return new MailboxQuery(namespace, username, pathName, expression, 
pathDelimiter.get());
+            return new MailboxQuery(namespace, username, 
mailboxNameExpression.orElse(DEFAULT_WILDCARD));
         }
     }
 
-    private final String expression;
-    private final char pathDelimiter;
-    private final Pattern pattern;
     private final Optional<String> namespace;
     private final Optional<String> user;
-    private final Optional<String> baseName;
+    private final MailboxNameExpression mailboxNameExpression;
 
     /**
      * Constructs an expression determining a set of mailbox names.
@@ -135,18 +118,10 @@ public final class MailboxQuery {
      * @param pathDelimiter
      *            path delimiter to use
      */
-    @VisibleForTesting MailboxQuery(Optional<String> namespace, 
Optional<String> user, Optional<String> baseName,
-                                    String expression, char pathDelimiter) {
+    @VisibleForTesting MailboxQuery(Optional<String> namespace, 
Optional<String> user, MailboxNameExpression mailboxNameExpression) {
         this.namespace = namespace;
         this.user = user;
-        this.baseName = baseName;
-        if (expression == null) {
-            this.expression = "";
-        } else {
-            this.expression = expression;
-        }
-        this.pathDelimiter = pathDelimiter;
-        pattern = constructEscapedRegex();
+        this.mailboxNameExpression = mailboxNameExpression;
     }
 
     public Optional<String> getNamespace() {
@@ -157,8 +132,8 @@ public final class MailboxQuery {
         return user;
     }
 
-    public Optional<String> getBaseName() {
-        return baseName;
+    public MailboxNameExpression getMailboxNameExpression() {
+        return mailboxNameExpression;
     }
 
     public boolean isPrivateMailboxes(MailboxSession session) {
@@ -167,7 +142,8 @@ public final class MailboxQuery {
             && user.map(sessionUser::isSameUser).orElse(false);
     }
 
-    public boolean belongsToRequestedNamespaceAndUser(MailboxPath mailboxPath) 
{
+    @VisibleForTesting
+    boolean belongsToRequestedNamespaceAndUser(MailboxPath mailboxPath) {
         boolean belongsToRequestedNamespace = namespace
             .map(value -> value.equals(mailboxPath.getNamespace()))
             .orElse(true);
@@ -178,141 +154,21 @@ public final class MailboxQuery {
         return belongsToRequestedNamespace && belongsToRequestedUser;
     }
 
-    /**
-     * Gets the name search expression. This may contain wildcards.
-     * 
-     * @return the expression
-     */
-    public final String getExpression() {
-        return expression;
-    }
-
-    /**
-     * Gets wildcard character that matches any series of characters.
-     * 
-     * @return the freeWildcard
-     */
-    public final char getFreeWildcard() {
-        return FREEWILDCARD;
-    }
-
-    /**
-     * Gets wildcard character that matches any series of characters excluding
-     * hierarchy delimiters. Effectively, this means that it matches any
-     * sequence within a name part.
-     * 
-     * @return the localWildcard
-     */
-    public final char getLocalWildcard() {
-        return LOCALWILDCARD;
-    }
-
-    /**
-     * Is the given name a match for {@link #getExpression()}?
-     * 
-     * @param name
-     *            name to be matched
-     * @return true if the given name matches this expression, false otherwise
-     */
     public boolean isExpressionMatch(String name) {
-        if (isWild()) {
-            return name != null
-                && pattern.matcher(name).matches();
-        } else {
-            return expression.equals(name);
-        }
+        return mailboxNameExpression.isExpressionMatch(name);
     }
 
     public boolean isPathMatch(MailboxPath mailboxPath) {
-        String baseName = this.baseName.orElse(EMPTY_PATH_NAME);
-        int baseNameLength = baseName.length();
-        String mailboxName = mailboxPath.getName();
-
         return belongsToRequestedNamespaceAndUser(mailboxPath)
-            && mailboxName.startsWith(baseName)
-            && isExpressionMatch(mailboxName.substring(baseNameLength));
-    }
-  
-    /**
-     * Get combined name formed by adding the expression to the base using the
-     * given hierarchy delimiter. Note that the wildcards are retained in the
-     * combined name.
-     * 
-     * @return {@link #getBase()} combined with {@link #getExpression()},
-     *         notnull
-     */
-    public String getCombinedName() {
-        String baseName = this.baseName.orElse(null);
-        if (baseName != null && baseName.length() > 0) {
-            final int baseLength = baseName.length();
-            if (baseName.charAt(baseLength - 1) == pathDelimiter) {
-                if (expression != null && expression.length() > 0) {
-                    if (expression.charAt(0) == pathDelimiter) {
-                        return baseName + expression.substring(1);
-                    } else {
-                        return baseName + expression;
-                    }
-                } else {
-                    return baseName;
-                }
-            } else {
-                if (expression != null && expression.length() > 0) {
-                    if (expression.charAt(0) == pathDelimiter) {
-                        return baseName + expression;
-                    } else {
-                        return baseName + pathDelimiter + expression;
-                    }
-                } else {
-                    return baseName;
-                }
-            }
-        } else {
-            return expression;
-        }
-    }
-
-    /**
-     * Is this expression wild?
-     * 
-     * @return true if wildcard contained, false otherwise
-     */
-    public boolean isWild() {
-        return expression != null
-            && (
-                expression.indexOf(getFreeWildcard()) >= 0
-                || expression.indexOf(getLocalWildcard()) >= 0);
+            && isExpressionMatch(mailboxPath.getName());
     }
 
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("expression", expression)
-            .add("pathDelimiter", pathDelimiter)
-            .add("pattern", pattern)
             .add("namespace", namespace)
             .add("user", user)
-            .add("baseName", baseName)
+            .add("mailboxNameExpression", mailboxNameExpression)
             .toString();
     }
 
-
-    private Pattern constructEscapedRegex() {
-        StringBuilder stringBuilder = new StringBuilder();
-        StringTokenizer tokenizer = new StringTokenizer(expression, "*%", 
true);
-        while (tokenizer.hasMoreTokens()) {
-            stringBuilder.append(getRegexPartAssociatedWithToken(tokenizer));
-        }
-        return Pattern.compile(stringBuilder.toString());
-    }
-
-    private String getRegexPartAssociatedWithToken(StringTokenizer tokenizer) {
-        String token = tokenizer.nextToken();
-        if (token.equals("*")) {
-            return ".*";
-        } else if (token.equals("%")) {
-            return "[^" + Pattern.quote(String.valueOf(pathDelimiter)) + "]*";
-        } else {
-            return Pattern.quote(token);
-        }
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java
index 655b5c7..fa647cb 100644
--- 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java
@@ -19,9 +19,17 @@
 
 package org.apache.james.mailbox.model.search;
 
+import java.util.Objects;
+
 import com.google.common.base.Preconditions;
 
 public class Wildcard implements MailboxNameExpression {
+
+    public static final Wildcard INSTANCE = new Wildcard();
+
+    private Wildcard() {
+    }
+
     @Override
     public boolean isExpressionMatch(String name) {
         Preconditions.checkNotNull(name);
@@ -37,4 +45,14 @@ public class Wildcard implements MailboxNameExpression {
     public boolean isWild() {
         return true;
     }
+
+    @Override
+    public final boolean equals(Object o) {
+        return o instanceof Wildcard;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java 
b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index bc74a13..f04cfa5 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -243,12 +243,10 @@ public abstract class MailboxManagerTest {
         mailboxManager.createMailbox(new MailboxPath("other_namespace", 
USER_1, "Other"), session);
         mailboxManager.createMailbox(MailboxPath.inbox(session), session);
         List<MailboxMetaData> metaDatas = mailboxManager.search(
-                MailboxQuery.builder()
-                    .base(MailboxPath.forUser(USER_1, ""))
-                    .expression("*")
-                    .mailboxSession(session)
-                    .build(), 
-                session);
+            MailboxQuery.privateMailboxesBuilder(session)
+                .matchesAllMailboxNames()
+                .build(),
+            session);
         assertThat(metaDatas).hasSize(1);
         
assertThat(metaDatas.get(0).getPath()).isEqualTo(MailboxPath.inbox(session));
     }
@@ -259,11 +257,9 @@ public abstract class MailboxManagerTest {
         mailboxManager.createMailbox(MailboxPath.forUser(USER_2, "Other"), 
session);
         mailboxManager.createMailbox(MailboxPath.inbox(session), session);
         List<MailboxMetaData> metaDatas = mailboxManager.search(
-                MailboxQuery.builder()
-                .base(MailboxPath.forUser(USER_1, ""))
-                .expression("*")
-                    .mailboxSession(session)
-                .build(), 
+            MailboxQuery.privateMailboxesBuilder(session)
+                .matchesAllMailboxNames()
+                .build(),
             session);
         assertThat(metaDatas).hasSize(1);
         
assertThat(metaDatas.get(0).getPath()).isEqualTo(MailboxPath.inbox(session));
@@ -454,8 +450,7 @@ public abstract class MailboxManagerTest {
             session1);
 
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .mailboxSession(session2)
-            .matchesAll()
+            .matchesAllMailboxNames()
             .build();
 
         assertThat(mailboxManager.search(mailboxQuery, session2))
@@ -480,7 +475,7 @@ public abstract class MailboxManagerTest {
             session1);
 
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .matchesAll()
+            .matchesAllMailboxNames()
             .build();
 
         assertThat(mailboxManager.search(mailboxQuery, session2))
@@ -510,7 +505,7 @@ public abstract class MailboxManagerTest {
             session1);
 
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .matchesAll()
+            .matchesAllMailboxNames()
             .build();
 
         assertThat(mailboxManager.search(mailboxQuery, session2))

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
index 7f59c12..5159209 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
@@ -21,12 +21,7 @@
 package org.apache.james.mailbox.model.search;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MailboxSession.User;
-import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.search.MailboxQuery.Builder;
 import org.junit.Before;
@@ -36,127 +31,98 @@ public class MailboxQueryTest {
     private static final String CURRENT_USER = "user";
 
     private MailboxPath mailboxPath;
-    private MailboxSession mailboxSession;
 
     @Before
     public void setUp() {
         mailboxPath = new MailboxPath("namespace", "user", "name");
-        mailboxSession = new MockMailboxSession("user");
     }
 
     @Test
     public void buildShouldMatchAllValuesWhenMatchesAll() throws Exception {
-        //When
+
         MailboxQuery actual = MailboxQuery.builder()
-                .base(mailboxPath)
-                .matchesAll()
-                .mailboxSession(mailboxSession)
+                .userAndNamespaceFrom(mailboxPath)
+                .matchesAllMailboxNames()
                 .build();
-        //Then
+
         assertThat(actual.isExpressionMatch("folder")).isTrue();
     }
 
     @Test
     public void buildShouldConstructMailboxPathWhenPrivateUserMailboxes() 
throws Exception {
-        //Given
         MailboxPath expected = MailboxPath.forUser("user", "");
-        //When
+
         MailboxQuery actual = MailboxQuery.builder()
                 .username("user")
-                .privateMailboxes()
-                .mailboxSession(mailboxSession)
+                .privateNamespace()
                 .build();
-        //Then
+
         assertThat(actual.getNamespace()).contains(expected.getNamespace());
         assertThat(actual.getUser()).contains(expected.getUser());
-        assertThat(actual.getBaseName()).contains(expected.getName());
+        
assertThat(actual.getMailboxNameExpression()).isEqualTo(Wildcard.INSTANCE);
     }
 
     @Test
     public void buildShouldMatchAllValuesWhenPrivateUserMailboxes() throws 
Exception {
-        //Given
         Builder testee = MailboxQuery.builder()
                 .username("user")
-                .privateMailboxes()
-            .mailboxSession(mailboxSession);
-        //When
+                .privateNamespace();
+
         MailboxQuery actual = testee.build();
-        //Then
-        assertThat(actual.isExpressionMatch("folder")).isTrue();
-    }
 
-    @Test
-    public void builderShouldInitFromSessionWhenGiven() throws Exception {
-        //Given
-        MailboxSession mailboxSession = mock(MailboxSession.class);
-        when(mailboxSession.getPathDelimiter()).thenReturn('#');
-        User user = mock(User.class);
-        when(user.getUserName()).thenReturn("little bobby table");
-        when(mailboxSession.getUser()).thenReturn(user);
-        // When
-        Builder query = MailboxQuery.privateMailboxesBuilder(mailboxSession);
-        //Then
-        assertThat(query.pathDelimiter).contains('#');
-        assertThat(query.username).contains("little bobby table");
+        assertThat(actual.isExpressionMatch("folder")).isTrue();
     }
 
     @Test
     public void builderShouldNotThrowWhenNoBaseDefined() throws Exception {
-        //Given
         Builder testee = MailboxQuery.builder()
-                .expression("abc")
-                .mailboxSession(mailboxSession);
-        //When
+                .expression(new ExactName("abc"));
+
         testee.build();
     }
 
     @Test(expected=IllegalStateException.class)
     public void builderShouldThrowWhenBaseAndUsernameGiven() throws Exception {
-        //Given
         Builder testee = MailboxQuery.builder()
-                .base(mailboxPath)
+                .userAndNamespaceFrom(mailboxPath)
                 .username("user");
-        //When
+
         testee.build();
     }
 
     @Test(expected=IllegalStateException.class)
     public void builderShouldThrowWhenBaseGiven() throws Exception {
-        //Given
         Builder testee = MailboxQuery.builder()
-                .base(mailboxPath)
-                .privateMailboxes();
-        //When
+                .userAndNamespaceFrom(mailboxPath)
+                .privateNamespace();
+
         testee.build();
     } 
 
-    @Test(expected=IllegalStateException.class)
-    public void builderShouldThrowWhenMissingUsername() throws Exception {
-        //Given
+    @Test
+    public void builderShouldNotThrowWhenMissingUsername() throws Exception {
         Builder testee = MailboxQuery.builder()
-                .privateMailboxes();
-        //When
+                .privateNamespace();
+
         testee.build();
     }
 
     @Test
     public void builderShouldUseBaseWhenGiven() throws Exception {
-        //When
+
         MailboxQuery actual = MailboxQuery.builder()
-                .base(mailboxPath)
-                .mailboxSession(mailboxSession)
+                .userAndNamespaceFrom(mailboxPath)
                 .build();
-        //Then
+
         assertThat(actual.getNamespace()).contains(mailboxPath.getNamespace());
         assertThat(actual.getUser()).contains(mailboxPath.getUser());
-        assertThat(actual.getBaseName()).contains(mailboxPath.getName());
+        
assertThat(actual.getMailboxNameExpression()).isEqualTo(Wildcard.INSTANCE);
     }
 
     @Test
     public void 
belongsToNamespaceAndUserShouldReturnTrueWithIdenticalMailboxes() {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(mailboxPath)
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(mailboxPath)
             .build();
 
         
assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(mailboxPath))
@@ -168,8 +134,7 @@ public class MailboxQueryTest {
         MailboxPath base = new MailboxPath("namespace", null, "name");
 
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(base)
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(base)
             .build();
 
         
assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(mailboxPath))
@@ -181,8 +146,7 @@ public class MailboxQueryTest {
         MailboxPath mailboxPath = new MailboxPath(null, "user", "name");
 
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(mailboxPath)
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(mailboxPath)
             .build();
 
         
assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(mailboxPath))
@@ -192,8 +156,7 @@ public class MailboxQueryTest {
     @Test
     public void 
belongsToNamespaceAndUserShouldReturnTrueWithMailboxWithSameNamespaceAndUserWithNullUser()
 {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(new MailboxPath("namespace", null, "name"))
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(new MailboxPath("namespace", null, "name"))
             .build();
 
         assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new 
MailboxPath("namespace", null, "name")))
@@ -203,8 +166,7 @@ public class MailboxQueryTest {
     @Test
     public void 
belongsToNamespaceAndUserShouldReturnTrueWithMailboxWithSameNamespaceAndUser() {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(new MailboxPath("namespace", CURRENT_USER, "name"))
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, 
"name"))
             .build();
 
         assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new 
MailboxPath("namespace", CURRENT_USER, "name2")))
@@ -214,8 +176,7 @@ public class MailboxQueryTest {
     @Test
     public void 
belongsToNamespaceAndUserShouldReturnFalseWithDifferentNamespace() {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(new MailboxPath("namespace", CURRENT_USER, "name"))
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, 
"name"))
             .build();
 
         assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new 
MailboxPath("namespace2", CURRENT_USER, "name")))
@@ -225,8 +186,7 @@ public class MailboxQueryTest {
     @Test
     public void belongsToNamespaceAndUserShouldReturnFalseWithDifferentUser() {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(new MailboxPath("namespace", CURRENT_USER, "name"))
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, 
"name"))
             .build();
 
         assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new 
MailboxPath("namespace", CURRENT_USER + "2", "name")))
@@ -235,8 +195,7 @@ public class MailboxQueryTest {
     @Test
     public void 
belongsToNamespaceAndUserShouldReturnFalseWithOneOfTheUserNull() {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(new MailboxPath("namespace", CURRENT_USER, "name"))
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, 
"name"))
             .build();
 
         assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new 
MailboxPath("namespace", null, "name")))
@@ -246,8 +205,7 @@ public class MailboxQueryTest {
     @Test
     public void belongsToNamespaceAndUserShouldReturnFalseWhenDifferentUser() {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(new MailboxPath("namespace", CURRENT_USER, "name"))
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, 
"name"))
             .build();
 
         assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new 
MailboxPath("namespace", "other", "name")))
@@ -257,8 +215,7 @@ public class MailboxQueryTest {
     @Test
     public void 
belongsToNamespaceAndUserShouldReturnFalseIfNamespaceAreDifferentWithNullUser() 
{
         MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(new MailboxPath("namespace", null, "name"))
-            .mailboxSession(mailboxSession)
+            .userAndNamespaceFrom(new MailboxPath("namespace", null, "name"))
             .build();
 
         assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new 
MailboxPath("namespace2", null, "name")))

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/WildcardTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/WildcardTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/WildcardTest.java
index a607164..1290a39 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/WildcardTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/WildcardTest.java
@@ -28,31 +28,31 @@ public class WildcardTest {
 
     @Test
     public void isWildShouldBeTrue() {
-        assertThat(new Wildcard().isWild())
+        assertThat(Wildcard.INSTANCE.isWild())
             .isTrue();
     }
 
     @Test
     public void getCombinedNameShouldReturnWildcard() {
-        assertThat(new Wildcard().getCombinedName())
+        assertThat(Wildcard.INSTANCE.getCombinedName())
             .isEqualTo(String.valueOf(MailboxNameExpression.FREEWILDCARD));
     }
 
     @Test
     public void isExpressionMatchShouldMatchAnyValue() {
-        assertThat(new Wildcard().isExpressionMatch("any"))
+        assertThat(Wildcard.INSTANCE.isExpressionMatch("any"))
             .isTrue();
     }
 
     @Test
     public void isExpressionMatchShouldMatchEmptyValue() {
-        assertThat(new Wildcard().isExpressionMatch(""))
+        assertThat(Wildcard.INSTANCE.isExpressionMatch(""))
             .isTrue();
     }
 
     @Test
     public void isExpressionMatchShouldThrowOnNullValue() {
-        assertThatThrownBy(() -> new Wildcard().isExpressionMatch(null))
+        assertThatThrownBy(() -> Wildcard.INSTANCE.isExpressionMatch(null))
             .isInstanceOf(NullPointerException.class);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
index 566a284..e009c84 100644
--- 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
+++ 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManager.java
@@ -87,7 +87,7 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
 
 
     @Override
-    public List<MessageResult> getMessages(List<MessageId> messages, 
FetchGroup fetchGroup, final MailboxSession mailboxSession) throws 
MailboxException {
+    public List<MessageResult> getMessages(List<MessageId> messages, 
FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException {
         return getUsersMailboxIds(mailboxSession)
             .stream()
             .flatMap(Throwing.function(mailboxId -> 
retrieveMailboxMessages(mailboxId, messages, FetchGroupImpl.MINIMAL, 
mailboxSession)))
@@ -136,7 +136,7 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
         }
     }
 
-    private List<MailboxId> getUsersMailboxIds(final MailboxSession 
mailboxSession) throws MailboxException {
+    private List<MailboxId> getUsersMailboxIds(MailboxSession mailboxSession) 
throws MailboxException {
         return mailboxManager.search(userMailboxes(mailboxSession), 
mailboxSession)
             .stream()
             .map(MailboxMetaData::getId)
@@ -144,10 +144,8 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
     }
 
     private MailboxQuery userMailboxes(MailboxSession mailboxSession) {
-        return MailboxQuery.builder()
-                .matchesAll()
-                .username(mailboxSession.getUser().getUserName())
-                .mailboxSession(mailboxSession)
+        return MailboxQuery.privateMailboxesBuilder(mailboxSession)
+                .matchesAllMailboxNames()
                 .build();
     }
 
@@ -166,7 +164,7 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
         }
     }
 
-    private Predicate<MailboxId> findMailboxBelongsToAnotherSession(final 
MailboxSession mailboxSession) {
+    private Predicate<MailboxId> 
findMailboxBelongsToAnotherSession(MailboxSession mailboxSession) {
         return input -> {
             try {
                 MailboxPath currentMailbox = mailboxManager.getMailbox(input, 
mailboxSession).getMailboxPath();
@@ -184,7 +182,7 @@ public class InMemoryMessageIdManager implements 
MessageIdManager {
             .findFirst();
     }
 
-    private Predicate<MessageResult> filterByMessageId(final MessageId 
messageId) {
+    private Predicate<MessageResult> filterByMessageId(MessageId messageId) {
         return messageResult -> messageResult.getMessageId().equals(messageId);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerTestSystem.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerTestSystem.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerTestSystem.java
index 5a35ae9..4cb2c60 100644
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerTestSystem.java
+++ 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerTestSystem.java
@@ -95,7 +95,9 @@ public class InMemoryMessageIdManagerTestSystem extends 
MessageIdManagerTestSyst
     }
 
     private Optional<MailboxMetaData> retrieveMailbox(MailboxId mailboxId, 
MailboxSession mailboxSession) throws MailboxException {
-        MailboxQuery userMailboxesQuery = 
MailboxQuery.privateMailboxesBuilder(mailboxSession).expression("*").build();
+        MailboxQuery userMailboxesQuery = 
MailboxQuery.privateMailboxesBuilder(mailboxSession)
+            .matchesAllMailboxNames()
+            .build();
         return mailboxManager.search(userMailboxesQuery, mailboxSession)
             .stream()
             .filter(mailboxMetaData -> 
mailboxMetaData.getId().equals(mailboxId))

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageManagerTestSystem.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageManagerTestSystem.java
 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageManagerTestSystem.java
index 273df14..31dc491 100644
--- 
a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageManagerTestSystem.java
+++ 
b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageManagerTestSystem.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.Wildcard;
 import org.apache.james.mailbox.store.MessageManagerTestSystem;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
@@ -95,7 +96,9 @@ public class InMemoryMessageManagerTestSystem extends 
MessageManagerTestSystem {
     }
 
     private Optional<MailboxMetaData> retrieveMailbox(final MailboxId 
mailboxId, MailboxSession mailboxSession) throws MailboxException {
-        MailboxQuery userMailboxesQuery = 
MailboxQuery.privateMailboxesBuilder(mailboxSession).expression("*").build();
+        MailboxQuery userMailboxesQuery = 
MailboxQuery.privateMailboxesBuilder(mailboxSession)
+            .expression(Wildcard.INSTANCE)
+            .build();
         return mailboxManager.search(userMailboxesQuery, mailboxSession)
             .stream()
             .filter(mailboxMetaData -> 
mailboxMetaData.getId().equals(mailboxId))

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 5ee075f..a125646 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -63,6 +63,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageId.Factory;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
+import org.apache.james.mailbox.model.search.MailboxNameExpression;
 import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
@@ -696,14 +697,15 @@ public class StoreMailboxManager implements 
MailboxManager {
 
     @VisibleForTesting
     public static MailboxPath getPathLike(MailboxQuery mailboxQuery, 
MailboxSession mailboxSession) {
-        String combinedName = mailboxQuery.getCombinedName()
-            .replace(mailboxQuery.getFreeWildcard(), SQL_WILDCARD_CHAR)
-            .replace(mailboxQuery.getLocalWildcard(), SQL_WILDCARD_CHAR)
+        MailboxNameExpression nameExpression = 
mailboxQuery.getMailboxNameExpression();
+        String combinedName = nameExpression.getCombinedName()
+            .replace(nameExpression.getFreeWildcard(), SQL_WILDCARD_CHAR)
+            .replace(nameExpression.getLocalWildcard(), SQL_WILDCARD_CHAR)
             + SQL_WILDCARD_CHAR;
         MailboxPath base = new MailboxPath(
             
mailboxQuery.getNamespace().orElse(MailboxConstants.USER_NAMESPACE),
             
mailboxQuery.getUser().orElse(mailboxSession.getUser().getUserName()),
-            mailboxQuery.getBaseName().orElse(""));
+            combinedName);
         return new MailboxPath(base, combinedName);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
index 530a0fd..8f74c76 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedWildcard;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.junit.Test;
 
@@ -115,9 +116,8 @@ public abstract class AbstractCombinationManagerTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
 
-        MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .base(MailboxFixture.MAILBOX_PATH1)
-            .mailboxSession(session)
+        MailboxQuery mailboxQuery = 
MailboxQuery.privateMailboxesBuilder(session)
+            .expression(new 
PrefixedWildcard(MailboxFixture.MAILBOX_PATH1.getName()))
             .build();
         MessageId messageId = messageManager1.appendMessage(new 
ByteArrayInputStream(MAIL_CONTENT), new Date(), session, false, 
FLAGS).getMessageId();
 
@@ -133,10 +133,8 @@ public abstract class AbstractCombinationManagerTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
 
-        MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .username(MailboxFixture.USER)
-            .expression(String.valueOf(MailboxQuery.FREEWILDCARD))
-            .mailboxSession(session)
+        MailboxQuery mailboxQuery = 
MailboxQuery.privateMailboxesBuilder(session)
+            .matchesAllMailboxNames()
             .build();
         MessageId messageId = messageManager1.appendMessage(new 
ByteArrayInputStream(MAIL_CONTENT), new Date(), session, false, 
FLAGS).getMessageId();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index ed736ac..656fdd3 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -40,7 +40,10 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageId.Factory;
 import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.search.MailboxNameExpression;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedRegex;
+import org.apache.james.mailbox.model.search.PrefixedWildcard;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -177,8 +180,7 @@ public class StoreMailboxManagerTest {
         //Given
         MailboxSession session = new MockMailboxSession("user");
         MailboxQuery.Builder testee = MailboxQuery.builder()
-            .expression("abc")
-            .mailboxSession(session);
+            .expression(new PrefixedRegex(EMPTY_PREFIX, "abc", 
session.getPathDelimiter()));
         //When
         MailboxQuery mailboxQuery = testee.build();
 
@@ -191,9 +193,8 @@ public class StoreMailboxManagerTest {
         //Given
         MailboxSession session = new MockMailboxSession("user");
         MailboxQuery.Builder testee = MailboxQuery.builder()
-            .base(MailboxPath.forUser("user", "prefix."))
-            .expression("abc")
-            .mailboxSession(session);
+            .expression(new PrefixedRegex("prefix.", "abc", 
session.getPathDelimiter()));
+
         //When
         MailboxQuery mailboxQuery = testee.build();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
index cfe604c..62b7d29 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
@@ -41,6 +41,7 @@ import 
org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedRegex;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.MDCBuilder;
 import org.slf4j.Logger;
@@ -74,10 +75,12 @@ public class LSubProcessor extends 
AbstractSubscriptionProcessor<LsubRequest> {
         }
 
         final MailboxQuery expression = MailboxQuery.builder()
-                .base(basePath)
-                .expression(CharsetUtil.decodeModifiedUTF7(mailboxName))
-                .mailboxSession(mailboxSession)
-                .build();
+            .userAndNamespaceFrom(basePath)
+            .expression(new PrefixedRegex(
+                basePath.getName(),
+                CharsetUtil.decodeModifiedUTF7(mailboxName),
+                mailboxSession.getPathDelimiter()))
+            .build();
         final Collection<String> mailboxResponses = new ArrayList<>();
         for (String mailbox : mailboxes) {
             respond(responder, expression, mailbox, true, mailboxes, 
mailboxResponses, mailboxSession.getPathDelimiter());

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
index 7d4bd31..b91ad75 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
@@ -46,6 +46,7 @@ import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxMetaData.Children;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedRegex;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.MDCBuilder;
 import org.slf4j.Logger;
@@ -173,9 +174,11 @@ public class ListProcessor extends 
AbstractMailboxProcessor<ListRequest> {
 
                 results = getMailboxManager().search(
                         MailboxQuery.builder()
-                            .base(basePath)
-                            
.expression(CharsetUtil.decodeModifiedUTF7(mailboxName))
-                            .mailboxSession(mailboxSession)
+                            .userAndNamespaceFrom(basePath)
+                            .expression(new PrefixedRegex(
+                                basePath.getName(),
+                                CharsetUtil.decodeModifiedUTF7(mailboxName),
+                                mailboxSession.getPathDelimiter()))
                             .build()
                         , mailboxSession);
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
 
b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
index 32cebbd..77f0ba1 100644
--- 
a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
+++ 
b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.Wildcard;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -109,7 +110,7 @@ public class MailboxProbeImpl implements GuiceProbe, 
MailboxProbe {
         try {
             mailboxSession = mailboxManager.createSystemSession(user);
             mailboxManager.startProcessingRequest(mailboxSession);
-            return searchUserMailboxes(user, mailboxSession)
+            return searchUserMailboxes(mailboxSession)
                     .stream()
                     .map(MailboxMetaData::getPath)
                     .map(MailboxPath::getName)
@@ -121,12 +122,10 @@ public class MailboxProbeImpl implements GuiceProbe, 
MailboxProbe {
         }
     }
 
-    private List<MailboxMetaData> searchUserMailboxes(String username, 
MailboxSession session) throws MailboxException {
+    private List<MailboxMetaData> searchUserMailboxes(MailboxSession session) 
throws MailboxException {
         return mailboxManager.search(
-            MailboxQuery.builder()
-                .base(MailboxPath.forUser(username, ""))
-                .expression("*")
-                .mailboxSession(session)
+            MailboxQuery.privateMailboxesBuilder(session)
+                .expression(Wildcard.INSTANCE)
                 .build(),
             session);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
----------------------------------------------------------------------
diff --git 
a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
 
b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
index 151ab62..30c01ac 100644
--- 
a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
+++ 
b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
@@ -81,7 +81,7 @@ public class MailboxManagerManagement extends StandardMBean 
implements MailboxMa
                      .build()) {
             session = mailboxManager.createSystemSession(username);
             mailboxManager.startProcessingRequest(session);
-            List<MailboxMetaData> mList = retrieveAllUserMailboxes(username, 
session);
+            List<MailboxMetaData> mList = retrieveAllUserMailboxes(session);
             for (MailboxMetaData aMList : mList) {
                 mailboxManager.deleteMailbox(aMList.getPath(), session);
             }
@@ -114,7 +114,7 @@ public class MailboxManagerManagement extends StandardMBean 
implements MailboxMa
                      .build()) {
             session = mailboxManager.createSystemSession(username);
             mailboxManager.startProcessingRequest(session);
-            List<MailboxMetaData> mList = retrieveAllUserMailboxes(username, 
session);
+            List<MailboxMetaData> mList = retrieveAllUserMailboxes(session);
             boxes = mList.stream()
                 .map(aMList -> aMList.getPath().getName())
                 .sorted()
@@ -211,12 +211,10 @@ public class MailboxManagerManagement extends 
StandardMBean implements MailboxMa
         }
     }
 
-    private List<MailboxMetaData> retrieveAllUserMailboxes(String username, 
MailboxSession session) throws MailboxException {
+    private List<MailboxMetaData> retrieveAllUserMailboxes(MailboxSession 
session) throws MailboxException {
         return mailboxManager.search(
-            MailboxQuery.builder()
-                .base(MailboxPath.forUser(username, ""))
-                .expression("*")
-                .mailboxSession(session)
+            MailboxQuery.privateMailboxesBuilder(session)
+                .matchesAllMailboxNames()
                 .build(),
             session);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractStorageQuota.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractStorageQuota.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractStorageQuota.java
index 816e83d..146e0c3 100755
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractStorageQuota.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractStorageQuota.java
@@ -35,10 +35,10 @@ import 
org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.FetchGroupImpl;
 import org.apache.james.mailbox.model.MailboxMetaData;
-import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.Wildcard;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.mailet.Experimental;
@@ -125,9 +125,8 @@ abstract public class AbstractStorageQuota extends 
AbstractQuotaMatcher {
             // get all mailboxes for the user to calculate the size
             // TODO: See JAMES-1198
             List<MailboxMetaData> mList = manager.search(
-                    MailboxQuery.builder()
-                        .base(MailboxPath.inbox(session))
-                        .mailboxSession(session)
+                    MailboxQuery.privateMailboxesBuilder(session)
+                        .expression(Wildcard.INSTANCE)
                         .build(),
                     session);
             for (MailboxMetaData aMList : mList) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
index 1354c20..eae7e13 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
@@ -139,7 +139,9 @@ public class GetMailboxesMethod implements Method {
 
     private Stream<Mailbox> retrieveAllMailboxes(MailboxSession 
mailboxSession) throws MailboxException {
         List<MailboxMetaData> userMailboxes = mailboxManager.search(
-            
MailboxQuery.privateMailboxesBuilder(mailboxSession).privateMailboxes().build(),
+            MailboxQuery.privateMailboxesBuilder(mailboxSession)
+                .matchesAllMailboxNames()
+                .build(),
             mailboxSession);
         return userMailboxes
             .stream()

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
index c51d6ad..500f9ab 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
@@ -32,6 +32,7 @@ import 
org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedWildcard;
 
 import com.github.fge.lambdas.Throwing;
 import com.github.fge.lambdas.functions.ThrowingFunction;
@@ -66,8 +67,7 @@ public class SystemMailboxesProviderImpl implements 
SystemMailboxesProvider {
     private Stream<MessageManager> searchMessageManagerByMailboxRole(Role 
aRole, MailboxSession session) throws MailboxException {
         ThrowingFunction<MailboxPath, MessageManager> loadMailbox = path -> 
mailboxManager.getMailbox(path, session);
         MailboxQuery mailboxQuery = 
MailboxQuery.privateMailboxesBuilder(session)
-            .privateMailboxes()
-            .expression(aRole.getDefaultMailbox())
+            .expression(new PrefixedWildcard(aRole.getDefaultMailbox()))
             .build();
         return mailboxManager.search(mailboxQuery, session)
             .stream()

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1030584/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
index be9713d..225d0bf 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
@@ -75,7 +75,7 @@ public class UserMailboxesService {
     public void deleteMailboxes(String username) throws MailboxException, 
UsersRepositoryException {
         usernamePreconditions(username);
         MailboxSession mailboxSession = 
mailboxManager.createSystemSession(USER_NAME);
-        listUserMailboxes(username, mailboxSession)
+        listUserMailboxes(mailboxSession)
             .map(MailboxMetaData::getPath)
             .forEach(Throwing.consumer(mailboxPath -> 
deleteMailbox(mailboxSession, mailboxPath)));
     }
@@ -83,7 +83,7 @@ public class UserMailboxesService {
     public List<MailboxResponse> listMailboxes(String username) throws 
MailboxException, UsersRepositoryException {
         usernamePreconditions(username);
         MailboxSession mailboxSession = 
mailboxManager.createSystemSession(USER_NAME);
-        return listUserMailboxes(username, mailboxSession)
+        return listUserMailboxes(mailboxSession)
             .map(mailboxMetaData -> new 
MailboxResponse(mailboxMetaData.getPath().getName()))
             .collect(Guavate.toImmutableList());
     }
@@ -105,7 +105,7 @@ public class UserMailboxesService {
     }
 
     private Stream<MailboxPath> listChildren(MailboxPath mailboxPath, 
MailboxSession mailboxSession) throws MailboxException {
-        return 
mailboxManager.search(createUserMailboxesQuery(mailboxPath.getUser()), 
mailboxSession)
+        return mailboxManager.search(createUserMailboxesQuery(mailboxSession), 
mailboxSession)
             .stream()
             .map(MailboxMetaData::getPath)
             .filter(path -> 
path.getHierarchyLevels(mailboxSession.getPathDelimiter()).contains(mailboxPath));
@@ -128,15 +128,13 @@ public class UserMailboxesService {
         return new MailboxPath(mailboxSession.getPersonalSpace(), username, 
mailboxName);
     }
 
-    private Stream<MailboxMetaData> listUserMailboxes(String username, 
MailboxSession mailboxSession) throws MailboxException {
-        return mailboxManager.search(createUserMailboxesQuery(username), 
mailboxSession)
+    private Stream<MailboxMetaData> listUserMailboxes(MailboxSession 
mailboxSession) throws MailboxException {
+        return mailboxManager.search(createUserMailboxesQuery(mailboxSession), 
mailboxSession)
             .stream();
     }
 
-    private MailboxQuery createUserMailboxesQuery(String username) {
-        return MailboxQuery.builder()
-            .username(username)
-            .privateMailboxes()
+    private MailboxQuery createUserMailboxesQuery(MailboxSession 
mailboxSession) {
+        return MailboxQuery.privateMailboxesBuilder(mailboxSession)
             .build();
     }
 


---------------------------------------------------------------------
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