Author: rdonkin
Date: Tue Jun  2 20:53:11 2009
New Revision: 781164

URL: http://svn.apache.org/viewvc?rev=781164&view=rev
Log:
IMAP-95 Membership implementation. https://issues.apache.org/jira/browse/IMAP-95

Added:
    
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java
   (with props)
Modified:
    james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailbox.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java

Modified: 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java?rev=781164&r1=781163&r2=781164&view=diff
==============================================================================
--- 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java 
(original)
+++ 
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailbox.java 
Tue Jun  2 20:53:11 2009
@@ -78,8 +78,8 @@
     }
     
     @Override
-    protected MailboxMembership copyMessage(StoreMailbox toMailbox, 
MailboxMembership originalMessage, long uid) {
-        MailboxMembership newRow = new 
JPAMailboxMembership(toMailbox.getMailboxId(), uid, (JPAMailboxMembership) 
originalMessage);
+    protected MailboxMembership copyMessage(MailboxMembership originalMessage, 
long uid) {
+        MailboxMembership newRow = new JPAMailboxMembership(getMailboxId(), 
uid, (JPAMailboxMembership) originalMessage);
         return newRow;
     }
     

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailbox.java?rev=781164&r1=781163&r2=781164&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailbox.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailbox.java
 Tue Jun  2 20:53:11 2009
@@ -30,11 +30,12 @@
 
     private final long id;    
     private final long uidValidity;
-    private AtomicLong nextUid;
+    private final AtomicLong nextUid;
     private String name;
     
     public InMemoryMailbox(final long id, final String name, final long 
uidValidity) {
         super();
+        this.nextUid = new AtomicLong(1);
         this.id = id;
         this.name = name;
         this.uidValidity = uidValidity;

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java?rev=781164&r1=781163&r2=781164&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryStoreMailbox.java
 Tue Jun  2 20:53:11 2009
@@ -19,12 +19,18 @@
 
 package org.apache.james.imap.inmemory;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.mail.Flags;
 
 import org.apache.james.imap.mailbox.MailboxException;
+import org.apache.james.imap.mailbox.MessageRange;
+import org.apache.james.imap.mailbox.SearchQuery;
+import org.apache.james.imap.mailbox.StorageException;
 import org.apache.james.imap.store.StoreMailbox;
 import org.apache.james.imap.store.mail.MessageMapper;
 import org.apache.james.imap.store.mail.model.Header;
@@ -32,19 +38,21 @@
 import org.apache.james.imap.store.mail.model.MailboxMembership;
 import org.apache.james.imap.store.mail.model.PropertyBuilder;
 
-public class InMemoryStoreMailbox extends StoreMailbox {
+public class InMemoryStoreMailbox extends StoreMailbox implements 
MessageMapper {
     
+    private static final int INITIAL_SIZE = 256;
+    private Map<Long, MailboxMembership> membershipByUid;
     private InMemoryMailbox mailbox;
 
     public InMemoryStoreMailbox(InMemoryMailbox mailbox) {
         super(mailbox);
         this.mailbox = mailbox;
+        this.membershipByUid = new ConcurrentHashMap<Long, 
MailboxMembership>(INITIAL_SIZE);
     }
 
     @Override
-    protected MailboxMembership copyMessage(StoreMailbox toMailbox, 
MailboxMembership originalMessage, long uid) {
-        // TODO Auto-generated method stub
-        return null;
+    protected MailboxMembership copyMessage(MailboxMembership originalMessage, 
long uid) {
+        return new SimpleMailboxMembership(mailboxId, uid, 
(SimpleMailboxMembership) originalMessage);
     }
 
     @Override
@@ -53,26 +61,87 @@
     }
 
     @Override
-    protected MailboxMembership createMessage(Date internalDate, long uid, int 
size, int bodyStartOctet, byte[] document, Flags flags, List<Header> headers, 
PropertyBuilder propertyBuilder) {
-        // TODO Auto-generated method stub
-        return null;
+    protected MailboxMembership createMessage(Date internalDate, long uid, int 
size, int bodyStartOctet, 
+            byte[] document, Flags flags, List<Header> headers, 
PropertyBuilder propertyBuilder) {
+        return new SimpleMailboxMembership(internalDate, uid, size, 
bodyStartOctet, document, flags, headers, propertyBuilder, mailboxId);
     }
 
     @Override
     protected MessageMapper createMessageMapper() {
-        // TODO Auto-generated method stub
-        return null;
+        return this;
     }
 
     @Override
     protected Mailbox getMailboxRow() throws MailboxException {
-        // TODO Auto-generated method stub
-        return null;
+        return mailbox;
     }
 
     @Override
     protected Mailbox reserveNextUid() throws MailboxException {
-        // TODO: implementation
+        mailbox.consumeUid();
+        return mailbox;
+    }
+
+    public void begin() throws StorageException {
+    }
+
+    public void commit() throws StorageException {
+    }
+
+    public long countMessagesInMailbox() throws StorageException {
+        return membershipByUid.size();
+    }
+
+    public long countUnseenMessagesInMailbox() throws StorageException {
+        long count = 0;
+        for(MailboxMembership member:membershipByUid.values()) {
+            if (!member.isSeen()) {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    public void delete(MailboxMembership message) throws StorageException {
+        membershipByUid.remove(message.getUid());
+    }
+
+    public List<MailboxMembership> findInMailbox(MessageRange set) throws 
StorageException {
+        return null;
+    }
+
+    public List<MailboxMembership> findMarkedForDeletionInMailbox(MessageRange 
set) throws StorageException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public List<MailboxMembership> findRecentMessagesInMailbox() throws 
StorageException {
+        final List<MailboxMembership> results = new 
ArrayList<MailboxMembership>();
+        for(MailboxMembership member:membershipByUid.values()) {
+            if (member.isRecent()) {
+                results.add(member);
+            }
+        }
+        return results;
+    }
+
+    public List<MailboxMembership> findUnseenMessagesInMailboxOrderByUid() 
throws StorageException {
+        final List<MailboxMembership> results = new 
ArrayList<MailboxMembership>();
+        for(MailboxMembership member:membershipByUid.values()) {
+            if (member.isRecent()) {
+                results.add(member);
+            }
+        }
+        return results;
+    }
+
+    public void save(MailboxMembership message) throws StorageException {
+        // TODO Auto-generated method stub
+        
+    }
+
+    public List<MailboxMembership> searchMailbox(SearchQuery query) throws 
StorageException {
+        // TODO Auto-generated method stub
         return null;
     }
 

Added: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java?rev=781164&view=auto
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java
 (added)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java
 Tue Jun  2 20:53:11 2009
@@ -0,0 +1,233 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imap.inmemory;
+
+import java.nio.ByteBuffer;
+import java.util.Date;
+import java.util.List;
+
+import javax.mail.Flags;
+
+import org.apache.james.imap.store.mail.model.Document;
+import org.apache.james.imap.store.mail.model.Header;
+import org.apache.james.imap.store.mail.model.MailboxMembership;
+import org.apache.james.imap.store.mail.model.Property;
+import org.apache.james.imap.store.mail.model.PropertyBuilder;
+
+public class SimpleMailboxMembership implements MailboxMembership, Document, 
Comparable<MailboxMembership> {
+
+    private final long uid;
+    private final long mailboxId;
+    private int size;
+    private boolean answered;
+    private boolean deleted;
+    private boolean draft;
+    private boolean flagged;
+    private boolean recent;
+    private boolean seen;
+    private Date internalDate;
+    private final String subType;
+    private List<Property> properties;
+    private final String mediaType;
+    private List<Header> headers;
+    private Long lineCount;
+    private byte[] document;
+    private int bodyStartOctet;
+    
+    public SimpleMailboxMembership(long mailboxId, long uid, final 
SimpleMailboxMembership original) {
+        this.uid = uid;
+        this.mailboxId = mailboxId;
+        this.size = original.size;
+        this.answered = original.answered;
+        this.deleted = original.deleted;
+        this.draft = original.draft;
+        this.flagged = original.flagged;
+        this.recent = original.recent;
+        this.seen = original.seen;
+        this.internalDate = original.internalDate;
+        this.subType  = original.subType;
+        this.mediaType = original.mediaType;
+        this.properties = original.properties;
+        this.headers = original.headers;
+        this.lineCount = original.lineCount;
+        this.document = original.document;
+        this.bodyStartOctet = original.bodyStartOctet;
+    }
+    
+    public SimpleMailboxMembership(Date internalDate, long uid, int size, int 
bodyStartOctet, byte[] document, 
+            Flags flags, List<Header> headers, PropertyBuilder 
propertyBuilder, final long mailboxId) {
+        this.uid = uid;
+        this.document = document;
+        this.size = size;
+        this.bodyStartOctet = bodyStartOctet;
+        setFlags(flags);
+        lineCount = propertyBuilder.getTextualLineCount();
+        this.headers = headers;
+        this.internalDate = internalDate;
+        this.mailboxId = mailboxId;
+        this.properties = propertyBuilder.toProperties();
+        this.mediaType = propertyBuilder.getMediaType();
+        this.subType = propertyBuilder.getSubType();
+    }
+
+
+    public synchronized Flags createFlags() {
+        final Flags flags = new Flags();
+        if (answered) {
+            flags.add(Flags.Flag.ANSWERED);
+        }
+        if (deleted) {
+            flags.add(Flags.Flag.DELETED);
+        }
+        if (draft) {
+            flags.add(Flags.Flag.DRAFT);
+        }
+        if (flagged) {
+            flags.add(Flags.Flag.FLAGGED);
+        }
+        if (recent) {
+            flags.add(Flags.Flag.RECENT);
+        }
+        if (seen) {
+            flags.add(Flags.Flag.SEEN);
+        }
+        return flags;
+    }
+
+    public Document getDocument() {
+        return this;
+    }
+
+    public Date getInternalDate() {
+        return internalDate;
+    }
+
+    public long getMailboxId() {
+        return mailboxId;
+    }
+
+    public int getSize() {
+        return size;
+    }
+
+    public long getUid() {
+        return uid;
+    }
+
+    public boolean isAnswered() {
+        return answered;
+    }
+
+    public boolean isDeleted() {
+        return deleted;
+    }
+
+    public boolean isDraft() {
+        return draft;
+    }
+
+    public boolean isFlagged() {
+        return flagged;
+    }
+
+    public boolean isRecent() {
+        return recent;
+    }
+
+    public boolean isSeen() {
+        return seen;
+    }
+
+    public synchronized void setFlags(Flags flags) {
+        answered = flags.contains(Flags.Flag.ANSWERED);
+        deleted = flags.contains(Flags.Flag.DELETED);
+        draft = flags.contains(Flags.Flag.DRAFT);
+        flagged = flags.contains(Flags.Flag.FLAGGED);
+        recent = flags.contains(Flags.Flag.RECENT);
+        seen = flags.contains(Flags.Flag.SEEN);
+    }
+
+    public void unsetRecent() {
+        recent = false;
+    }
+
+    public ByteBuffer getBodyContent() {
+        return ByteBuffer.wrap(document, bodyStartOctet, document.length - 
bodyStartOctet);
+    }
+
+    public long getBodyOctets() {
+        return getFullContentOctets() - bodyStartOctet;
+    }
+
+    public ByteBuffer getFullContent() {
+        return ByteBuffer.wrap(document);
+    }
+
+    public long getFullContentOctets() {
+        return document.length;
+    }
+
+    public List<Header> getHeaders() {
+        return headers;
+    }
+
+    public String getMediaType() {
+        return mediaType;
+    }
+
+    public List<Property> getProperties() {
+        return properties;
+    }
+
+    public String getSubType() {
+        return subType;
+    }
+
+    public Long getTextualLineCount() {
+        return lineCount;
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + (int) (uid ^ (uid >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final SimpleMailboxMembership other = (SimpleMailboxMembership) obj;
+        if (uid != other.uid)
+            return false;
+        return true;
+    }
+
+    public int compareTo(MailboxMembership o) {
+        final long otherUid = getUid();
+        return uid < otherUid ? -1 : uid == otherUid ? 0 : 1;
+    }
+}

Propchange: 
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/SimpleMailboxMembership.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java?rev=781164&r1=781163&r2=781164&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailbox.java
 Tue Jun  2 20:53:11 2009
@@ -72,7 +72,7 @@
         this.tracker = new UidChangeTracker(mailbox.getLastUid());
     }
 
-    protected abstract MailboxMembership copyMessage(StoreMailbox toMailbox, 
MailboxMembership originalMessage, long uid);
+    protected abstract MailboxMembership copyMessage(MailboxMembership 
originalMessage, long uid);
     
     protected abstract MessageMapper createMessageMapper();
     
@@ -429,20 +429,20 @@
     public boolean isWriteable() {
         return true;
     }
+    
 
-    public void copyTo(MessageRange set, StoreMailbox toMailbox, 
MailboxSession session) throws MailboxException {
+    public List<MailboxMembership> copy(List<MailboxMembership> originalRows, 
MailboxSession session) throws MailboxException {
         try {
             final MessageMapper mapper = createMessageMapper();
             mapper.begin();
 
             final List<MailboxMembership> copiedRows = new 
ArrayList<MailboxMembership>();
-            final List<MailboxMembership> originalRows = 
mapper.findInMailbox(set);
             for (MailboxMembership originalMessage:originalRows) {
 
-                final Mailbox mailbox = toMailbox.reserveNextUid();
+                final Mailbox mailbox = reserveNextUid();
                 if (mailbox != null) {
                     long uid = mailbox.getLastUid();
-                    final MailboxMembership newRow = copyMessage(toMailbox, 
originalMessage, uid);
+                    final MailboxMembership newRow = 
copyMessage(originalMessage, uid);
                     mapper.save(newRow);
                     copiedRows.add(newRow);
                 }
@@ -450,6 +450,23 @@
 
             mapper.commit();
             
+            return copiedRows;
+            
+        } catch (MessagingException e) {
+            throw new MailboxException(HumanReadableText.FAILURE_MAIL_PARSE, 
e);
+        }
+    }
+
+    public void copyTo(MessageRange set, StoreMailbox toMailbox, 
MailboxSession session) throws MailboxException {
+        try {
+            final MessageMapper mapper = createMessageMapper();
+            mapper.begin();
+
+            final List<MailboxMembership> originalRows = 
mapper.findInMailbox(set);
+            final List<MailboxMembership> copiedRows = 
toMailbox.copy(originalRows, session);
+
+            mapper.commit();
+            
             // Wait until commit before issuing events
             for (MailboxMembership newMember:copiedRows) {
                 toMailbox.tracker.found(newMember.getUid(), 
newMember.createFlags());



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to