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