[jira] [Closed] (JAMES-1686) Enhance MailboxExpressionTest to match best test practice
[ https://issues.apache.org/jira/browse/JAMES-1686?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Laura Royet closed JAMES-1686. -- > Enhance MailboxExpressionTest to match best test practice > - > > Key: JAMES-1686 > URL: https://issues.apache.org/jira/browse/JAMES-1686 > Project: James Server > Issue Type: Improvement >Reporter: Laura Royet > > Enhance MailboxExpressionTest to match best test practice -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Resolved] (JAMES-1686) Enhance MailboxExpressionTest to match best test practice
[ https://issues.apache.org/jira/browse/JAMES-1686?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Laura Royet resolved JAMES-1686. Resolution: Fixed merged > Enhance MailboxExpressionTest to match best test practice > - > > Key: JAMES-1686 > URL: https://issues.apache.org/jira/browse/JAMES-1686 > Project: James Server > Issue Type: Improvement >Reporter: Laura Royet > > Enhance MailboxExpressionTest to match best test practice -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[1/2] james-project git commit: JAMES-1686 Enhance MailboxExpressionTest to match best test practice
Repository: james-project Updated Branches: refs/heads/master 8b970f59d -> 11071d5cc JAMES-1686 Enhance MailboxExpressionTest to match best test practice Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c587fb67 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c587fb67 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c587fb67 Branch: refs/heads/master Commit: c587fb6709fd3e8bb1dfef5e920fb73e80f45914 Parents: e4424ad Author: Laura RoyetAuthored: Wed Feb 17 18:59:53 2016 +0100 Committer: Laura Royet Committed: Fri Mar 4 15:48:38 2016 +0100 -- .../james/mailbox/MailboxExpressionTest.java| 319 - .../james/mailbox/model/MailboxQueryTest.java | 1232 -- 2 files changed, 1096 insertions(+), 455 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/c587fb67/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxExpressionTest.java -- diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxExpressionTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxExpressionTest.java deleted file mode 100644 index 5f813c3..000 --- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxExpressionTest.java +++ /dev/null @@ -1,319 +0,0 @@ -/ - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information* - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the* - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the* - * specific language governing permissions and limitations * - * under the License. * - / - -package org.apache.james.mailbox; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.apache.james.mailbox.model.MailboxPath; -import org.apache.james.mailbox.model.MailboxQuery; -import org.junit.Test; - -public class MailboxExpressionTest { - -private static final String PART = "mailbox"; - -private static final String SECOND_PART = "sub"; - -private static final String BASE = "BASE"; -private static final MailboxPath BASE_PATH = new MailboxPath(null, null, BASE); - - -private MailboxQuery create(String expression) { -return new MailboxQuery(BASE_PATH, expression, '.'); -} - -@Test -public void testIsWild() throws Exception { -assertTrue(create("*").isWild()); -assertTrue(create("%").isWild()); -assertTrue(create("One*").isWild()); -assertTrue(create("*One").isWild()); -assertTrue(create("A*A").isWild()); -assertTrue(create("One%").isWild()); -assertTrue(create("%One").isWild()); -assertTrue(create("A%A").isWild()); -assertFalse(create("").isWild()); -assertFalse(create(null).isWild()); -assertFalse(create("ONE").isWild()); -} - -@Test -public void combinedNameWithNoExpressionShouldReturnBase() throws Exception { -MailboxQuery expression = new MailboxQuery(BASE_PATH, "", '.'); -assertThat(expression.getCombinedName()).isEqualTo(BASE); -} - -@Test -public void combinedNameOnNullShouldBeEmpty() throws Exception { -MailboxQuery expression = new MailboxQuery(new MailboxPath(null, null, null), null, '.'); -assertThat(expression.getCombinedName()).isEmpty(); -} - -@Test -public void combinedNameShouldContainBaseAndPart() throws Exception { -MailboxQuery expression = new MailboxQuery(BASE_PATH, PART, '.'); -assertThat(expression.getCombinedName()).isEqualTo(BASE + "." + PART); -} - -@Test -public void combinedNameOnPartStartingWithDelimiterShouldIgnoreDelimiter() throws Exception { -MailboxQuery expression =
[2/2] james-project git commit: Merge remote-tracking branch 'lroyet/JAMES-1686'
Merge remote-tracking branch 'lroyet/JAMES-1686' Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/11071d5c Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/11071d5c Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/11071d5c Branch: refs/heads/master Commit: 11071d5cc3a7e1d4711342934b8c5df806734ce9 Parents: 8b970f5 c587fb6 Author: Antoine DupratAuthored: Fri Mar 4 16:00:11 2016 +0100 Committer: Antoine Duprat Committed: Fri Mar 4 16:00:11 2016 +0100 -- .../james/mailbox/MailboxExpressionTest.java| 319 - .../james/mailbox/model/MailboxQueryTest.java | 1232 -- 2 files changed, 1096 insertions(+), 455 deletions(-) -- - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Commented] (JAMES-1700) New user provisionning throwing on concurrent requests
[ https://issues.apache.org/jira/browse/JAMES-1700?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15179921#comment-15179921 ] ASF GitHub Bot commented on JAMES-1700: --- Github user rouazana closed the pull request at: https://github.com/apache/james-project/pull/37 > New user provisionning throwing on concurrent requests > -- > > Key: JAMES-1700 > URL: https://issues.apache.org/jira/browse/JAMES-1700 > Project: James Server > Issue Type: Bug > Components: JMAP >Reporter: Antoine Duprat > > Such exception occured: > {code} > java.lang.RuntimeException: > org.apache.james.user.api.UsersRepositoryException: User with username > us...@open-paas.org already exist! > at com.google.common.base.Throwables.propagate(Throwables.java:160) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccountIfNeeded(FirstUserConnectionFilter.java:80) > at > org.apache.james.jmap.FirstUserConnectionFilter$$Lambda$96/446105096.accept(Unknown > Source) > at java.util.Optional.ifPresent(Optional.java:159) > at > org.apache.james.jmap.FirstUserConnectionFilter.doFilter(FirstUserConnectionFilter.java:69) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) > at > org.apache.james.jmap.AuthenticationFilter.doFilter(AuthenticationFilter.java:78) > at > org.apache.james.jmap.BypassAuthOnRequestMethod.tryAuth(BypassAuthOnRequestMethod.java:115) > at > org.apache.james.jmap.BypassAuthOnRequestMethod.doFilter(BypassAuthOnRequestMethod.java:97) > at > org.apache.james.jmap.AllowAllCrossOriginRequests.doFilter(AllowAllCrossOriginRequests.java:46) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) > at > org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) > at > org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513) > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119) > at org.eclipse.jetty.server.Server.handle(Server.java:517) > at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306) > at > org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) > at > org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261) > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) > at > org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75) > at > org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213) > at > org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147) > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) > at > org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) > at java.lang.Thread.run(Thread.java:745) > Caused by: org.apache.james.user.api.UsersRepositoryException: User with > username us...@open-paas.org already exist! > at > org.apache.james.user.cassandra.CassandraUsersRepository.doAddUser(CassandraUsersRepository.java:163) > at > org.apache.james.user.cassandra.CassandraUsersRepository.addUser(CassandraUsersRepository.java:145) > at > org.apache.james.jmap.FirstUserConnectionFilter.createUser(FirstUserConnectionFilter.java:94) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccount(FirstUserConnectionFilter.java:89) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccountIfNeeded(FirstUserConnectionFilter.java:77) > ... 24 more > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Commented] (JAMES-1700) New user provisionning throwing on concurrent requests
[ https://issues.apache.org/jira/browse/JAMES-1700?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15179920#comment-15179920 ] ASF GitHub Bot commented on JAMES-1700: --- Github user rouazana commented on the pull request: https://github.com/apache/james-project/pull/37#issuecomment-192296392 Reopen here: https://github.com/linagora/james-project/pull/178 > New user provisionning throwing on concurrent requests > -- > > Key: JAMES-1700 > URL: https://issues.apache.org/jira/browse/JAMES-1700 > Project: James Server > Issue Type: Bug > Components: JMAP >Reporter: Antoine Duprat > > Such exception occured: > {code} > java.lang.RuntimeException: > org.apache.james.user.api.UsersRepositoryException: User with username > us...@open-paas.org already exist! > at com.google.common.base.Throwables.propagate(Throwables.java:160) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccountIfNeeded(FirstUserConnectionFilter.java:80) > at > org.apache.james.jmap.FirstUserConnectionFilter$$Lambda$96/446105096.accept(Unknown > Source) > at java.util.Optional.ifPresent(Optional.java:159) > at > org.apache.james.jmap.FirstUserConnectionFilter.doFilter(FirstUserConnectionFilter.java:69) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) > at > org.apache.james.jmap.AuthenticationFilter.doFilter(AuthenticationFilter.java:78) > at > org.apache.james.jmap.BypassAuthOnRequestMethod.tryAuth(BypassAuthOnRequestMethod.java:115) > at > org.apache.james.jmap.BypassAuthOnRequestMethod.doFilter(BypassAuthOnRequestMethod.java:97) > at > org.apache.james.jmap.AllowAllCrossOriginRequests.doFilter(AllowAllCrossOriginRequests.java:46) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) > at > org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) > at > org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513) > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119) > at org.eclipse.jetty.server.Server.handle(Server.java:517) > at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306) > at > org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) > at > org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261) > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) > at > org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75) > at > org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213) > at > org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147) > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) > at > org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) > at java.lang.Thread.run(Thread.java:745) > Caused by: org.apache.james.user.api.UsersRepositoryException: User with > username us...@open-paas.org already exist! > at > org.apache.james.user.cassandra.CassandraUsersRepository.doAddUser(CassandraUsersRepository.java:163) > at > org.apache.james.user.cassandra.CassandraUsersRepository.addUser(CassandraUsersRepository.java:145) > at > org.apache.james.jmap.FirstUserConnectionFilter.createUser(FirstUserConnectionFilter.java:94) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccount(FirstUserConnectionFilter.java:89) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccountIfNeeded(FirstUserConnectionFilter.java:77) > ... 24 more > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Commented] (JAMES-1700) New user provisionning throwing on concurrent requests
[ https://issues.apache.org/jira/browse/JAMES-1700?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15179917#comment-15179917 ] ASF GitHub Bot commented on JAMES-1700: --- GitHub user rouazana opened a pull request: https://github.com/apache/james-project/pull/37 JAMES-1700 Don't fail in account creation if user already exists Using thread-weaver to really test racing condition. Manual mock seems to be necessary as Mockito and thread-weaver seem to conflict. You can merge this pull request into a Git repository by running: $ git pull https://github.com/rouazana/james-project JAMES-1700 Alternatively you can review and apply these changes as the patch at: https://github.com/apache/james-project/pull/37.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #37 commit e5fce8814f0531d8d334f8c242acc4823f4181c5 Author: Raphael OuazanaDate: 2016-03-04T13:59:56Z JAMES-1700 Don't fail in account creation if user already exists > New user provisionning throwing on concurrent requests > -- > > Key: JAMES-1700 > URL: https://issues.apache.org/jira/browse/JAMES-1700 > Project: James Server > Issue Type: Bug > Components: JMAP >Reporter: Antoine Duprat > > Such exception occured: > {code} > java.lang.RuntimeException: > org.apache.james.user.api.UsersRepositoryException: User with username > us...@open-paas.org already exist! > at com.google.common.base.Throwables.propagate(Throwables.java:160) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccountIfNeeded(FirstUserConnectionFilter.java:80) > at > org.apache.james.jmap.FirstUserConnectionFilter$$Lambda$96/446105096.accept(Unknown > Source) > at java.util.Optional.ifPresent(Optional.java:159) > at > org.apache.james.jmap.FirstUserConnectionFilter.doFilter(FirstUserConnectionFilter.java:69) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) > at > org.apache.james.jmap.AuthenticationFilter.doFilter(AuthenticationFilter.java:78) > at > org.apache.james.jmap.BypassAuthOnRequestMethod.tryAuth(BypassAuthOnRequestMethod.java:115) > at > org.apache.james.jmap.BypassAuthOnRequestMethod.doFilter(BypassAuthOnRequestMethod.java:97) > at > org.apache.james.jmap.AllowAllCrossOriginRequests.doFilter(AllowAllCrossOriginRequests.java:46) > at > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) > at > org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) > at > org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513) > at > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119) > at org.eclipse.jetty.server.Server.handle(Server.java:517) > at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306) > at > org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) > at > org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261) > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) > at > org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75) > at > org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213) > at > org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147) > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) > at > org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) > at java.lang.Thread.run(Thread.java:745) > Caused by: org.apache.james.user.api.UsersRepositoryException: User with > username us...@open-paas.org already exist! > at > org.apache.james.user.cassandra.CassandraUsersRepository.doAddUser(CassandraUsersRepository.java:163) > at > org.apache.james.user.cassandra.CassandraUsersRepository.addUser(CassandraUsersRepository.java:145) > at > org.apache.james.jmap.FirstUserConnectionFilter.createUser(FirstUserConnectionFilter.java:94) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccount(FirstUserConnectionFilter.java:89) > at > org.apache.james.jmap.FirstUserConnectionFilter.createAccountIfNeeded(FirstUserConnectionFilter.java:77) > ... 24 more > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To
[jira] [Commented] (IMAP-370) Consider supporting the upcoming MOVE extension
[ https://issues.apache.org/jira/browse/IMAP-370?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15179839#comment-15179839 ] Tellier Benoit commented on IMAP-370: - I just contributed a fix for the inheritance fix. I also activate the MOVE capability if supported by the backend. > Consider supporting the upcoming MOVE extension > --- > > Key: IMAP-370 > URL: https://issues.apache.org/jira/browse/IMAP-370 > Project: James Imap > Issue Type: Improvement > Components: Protocol >Reporter: Andrzej Rusin > Attachments: IMAP-370-2.patch, IMAP-370-capability-v1.patch, > IMAP-370-v1.patch > > > As we see at > http://datatracker.ietf.org/doc/draft-ietf-imapmove-command/ballot/ IETF is > about to finally accept the IMAP MOVE extension. > This extension enables great performance optimization possibilities for the > more advanced Mailstore backends, eg the ones that use a underlying > relational or non-relational database: > One of the most common usage scenarios in IMAP is moving messages across > folders, and with the MOVE extention it can be finally accomplished without a > COPY/DELETE cycle on certain Mailbox backends. > Therefore, in my belief, it would be very nice to have that extension > implemented in James. > Some of the bundled Mailstore implementations already are based on SQL/noSQL > datasources, and can directly benefit from it. > Some of the independent Mailstore implementations (including mine) can > benefit from it too. > Some of IMAP clients (including Thunderbird as of 3.something) already > support that extension or the X-MOVE or X-AOL-MOVE one. > So James has a great opportunity to be the leader of standards adoption on > the server side. > What do you think? Please comment. -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Commented] (IMAP-167) Add support for Quotas
[ https://issues.apache.org/jira/browse/IMAP-167?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=15179838#comment-15179838 ] Tellier Benoit commented on IMAP-167: - I contributed commits and MPT tests for that. Can someone close the issue ? Shouldn't these issue be migrated to protocols ? > Add support for Quotas > -- > > Key: IMAP-167 > URL: https://issues.apache.org/jira/browse/IMAP-167 > Project: James Imap > Issue Type: New Feature >Reporter: Norman Maurer > > It would be cool to support some kind of quotas. Thats not part of the IMAP > specification but its a very common need. -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Resolved] (MAILBOX-265) Cassandra backend must take fetchType into account
[ https://issues.apache.org/jira/browse/MAILBOX-265?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Tellier Benoit resolved MAILBOX-265. Resolution: Fixed > Cassandra backend must take fetchType into account > -- > > Key: MAILBOX-265 > URL: https://issues.apache.org/jira/browse/MAILBOX-265 > Project: James Mailbox > Issue Type: Improvement >Affects Versions: 0.6 >Reporter: Tellier Benoit > Fix For: 0.6 > > > Today, CassandraMessageMapper :: findInMailbox do not use fetch type. > This means that it retrieves always full messages from database, even when > not needed. > For instance this is the case upon SELECT statement, where the full mailbox > metadata is retrieved in order to build the UID <=>Message Sequence Number > mapping. > Making Cassandra backend sensible to Fetch Type will highly improve > efficiency of such an operation. -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[19/20] james-project git commit: IMAP-370 Add MOVE extension to supported commands in documentation
IMAP-370 Add MOVE extension to supported commands in documentation Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6ffe855a Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6ffe855a Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6ffe855a Branch: refs/heads/master Commit: 6ffe855a07220f6a45cfbd7bbec0602c5f3327f4 Parents: 33a53fa Author: Benoit TellierAuthored: Fri Feb 26 11:27:43 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- protocols/src/site/xdoc/imap4.xml | 7 --- server/src/site/xdoc/feature-protocols.xml | 20 +--- 2 files changed, 21 insertions(+), 6 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/6ffe855a/protocols/src/site/xdoc/imap4.xml -- diff --git a/protocols/src/site/xdoc/imap4.xml b/protocols/src/site/xdoc/imap4.xml index 909e5f4..ee37a0a 100644 --- a/protocols/src/site/xdoc/imap4.xml +++ b/protocols/src/site/xdoc/imap4.xml @@ -14,7 +14,7 @@ software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - specific language govaerning permissions and limitations + specific language governing permissions and limitations under the License. --> @@ -56,10 +56,11 @@ ENABLE (in release 0.2.1) CONDSTORE (RFC 4551 http://www.ietf.org/rfc/rfc4551.txt in release 0.3) RESYNCH (RFC 5162 http://www.ietf.org/rfc/rfc5162.txt in trunk) + MOVE (RFC 6851 https://tools.ietf.org/html/rfc6851 in trunk). This is enabled only if you use a MailboxManager exposing the Move capability - We follow RFC2683 recommandations for our implementations: + We follow RFC2683 recommendations for our implementations: - IMAP4 Implementation Recommandations (RFC 2683 http://www.ietf.org/rfc/rfc2683.txt) + IMAP4 Implementation Recommendations (RFC 2683 http://www.ietf.org/rfc/rfc2683.txt) Interesting features: http://git-wip-us.apache.org/repos/asf/james-project/blob/6ffe855a/server/src/site/xdoc/feature-protocols.xml -- diff --git a/server/src/site/xdoc/feature-protocols.xml b/server/src/site/xdoc/feature-protocols.xml index 687ddb3..a479726 100644 --- a/server/src/site/xdoc/feature-protocols.xml +++ b/server/src/site/xdoc/feature-protocols.xml @@ -52,7 +52,10 @@ client/server communication. More information on configuring the SMTP service can be found here. - + + You can find further information about supported protocols and RFCs +http://james.apache.org/protocols/smtp.html;>on the JAMES-PROTOCOLS project SMTP page + @@ -66,7 +69,15 @@ IMAP4 client connecting to the server. More information on configuring the IMAP4 service can be found here. - + + You can find further information about supported protocols and RFCs +http://james.apache.org/protocols/imap4.html;>on the JAMES-PROTOCOLS project IMAP4 page + + + +Note that MOVE extension (RFC-6851) needs a MailboxManager implementing the move function. For now, this is only done with +the CassandraMailboxManager + @@ -80,7 +91,10 @@ POP3 client connecting to the server. More information on configuring the POP3 service can be found here. - + + You can find further information about supported protocols and RFCs +http://james.apache.org/protocols/pop3.html;>on the JAMES-PROTOCOLS project POP3 page + - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[15/20] james-project git commit: IMAP-370 Mailbox configuration page should link to mailbox project page and include a notice about Cassandra back-end
IMAP-370 Mailbox configuration page should link to mailbox project page and include a notice about Cassandra back-end Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c7e784f4 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c7e784f4 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c7e784f4 Branch: refs/heads/master Commit: c7e784f479616bf7f8fee2ffe4e8b609a0c39f30 Parents: 2782a95 Author: Benoit TellierAuthored: Fri Feb 26 14:19:20 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- server/src/site/xdoc/config-mailbox.xml | 5 - 1 file changed, 4 insertions(+), 1 deletion(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/c7e784f4/server/src/site/xdoc/config-mailbox.xml -- diff --git a/server/src/site/xdoc/config-mailbox.xml b/server/src/site/xdoc/config-mailbox.xml index c37d7bf..bdb6307 100644 --- a/server/src/site/xdoc/config-mailbox.xml +++ b/server/src/site/xdoc/config-mailbox.xml @@ -35,9 +35,12 @@ provider -Supported providers are: jpa (default), jcr, maildir, memory. Be aware that maildir will only work on unix like operation systems! +Supported providers are: jpa (default), jcr, maildir, cassandra, memory. Be aware that maildir will only work on unix like operation systems! +Cassandra mailbox need to be compiled and run using java 8. + See http://james.apache.org/mailbox/index.html;>documentation page to learn more about the different back-ends and their capabilities. + - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[18/20] james-project git commit: IMAP-370 Document capabilities on mailboxes + add cassandra page
IMAP-370 Document capabilities on mailboxes + add cassandra page Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/2782a955 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/2782a955 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/2782a955 Branch: refs/heads/master Commit: 2782a9551dd8e8c0a0523b447542af33348832e6 Parents: 6ffe855 Author: Benoit TellierAuthored: Fri Feb 26 14:09:52 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- mailbox/src/site/site.xml | 2 +- mailbox/src/site/xdoc/index.xml | 8 + mailbox/src/site/xdoc/mailbox-api.xml | 10 +- mailbox/src/site/xdoc/mailbox-cassandra.xml | 40 mailbox/src/site/xdoc/mailbox-guice.xml | 33 --- mailbox/src/site/xdoc/mailbox-hbase.xml | 11 --- mailbox/src/site/xdoc/mailbox-jcr.xml | 1 + mailbox/src/site/xdoc/mailbox-jpa.xml | 3 +- mailbox/src/site/xdoc/mailbox-maildir.xml | 3 +- mailbox/src/site/xdoc/mailbox-memory.xml| 1 + mailbox/src/site/xdoc/mailbox-spring.xml| 2 +- mailbox/src/site/xdoc/mailbox-store.xml | 6 ++-- 12 files changed, 74 insertions(+), 46 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/2782a955/mailbox/src/site/site.xml -- diff --git a/mailbox/src/site/site.xml b/mailbox/src/site/site.xml index 0ab1cd4..ca68afe 100644 --- a/mailbox/src/site/site.xml +++ b/mailbox/src/site/site.xml @@ -45,6 +45,7 @@ + @@ -52,7 +53,6 @@ - http://git-wip-us.apache.org/repos/asf/james-project/blob/2782a955/mailbox/src/site/xdoc/index.xml -- diff --git a/mailbox/src/site/xdoc/index.xml b/mailbox/src/site/xdoc/index.xml index 3abe9bc..f91c206 100644 --- a/mailbox/src/site/xdoc/index.xml +++ b/mailbox/src/site/xdoc/index.xml @@ -46,6 +46,14 @@ You can http://james.apache.org/download.cgi;>download current 0.4 release. The API as the schemas for the different implementations are susceptible to evolve. + Here are the different implementations of the mailbox we propose : + Memory for testing purposes + Cassandra + Maildir + JPA + JCR + HBase) + http://git-wip-us.apache.org/repos/asf/james-project/blob/2782a955/mailbox/src/site/xdoc/mailbox-api.xml -- diff --git a/mailbox/src/site/xdoc/mailbox-api.xml b/mailbox/src/site/xdoc/mailbox-api.xml index f80f326..a0084ce 100644 --- a/mailbox/src/site/xdoc/mailbox-api.xml +++ b/mailbox/src/site/xdoc/mailbox-api.xml @@ -49,7 +49,15 @@ The Mailbox Manager is responsible for session creation, operations on mailbox (create, delete, search) - and to return a Message Manager. It also allows to copy and list messages. + and to return a Message Manager. It also allows to copy and list messages. + + + +Mailbox manager capabilities represents which operations a mailbox manager is able to support. For now the list is : +Basic: supports all basic operations +Move: implements the move capability + + + + + +Mailbox Cassandra + + + + + +This module provides a mailbox implementation for persisting mailboxes (messages, and subscriptions) in a Cassandra cluster. +It supports the Basic and Move capabilities. + + + +The Cassandra implementation comes with a CassandraMailboxManager and a CassandraMessageManager for persisting users mailboxes. +This implementation also have a CurrentQuotaManager and a MaxQuotaManager, for storing users quotas in a Cassandra cluster. + + + + + http://git-wip-us.apache.org/repos/asf/james-project/blob/2782a955/mailbox/src/site/xdoc/mailbox-guice.xml -- diff --git a/mailbox/src/site/xdoc/mailbox-guice.xml b/mailbox/src/site/xdoc/mailbox-guice.xml deleted file mode 100644 index 6abdf12..000 --- a/mailbox/src/site/xdoc/mailbox-guice.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Mailbox Guice - - - - - - - - - - http://git-wip-us.apache.org/repos/asf/james-project/blob/2782a955/mailbox/src/site/xdoc/mailbox-hbase.xml -- diff --git a/mailbox/src/site/xdoc/mailbox-hbase.xml
[17/20] james-project git commit: IMAP-370 MOVE capability should be announced when MailboxManager supports Move capability
IMAP-370 MOVE capability should be announced when MailboxManager supports Move capability Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/33a53faa Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/33a53faa Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/33a53faa Branch: refs/heads/master Commit: 33a53faaa2b4f77a77f1dca6452cc325dcf1d4ac Parents: f37d2b4 Author: Benoit TellierAuthored: Thu Feb 25 14:17:46 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../src/main/resources/org/apache/james/imap/scripts/Move.test | 5 + 1 file changed, 5 insertions(+) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/33a53faa/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Move.test -- diff --git a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Move.test b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Move.test index ade2415..de6067c 100644 --- a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Move.test +++ b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Move.test @@ -16,6 +16,11 @@ # specific language governing permissions and limitations # # under the License. # + +C: a0 CAPABILITY +S: \* CAPABILITY .* MOVE .* +S: a0 OK CAPABILITY completed. + C: a1 CREATE moved S: a1 OK CREATE completed. - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[16/20] james-project git commit: MAILBOX-265 Cassandra Message Mapper should take Headers and Metadata fetch Type into account
MAILBOX-265 Cassandra Message Mapper should take Headers and Metadata fetch Type into account Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7a86fe1a Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7a86fe1a Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7a86fe1a Branch: refs/heads/master Commit: 7a86fe1a7250fa05c658cf817190c2eff7e83c1f Parents: 6a90560 Author: Benoit TellierAuthored: Thu Mar 3 11:52:26 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../cassandra/mail/CassandraMessageMapper.java | 103 +-- .../cassandra/table/CassandraMessageTable.java | 3 + 2 files changed, 72 insertions(+), 34 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/7a86fe1a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java -- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java index e001839..a401b90 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java @@ -33,10 +33,12 @@ import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BOD import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BODY_START_OCTET; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.FIELDS; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.FULL_CONTENT_OCTETS; +import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.HEADERS; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.HEADER_CONTENT; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.IMAP_UID; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.INTERNAL_DATE; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.MAILBOX_ID; +import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.METADATA; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.MOD_SEQ; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.PROPERTIES; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.TABLE_NAME; @@ -164,15 +166,15 @@ public class CassandraMessageMapper implements MessageMapper { @Override public Iterator findInMailbox(Mailbox mailbox, MessageRange set, FetchType ftype, int max) throws MailboxException { -return CassandraUtils.convertToStream(session.execute(buildQuery(mailbox, set))) -.map(this::message) +return CassandraUtils.convertToStream(session.execute(buildQuery(mailbox, set, ftype))) +.map(row -> message(row, ftype)) .sorted(Comparator.comparingLong(MailboxMessage::getUid)) .iterator(); } @Override public List findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException { -return CassandraUtils.convertToStream(session.execute(selectAll(mailbox).and((eq(RECENT, true) +return CassandraUtils.convertToStream(session.execute(selectAll(mailbox, FetchType.Metadata).and((eq(RECENT, true) .map((row) -> row.getLong(IMAP_UID)) .sorted() .collect(Collectors.toList()); @@ -180,7 +182,7 @@ public class CassandraMessageMapper implements MessageMapper { @Override public Long findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException { -return CassandraUtils.convertToStream(session.execute(selectAll(mailbox).and((eq(SEEN, false) +return CassandraUtils.convertToStream(session.execute(selectAll(mailbox, FetchType.Metadata).and((eq(SEEN, false) .map((row) -> row.getLong(IMAP_UID)) .sorted() .findFirst() @@ -189,8 +191,8 @@ public class CassandraMessageMapper implements MessageMapper { @Override public Map expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set) throws MailboxException { -return CassandraUtils.convertToStream(session.execute(buildQuery(mailbox, set).and(eq(DELETED, true -.map(this::message) +return CassandraUtils.convertToStream(session.execute(buildQuery(mailbox, set,
[20/20] james-project git commit: MAILBOX-265 Cassandra Message Mapper should take limit into account
MAILBOX-265 Cassandra Message Mapper should take limit into account Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/8b970f59 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/8b970f59 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/8b970f59 Branch: refs/heads/master Commit: 8b970f59d6103ad1852409b5e11939b7d7d4b2c6 Parents: fb4a3ec Author: Benoit TellierAuthored: Thu Mar 3 12:05:51 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:25 2016 +0700 -- .../mailbox/cassandra/mail/CassandraMessageMapper.java | 11 ++- .../store/mail/model/AbstractMessageMapperTest.java | 3 --- 2 files changed, 10 insertions(+), 4 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/8b970f59/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java -- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java index 7f9bbc4..b406391 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java @@ -69,6 +69,8 @@ import javax.mail.Flags; import javax.mail.Flags.Flag; import javax.mail.util.SharedByteArrayInputStream; +import com.datastax.driver.core.Statement; +import com.datastax.driver.core.querybuilder.Select; import com.google.common.base.Throwables; import org.apache.james.backends.cassandra.init.CassandraTypesProvider; import org.apache.james.backends.cassandra.utils.CassandraConstants; @@ -167,12 +169,19 @@ public class CassandraMessageMapper implements MessageMapper { @Override public Iterator findInMailbox(Mailbox mailbox, MessageRange set, FetchType ftype, int max) throws MailboxException { -return CassandraUtils.convertToStream(session.execute(buildQuery(mailbox, set, ftype))) +return CassandraUtils.convertToStream(session.execute(buildSelectQueryWithLimit(buildQuery(mailbox, set, ftype), max))) .map(row -> message(row, ftype)) .sorted(Comparator.comparingLong(MailboxMessage::getUid)) .iterator(); } +private Statement buildSelectQueryWithLimit(Select.Where selectStatement, int max) { +if (max <= 0) { +return selectStatement; +} +return selectStatement.limit(max); +} + @Override public List findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException { return CassandraUtils.convertToStream(session.execute(selectAll(mailbox, FetchType.Metadata).and((eq(RECENT, true) http://git-wip-us.apache.org/repos/asf/james-project/blob/8b970f59/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java -- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java index a8ede55..3198507 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java @@ -44,7 +44,6 @@ import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; public abstract class AbstractMessageMapperTest { @@ -256,8 +255,6 @@ public abstract class AbstractMessageMapperTest { assertThat(retrievedMessageIterator).isEmpty(); } -// No limit used for the moment -@Ignore @Test public void retrievingMessagesWithALimitShouldLimitTheNumberOfMessages() throws MailboxException { int limit = 2; - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[12/20] james-project git commit: IMAP-370 MOVE capability should be exposed and MoveProcessor enabled only if implemented by the MailboxManager
IMAP-370 MOVE capability should be exposed and MoveProcessor enabled only if implemented by the MailboxManager Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f37d2b42 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f37d2b42 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f37d2b42 Branch: refs/heads/master Commit: f37d2b42a8121827a0092ca71a6e3b35d78004fc Parents: 7958d56 Author: Benoit TellierAuthored: Thu Feb 25 13:30:44 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../apache/james/mailbox/MailboxManager.java| 7 +++ .../cassandra/CassandraMailboxManager.java | 9 .../mailbox/store/StoreMailboxManager.java | 7 +++ .../imap/processor/DefaultProcessorChain.java | 10 +++- .../james/imap/processor/MoveProcessor.java | 53 ++-- .../james/imap/processor/MoveProcessorTest.java | 14 ++ .../base/MailboxEventAnalyserTest.java | 10 +++- 7 files changed, 90 insertions(+), 20 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java -- diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java index 712291d..22cad9d 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java @@ -69,6 +69,13 @@ import org.slf4j.Logger; public interface MailboxManager extends RequestAware, MailboxListenerSupport { +enum Capabilities { +Basic, +Move +} + +List getSupportedCapabilities(); + /** * Return the delimiter to use for folders * http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java -- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java index 2f8c736..369a928 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java @@ -19,6 +19,8 @@ package org.apache.james.mailbox.cassandra; +import java.util.List; + import javax.inject.Inject; import javax.inject.Singleton; @@ -36,6 +38,8 @@ import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox; import org.apache.james.mailbox.store.search.MessageSearchIndex; +import com.google.common.collect.Lists; + /** * Cassandra implementation of {@link StoreMailboxManager} */ @@ -60,6 +64,11 @@ public class CassandraMailboxManager extends StoreMailboxManager { } @Override +public List getSupportedCapabilities() { +return Lists.newArrayList(Capabilities.Basic, Capabilities.Move); +} + +@Override protected Mailbox doCreateMailbox(MailboxPath mailboxPath, MailboxSession session) throws MailboxException { SimpleMailbox cassandraMailbox = new SimpleMailbox<>(mailboxPath, randomUidValidity()); cassandraMailbox.setACL(SimpleMailboxACL.EMPTY); http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/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 9262a87..4d7f463 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 @@ -71,6 +71,8 @@ import org.apache.james.mailbox.store.transaction.Mapper; import org.apache.james.mailbox.store.transaction.TransactionalMapper; import org.slf4j.Logger; +import com.google.common.collect.Lists; + /** * This base class of an {@link MailboxManager} implementation provides a high-level api for writing your own * {@link MailboxManager} implementation. If you plan to write your own {@link MailboxManager} its most times so easiest @@ -196,6 +198,11 @@ public class StoreMailboxManager implements
[04/20] james-project git commit: IMAP-370 Solve inheritance bugg on request handling
IMAP-370 Solve inheritance bugg on request handling Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/792a87a0 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/792a87a0 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/792a87a0 Branch: refs/heads/master Commit: 792a87a04872842060cd9054a86bb6de8987ca19 Parents: b06992f Author: Benoit TellierAuthored: Wed Feb 24 13:31:53 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:19 2016 +0700 -- .../AbstractMessageRangeCommandParser.java | 45 .../imap/decode/parser/CopyCommandParser.java | 26 + .../imap/decode/parser/MoveCommandParser.java | 5 +- .../request/AbstractMessageRangeRequest.java| 49 .../james/imap/message/request/CopyRequest.java | 35 +- .../james/imap/message/request/MoveRequest.java | 5 +- .../AbstractMessageRangeProcessor.java | 114 +++ .../james/imap/processor/CopyProcessor.java | 93 ++- .../imap/processor/DefaultProcessorChain.java | 5 +- .../james/imap/processor/MoveProcessor.java | 23 ++-- 10 files changed, 245 insertions(+), 155 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/792a87a0/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java -- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java new file mode 100644 index 000..0a2f81b --- /dev/null +++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java @@ -0,0 +1,45 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the* + * specific language governing permissions and limitations * + * under the License. * + / + +package org.apache.james.imap.decode.parser; + +import org.apache.james.imap.api.ImapCommand; +import org.apache.james.imap.api.ImapMessage; +import org.apache.james.imap.api.message.IdRange; +import org.apache.james.imap.api.process.ImapSession; +import org.apache.james.imap.decode.ImapRequestLineReader; +import org.apache.james.imap.message.request.AbstractMessageRangeRequest; +import org.apache.james.protocols.imap.DecodingException; + +public abstract class AbstractMessageRangeCommandParser extends AbstractUidCommandParser { + +public AbstractMessageRangeCommandParser(ImapCommand command) { +super(command); +} + +protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException { +IdRange[] idSet = request.parseIdRange(session); +String mailboxName = request.mailbox(); +request.eol(); +return createRequest(command, tag, useUids, idSet, mailboxName); +} + +abstract protected AbstractMessageRangeRequest createRequest(ImapCommand command, String tag, boolean useUids, IdRange[] idSet, String mailboxName); + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/792a87a0/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CopyCommandParser.java -- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CopyCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CopyCommandParser.java index 4abc0b4..0487839 100644 ---
[11/20] james-project git commit: IMAP-370 Add MPT checks for MOVE command
IMAP-370 Add MPT checks for MOVE command Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7958d56f Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7958d56f Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7958d56f Branch: refs/heads/master Commit: 7958d56f2eab83795fb9367fe1019f6d05ea9e3c Parents: 53755c7 Author: Benoit TellierAuthored: Thu Feb 25 10:26:29 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../cassandra/CassandraMailboxTest.java | 4 +- .../james/mpt/imapmailbox/suite/Move.java | 44 + .../org/apache/james/imap/scripts/Move.test | 69 3 files changed, 116 insertions(+), 1 deletion(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/7958d56f/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java -- diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java index da7ce09..643c9c6 100644 --- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java +++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java @@ -28,6 +28,7 @@ import org.apache.james.mpt.imapmailbox.suite.FetchBodySection; import org.apache.james.mpt.imapmailbox.suite.FetchBodyStructure; import org.apache.james.mpt.imapmailbox.suite.FetchHeaders; import org.apache.james.mpt.imapmailbox.suite.Listing; +import org.apache.james.mpt.imapmailbox.suite.Move; import org.apache.james.mpt.imapmailbox.suite.NonAuthenticatedState; import org.apache.james.mpt.imapmailbox.suite.PartialFetch; import org.apache.james.mpt.imapmailbox.suite.QuotaTest; @@ -65,7 +66,8 @@ import org.junit.runners.Suite; SelectedState.class, UidSearch.class, UserFlagsSupport.class, -QuotaTest.class +QuotaTest.class, +Move.class }) @GuiceModules({ CassandraMailboxTestModule.class }) public class CassandraMailboxTest { http://git-wip-us.apache.org/repos/asf/james-project/blob/7958d56f/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Move.java -- diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Move.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Move.java new file mode 100644 index 000..489b148 --- /dev/null +++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Move.java @@ -0,0 +1,44 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the* + * specific language governing permissions and limitations * + * under the License. * + / + +package org.apache.james.mpt.imapmailbox.suite; + +import java.util.Locale; + +import javax.inject.Inject; + +import org.apache.james.mpt.api.HostSystem; +import org.apache.james.mpt.imapmailbox.suite.base.BaseSelectedState; +import org.junit.Test; + +public class Move extends BaseSelectedState { + +@Inject +private static HostSystem system; + +public Move() throws Exception { +super(system); +} + +@Test +public void moveShouldWork() throws Exception { +scriptTest("Move", Locale.US); +} + +}
[13/20] james-project git commit: IMAP-370 Kill un efficient and unnecessary prepared query from query string
IMAP-370 Kill un efficient and unnecessary prepared query from query string Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ca531c0d Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ca531c0d Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ca531c0d Branch: refs/heads/master Commit: ca531c0d9dbbae1facfd1b5abf1727575c152243 Parents: bb92cd4 Author: Benoit TellierAuthored: Thu Mar 3 10:25:03 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../cassandra/mail/CassandraMessageMapper.java | 16 1 file changed, 4 insertions(+), 12 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/ca531c0d/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java -- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java index 12137c5..e001839 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java @@ -19,7 +19,6 @@ package org.apache.james.mailbox.cassandra.mail; -import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker; import static com.datastax.driver.core.querybuilder.QueryBuilder.decr; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; import static com.datastax.driver.core.querybuilder.QueryBuilder.gte; @@ -94,14 +93,11 @@ import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage; import org.apache.james.mailbox.store.mail.model.impl.SimpleProperty; -import com.datastax.driver.core.BoundStatement; -import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; import com.datastax.driver.core.Session; import com.datastax.driver.core.UDTValue; import com.datastax.driver.core.querybuilder.Assignment; -import com.datastax.driver.core.querybuilder.Insert; import com.datastax.driver.core.querybuilder.QueryBuilder; import com.datastax.driver.core.querybuilder.Select.Where; import com.google.common.io.ByteStreams; @@ -322,7 +318,7 @@ public class CassandraMessageMapper implements MessageMapper { private MessageMetaData save(Mailbox mailbox, MailboxMessage message) throws MailboxException { try { -Insert query = insertInto(TABLE_NAME) +session.execute(insertInto(TABLE_NAME) .value(MAILBOX_ID, mailbox.getMailboxId().asUuid()) .value(IMAP_UID, message.getUid()) .value(MOD_SEQ, message.getModSeq()) @@ -338,8 +334,8 @@ public class CassandraMessageMapper implements MessageMapper { .value(SEEN, message.isSeen()) .value(USER, message.createFlags().contains(Flag.USER)) .value(USER_FLAGS, userFlagsSet(message)) -.value(BODY_CONTENT, bindMarker()) -.value(HEADER_CONTENT, bindMarker()) +.value(BODY_CONTENT, toByteBuffer(message.getBodyContent())) +.value(HEADER_CONTENT, toByteBuffer(message.getHeaderContent())) .value(PROPERTIES, message.getProperties().stream() .map(x -> typesProvider.getDefinedUserType(PROPERTIES) .newValue() @@ -347,12 +343,8 @@ public class CassandraMessageMapper implements MessageMapper { .setString(Properties.NAME, x.getLocalName()) .setString(Properties.VALUE, x.getValue())) .collect(Collectors.toList())) -.value(TEXTUAL_LINE_COUNT, message.getTextualLineCount()); -PreparedStatement preparedStatement = session.prepare(query.toString()); +.value(TEXTUAL_LINE_COUNT, message.getTextualLineCount())); - -BoundStatement boundStatement = preparedStatement.bind(toByteBuffer(message.getBodyContent()), toByteBuffer(message.getHeaderContent())); -session.execute(boundStatement); return new SimpleMessageMetaData(message); } catch (IOException e) { throw new MailboxException("Error saving mail", e); - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail:
[10/20] james-project git commit: IMAP-370 Factorize COPY operations with APPEND operations on Cassandra backend
IMAP-370 Factorize COPY operations with APPEND operations on Cassandra backend Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/bb92cd4b Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/bb92cd4b Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/bb92cd4b Branch: refs/heads/master Commit: bb92cd4b2367555d61c00ab2305ad29e3f8011b7 Parents: c7e784f Author: Benoit TellierAuthored: Thu Mar 3 10:10:28 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../mailbox/cassandra/mail/CassandraMessageMapper.java | 9 + 1 file changed, 1 insertion(+), 8 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/bb92cd4b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java -- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java index c46447d..12137c5 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java @@ -246,15 +246,8 @@ public class CassandraMessageMapper implements MessageMapper { @Override public MessageMetaData copy(Mailbox mailbox, MailboxMessage original) throws MailboxException { - -original.setUid(uidProvider.nextUid(mailboxSession, mailbox)); -original.setModSeq(modSeqProvider.nextModSeq(mailboxSession, mailbox)); -incrementCount(mailbox.getMailboxId()); -if(!original.isSeen()) { -incrementUnseen(mailbox.getMailboxId()); -} original.setFlags(new FlagsBuilder().add(original.createFlags()).add(Flag.RECENT).build()); -return save(mailbox, original); +return add(mailbox, original); } @Override - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[01/20] james-project git commit: IMAP-370 Missing license
Repository: james-project Updated Branches: refs/heads/master 0af4d200f -> 8b970f59d IMAP-370 Missing license Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/8a292171 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/8a292171 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/8a292171 Branch: refs/heads/master Commit: 8a292171f63472ac362a8a3f980f62a01a56baa7 Parents: 0af4d20 Author: Benoit TellierAuthored: Wed Feb 24 16:57:45 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:32:17 2016 +0700 -- .../james/imap/message/request/MoveRequest.java | 19 +++ 1 file changed, 19 insertions(+) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/8a292171/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java -- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java index 3f5370f..9015ea0 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java @@ -1,3 +1,22 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the* + * specific language governing permissions and limitations * + * under the License. * + / + package org.apache.james.imap.message.request; import org.apache.james.imap.api.ImapCommand; - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[06/20] james-project git commit: IMAP-370 Expunge notification should be sent upon move
IMAP-370 Expunge notification should be sent upon move Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/762af8ed Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/762af8ed Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/762af8ed Branch: refs/heads/master Commit: 762af8ed3f2309305663caf75d2da2db809645c9 Parents: 792a87a Author: Benoit TellierAuthored: Wed Feb 24 16:26:02 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:23 2016 +0700 -- .../apache/james/mailbox/store/MoveResult.java | 43 .../mailbox/store/StoreMessageManager.java | 15 --- 2 files changed, 53 insertions(+), 5 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/762af8ed/mailbox/store/src/main/java/org/apache/james/mailbox/store/MoveResult.java -- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MoveResult.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MoveResult.java new file mode 100644 index 000..76bbb86 --- /dev/null +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MoveResult.java @@ -0,0 +1,43 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the* + * specific language governing permissions and limitations * + * under the License. * + / + +package org.apache.james.mailbox.store; + +import java.util.Iterator; + +import org.apache.james.mailbox.model.MessageMetaData; + +public class MoveResult { + +private final Iterator movedMessages; +private final Iterator originalMessages; + +public MoveResult(Iterator movedMessages, Iterator originalMessages) { +this.movedMessages = movedMessages; +this.originalMessages = originalMessages; +} + +public Iterator getMovedMessages() { +return movedMessages; +} + +public Iterator getOriginalMessages() { +return originalMessages; +} +} http://git-wip-us.apache.org/repos/asf/james-project/blob/762af8ed/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java -- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java index f0098c3..6b842bb 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java @@ -84,6 +84,9 @@ import org.apache.james.mime4j.stream.MimeConfig; import org.apache.james.mime4j.stream.MimeTokenStream; import org.apache.james.mime4j.stream.RecursionMode; +import com.google.common.base.Function; +import com.google.common.collect.Iterators; + /** * Base class for {@link org.apache.james.mailbox.MessageManager} * implementations. @@ -716,23 +719,23 @@ public class StoreMessageManager implements org.apache.jam return copiedRows.iterator(); } -private Iterator move(Iterator originalRows, - MailboxSession session) throws MailboxException { +private MoveResult move(Iterator originalRows, MailboxSession session) throws MailboxException { final List movedRows = new ArrayList(); +final List originalRowsCopy = new ArrayList(); final MessageMapper messageMapper = mapperFactory.getMessageMapper(session); while (originalRows.hasNext()) { final MailboxMessage originalMessage = originalRows.next(); +
[14/20] james-project git commit: IMAP-370 In Memory implementation for the MOVE method
IMAP-370 In Memory implementation for the MOVE method Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6a90560a Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6a90560a Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6a90560a Branch: refs/heads/master Commit: 6a90560af84d2b1d01fb8573b6ee57be6a761e2b Parents: ca531c0 Author: Benoit TellierAuthored: Thu Mar 3 16:43:06 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../inmemory/InMemoryMailboxManager.java| 43 +++ .../inmemory/mail/InMemoryMessageMapper.java| 28 ++-- .../inmemory/InMemoryMailboxManagerTest.java| 8 ++-- .../inmemory/mail/InMemoryMapperProvider.java | 45 .../inmemory/mail/InMemoryMessageMoveTest.java | 30 + .../manager/InMemoryIntegrationResources.java | 4 +- .../mail/model/AbstractMessageMoveTest.java | 4 +- .../inmemory/InMemoryMailboxTest.java | 4 +- .../inmemory/host/InMemoryHostSystem.java | 15 +++ 9 files changed, 152 insertions(+), 29 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java -- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java new file mode 100644 index 000..1814766 --- /dev/null +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java @@ -0,0 +1,43 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the* + * specific language governing permissions and limitations * + * under the License. * + / + +package org.apache.james.mailbox.inmemory; + +import java.util.List; + +import org.apache.james.mailbox.MailboxPathLocker; +import org.apache.james.mailbox.acl.GroupMembershipResolver; +import org.apache.james.mailbox.acl.MailboxACLResolver; +import org.apache.james.mailbox.store.Authenticator; +import org.apache.james.mailbox.store.StoreMailboxManager; + +import com.google.common.collect.Lists; + +public class InMemoryMailboxManager extends StoreMailboxManager { + +public InMemoryMailboxManager(Authenticator authenticator, MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver) { +super(new InMemoryMailboxSessionMapperFactory(), authenticator, locker, aclResolver, groupMembershipResolver); +} + +@Override +public List getSupportedCapabilities() { +return Lists.newArrayList(Capabilities.Basic, Capabilities.Move); + +} +} http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java -- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java index b201d34..1986946 100644 --- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java @@ -55,10 +55,14 @@ public class InMemoryMessageMapper extends AbstractMessageMapper { } private Map getMembershipByUidForMailbox(Mailbox mailbox) { -
[05/20] james-project git commit: IMAP-370 Provide tests for CopyProcessor and MoveProcessor
IMAP-370 Provide tests for CopyProcessor and MoveProcessor Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/45edd6c0 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/45edd6c0 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/45edd6c0 Branch: refs/heads/master Commit: 45edd6c04f8d00fa4ea55d7d0c9400f6810f1140 Parents: 762af8e Author: Benoit TellierAuthored: Wed Feb 24 16:28:04 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:23 2016 +0700 -- protocols/imap/pom.xml | 5 + .../james/imap/processor/CopyProcessorTest.java | 232 +++ .../james/imap/processor/MoveProcessorTest.java | 231 ++ 3 files changed, 468 insertions(+) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/45edd6c0/protocols/imap/pom.xml -- diff --git a/protocols/imap/pom.xml b/protocols/imap/pom.xml index 20e8586..49c074f 100644 --- a/protocols/imap/pom.xml +++ b/protocols/imap/pom.xml @@ -96,6 +96,11 @@ test +org.mockito +mockito-core +test + + org.apache.james apache-james-mailbox-store test http://git-wip-us.apache.org/repos/asf/james-project/blob/45edd6c0/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java -- diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java new file mode 100644 index 000..bacef9d --- /dev/null +++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java @@ -0,0 +1,232 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the* + * specific language governing permissions and limitations * + * under the License. * + / + +package org.apache.james.imap.processor; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; + +import org.apache.james.imap.api.ImapCommand; +import org.apache.james.imap.api.ImapConstants; +import org.apache.james.imap.api.ImapSessionState; +import org.apache.james.imap.api.ImapSessionUtils; +import org.apache.james.imap.api.display.HumanReadableText; +import org.apache.james.imap.api.message.IdRange; +import org.apache.james.imap.api.message.response.StatusResponse; +import org.apache.james.imap.api.message.response.StatusResponseFactory; +import org.apache.james.imap.api.process.ImapProcessor; +import org.apache.james.imap.api.process.ImapSession; +import org.apache.james.imap.api.process.SelectedMailbox; +import org.apache.james.imap.message.request.CopyRequest; +import org.apache.james.imap.message.request.MoveRequest; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageManager; +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.MessageRange; +import org.apache.james.mailbox.store.MailboxMetaData; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Lists; + +public class CopyProcessorTest { + +public static final String TAG = "TAG"; +private static final Logger LOGGER
[09/20] james-project git commit: IMAP-370 Provide tests for CopyCommandParser and MoveCommandParser
IMAP-370 Provide tests for CopyCommandParser and MoveCommandParser Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/53755c7b Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/53755c7b Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/53755c7b Branch: refs/heads/master Commit: 53755c7b785c03ccaf6b92af73e321f9722e1d46 Parents: 45edd6c Author: Benoit TellierAuthored: Wed Feb 24 16:55:05 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- protocols/imap/pom.xml | 6 +++ .../request/AbstractMessageRangeRequest.java| 28 +++ .../imap/decode/parser/CopyParserTest.java | 49 .../imap/decode/parser/MoveParserTest.java | 49 4 files changed, 132 insertions(+) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/53755c7b/protocols/imap/pom.xml -- diff --git a/protocols/imap/pom.xml b/protocols/imap/pom.xml index 49c074f..305985d 100644 --- a/protocols/imap/pom.xml +++ b/protocols/imap/pom.xml @@ -86,6 +86,12 @@ guava +org.assertj +assertj-core +${assertj-1.version} +test + + org.jmock jmock test http://git-wip-us.apache.org/repos/asf/james-project/blob/53755c7b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java -- diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java index f9672a0..a6c56c1 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java @@ -19,9 +19,15 @@ package org.apache.james.imap.message.request; +import java.util.Arrays; +import java.util.List; + import org.apache.james.imap.api.ImapCommand; import org.apache.james.imap.api.message.IdRange; +import com.google.common.base.Objects; +import com.google.common.hash.HashCode; + public abstract class AbstractMessageRangeRequest extends AbstractImapRequest { private final IdRange[] idSet; @@ -46,4 +52,26 @@ public abstract class AbstractMessageRangeRequest extends AbstractImapRequest { public final boolean isUseUids() { return useUids; } + +@Override +public boolean equals(Object o) { +if (o == null || getClass() != o.getClass()) return false; + +AbstractMessageRangeRequest that = (AbstractMessageRangeRequest) o; + +return equals(this.idSet, that.idSet) +&& Objects.equal(this.mailboxName, that.mailboxName) +&& Objects.equal(this.useUids, that.useUids); +} + +private boolean equals(IdRange[] idSet1, IdRange[] idSet2) { +List idRanges1 = Arrays.asList(idSet1); +List idRanges2 = Arrays.asList(idSet2); +return Objects.equal(idRanges1, idRanges2); +} + +@Override +public int hashCode() { +return Objects.hashCode(idSet, mailboxName, useUids); +} } http://git-wip-us.apache.org/repos/asf/james-project/blob/53755c7b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java -- diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java new file mode 100644 index 000..05a5bfc --- /dev/null +++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java @@ -0,0 +1,49 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless
[07/20] james-project git commit: MAILBOX-265 Cassandra Message Mapper should take Body fetch Type into account
MAILBOX-265 Cassandra Message Mapper should take Body fetch Type into account Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/fb4a3ec3 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/fb4a3ec3 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/fb4a3ec3 Branch: refs/heads/master Commit: fb4a3ec303693d95403118ac9b284d1f61a5b561 Parents: 16cbae9 Author: Benoit TellierAuthored: Thu Mar 3 13:47:47 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../mailbox/cassandra/mail/CassandraMessageMapper.java | 11 +-- .../cassandra/modules/CassandraMessageModule.java| 4 ++-- .../mailbox/cassandra/table/CassandraMessageTable.java | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4a3ec3/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java -- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java index a401b90..7f9bbc4 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java @@ -28,6 +28,7 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.lte; import static com.datastax.driver.core.querybuilder.QueryBuilder.select; import static com.datastax.driver.core.querybuilder.QueryBuilder.set; import static com.datastax.driver.core.querybuilder.QueryBuilder.update; +import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BODY; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BODY_CONTENT; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BODY_OCTECTS; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.BODY_START_OCTET; @@ -277,7 +278,7 @@ public class CassandraMessageMapper implements MessageMapper { SimpleMailboxMessage message = new SimpleMailboxMessage<>( row.getDate(INTERNAL_DATE), -row.getInt(FULL_CONTENT_OCTETS), +row.getLong(FULL_CONTENT_OCTETS), row.getInt(BODY_START_OCTET), buildContent(row, fetchType), getFlags(row), @@ -469,6 +470,7 @@ public class CassandraMessageMapper implements MessageMapper { private String[] retrieveFields(FetchType fetchType) { switch (fetchType) { case Body: +return BODY; case Full: return FIELDS; case Headers: @@ -483,10 +485,11 @@ public class CassandraMessageMapper implements MessageMapper { private SharedByteArrayInputStream buildContent(Row row, FetchType fetchType) { switch (fetchType) { case Full: -case Body: return new SharedByteArrayInputStream(getFullContent(row)); case Headers: return new SharedByteArrayInputStream(getFieldContent(HEADER_CONTENT, row)); +case Body: +return new SharedByteArrayInputStream(getBodyContent(row)); case Metadata: return new SharedByteArrayInputStream(new byte[]{}); default: @@ -498,6 +501,10 @@ public class CassandraMessageMapper implements MessageMapper { return Bytes.concat(getFieldContent(HEADER_CONTENT, row), getFieldContent(BODY_CONTENT, row)); } +private byte[] getBodyContent(Row row) { +return Bytes.concat(new byte[row.getInt(BODY_START_OCTET)], getFieldContent(BODY_CONTENT, row)); +} + private byte[] getFieldContent(String field, Row row) { byte[] headerContent = new byte[row.getBytes(field).remaining()]; row.getBytes(field).get(headerContent); http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4a3ec3/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java -- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java index febfba0..d401782 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java +++
[08/20] james-project git commit: MAILBOX-265 FetchType FULL should be used when computing and reading Mime structure
MAILBOX-265 FetchType FULL should be used when computing and reading Mime structure Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/16cbae9f Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/16cbae9f Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/16cbae9f Branch: refs/heads/master Commit: 16cbae9fea243f68ba3ce94b16e5b58cdeaf7aaf Parents: 7a86fe1 Author: Benoit TellierAuthored: Thu Mar 3 14:50:31 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:35:24 2016 +0700 -- .../java/org/apache/james/mailbox/model/FetchGroupImpl.java| 6 ++ .../apache/james/mailbox/store/StoreMessageResultIterator.java | 5 - .../mailbox/store/StoreMailboxMessageResultIteratorTest.java | 3 ++- .../org/apache/james/mailbox/copier/MailboxCopierImpl.java | 3 ++- .../org/apache/james/pop3server/mailbox/MailboxAdapter.java| 3 ++- 5 files changed, 12 insertions(+), 8 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/16cbae9f/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroupImpl.java -- diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroupImpl.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroupImpl.java index b7faba7..38d4bd1 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroupImpl.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroupImpl.java @@ -42,16 +42,14 @@ public class FetchGroupImpl implements MessageResult.FetchGroup { private Set partContentDescriptors; public FetchGroupImpl() { -super(); +this(0, new HashSet()); } public FetchGroupImpl(int content) { -super(); -this.content = content; +this(content, new HashSet()); } public FetchGroupImpl(int content, Set partContentDescriptors) { -super(); this.content = content; this.partContentDescriptors = partContentDescriptors; } http://git-wip-us.apache.org/repos/asf/james-project/blob/16cbae9f/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java -- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java index 4e2b635..6741352 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java @@ -82,7 +82,10 @@ public class StoreMessageResultIterator implements Message headers = true; content -= FetchGroup.HEADERS; } -if ((content & FetchGroup.BODY_CONTENT) > 0) { +if (group.getPartContentDescriptors().size() > 0) { +full = true; +} +if ((content & FetchGroup.BODY_CONTENT ) > 0 ) { body = true; content -= FetchGroup.BODY_CONTENT; } http://git-wip-us.apache.org/repos/asf/james-project/blob/16cbae9f/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java -- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java index de9e35d..b60e238 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java @@ -22,6 +22,7 @@ package org.apache.james.mailbox.store; import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -50,7 +51,7 @@ public class StoreMailboxMessageResultIteratorTest { private final class TestFetchGroup implements FetchGroup { @Override public Set getPartContentDescriptors() { -return null; +return new HashSet(); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/16cbae9f/mailbox/tool/src/main/java/org/apache/james/mailbox/copier/MailboxCopierImpl.java -- diff --git
[02/20] james-project git commit: IMAP-370 Cassandra should implement move command
IMAP-370 Cassandra should implement move command Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ea9d77de Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ea9d77de Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ea9d77de Branch: refs/heads/master Commit: ea9d77dee363f4b197ff42eece6a731f64d63b17 Parents: 8a29217 Author: Benoit TellierAuthored: Tue Feb 23 16:11:15 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:32:49 2016 +0700 -- .../cassandra/mail/CassandraMessageMapper.java | 48 +++--- .../mail/CassandraMessageMoveTest.java | 30 .../mail/model/AbstractMessageMoveTest.java | 145 +++ 3 files changed, 202 insertions(+), 21 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/ea9d77de/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java -- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java index 1ec2348..c46447d 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java @@ -151,14 +151,18 @@ public class CassandraMessageMapper implements MessageMapper { @Override public void delete(Mailbox mailbox, MailboxMessage message) { +deleteUsingMailboxId(mailbox.getMailboxId(), message); +} + +private void deleteUsingMailboxId(CassandraId mailboxId, MailboxMessage message) { session.execute( QueryBuilder.delete() .from(TABLE_NAME) -.where(eq(MAILBOX_ID, mailbox.getMailboxId().asUuid())) +.where(eq(MAILBOX_ID, mailboxId.asUuid())) .and(eq(IMAP_UID, message.getUid(; -decrementCount(mailbox); +decrementCount(mailboxId); if (!message.isSeen()) { -decrementUnseen(mailbox); +decrementUnseen(mailboxId); } } @@ -196,8 +200,10 @@ public class CassandraMessageMapper implements MessageMapper { } @Override -public MessageMetaData move(Mailbox mailbox, MailboxMessage original) throws MailboxException { -throw new UnsupportedOperationException("Not implemented - see https://issues.apache.org/jira/browse/IMAP-370;); +public MessageMetaData move(Mailbox destinationMailbox, MailboxMessage original) throws MailboxException { +MessageMetaData messageMetaData = copy(destinationMailbox, original); +deleteUsingMailboxId(original.getMailboxId(), original); +return messageMetaData; } @Override @@ -216,9 +222,9 @@ public class CassandraMessageMapper implements MessageMapper { message.setModSeq(modSeqProvider.nextModSeq(mailboxSession, mailbox)); MessageMetaData messageMetaData = save(mailbox, message); if (!message.isSeen()) { -incrementUnseen(mailbox); +incrementUnseen(mailbox.getMailboxId()); } -incrementCount(mailbox); +incrementCount(mailbox.getMailboxId()); return messageMetaData; } @@ -243,9 +249,9 @@ public class CassandraMessageMapper implements MessageMapper { original.setUid(uidProvider.nextUid(mailboxSession, mailbox)); original.setModSeq(modSeqProvider.nextModSeq(mailboxSession, mailbox)); -incrementCount(mailbox); +incrementCount(mailbox.getMailboxId()); if(!original.isSeen()) { -incrementUnseen(mailbox); +incrementUnseen(mailbox.getMailboxId()); } original.setFlags(new FlagsBuilder().add(original.createFlags()).add(Flag.RECENT).build()); return save(mailbox, original); @@ -256,24 +262,24 @@ public class CassandraMessageMapper implements MessageMapper { return uidProvider.lastUid(mailboxSession, mailbox); } -private void decrementCount(Mailbox mailbox) { -updateMailbox(mailbox, decr(CassandraMailboxCountersTable.COUNT)); +private void decrementCount(CassandraId mailboxId) { +updateMailbox(mailboxId, decr(CassandraMailboxCountersTable.COUNT)); } -private void incrementCount(Mailbox mailbox) { -updateMailbox(mailbox, incr(CassandraMailboxCountersTable.COUNT)); +private void incrementCount(CassandraId mailboxId) { +updateMailbox(mailboxId, incr(CassandraMailboxCountersTable.COUNT)); } -private void
[03/20] james-project git commit: IMAP-370 Factorize code between copies and moves
IMAP-370 Factorize code between copies and moves Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/b06992f1 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/b06992f1 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/b06992f1 Branch: refs/heads/master Commit: b06992f18a09ca351d64880e37cc9ef7f13433d0 Parents: ea9d77d Author: Benoit TellierAuthored: Wed Feb 24 12:09:53 2016 +0700 Committer: Benoit Tellier Committed: Fri Mar 4 19:33:23 2016 +0700 -- .../james/mailbox/store/MessageBatcher.java | 57 .../mailbox/store/StoreMailboxManager.java | 57 +++- .../mailbox/store/StoreMessageManager.java | 39 --- .../james/mailbox/store/MessageBatcherTest.java | 71 4 files changed, 168 insertions(+), 56 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/b06992f1/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageBatcher.java -- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageBatcher.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageBatcher.java new file mode 100644 index 000..0631f02 --- /dev/null +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageBatcher.java @@ -0,0 +1,57 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the* + * specific language governing permissions and limitations * + * under the License. * + / + +package org.apache.james.mailbox.store; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.model.MessageRange; +import org.apache.james.mailbox.store.mail.model.MailboxId; +import org.msgpack.core.Preconditions; + +public class MessageBatcher { + +public static final int NO_BATCH_SIZE = 0; + +public interface BatchedOperation { +List execute(MessageRange messageRange) throws MailboxException; +} + +private final int moveBatchSize; + +public MessageBatcher(int moveBatchSize) { +Preconditions.checkArgument(moveBatchSize >= NO_BATCH_SIZE); +this.moveBatchSize = moveBatchSize; +} + +public List batchMessages(MessageRange set, BatchedOperation batchedOperation) throws MailboxException { +if (moveBatchSize > 0) { +List movedRanges = new ArrayList(); +for (MessageRange messageRange : set.split(moveBatchSize)) { +movedRanges.addAll(batchedOperation.execute(messageRange)); +} +return movedRanges; +} else { +return batchedOperation.execute(set); +} +} + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/b06992f1/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 7a2fda2..9262a87 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 @@ -21,7 +21,6 @@ package org.apache.james.mailbox.store; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Random; @@ -99,9 +98,9 @@ public class StoreMailboxManager implements
[jira] [Closed] (JAMES-1699) setMessages - send message feature - add tests
[ https://issues.apache.org/jira/browse/JAMES-1699?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Fabien VIGNON closed JAMES-1699. Resolution: Done > setMessages - send message feature - add tests > -- > > Key: JAMES-1699 > URL: https://issues.apache.org/jira/browse/JAMES-1699 > Project: James Server > Issue Type: Improvement > Components: JMAP >Reporter: Fabien VIGNON > > recently added "setMessages - send a message" feature is missing some > integration tests. -- This message was sent by Atlassian JIRA (v6.3.4#6332) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[2/3] james-project git commit: JAMES-1699 spec: mark setMessages/send message as implemented
JAMES-1699 spec: mark setMessages/send message as implemented Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7d25d879 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7d25d879 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7d25d879 Branch: refs/heads/master Commit: 7d25d879745e1c123c3715434408b51718714b04 Parents: bf65ad9 Author: Fabien VignonAuthored: Thu Mar 3 15:43:02 2016 +0100 Committer: Fabien Vignon Committed: Fri Mar 4 10:51:54 2016 +0100 -- .../james/jmap/methods/SetMessagesMethodTest.java | 18 +- server/protocols/jmap/doc/specs/spec/message.mdwn | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/7d25d879/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java -- diff --git a/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java index fa16c1f..1828097 100644 --- a/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java +++ b/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java @@ -72,9 +72,9 @@ public abstract class SetMessagesMethodTest { private static final String NAME = "[0][0]"; private static final String ARGUMENTS = "[0][1]"; -public static final String SECOND_NAME = "[1][0]"; -public static final String SECOND_ARGUMENTS = "[1][1]"; -public static final String USERS_DOMAIN = "domain.tld"; +private static final String SECOND_NAME = "[1][0]"; +private static final String SECOND_ARGUMENTS = "[1][1]"; +private static final String USERS_DOMAIN = "domain.tld"; private final TemporaryFolder temporaryFolder = new TemporaryFolder(); private final EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(); @@ -670,7 +670,7 @@ public abstract class SetMessagesMethodTest { "\"setMessages\","+ "{" + " \"create\": { \"" + messageCreationId + "\" : {" + -"\"from\": { \"name\": \"MAILER-DEAMON\", \"email\": \"postmas...@example.com\"}," + +"\"from\": { \"name\": \"MAILER-DAEMON\", \"email\": \"postmas...@example.com\"}," + "\"to\": [{ \"name\": \"BOB\", \"email\": \"some...@example.com\"}]," + "\"subject\": \"Thank you for joining example.com!\"," + "\"textBody\": \"Hello someone, and thank you for joining example.com!\"," + @@ -828,7 +828,7 @@ public abstract class SetMessagesMethodTest { "\"setMessages\","+ "{" + " \"create\": { \"" + messageCreationId + "\" : {" + -"\"from\": { \"name\": \"MAILER-DEAMON\", \"email\": \"postmas...@example.com\"}," + +"\"from\": { \"name\": \"MAILER-DAEMON\", \"email\": \"postmas...@example.com\"}," + "\"to\": [{ \"name\": \"BOB\", \"email\": \"some...@example.com@example.com\"}]," + "\"cc\": [{ \"name\": \"ALICE\"}]," + "\"subject\": \"Thank you for joining example.com!\"," + @@ -984,7 +984,7 @@ public abstract class SetMessagesMethodTest { "\"setMessages\","+ "{" + " \"create\": { \"" + messageCreationId + "\" : {" + -"\"from\": { \"name\": \"MAILER-DEAMON\", \"email\": \"postmas...@example.com\"}," + +"\"from\": { \"name\": \"MAILER-DAEMON\", \"email\": \"postmas...@example.com\"}," + "\"to\": [{ \"name\": \"BOB\", \"email\": \"some...@example.com\"}]," + "\"cc\": [{ \"name\": \"ALICE\"}]," + "\"textBody\": \"Hello someone, and thank you for joining example.com!\"," + @@ -1015,7 +1015,7 @@ public abstract class SetMessagesMethodTest { } @Test -public void setMessagesShouldPushMessageIntoRecipientUsersInbox() throws Exception { +public void setMessagesShouldDeliverMessageToRecipient() throws Exception { // Sender jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "sent"); // Recipient @@ -1056,10 +1056,10 @@ public abstract class SetMessagesMethodTest {
[3/3] james-project git commit: Merge remote-tracking branch 'fvignon/JAMES-1699'
Merge remote-tracking branch 'fvignon/JAMES-1699' Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/0af4d200 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/0af4d200 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/0af4d200 Branch: refs/heads/master Commit: 0af4d200fbffc36f144f03edc5201420c220b582 Parents: 9e3a28c 7d25d87 Author: Antoine DupratAuthored: Fri Mar 4 11:01:13 2016 +0100 Committer: Antoine Duprat Committed: Fri Mar 4 11:01:13 2016 +0100 -- .../jmap/methods/SetMessagesMethodTest.java | 244 --- .../protocols/jmap/doc/specs/spec/message.mdwn | 1 - 2 files changed, 213 insertions(+), 32 deletions(-) -- - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[1/3] james-project git commit: JAMES-1699 add tests for JAMES-1692 setMessages - send a new message
Repository: james-project Updated Branches: refs/heads/master 9e3a28cdb -> 0af4d200f JAMES-1699 add tests for JAMES-1692 setMessages - send a new message check messsages are moved from sender's outbox to sent mailbox check recipient's inbox has a new message once sender has sent a new message. Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/bf65ad95 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/bf65ad95 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/bf65ad95 Branch: refs/heads/master Commit: bf65ad956bd7018759fefb8c187ab6980b7d Parents: 45d2607 Author: Fabien VignonAuthored: Tue Mar 1 14:58:16 2016 +0100 Committer: Fabien Vignon Committed: Fri Mar 4 10:51:53 2016 +0100 -- .../jmap/methods/SetMessagesMethodTest.java | 238 --- 1 file changed, 210 insertions(+), 28 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/bf65ad95/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java -- diff --git a/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java index 70dcd8f..fa16c1f 100644 --- a/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java +++ b/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/SetMessagesMethodTest.java @@ -39,6 +39,7 @@ import java.io.ByteArrayInputStream; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import javax.mail.Flags; @@ -59,6 +60,9 @@ import org.junit.rules.RuleChain; import org.junit.rules.TemporaryFolder; import com.google.common.base.Charsets; +import com.jayway.awaitility.Awaitility; +import com.jayway.awaitility.Duration; +import com.jayway.awaitility.core.ConditionFactory; import com.jayway.restassured.RestAssured; import com.jayway.restassured.builder.ResponseSpecBuilder; import com.jayway.restassured.http.ContentType; @@ -68,12 +72,15 @@ public abstract class SetMessagesMethodTest { private static final String NAME = "[0][0]"; private static final String ARGUMENTS = "[0][1]"; +public static final String SECOND_NAME = "[1][0]"; +public static final String SECOND_ARGUMENTS = "[1][1]"; +public static final String USERS_DOMAIN = "domain.tld"; private final TemporaryFolder temporaryFolder = new TemporaryFolder(); private final EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(); private final EmbeddedCassandra cassandra = EmbeddedCassandra.createStartServer(); private final JmapServer jmapServer = jmapServer(temporaryFolder, embeddedElasticSearch, cassandra); -private String outboxId; +private ConditionFactory calmlyAwait; protected abstract JmapServer jmapServer(TemporaryFolder temporaryFolder, EmbeddedElasticSearch embeddedElasticSearch, EmbeddedCassandra cassandra); @@ -91,32 +98,39 @@ public abstract class SetMessagesMethodTest { RestAssured.port = jmapServer.getPort(); RestAssured.config = newConfig().encoderConfig(encoderConfig().defaultContentCharset(Charsets.UTF_8)); -String domain = "domain.tld"; -username = "username@" + domain; +username = "username@" + USERS_DOMAIN; String password = "password"; -jmapServer.serverProbe().addDomain(domain); +jmapServer.serverProbe().addDomain(USERS_DOMAIN); jmapServer.serverProbe().addUser(username, password); -jmapServer.serverProbe().createMailbox("#private", "username", "inbox"); +jmapServer.serverProbe().createMailbox("#private", username, "inbox"); accessToken = JmapAuthentication.authenticateJamesUser(username, password); jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "outbox"); embeddedElasticSearch.awaitForElasticSearch(); -// Find the newly created outbox mailbox (using getMailboxes command on /jmap endpoint) -List
[1/2] james-project git commit: update docker/guice section in README
Repository: james-project Updated Branches: refs/heads/master 45d2607fb -> 9e3a28cdb update docker/guice section in README - add command for building james artifact (guice/cassandra section) - add missing jmap port mapping when running james container. - fix section's missing markdown formatting Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/e1b36e10 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/e1b36e10 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/e1b36e10 Branch: refs/heads/master Commit: e1b36e10425efaa14988a030dced820df6746702 Parents: 00678d8 Author: Fabien VignonAuthored: Tue Mar 1 14:50:10 2016 +0100 Committer: Fabien Vignon Committed: Tue Mar 1 15:23:30 2016 +0100 -- README.txt | 31 --- 1 file changed, 24 insertions(+), 7 deletions(-) -- http://git-wip-us.apache.org/repos/asf/james-project/blob/e1b36e10/README.txt -- diff --git a/README.txt b/README.txt index ce61fb3..a29b6ad 100644 --- a/README.txt +++ b/README.txt @@ -97,26 +97,43 @@ This feature available for two configurations : Run James with Java 8 + Guice + Cassandra + ElasticSearch = -* Requirements +## Requirements Built artifacts should be in ./dockerfiles/run/guice/destination folder. - -* Howto ? -You need a running cassandra in docker. To achieve this run : +If you haven't already: +```bash +$ docker build -t james/project dockerfiles/compilation/java-8 +$ docker run -v $HOME/.m2:/root/.m2 -v $PWD:/origin \ + -v $PWD/dockerfiles/run/guice/destination:/destination \ + -t james/project -s HEAD +``` + +## Howto ? +You need a running **cassandra** in docker. To achieve this run : +```bash $ docker run -d --name=cassandra cassandra:2.2.3 +``` -You need a running ElasticSearch in docker. To achieve this run : +You need a running **ElasticSearch** in docker. To achieve this run : +```bash $ docker run -d --name=elasticsearch elasticsearch:1.5.2 +``` We need to provide the key we will use for TLS. For obvious reasons, this is not provided in this git. -Copy your TSL keys to destination/run/guice/conf/keystore or generate it using the following command. The password must be james72laBalle to match default configuration. +Copy your TLS keys to `destination/run/guice/conf/keystore` or generate it using the following command. The password must be `james72laBalle` to match default configuration. +```bash $ keytool -genkey -alias james -keyalg RSA -keystore dockerfiles/run/guice/destination/conf/keystore +``` Then we need to build james container : +```bash $ docker build -t james_run dockerfiles/run/guice/ +``` To run this container : -$ docker run --hostname HOSTNAME -p "25:25" -p "110:110" -p "143:143" -p "465:465" -p "587:587" -p "993:993" --link cassandra:cassandra --link elasticsearch:elasticsearch --name james_run -t james_run +```bash +$ docker run --hostname HOSTNAME -p "25:25" -p 80:80 -p "110:110" -p "143:143" -p "465:465" -p "587:587" -p "993:993" --link cassandra:cassandra --link elasticsearch:elasticsearch --name james_run -t james_run +``` Where : - HOSTNAME: is the hostname you want to give to your James container. This DNS entry will be used to send mail to your James server. - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[2/2] james-project git commit: Merge remote-tracking branch 'fvignon/DockerJamesReadMeFix'
Merge remote-tracking branch 'fvignon/DockerJamesReadMeFix' Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9e3a28cd Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9e3a28cd Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9e3a28cd Branch: refs/heads/master Commit: 9e3a28cdb7c2745431a0361f5f07745496c45d66 Parents: 45d2607 e1b36e1 Author: Antoine DupratAuthored: Fri Mar 4 10:51:04 2016 +0100 Committer: Antoine Duprat Committed: Fri Mar 4 10:51:04 2016 +0100 -- README.txt | 31 --- 1 file changed, 24 insertions(+), 7 deletions(-) -- - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org