Author: btellier Date: Fri Jul 3 14:57:28 2015 New Revision: 1689032 URL: http://svn.apache.org/r1689032 Log: MAILBOX-246 Cassandra user flag management
Modified: james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraTableManager.java james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java Modified: james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraTableManager.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraTableManager.java?rev=1689032&r1=1689031&r2=1689032&view=diff ============================================================================== --- james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraTableManager.java (original) +++ james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraTableManager.java Fri Jul 3 14:57:28 2015 @@ -24,6 +24,7 @@ import static com.datastax.driver.core.D import static com.datastax.driver.core.DataType.cboolean; import static com.datastax.driver.core.DataType.cint; import static com.datastax.driver.core.DataType.counter; +import static com.datastax.driver.core.DataType.set; import static com.datastax.driver.core.DataType.text; import static com.datastax.driver.core.DataType.timestamp; import static com.datastax.driver.core.DataType.timeuuid; @@ -90,6 +91,7 @@ public class CassandraTableManager { .addColumn(CassandraMessageTable.Flag.RECENT, cboolean()) .addColumn(CassandraMessageTable.Flag.SEEN, cboolean()) .addColumn(CassandraMessageTable.Flag.USER, cboolean()) + .addColumn(CassandraMessageTable.Flag.USER_FLAGS, set(text())) .addUDTListColumn(CassandraMessageTable.PROPERTIES, SchemaBuilder.frozen(CassandraTypesProvider.TYPE.Property.getName()))), Subscription(CassandraSubscriptionTable.TABLE_NAME, SchemaBuilder.createTable(CassandraSubscriptionTable.TABLE_NAME) Modified: james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java?rev=1689032&r1=1689031&r2=1689032&view=diff ============================================================================== --- james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java (original) +++ james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java Fri Jul 3 14:57:28 2015 @@ -46,7 +46,7 @@ import static org.apache.james.mailbox.c import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Flag.DELETED; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Flag.DRAFT; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Flag.FLAGGED; -import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Flag.JAVAX_MAIL_FLAG; +import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Flag.USER_FLAGS; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Flag.RECENT; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Flag.SEEN; import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Flag.USER; @@ -54,11 +54,13 @@ import static org.apache.james.mailbox.c import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; +import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -273,9 +275,7 @@ public class CassandraMessageMapper impl } private void updateMailbox(Mailbox<CassandraId> mailbox, Assignment operation) { - session.execute(update(CassandraMailboxCountersTable.TABLE_NAME) - .with(operation) - .where(eq(CassandraMailboxCountersTable.MAILBOX_ID, mailbox.getMailboxId().asUuid()))); + session.execute(update(CassandraMailboxCountersTable.TABLE_NAME).with(operation).where(eq(CassandraMailboxCountersTable.MAILBOX_ID, mailbox.getMailboxId().asUuid()))); } private Message<CassandraId> message(Row row) { @@ -308,6 +308,9 @@ public class CassandraMessageMapper impl flags.add(CassandraMessageTable.Flag.JAVAX_MAIL_FLAG.get(flag)); } } + row.getSet(CassandraMessageTable.Flag.USER_FLAGS, String.class) + .stream() + .forEach(flags::add); return flags; } @@ -337,6 +340,7 @@ public class CassandraMessageMapper impl .value(RECENT, message.isRecent()) .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(PROPERTIES, message.getProperties().stream() @@ -358,6 +362,10 @@ public class CassandraMessageMapper impl } } + private Set<String> userFlagsSet(Message<CassandraId> message) { + return Arrays.stream(message.createFlags().getUserFlags()).collect(Collectors.toSet()); + } + private void manageUnseenMessageCounts(Mailbox<CassandraId> mailbox, Flags oldFlags, Flags newFlags) { if (oldFlags.contains(Flag.SEEN) && !newFlags.contains(Flag.SEEN)) { incrementUnseen(mailbox); @@ -420,6 +428,7 @@ public class CassandraMessageMapper impl .and(set(RECENT, message.isRecent())) .and(set(SEEN, message.isSeen())) .and(set(USER, message.createFlags().contains(Flag.USER))) + .and(set(USER_FLAGS, userFlagsSet(message))) .and(set(MOD_SEQ, message.getModSeq())) .where(eq(IMAP_UID, message.getUid())) .and(eq(MAILBOX_ID, message.getMailboxId().asUuid())) Modified: james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java?rev=1689032&r1=1689031&r2=1689032&view=diff ============================================================================== --- james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java (original) +++ james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageTable.java Fri Jul 3 14:57:28 2015 @@ -37,7 +37,7 @@ public interface CassandraMessageTable { String BODY_CONTENT = "bodyContent"; String HEADER_CONTENT = "headerContent"; String PROPERTIES = "properties"; - String[] FIELDS = { MAILBOX_ID, IMAP_UID, INTERNAL_DATE, MOD_SEQ, BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, Flag.ANSWERED, Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, BODY_CONTENT, HEADER_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES }; + String[] FIELDS = { MAILBOX_ID, IMAP_UID, INTERNAL_DATE, MOD_SEQ, BODY_START_OCTET, FULL_CONTENT_OCTETS, BODY_OCTECTS, Flag.ANSWERED, Flag.DELETED, Flag.DRAFT, Flag.FLAGGED, Flag.RECENT, Flag.SEEN, Flag.USER, Flag.USER_FLAGS, BODY_CONTENT, HEADER_CONTENT, TEXTUAL_LINE_COUNT, PROPERTIES }; interface Flag { String ANSWERED = "flagAnswered"; @@ -47,6 +47,7 @@ public interface CassandraMessageTable { String SEEN = "flagSeen"; String FLAGGED = "flagFlagged"; String USER = "flagUser"; + String USER_FLAGS = "userFlags"; String[] ALL = { ANSWERED, DELETED, DRAFT, RECENT, SEEN, FLAGGED, USER }; ImmutableMap<String, Flags.Flag> JAVAX_MAIL_FLAG = ImmutableMap.<String, Flags.Flag>builder() Modified: james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java?rev=1689032&r1=1689031&r2=1689032&view=diff ============================================================================== --- james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java (original) +++ james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMapperTest.java Fri Jul 3 14:57:28 2015 @@ -53,6 +53,7 @@ public abstract class AbstractMessageMap private static final int LIMIT = 10; private static final int BODY_START = 16; public static final int UID_VALIDITY = 42; + public static final String USER_FLAG = "userFlag"; private MapperProvider<Id> mapperProvider; private MessageMapper<Id> messageMapper; @@ -609,6 +610,28 @@ public abstract class AbstractMessageMap assertThat(message.getSubType()).isEqualTo(subType); } + @Test + public void userFlagsShouldBeSupported() throws Exception { + saveMessages(); + messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(USER_FLAG), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid())); + MessageAssert.assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(USER_FLAG)); + } + + @Test + public void userFlagsUpdateShouldReturnCorrectUpdatedFlags() throws Exception { + saveMessages(); + long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox); + assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(USER_FLAG), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid()))) + .containsOnly(new UpdatedFlags(message1.getUid(), modSeq + 1, new Flags(), new Flags(USER_FLAG))); + } + + @Test + public void messagesShouldBeSavedWithTheirUserFlags() throws Exception { + Message<Id> message = new SimpleMessage<Id>(benwaInboxMailbox, message1); + messageMapper.add(benwaInboxMailbox, message); + MessageAssert.assertThat(retrieveMessageFromStorage(message)).hasFlags(new Flags(USER_FLAG)); + } + private Map<Long, MessageMetaData> markThenPerformExpunge(MessageRange range) throws MailboxException { messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.DELETED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid())); messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.DELETED), FlagsUpdateMode.REPLACE), MessageRange.one(message4.getUid())); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org