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 no...@apache.org on 2011/04/28 21:50:29 UTC

svn commit: r1097586 - in /james/mailbox/trunk: api/src/main/java/org/apache/james/mailbox/ api/src/test/java/org/apache/james/mailbox/util/ store/src/main/java/org/apache/james/mailbox/store/

Author: norman
Date: Thu Apr 28 19:50:29 2011
New Revision: 1097586

URL: http://svn.apache.org/viewvc?rev=1097586&view=rev
Log:
Allow to support User Flags. See MAILBOX-63

Modified:
    james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java
    james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java

Modified: james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java?rev=1097586&r1=1097585&r2=1097586&view=diff
==============================================================================
--- james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java (original)
+++ james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/UpdatedFlags.java Thu Apr 28 19:50:29 2011
@@ -19,46 +19,76 @@
 
 package org.apache.james.mailbox;
 
+import java.util.Arrays;
 import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.lang.UnsupportedOperationException;
 
 import javax.mail.Flags;
-import javax.mail.Flags.Flag;
 
 /**
  * Represent a Flag update for a message
  * 
  *
  */
-public class UpdatedFlags implements Iterable<Flags.Flag>{
+public class UpdatedFlags {
 
     private final long uid;
     private final Flags oldFlags;
     private final Flags newFlags;
-    private final boolean[] modifiedFlags;
+    private final Flags modifiedFlags;
 
     public UpdatedFlags(long uid, Flags oldFlags, Flags newFlags) {
        this.uid = uid;
        this.oldFlags = oldFlags;
        this.newFlags = newFlags;
-       this.modifiedFlags = new boolean[NUMBER_OF_SYSTEM_FLAGS];
-       this.modifiedFlags[0] = isChanged(oldFlags, newFlags, Flags.Flag.ANSWERED);
-       this.modifiedFlags[1] = isChanged(oldFlags, newFlags, Flags.Flag.DELETED);
-       this.modifiedFlags[2] = isChanged(oldFlags, newFlags, Flags.Flag.DRAFT);
-       this.modifiedFlags[3] = isChanged(oldFlags, newFlags, Flags.Flag.FLAGGED);
-       this.modifiedFlags[4] = isChanged(oldFlags, newFlags, Flags.Flag.RECENT);
-       this.modifiedFlags[5] = isChanged(oldFlags, newFlags, Flags.Flag.SEEN);
+       this.modifiedFlags = new Flags();
+       addModifiedSystemFlags();
+       addModifiedUserFlags();
     }
     
+    private void addModifiedSystemFlags() {
+        if (isChanged(oldFlags, newFlags, Flags.Flag.ANSWERED)) {
+            modifiedFlags.add(Flags.Flag.ANSWERED);
+        }
+        if(isChanged(oldFlags, newFlags, Flags.Flag.DELETED)) {
+            modifiedFlags.add(Flags.Flag.DELETED);
+        }
+        if (isChanged(oldFlags, newFlags, Flags.Flag.DRAFT)) {
+            modifiedFlags.add(Flags.Flag.DRAFT);
+        }
+        if (isChanged(oldFlags, newFlags, Flags.Flag.FLAGGED)) {
+            modifiedFlags.add(Flags.Flag.FLAGGED);
+        }
+        if (isChanged(oldFlags, newFlags, Flags.Flag.RECENT)) {
+            modifiedFlags.add(Flags.Flag.RECENT);
+        }
+        if (isChanged(oldFlags, newFlags, Flags.Flag.SEEN)) {
+            modifiedFlags.add(Flags.Flag.SEEN);
+        }
+    }
+    
+    private void addModifiedUserFlags() {
+        addModifiedUserFlags(oldFlags.getUserFlags());
+        addModifiedUserFlags(newFlags.getUserFlags());
+
+    }
+    
+
+    private void addModifiedUserFlags(String[] userflags) {
+        for (int i = 0; i < userflags.length; i++) {
+            String userFlag = userflags[i];
+            if (isChanged(oldFlags, newFlags, userFlag)) {
+                modifiedFlags.add(userFlag);
 
+            }
+        }
+    }
     private static boolean isChanged(final Flags original, final Flags updated, Flags.Flag flag) {
         return original != null && updated != null && (original.contains(flag) ^ updated.contains(flag));
     }
 
-    private static final Flags.Flag[] FLAGS = { Flags.Flag.ANSWERED, Flags.Flag.DELETED, Flags.Flag.DRAFT, Flags.Flag.FLAGGED, Flags.Flag.RECENT, Flags.Flag.SEEN };
-
-    private static final int NUMBER_OF_SYSTEM_FLAGS = 6;
+    private static boolean isChanged(final Flags original, final Flags updated, String userFlag) {
+        return original != null && updated != null && (original.contains(userFlag) ^ updated.contains(userFlag));
+    }
 
     
     /**
@@ -87,54 +117,7 @@ public class UpdatedFlags implements Ite
     public long getUid() {
         return uid;
     }
-    
-    private class FlagsIterator implements Iterator<Flag> {
-        private int position;
-
-        public FlagsIterator() {
-            position = 0;
-            nextPosition();
-        }
-
-        private void nextPosition() {
-            if ((position < NUMBER_OF_SYSTEM_FLAGS) && (!modifiedFlags[position])) {
-                position++;
-                nextPosition();
-            }
-        }
-
-        /*
-         * (non-Javadoc)
-         * 
-         * @see java.util.Iterator#hasNext()
-         */
-        public boolean hasNext() {
-            return position < NUMBER_OF_SYSTEM_FLAGS;
-        }
-
-        /*
-         * (non-Javadoc)
-         * 
-         * @see java.util.Iterator#next()
-         */
-        public Flag next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            final Flag result = FLAGS[position++];
-            nextPosition();
-            return result;
-        }
-
-        /*
-         * (non-Javadoc)
-         * 
-         * @see java.util.Iterator#remove()
-         */
-        public void remove() {
-            throw new UnsupportedOperationException("Read only");
-        }
-    }
+   
 
     /**
      * Gets an iterator for the system flags changed.
@@ -142,7 +125,17 @@ public class UpdatedFlags implements Ite
      * @return <code>Flags.Flag</code> <code>Iterator</code>, not null
      */
 
