Author: rdonkin
Date: Mon Dec  3 13:12:18 2007
New Revision: 600691

URL: http://svn.apache.org/viewvc?rev=600691&view=rev
Log:
Consolidate into single wrapper.

Added:
    
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxWrapper.java
      - copied, changed from r600599, 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxSessionWrapper.java
Removed:
    
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/FlaggedSessionMailboxWrapper.java
    
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxSessionWrapper.java
    
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/NumberStableSessionWrapper.java
Modified:
    
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java

Copied: 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxWrapper.java
 (from r600599, 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxSessionWrapper.java)
URL: 
http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxWrapper.java?p2=james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxWrapper.java&p1=james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxSessionWrapper.java&r1=600599&r2=600691&rev=600691&view=diff
==============================================================================
--- 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxSessionWrapper.java
 (original)
+++ 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/wrapper/ImapMailboxWrapper.java
 Mon Dec  3 13:12:18 2007
@@ -19,46 +19,404 @@
 
 package org.apache.james.mailboxmanager.wrapper;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
 import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import javax.mail.Flags;
+import javax.mail.internet.MimeMessage;
 
 import org.apache.james.mailboxmanager.GeneralMessageSet;
+import org.apache.james.mailboxmanager.MailboxListener;
 import org.apache.james.mailboxmanager.MailboxManagerException;
-import org.apache.james.mailboxmanager.Quota;
+import org.apache.james.mailboxmanager.MessageResult;
 import org.apache.james.mailboxmanager.SearchParameters;
-import org.apache.james.mailboxmanager.acl.MailboxRights;
+import org.apache.james.mailboxmanager.impl.GeneralMessageSetImpl;
 import org.apache.james.mailboxmanager.impl.MailboxEventDispatcher;
+import org.apache.james.mailboxmanager.impl.MessageResultImpl;
+import org.apache.james.mailboxmanager.mailbox.AbstractGeneralMailbox;
+import org.apache.james.mailboxmanager.mailbox.EventQueueingSessionMailbox;
+import org.apache.james.mailboxmanager.mailbox.FlaggedMailbox;
+import org.apache.james.mailboxmanager.mailbox.GeneralMailbox;
 import org.apache.james.mailboxmanager.mailbox.ImapMailbox;
 import org.apache.james.mailboxmanager.mailbox.ImapMailboxSession;
 import org.apache.james.mailboxmanager.mailbox.SearchableMailbox;
 
