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: [email protected]
For additional commands, e-mail: [email protected]