You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2015/07/03 16:57:29 UTC
svn commit: r1689032 - in /james/mailbox/trunk:
cassandra/src/main/java/org/apache/james/mailbox/cassandra/
cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/
cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/
store/src/tes...
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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org