-public class ImapMailboxSessionWrapper extends FlaggedSessionMailboxWrapper
-        implements ImapMailboxSession {
+public class ImapMailboxWrapper extends AbstractGeneralMailbox 
+        implements ImapMailboxSession, EventQueueingSessionMailbox, 
MailboxListener  {
 
-    protected MailboxEventDispatcher eventDispatcher = new 
MailboxEventDispatcher();
 
-    public ImapMailboxSessionWrapper(ImapMailbox imapMailbox) throws 
MailboxManagerException {
-        super(imapMailbox);
+    private static final class MsnIterator implements Iterator {
+            private final Iterator it;
+            private final UidToMsnBidiMap map;
+            
+            public MsnIterator(final Iterator it, final UidToMsnBidiMap map) {
+                this.it = it;
+                this.map = map;
+            }
+            
+            public boolean hasNext() {
+                return it.hasNext();
+            }
+    
+            public Object next() {
+                final MessageResult next = (MessageResult) it.next();
+                final int msn = map.getMsn(next.getUid());
+                final MessageResult result = new MsnMessageResult(next, msn);
+                return result;
+            }
+    
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+            
+            private static final class MsnMessageResult implements 
MessageResult {
+                private final MessageResult delegate;
+                private final int msn;
+                
+                public MsnMessageResult(final MessageResult delegate, final 
int msn) {
+                    super();
+                    this.delegate = delegate;
+                    this.msn = msn;
+                }
+
+                public Flags getFlags() throws MailboxManagerException {
+                    return delegate.getFlags();
+                }
+
+                public Content getFullMessage() throws MailboxManagerException 
{
+                    return delegate.getFullMessage();
+                }
+
+                public int getIncludedResults() {
+                    return delegate.getIncludedResults() | MessageResult.MSN;
+                }
+
+                public Date getInternalDate() {
+                    return delegate.getInternalDate();
+                }
+
+                public String getKey() {
+                    return delegate.getKey();
+                }
+
+                public Content getMessageBody() throws MailboxManagerException 
{
+                    return delegate.getMessageBody();
+                }
+
+                public MimeMessage getMimeMessage() throws 
MailboxManagerException {
+                    return delegate.getMimeMessage();
+                }
+
+                public int getMsn() {
+                    return msn;
+                }
+
+                public int getSize() {
+                    return delegate.getSize();
+                }
+
+                public long getUid() {
+                    return delegate.getUid();
+                }
+
+                public long getUidValidity() {
+                    return delegate.getUidValidity();
+                }
+
+                public Iterator iterateHeaders() throws 
MailboxManagerException {
+                    return delegate.iterateHeaders();
+                }
+
+                public int compareTo(Object o) {
+                    return delegate.compareTo(o);
+                }
+                
+            }
+        }
+
+    protected GeneralMailbox mailbox;
+
+    private UidToMsnBidiMap numberCache = null;
+    
+    protected Map flagEventMap = new TreeMap();
+
+    protected SortedSet expungedEventList = new TreeSet();
+
+    private MailboxEventDispatcher eventDispatcher = new 
MailboxEventDispatcher();
+    
+    private boolean startingNumberCache = false;
+    
+    
+    public ImapMailboxWrapper(ImapMailbox mailbox) throws 
MailboxManagerException {
+        setMailbox(mailbox);
+        init();
+    }
+    
+    public void setMailbox(ImapMailbox mailbox) {
+        this.mailbox=mailbox;
     }
 
-    public long getUidValidity() throws MailboxManagerException {
-        return ((ImapMailbox) mailbox).getUidValidity();
+    public void init() throws MailboxManagerException {
+        mailbox.addListener(eventDispatcher);
+        eventDispatcher.addMailboxListener(this);        
     }
 
-    public long getUidNext() throws MailboxManagerException {
-        return ((ImapMailbox) mailbox).getUidNext();
+    protected UidToMsnBidiMap getNumberCache() throws MailboxManagerException {
+        if (numberCache == null && mailbox != null) {
+            startingNumberCache = true;
+            try {
+                final Iterator it = mailbox.getMessages(GeneralMessageSetImpl
+                        .all(), MessageResult.UID);
+                numberCache = new UidToMsnBidiMap();
+                while (it.hasNext()) {
+                    final MessageResult result = (MessageResult) it.next();
+                    final long uid = result.getUid();
+                    numberCache.add(uid);
+                }
+            } finally {
+                startingNumberCache = false;
+            }
+        }
+        return numberCache;
     }
 
-    public Iterator search(GeneralMessageSet set, SearchParameters searchTerm, 
int result) throws MailboxManagerException {
-        final Iterator results = ((SearchableMailbox)mailbox).search(set, 
searchTerm, noMsnResult(result));
+    protected GeneralMessageSet toUidSet(GeneralMessageSet set)
+            throws MailboxManagerException {
+
+        if (set.getType() == GeneralMessageSet.TYPE_MSN) {
+            set = GeneralMessageSetImpl.uidRange(getNumberCache().getUid(
+                    set.getMsnFrom()), 
getNumberCache().getUid(set.getMsnTo()));
+        }
+        return set;
+    }
+
+    protected static int noMsnResult(int result) {
+        if ((result & MessageResult.MSN) > 0) {
+            result |= MessageResult.UID;
+            result -= MessageResult.MSN;
+        }
+        return result;
+    }
+
+    protected MessageResult[] addMsnToResults(MessageResult[] mr, int result)
+            throws MailboxManagerException {
+        MessageResult[] translated = new MessageResult[mr.length];
+        for (int i = 0; i < translated.length; i++) {
+            translated[i] = addMsnResult(mr[i], result);
+        }
+        return translated;
+    }
+
+    protected MessageResult addMsnResult(MessageResult mr, int result)
+            throws MailboxManagerException {
+        // added events dispatched before the cache has been started
+        // should be ignored
+        if (mr != null) {
+            if ((result & MessageResult.MSN) > 0) {
+                // TODO copy the MessageResult because it could be another 
class
+                int msn = getNumberCache().getMsn(mr.getUid());
+                ((MessageResultImpl) mr).setMsn(msn);
+            }
+        }
+        return mr;
+    }
+
+    public synchronized Iterator getExpungedEvents(boolean reset)
+            throws MailboxManagerException {
+        final Collection msnExpungedEvents  = 
buildMsnEvents(expungedEventList,reset);
+        if (reset) {
+            expungedEventList = new TreeSet();
+        } 
+        return msnExpungedEvents.iterator();
+    }
+
+    private Collection  buildMsnEvents(final Collection messageResults, 
+            final boolean expunge)
+            throws MailboxManagerException {
+        final Collection msnEvents = new ArrayList(messageResults.size());
+        for (final Iterator iter = messageResults.iterator(); iter.hasNext();) 
{
+            final Long uidObject = (Long) iter.next();
+            final long uid = uidObject.longValue();
+            final MessageResultImpl message = new MessageResultImpl(uid);
+            final UidToMsnBidiMap numberCache = getNumberCache();
+            final int msn = numberCache.getMsn(uid);
+            message.setMsn(msn);
+            if (expunge) {
+                numberCache.expunge(uid);
+            }
+            msnEvents.add(message);
+        }
+        return msnEvents;
+    }
+
+    public void added(final long uid) {
+        try {
+            // added events dispatched before the cache has been started
+            // should be ignored
+            if (!startingNumberCache && numberCache != null) 
+            {
+                getNumberCache().add(uid);
+            }
+        } catch (MailboxManagerException e) {
+            getLog().error("This should not happen",e);
+        }
+    }
+
+    public void expunged(final long uid) {
+        getLog().debug("Expunged: "+uid);
+        expungedEventList.add(new Long(uid));
+    }
+
+    public synchronized void flagsUpdated(final long uid, final Flags flags, 
long sessionId) {
+        final Long uidObject = new Long(uid);
+        if (sessionId != getSessionId() && 
!flagEventMap.containsKey(uidObject)) {
+            // if there has been an external update in the past we should 
inform
+            // about the newest value, even if in silent mode
+            
+            // only store flags
+            final MessageResultImpl lightweightResult = new 
MessageResultImpl(uid);
+            lightweightResult.setFlags(flags);
+            flagEventMap.put(uidObject, lightweightResult);
+        }
+    }
+
+    
+    
+    /**
+     * @see 
org.apache.james.mailboxmanager.MailboxListener#event(org.apache.james.mailboxmanager.MailboxListener.Event)
+     */
+    public void event(Event event) {
+        if (event instanceof MessageEvent) {
+            final long sessionId = event.getSessionId();
+            final MessageEvent messageEvent = (MessageEvent) event;
+            final long uid = messageEvent.getSubjectUid();
+            if (event instanceof Added) {
+                added(uid);
+            } else if (event instanceof Expunged) {
+                expunged(uid);
+            } else if (event instanceof FlagsUpdated) {
+                final FlagsUpdated flagsUpdated = (FlagsUpdated) event;
+                flagsUpdated(flagsUpdated.getSubjectUid(), 
flagsUpdated.getNewFlags(), 
+                        sessionId);
+            }
+        }
+    }
+    
+    public void addListener(MailboxListener listener) {
+        eventDispatcher.addMailboxListener(listener);
+    }
+
+    public void removeListener(MailboxListener listener) {
+        eventDispatcher.removeMailboxListener(listener);
+    }
+    
+    public void close() {
+        mailbox.removeListener(eventDispatcher);
+        mailbox=null;
+    }
+    
+    protected final Iterator addMsn(Iterator iterator) throws 
MailboxManagerException {
+        return new MsnIterator(iterator, getNumberCache());
+    }
+
+    /**
+     * for testing
+     * @return the listener this class uses to subscribe to Mailbox events
+     */
+    
+    MailboxListener getListenerObject() {
+        return eventDispatcher;
+    }
+    
+
+    public synchronized Iterator expunge(GeneralMessageSet set, int result) 
throws MailboxManagerException {
+        final GeneralMessageSet uidSet = toUidSet(set);
+        final int noMsnResult = noMsnResult(result);
+        final Iterator expunge = ((FlaggedMailbox) mailbox).expunge(uidSet, 
noMsnResult);
+        return addMsn(expunge);
+    }
+
+    public MessageResult getFirstUnseen(int result) throws 
MailboxManagerException {
+        return addMsnResult(((FlaggedMailbox) 
mailbox).getFirstUnseen(noMsnResult(result)),result);
+    }
+
+    public Flags getPermanentFlags() {
+        return ((FlaggedMailbox) mailbox).getPermanentFlags();
+    }
+
+    public int getRecentCount(boolean reset) throws MailboxManagerException {
+        return ((FlaggedMailbox) mailbox).getRecentCount(reset);
+    }
+
+    public int getUnseenCount() throws MailboxManagerException {
+        return ((FlaggedMailbox) mailbox).getUnseenCount();
+    }
+
+    public Iterator setFlags(Flags flags, boolean value, boolean replace, 
GeneralMessageSet set, int result) throws MailboxManagerException {
+        final Iterator results = ((FlaggedMailbox) mailbox).setFlags(flags, 
value, replace,toUidSet(set), result);
         return addMsn(results);
     }
+    
+    public MessageResult appendMessage(MimeMessage message, Date internalDate,
+            int result) throws MailboxManagerException {
+        return addMsnResult(mailbox.appendMessage(message, internalDate, 
noMsnResult(result)),result);
+    }
 
-    public long getSessionId() {
-        return ((ImapMailbox) mailbox).getSessionId();
+    public int getMessageCount() throws MailboxManagerException {
+        return mailbox.getMessageCount();
     }
 
+    public int getMessageResultTypes() {
+        return mailbox.getMessageResultTypes() | MessageResult.MSN;
+    }
 
+    public Iterator getMessages(GeneralMessageSet set, int result)
+            throws MailboxManagerException {
+        return addMsn(mailbox.getMessages(toUidSet(set),
+                noMsnResult(result)));
+    }
 
+    public int getMessageSetTypes() {
+        return mailbox.getMessageSetTypes() | GeneralMessageSet.TYPE_MSN;
+    }
 
+    public String getName() throws MailboxManagerException {
+        return mailbox.getName();
+    }
+
+    public MessageResult updateMessage(GeneralMessageSet messageSet, 
MimeMessage message, int result) throws MailboxManagerException {
+        return addMsnResult(mailbox.updateMessage(toUidSet(messageSet), 
message, noMsnResult(result)),result);
+    }
+
+    public boolean isWriteable() {
+        return true;
+    }
+
+    public void remove(GeneralMessageSet set) throws MailboxManagerException {
+        mailbox.remove(toUidSet(set));
+    }
+
+    public long getSessionId() {
+        return mailbox.getSessionId();
+    }
+
+    public long getUidValidity() throws MailboxManagerException {
+        return ((ImapMailbox) mailbox).getUidValidity();
+    }
+
+    public long getUidNext() throws MailboxManagerException {
+        return ((ImapMailbox) mailbox).getUidNext();
+    }
+
+    public Iterator search(GeneralMessageSet set, SearchParameters searchTerm, 
int result) throws MailboxManagerException {
+        final Iterator results = ((SearchableMailbox)mailbox).search(set, 
searchTerm, noMsnResult(result));
+        return addMsn(results);
+    }
 
 }

Modified: 
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java?rev=600691&r1=600690&r2=600691&view=diff
==============================================================================
--- 
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
 (original)
+++ 
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailboxManager.java
 Mon Dec  3 13:12:18 2007
@@ -45,7 +45,7 @@
 import org.apache.james.mailboxmanager.manager.MailboxManager;
 import org.apache.james.mailboxmanager.torque.om.MailboxRow;
 import org.apache.james.mailboxmanager.torque.om.MailboxRowPeer;
-import org.apache.james.mailboxmanager.wrapper.ImapMailboxSessionWrapper;
+import org.apache.james.mailboxmanager.wrapper.ImapMailboxWrapper;
 import org.apache.james.services.User;
 import org.apache.torque.TorqueException;
 import org.apache.torque.util.CountHelper;
@@ -117,8 +117,8 @@
                         managers.put(mailboxName, torqueMailbox);
                     }
                     
-                    final ImapMailboxSessionWrapper wrapper 
-                        = new ImapMailboxSessionWrapper(torqueMailbox);
+                    final ImapMailboxWrapper wrapper 
+                        = new ImapMailboxWrapper(torqueMailbox);
                     return wrapper;
                 } else {
                     getLog().info("Mailbox '" + mailboxName + "' not found.");



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to