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

Reply via email to