You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2016/01/25 16:22:46 UTC
svn commit: r1726644 - in /james/project/trunk: mailbox/api/
mailbox/api/src/main/java/org/apache/james/mailbox/model/
mailbox/api/src/test/java/org/apache/james/mailbox/model/
server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/
Author: matthieu
Date: Mon Jan 25 15:22:46 2016
New Revision: 1726644
URL: http://svn.apache.org/viewvc?rev=1726644&view=rev
Log:
JAMES-1661 Define a builder for MailboxQuery to ease request construction
Modified:
james/project/trunk/mailbox/api/pom.xml
james/project/trunk/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxQuery.java
james/project/trunk/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxQueryTest.java
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
Modified: james/project/trunk/mailbox/api/pom.xml
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/api/pom.xml?rev=1726644&r1=1726643&r2=1726644&view=diff
==============================================================================
--- james/project/trunk/mailbox/api/pom.xml (original)
+++ james/project/trunk/mailbox/api/pom.xml Mon Jan 25 15:22:46 2016
@@ -33,6 +33,10 @@
<dependencies>
<dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
<groupId>${javax.mail.groupId}</groupId>
<artifactId>${javax.mail.artifactId}</artifactId>
</dependency>
@@ -66,5 +70,10 @@
<version>${assertj-1.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
Modified: james/project/trunk/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxQuery.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxQuery.java?rev=1726644&r1=1726643&r2=1726644&view=diff
==============================================================================
--- james/project/trunk/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxQuery.java (original)
+++ james/project/trunk/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxQuery.java Mon Jan 25 15:22:46 2016
@@ -22,6 +22,12 @@ package org.apache.james.mailbox.model;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
+import org.apache.james.mailbox.MailboxSession;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
/**
* Expresses select criteria for mailboxes.
@@ -46,6 +52,79 @@ public final class MailboxQuery {
* Use this wildcard to match every char except the hierarchy delimiter
*/
public final static char LOCALWILDCARD = '%';
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static Builder builder(MailboxSession session) {
+ return builder().pathDelimiter(session.getPathDelimiter()).username(session.getUser().getUserName());
+ }
+
+ public static class Builder {
+ private static final String EMPTY_PATH_NAME = "";
+ private MailboxPath base;
+ private String expression;
+ @VisibleForTesting char pathDelimiter;
+ @VisibleForTesting String username;
+ @VisibleForTesting Optional<String> pathName;
+ @VisibleForTesting Optional<String> namespace;
+
+ private Builder() {
+ this.pathName = Optional.absent();
+ this.namespace = Optional.absent();
+ }
+
+ public Builder base(MailboxPath base) {
+ this.base = base;
+ return this;
+ }
+
+ public Builder username(String username) {
+ this.username = username;
+ return this;
+ }
+
+ public Builder privateUserMailboxes() {
+ Preconditions.checkState(!pathName.isPresent());
+ Preconditions.checkState(!namespace.isPresent());
+ Preconditions.checkState(base == null);
+ this.namespace = Optional.of(MailboxConstants.USER_NAMESPACE);
+ this.pathName = Optional.of(EMPTY_PATH_NAME);
+ return matchesAll();
+ }
+
+ public Builder expression(String expression) {
+ this.expression = expression;
+ return this;
+ }
+
+ public Builder matchesAll() {
+ this.expression = String.valueOf(FREEWILDCARD);
+ return this;
+ }
+
+ public Builder pathDelimiter(char pathDelimiter) {
+ this.pathDelimiter = pathDelimiter;
+ return this;
+ }
+
+ public MailboxQuery build() {
+ Preconditions.checkState(base != null || username != null);
+ if (base != null && username != null) {
+ throw new IllegalStateException("'base' and 'username' are exclusives");
+ }
+ return new MailboxQuery(buildBase(), expression, pathDelimiter);
+ }
+
+ private MailboxPath buildBase() {
+ if (base != null) {
+ return base;
+ } else {
+ return new MailboxPath(namespace.or(MailboxConstants.USER_NAMESPACE), username, pathName.or(EMPTY_PATH_NAME));
+ }
+ }
+ }
/**
* Constructs an expression determining a set of mailbox names.
Modified: james/project/trunk/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxQueryTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxQueryTest.java?rev=1726644&r1=1726643&r2=1726644&view=diff
==============================================================================
--- james/project/trunk/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxQueryTest.java (original)
+++ james/project/trunk/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxQueryTest.java Mon Jan 25 15:22:46 2016
@@ -25,6 +25,13 @@ import org.junit.Test;
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.model.MailboxQuery.Builder;
+
public class MailboxQueryTest {
MailboxPath path;
@@ -248,6 +255,11 @@ public class MailboxQueryTest {
assertThat(new MailboxQuery(path, null, '.').isExpressionMatch("folder")).isFalse();
}
+ @Test(expected=IllegalStateException.class)
+ public void buildShouldThrowWhenNoBaseDefined() {
+ MailboxQuery.builder().expression("abc").pathDelimiter('/').build();
+ }
+
@Test
public void freeWildcardAreNotEscapedWithDotSeparator() {
assertThat(new MailboxQuery(path, "folder\\*", '.').isExpressionMatch("folder\\123")).isTrue();
@@ -258,4 +270,68 @@ public class MailboxQueryTest {
assertThat(new MailboxQuery(path, "folder\\%", '.').isExpressionMatch("folder\\123")).isTrue();
}
+ @Test
+ public void buildShouldMatchAllValuesWhenAll() {
+ MailboxQuery query = MailboxQuery.builder()
+ .base(path)
+ .matchesAll()
+ .pathDelimiter('.')
+ .build();
+ assertThat(query.isExpressionMatch("folder")).isTrue();
+ }
+
+ @Test
+ public void buildShouldConstructMailboxPathWhenPrivateUserMailboxes() {
+ MailboxPath expected = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "");
+ MailboxPath actual = MailboxQuery.builder()
+ .username("user")
+ .privateUserMailboxes()
+ .pathDelimiter('.')
+ .build().getBase();
+ assertThat(actual).isEqualTo(expected);
+ }
+
+ @Test
+ public void buildShouldMatchAllWhenPrivateUserMailboxes() {
+ MailboxQuery query = MailboxQuery.builder()
+ .username("user")
+ .privateUserMailboxes()
+ .pathDelimiter('.')
+ .build();
+ assertThat(query.isExpressionMatch("folder")).isTrue();
+ }
+
+ @Test
+ public void builderShouldInitFromSessionWhenGiven() {
+ 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);
+ Builder query = MailboxQuery.builder(mailboxSession);
+ assertThat(query.pathDelimiter).isEqualTo('#');
+ assertThat(query.username).isEqualTo("little bobby table");
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void builderShouldThrowWhenConflictingBase() {
+ MailboxQuery.builder().base(mock(MailboxPath.class)).username("user").build();
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void builderShouldThrowWhenOverwritingBaseParams() {
+ MailboxQuery.builder().base(mock(MailboxPath.class)).privateUserMailboxes().build();
+ }
+
+ @Test(expected=IllegalStateException.class)
+ public void builderShouldThrowWhenMissingUsername() {
+ MailboxQuery.builder().privateUserMailboxes().build();
+ }
+
+ @Test
+ public void builderShouldUseBaseWhenGiven() {
+ MailboxPath base = new MailboxPath("a", "b", "c");
+ MailboxQuery actual = MailboxQuery.builder().base(base).build();
+ assertThat(actual.getBase()).isSameAs(base);
+ }
}
Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java?rev=1726644&r1=1726643&r2=1726644&view=diff
==============================================================================
--- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java (original)
+++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java Mon Jan 25 15:22:46 2016
@@ -40,7 +40,6 @@ import org.apache.james.mailbox.MailboxS
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MailboxConstants;
import org.apache.james.mailbox.model.MailboxMetaData;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MailboxQuery;
@@ -112,12 +111,9 @@ public class GetMailboxesMethod<Id exten
}
private List<MailboxMetaData> retrieveUserMailboxes(MailboxSession session) throws MailboxException {
- String username = session.getUser().getUserName();
return mailboxManager.search(
- new MailboxQuery(new MailboxPath(MailboxConstants.USER_NAMESPACE, username, ""),
- "*",
- session.getPathDelimiter()),
- session);
+ MailboxQuery.builder(session).privateUserMailboxes().build(),
+ session);
}
private Optional<Mailbox> mailboxFromMailboxPath(MailboxPath mailboxPath, MailboxSession mailboxSession) {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org