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]