-    public Iterator<Flags.Flag> iterator() {
-        return new FlagsIterator();
+    public Iterator<Flags.Flag> systemFlagIterator() {
+        return Arrays.asList(modifiedFlags.getSystemFlags()).iterator();
+    }
+    
+    /**
+     * Gets an iterator for the users flags changed.
+     * 
+     * @return <code>String</code> <code>Iterator</code>, not null
+     */
+
+    public Iterator<String> userFlagIterator() {
+        return Arrays.asList(modifiedFlags.getUserFlags()).iterator();
     }
 }

Modified: james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java?rev=1097586&r1=1097585&r2=1097586&view=diff
==============================================================================
--- james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java (original)
+++ james/mailbox/trunk/api/src/test/java/org/apache/james/mailbox/util/MailboxEventDispatcherFlagsTest.java Thu Apr 28 19:50:29 2011
@@ -83,7 +83,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertFalse(iterator.hasNext());
     }
@@ -96,7 +96,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.ANSWERED, iterator.next());
@@ -111,7 +111,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.ANSWERED, iterator.next());
@@ -126,7 +126,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.DELETED, iterator.next());
@@ -141,7 +141,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.DELETED, iterator.next());
@@ -156,7 +156,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.DRAFT, iterator.next());
@@ -171,7 +171,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.DRAFT, iterator.next());
@@ -186,7 +186,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.FLAGGED, iterator.next());
@@ -201,7 +201,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.FLAGGED, iterator.next());
@@ -216,7 +216,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.RECENT, iterator.next());
@@ -231,7 +231,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.RECENT, iterator.next());
@@ -246,7 +246,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.SEEN, iterator.next());
@@ -261,7 +261,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.SEEN, iterator.next());
@@ -283,7 +283,7 @@ public class MailboxEventDispatcherFlags
         assertTrue(collector.events.get(0) instanceof MailboxListener.FlagsUpdated);
         MailboxListener.FlagsUpdated event = (MailboxListener.FlagsUpdated) collector.events
                 .get(0);
-        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).iterator();
+        Iterator<Flags.Flag> iterator = event.getUpdatedFlags().get(0).systemFlagIterator();
         assertNotNull(iterator);
         assertTrue(iterator.hasNext());
         assertEquals(Flags.Flag.ANSWERED, iterator.next());

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java?rev=1097586&r1=1097585&r2=1097586&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java Thu Apr 28 19:50:29 2011
@@ -118,16 +118,31 @@ public abstract class StoreMessageManage
     
 
     
-    private Flags getPermanentFlags() {
+    private Flags getPermanentFlags(MailboxSession session) {
         Flags permanentFlags = new Flags();
         permanentFlags.add(Flags.Flag.ANSWERED);
         permanentFlags.add(Flags.Flag.DELETED);
         permanentFlags.add(Flags.Flag.DRAFT);
         permanentFlags.add(Flags.Flag.FLAGGED);
         permanentFlags.add(Flags.Flag.SEEN);
+        if (areUserFlagsPermanent(session)) {
+            permanentFlags.add(Flags.Flag.USER);
+        }
         return permanentFlags;
     }
 
+    /**
+     * Sub-classes should override this and return true if they support to store user flags(keywords) permanent.
+     * 
+     * The default is to return false
+     * 
+     * @param session
+     * @return supported 
+     */
+    protected boolean areUserFlagsPermanent(MailboxSession session) {
+        return false;
+    }
+    
     /*
      * (non-Javadoc)
      * @see org.apache.james.mailbox.Mailbox#expunge(org.apache.james.mailbox.MessageRange, org.apache.james.mailbox.MailboxSession)
@@ -258,6 +273,10 @@ public abstract class StoreMessageManage
                 flags = new Flags();
             } else {
                 flags = flagsToBeSet;
+
+                // Check if we need to trim the flags
+                trimFlags(flags, mailboxSession);
+
             }
             if (isRecent) {
                 flags.add(Flags.Flag.RECENT);
@@ -376,7 +395,7 @@ public abstract class StoreMessageManage
     public MetaData getMetaData(boolean resetRecent, MailboxSession mailboxSession, 
             org.apache.james.mailbox.MessageManager.MetaData.FetchGroup fetchGroup) throws MailboxException {
         final List<Long> recent = recent(resetRecent, mailboxSession);
-        final Flags permanentFlags = getPermanentFlags();
+        final Flags permanentFlags = getPermanentFlags(mailboxSession);
         final long uidValidity = getMailboxEntity().getUidValidity();
         final long uidNext = uidProvider.lastUid(mailboxSession, mailbox) +1;
         final long messageCount = getMessageCount(mailboxSession);
@@ -400,6 +419,30 @@ public abstract class StoreMessageManage
     }
 
  
+    // Check if this mailbox supports user flags and if not remove all of them before 
+    // pass this to the mapper
+    private void trimFlags(Flags flags, MailboxSession session) {
+        
+        Flags permFlags = getPermanentFlags(session);
+        
+        Flag[] systemFlags = flags.getSystemFlags();
+        for (int i = 0; i <  systemFlags.length; i++) {
+            Flag f = systemFlags[i];
+            if (permFlags.contains(f) == false) {
+                flags.remove(f);
+            }
+        }
+        if (permFlags.contains(Flags.Flag.USER) == false) {
+            String[] uFlags = flags.getUserFlags();
+            for (int i = 0; i <uFlags.length; i++) {
+                String uFlag = uFlags[i];
+                if (permFlags.contains(uFlag) == false) {
+                    flags.remove(uFlag);
+                }
+            }
+        }
+      
+    }
     
     /*
      * (non-Javadoc)
@@ -410,7 +453,10 @@ public abstract class StoreMessageManage
        
         final SortedMap<Long, Flags> newFlagsByUid = new TreeMap<Long, Flags>();
 
+        trimFlags(flags, mailboxSession);
+        
         final MessageMapper<Id> messageMapper = mapperFactory.getMessageMapper(mailboxSession);
+      
         Iterator<UpdatedFlags> it = messageMapper.execute(new Mapper.Transaction<Iterator<UpdatedFlags>>() {
 
             public Iterator<UpdatedFlags> run() throws MailboxException {



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org