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/05/30 20:44:56 UTC
svn commit: r1129288 - in /james/mailbox/trunk:
jcr/src/main/java/org/apache/james/mailbox/jcr/
jcr/src/main/java/org/apache/james/mailbox/jcr/mail/
jcr/src/main/java/org/apache/james/mailbox/jcr/user/
jpa/src/main/java/org/apache/james/mailbox/jpa/ jp...
Author: norman
Date: Mon May 30 18:44:56 2011
New Revision: 1129288
URL: http://svn.apache.org/viewvc?rev=1129288&view=rev
Log:
Allow to inject a MessageSearchIndex in the AbstractMessageMapper. Part of MAILBOX-10
Modified:
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java
james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java
james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java
james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRMapper.java Mon May 30 18:44:56 2011
@@ -35,15 +35,13 @@ import org.slf4j.Logger;
public abstract class AbstractJCRMapper extends TransactionalMapper implements JCRImapConstants {
public final static String MAILBOXES_PATH = "mailboxes";
- private final Logger logger;
private final MailboxSessionJCRRepository repository;
protected final MailboxSession mSession;
- public AbstractJCRMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession, Logger logger) {
+ public AbstractJCRMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession) {
this.repository = repository;
this.mSession = mSession;
- this.logger = logger;
}
/**
@@ -52,7 +50,7 @@ public abstract class AbstractJCRMapper
* @return logger
*/
protected Logger getLogger() {
- return logger;
+ return mSession.getLog();
}
/**
Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/AbstractJCRScalingMapper.java Mon May 30 18:44:56 2011
@@ -23,7 +23,6 @@ import javax.jcr.RepositoryException;
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.james.mailbox.MailboxSession;
-import org.slf4j.Logger;
/**
* Abstract base class for Mapper's which support scaling
@@ -34,8 +33,8 @@ public abstract class AbstractJCRScaling
private final int scaling;
private final static char PAD ='_';
- public AbstractJCRScalingMapper(MailboxSessionJCRRepository repository, MailboxSession mSession, int scaling, Logger logger) {
- super(repository, mSession, logger);
+ public AbstractJCRScalingMapper(MailboxSessionJCRRepository repository, MailboxSession mSession, int scaling) {
+ super(repository, mSession);
this.scaling = scaling;
}
Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxSessionMapperFactory.java Mon May 30 18:44:56 2011
@@ -25,6 +25,7 @@ import org.apache.james.mailbox.jcr.mail
import org.apache.james.mailbox.jcr.mail.JCRMessageMapper;
import org.apache.james.mailbox.jcr.user.JCRSubscriptionMapper;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.MessageSearchIndex;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.user.SubscriptionMapper;
@@ -39,37 +40,37 @@ import org.slf4j.LoggerFactory;
public class JCRMailboxSessionMapperFactory extends MailboxSessionMapperFactory<String> {
private final MailboxSessionJCRRepository repository;
- private final Logger logger;
private final static int DEFAULT_SCALING = 2;
private final int scaling;
private int messageScaling;
+ private final MessageSearchIndex<String> index;
public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository) {
- this(repository, DEFAULT_SCALING, JCRMessageMapper.MESSAGE_SCALE_DAY);
+ this(repository, null, DEFAULT_SCALING, JCRMessageMapper.MESSAGE_SCALE_DAY);
}
- public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository, final int scaling, final int messageScaling) {
+ public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository, final MessageSearchIndex<String> index, final int scaling, final int messageScaling) {
this.repository = repository;
- this.logger = LoggerFactory.getLogger(JCRMailboxSessionMapperFactory.class);
+ this.index = index;
this.scaling = scaling;
this.messageScaling = messageScaling;
}
@Override
public MailboxMapper<String> createMailboxMapper(MailboxSession session) throws MailboxException {
- JCRMailboxMapper mapper = new JCRMailboxMapper(repository, session, scaling, logger);
+ JCRMailboxMapper mapper = new JCRMailboxMapper(repository, session, scaling);
return mapper;
}
@Override
public MessageMapper<String> createMessageMapper(MailboxSession session) throws MailboxException {
- JCRMessageMapper messageMapper = new JCRMessageMapper(repository, session, logger, messageScaling);
+ JCRMessageMapper messageMapper = new JCRMessageMapper(repository, session, index, messageScaling);
return messageMapper;
}
@Override
public SubscriptionMapper createSubscriptionMapper(MailboxSession session) throws SubscriptionException {
- JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(repository, session, DEFAULT_SCALING, logger);
+ JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(repository, session, DEFAULT_SCALING);
return mapper;
}
Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java Mon May 30 18:44:56 2011
@@ -42,7 +42,6 @@ import org.apache.james.mailbox.jcr.Mail
import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.slf4j.Logger;
/**
* JCR implementation of a MailboxMapper
@@ -52,8 +51,8 @@ import org.slf4j.Logger;
public class JCRMailboxMapper extends AbstractJCRScalingMapper implements MailboxMapper<String> {
- public JCRMailboxMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling, final Logger logger) {
- super(repos, session, scaling, logger);
+ public JCRMailboxMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling) {
+ super(repos, session, scaling);
}
/*
Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java Mon May 30 18:44:56 2011
@@ -46,12 +46,12 @@ import org.apache.james.mailbox.jcr.JCRI
import org.apache.james.mailbox.jcr.MailboxSessionJCRRepository;
import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
import org.apache.james.mailbox.jcr.mail.model.JCRMessage;
+import org.apache.james.mailbox.store.MessageSearchIndex;
import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.mail.SimpleMessageMetaData;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.Message;
-import org.slf4j.Logger;
/**
* JCR implementation of a {@link MessageMapper}. The implementation store each message as
@@ -97,9 +97,7 @@ public class JCRMessageMapper extends Ab
private final int scaleType;
- private final Logger logger;
private final MailboxSessionJCRRepository repository;
- protected final MailboxSession mSession;
/**
@@ -109,25 +107,16 @@ public class JCRMessageMapper extends Ab
* @param session {@link MailboxSession} to which the mapper is bound
* @param logger Log
*/
- public JCRMessageMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession, final Logger logger, int scaleType) {
- this.repository = repository;
- this.mSession = mSession;
- this.logger = logger;
+ public JCRMessageMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession, final MessageSearchIndex<String> index, int scaleType) {
+ super(mSession, index);
+ this.repository = repository;
this.scaleType = scaleType;
}
- public JCRMessageMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final Logger logger) {
- this(repos, session, logger, MESSAGE_SCALE_DAY);
+ public JCRMessageMapper(final MailboxSessionJCRRepository repos, MailboxSession session) {
+ this(repos, session, null, MESSAGE_SCALE_DAY);
}
- /**
- * Return the logger
- *
- * @return logger
- */
- protected Logger getLogger() {
- return logger;
- }
/**
* Return the JCR Session
@@ -135,7 +124,7 @@ public class JCRMessageMapper extends Ab
* @return session
*/
protected Session getSession() throws RepositoryException{
- return repository.login(mSession);
+ return repository.login(mailboxSession);
}
/**
@@ -322,7 +311,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
while (iterator.hasNext()) {
- list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
}
return list;
}
@@ -337,7 +326,7 @@ public class JCRMessageMapper extends Ab
QueryResult result = query.execute();
NodeIterator iterator = result.getNodes();
while (iterator.hasNext()) {
- list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
}
return list;
}
@@ -354,7 +343,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
while (iterator.hasNext()) {
- list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
}
return list;
}
@@ -371,7 +360,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
while (iterator.hasNext()) {
- list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
}
return list;
}
@@ -387,7 +376,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
while (iterator.hasNext()) {
- list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
}
return list;
}
@@ -402,7 +391,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
while (iterator.hasNext()) {
- JCRMessage member = new JCRMessage(iterator.nextNode(), getLogger());
+ JCRMessage member = new JCRMessage(iterator.nextNode(), mailboxSession.getLog());
list.add(member);
}
return list;
@@ -417,7 +406,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
while (iterator.hasNext()) {
- list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
}
return list;
}
@@ -432,7 +421,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
while (iterator.hasNext()) {
- JCRMessage member = new JCRMessage(iterator.nextNode(), getLogger());
+ JCRMessage member = new JCRMessage(iterator.nextNode(), mailboxSession.getLog());
list.add(member);
}
return list;
@@ -500,7 +489,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
while(iterator.hasNext()) {
- list.add(new JCRMessage(iterator.nextNode(), getLogger()));
+ list.add(new JCRMessage(iterator.nextNode(), mailboxSession.getLog()));
}
return list;
@@ -526,7 +515,7 @@ public class JCRMessageMapper extends Ab
NodeIterator iterator = result.getNodes();
if(iterator.hasNext()) {
- return new JCRMessage(iterator.nextNode(), getLogger()).getUid();
+ return new JCRMessage(iterator.nextNode(), mailboxSession.getLog()).getUid();
} else {
return null;
}
@@ -560,7 +549,7 @@ public class JCRMessageMapper extends Ab
* Logout from open JCR Session
*/
public void endRequest() {
- repository.logout(mSession);
+ repository.logout(mailboxSession);
}
Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/user/JCRSubscriptionMapper.java Mon May 30 18:44:56 2011
@@ -41,7 +41,6 @@ import org.apache.james.mailbox.jcr.Mail
import org.apache.james.mailbox.jcr.user.model.JCRSubscription;
import org.apache.james.mailbox.store.user.SubscriptionMapper;
import org.apache.james.mailbox.store.user.model.Subscription;
-import org.slf4j.Logger;
/**
* JCR implementation of a SubscriptionManager
@@ -49,8 +48,8 @@ import org.slf4j.Logger;
*/
public class JCRSubscriptionMapper extends AbstractJCRScalingMapper implements SubscriptionMapper {
- public JCRSubscriptionMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling, final Logger log) {
- super(repos,session, scaling, log);
+ public JCRSubscriptionMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling) {
+ super(repos,session, scaling);
}
/*
Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java Mon May 30 18:44:56 2011
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.jpa.mail
import org.apache.james.mailbox.jpa.mail.JPAMessageMapper;
import org.apache.james.mailbox.jpa.user.JPASubscriptionMapper;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.MessageSearchIndex;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.user.SubscriptionMapper;
@@ -37,12 +38,18 @@ import org.apache.james.mailbox.store.us
public class JPAMailboxSessionMapperFactory extends MailboxSessionMapperFactory<Long> {
private final EntityManagerFactory entityManagerFactory;
+ private MessageSearchIndex<Long> index;
- public JPAMailboxSessionMapperFactory(EntityManagerFactory entityManagerFactory) {
+ public JPAMailboxSessionMapperFactory(MessageSearchIndex<Long> index, EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
+ this.index = index;
createEntityManager().close();
}
+ public JPAMailboxSessionMapperFactory(EntityManagerFactory entityManagerFactory) {
+ this(null, entityManagerFactory);
+ }
+
@Override
public MailboxMapper<Long> createMailboxMapper(MailboxSession session) {
return new JPAMailboxMapper(entityManagerFactory);
@@ -50,7 +57,7 @@ public class JPAMailboxSessionMapperFact
@Override
public MessageMapper<Long> createMessageMapper(MailboxSession session) {
- return new JPAMessageMapper(entityManagerFactory);
+ return new JPAMessageMapper(session, index, entityManagerFactory);
}
@Override
Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java Mon May 30 18:44:56 2011
@@ -30,6 +30,7 @@ import javax.persistence.PersistenceExce
import javax.persistence.Query;
import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageMetaData;
import org.apache.james.mailbox.MessageRange;
import org.apache.james.mailbox.MessageRange.Type;
@@ -37,6 +38,7 @@ import org.apache.james.mailbox.jpa.mail
import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;
import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;
import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;
+import org.apache.james.mailbox.store.MessageSearchIndex;
import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.mail.SimpleMessageMetaData;
@@ -51,7 +53,8 @@ public class JPAMessageMapper extends Ab
protected EntityManagerFactory entityManagerFactory;
protected EntityManager entityManager;
- public JPAMessageMapper(final EntityManagerFactory entityManagerFactory) {
+ public JPAMessageMapper(final MailboxSession session, MessageSearchIndex<Long> index, final EntityManagerFactory entityManagerFactory) {
+ super(session, index);
this.entityManagerFactory = entityManagerFactory;
}
Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxSessionMapperFactory.java Mon May 30 18:44:56 2011
@@ -25,6 +25,7 @@ import org.apache.james.mailbox.maildir.
import org.apache.james.mailbox.maildir.mail.MaildirMessageMapper;
import org.apache.james.mailbox.maildir.user.MaildirSubscriptionMapper;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.MessageSearchIndex;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.user.SubscriptionMapper;
@@ -33,11 +34,19 @@ public class MaildirMailboxSessionMapper
MailboxSessionMapperFactory<Integer> {
private final MaildirStore store;
+ private final MessageSearchIndex<Integer> index;
public MaildirMailboxSessionMapperFactory(MaildirStore store) {
+ this(store, null);
+ }
+
+
+ public MaildirMailboxSessionMapperFactory(MaildirStore store, MessageSearchIndex<Integer> index) {
this.store = store;
+ this.index = index;
}
+
@Override
protected MailboxMapper<Integer> createMailboxMapper(MailboxSession session)
throws MailboxException {
@@ -47,7 +56,7 @@ public class MaildirMailboxSessionMapper
@Override
protected MessageMapper<Integer> createMessageMapper(MailboxSession session)
throws MailboxException {
- return new MaildirMessageMapper(store);
+ return new MaildirMessageMapper(session, index, store);
}
@Override
Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java Mon May 30 18:44:56 2011
@@ -25,20 +25,18 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.Map.Entry;
-import javax.mail.Flags;
import javax.mail.Flags.Flag;
import org.apache.commons.io.FileUtils;
import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageMetaData;
import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.UpdatedFlags;
import org.apache.james.mailbox.MessageRange.Type;
import org.apache.james.mailbox.maildir.MaildirFolder;
import org.apache.james.mailbox.maildir.MaildirMessageName;
@@ -46,18 +44,19 @@ import org.apache.james.mailbox.maildir.
import org.apache.james.mailbox.maildir.mail.model.AbstractMaildirMessage;
import org.apache.james.mailbox.maildir.mail.model.LazyLoadingMaildirMessage;
import org.apache.james.mailbox.maildir.mail.model.MaildirMessage;
-import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.MessageSearchIndex;
+import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
import org.apache.james.mailbox.store.mail.SimpleMessageMetaData;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.Message;
-import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
-public class MaildirMessageMapper extends NonTransactionalMapper implements MessageMapper<Integer> {
+public class MaildirMessageMapper extends AbstractMessageMapper<Integer> {
private final MaildirStore maildirStore;
private final int BUF_SIZE = 2048;
- public MaildirMessageMapper(MaildirStore maildirStore) {
+ public MaildirMessageMapper(MailboxSession session, MessageSearchIndex<Integer> index, MaildirStore maildirStore) {
+ super(session, index);
this.maildirStore = maildirStore;
}
@@ -186,41 +185,6 @@ public class MaildirMessageMapper extend
}
- /*
- * (non-Javadoc)
- * @see org.apache.james.mailbox.store.mail.MessageMapper#expungeMarkedForDeletionInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.MessageRange)
- */
- public Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox<Integer> mailbox, MessageRange set) throws MailboxException {
- List<Message<Integer>> results = new ArrayList<Message<Integer>>();
- final long from = set.getUidFrom();
- final long to = set.getUidTo();
- final Type type = set.getType();
- switch (type) {
- default:
- case ALL:
- results = findMessagesInMailbox(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, -1);
- break;
- case FROM:
- results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, -1);
- break;
- case ONE:
- results = findDeletedMessageInMailboxWithUID(mailbox, from);
- break;
- case RANGE:
- results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, to);
- break;
- }
- Map<Long, MessageMetaData> uids = new HashMap<Long, MessageMetaData>();
- for (int i = 0; i < results.size(); i++) {
- Message<Integer> m = results.get(i);
- long uid = m.getUid();
- uids.put(uid, new SimpleMessageMetaData(m));
- delete(mailbox, m);
- }
-
- return uids;
- }
-
private List<Message<Integer>> findMessagesInMailbox(Mailbox<Integer> mailbox,
FilenameFilter filter, int limit) throws MailboxException {
MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
@@ -289,27 +253,169 @@ public class MaildirMessageMapper extend
}
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#endRequest()
+ */
+ public void endRequest() {
+ // not used
+
+ }
+
+ /**
+ * Call {@link #calculateHigestModSeq(Mailbox)} as we do no caching here
+ */
+ public long getHighestModSeq(Mailbox<Integer> mailbox) throws MailboxException {
+ return calculateHigestModSeq(mailbox);
+ }
+
+ /**
+ * Call {@link #calculateLastUid(Mailbox)} as we do no caching here
+ */
+ public long getLastUid(Mailbox<Integer> mailbox) throws MailboxException {
+ return calculateLastUid(mailbox);
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#calculateHigestModSeq(org.apache.james.mailbox.store.mail.model.Mailbox)
+ */
+ protected long calculateHigestModSeq(Mailbox<Integer> mailbox) throws MailboxException {
+ MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+ try {
+ return folder.getHighestModSeq();
+ } catch (IOException e) {
+ throw new MailboxException("Unable to get highest mod-seq for mailbox " + mailbox, e);
+ }
+ }
+
+
/*
* (non-Javadoc)
- * @see org.apache.james.mailbox.store.mail.MessageMapper#add(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.MailboxMembership)
+ * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#calculateLastUid(org.apache.james.mailbox.store.mail.model.Mailbox)
*/
- public MessageMetaData add(Mailbox<Integer> mailbox, Message<Integer> message)
- throws MailboxException {
- AbstractMaildirMessage maildirMessage = (AbstractMaildirMessage) message;
+ protected long calculateLastUid(Mailbox<Integer> mailbox) throws MailboxException {
MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
- long uid = 0;
- // a new message
- if (maildirMessage.isNew()) {
+ try {
+ return folder.getLastUid();
+ } catch (IOException e) {
+ throw new MailboxException("Unable to get last uid for mailbox " + mailbox, e);
+ }
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, long, long, org.apache.james.mailbox.store.mail.model.Message)
+ */
+ protected void copy(Mailbox<Integer> mailbox, long uid, long modSeq, Message<Integer> original) throws MailboxException {
+ MaildirMessage theCopy = new MaildirMessage(mailbox, (AbstractMaildirMessage) original);
+ save(mailbox, theCopy);
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#expungeMarkedForDeletion(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.MessageRange)
+ */
+ protected Map<Long, MessageMetaData> expungeMarkedForDeletion(Mailbox<Integer> mailbox, MessageRange set) throws MailboxException {
+ List<Message<Integer>> results = new ArrayList<Message<Integer>>();
+ final long from = set.getUidFrom();
+ final long to = set.getUidTo();
+ final Type type = set.getType();
+ switch (type) {
+ default:
+ case ALL:
+ results = findMessagesInMailbox(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, -1);
+ break;
+ case FROM:
+ results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, -1);
+ break;
+ case ONE:
+ results = findDeletedMessageInMailboxWithUID(mailbox, from);
+ break;
+ case RANGE:
+ results = findMessagesInMailboxBetweenUIDs(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, from, to);
+ break;
+ }
+ Map<Long, MessageMetaData> uids = new HashMap<Long, MessageMetaData>();
+ for (int i = 0; i < results.size(); i++) {
+ Message<Integer> m = results.get(i);
+ long uid = m.getUid();
+ uids.put(uid, new SimpleMessageMetaData(m));
+ delete(mailbox, m);
+ }
+
+ return uids;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message)
+ */
+ protected void save(Mailbox<Integer> mailbox, Message<Integer> message) throws MailboxException {
+ if (message instanceof LazyLoadingMaildirMessage) {
+ // if the message is an instanceof LazyLoadingMaildirMessage we can be sure it was loaded out of the store and
+ // so we need only to update the flags
+ try {
+ MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+ LazyLoadingMaildirMessage maildirMessage = (LazyLoadingMaildirMessage) message;
+ MaildirMessageName messageName = folder.getMessageNameByUid(maildirMessage.getUid());
+ File messageFile = messageName.getFile();
+ // System.out.println("save existing " + message +
+ // " as " + messageFile.getName());
+ messageName.setFlags(maildirMessage.createFlags());
+ // this automatically moves messages from new to cur if
+ // needed
+ String newMessageName = messageName.getFullName();
+
+ File newMessageFile;
+
+ // See MAILBOX-57
+ if (message.createFlags().contains(Flag.RECENT)) {
+ // message is recent so save it in the new folder
+ newMessageFile = new File(folder.getNewFolder(), newMessageName);
+ } else {
+ newMessageFile = new File(folder.getCurFolder(), newMessageName);
+ }
+ long modSeq;
+ // if the flags don't have change we should not try to move the
+ // file
+ if (newMessageFile.equals(messageFile) == false) {
+ FileUtils.moveFile(messageFile, newMessageFile);
+ modSeq = newMessageFile.lastModified();
+
+ } else {
+ modSeq = messageFile.lastModified();
+ }
+ maildirMessage.setModSeq(modSeq);
+
+ long uid = maildirMessage.getUid();
+ folder.update(uid, newMessageName);
+ } catch (IOException e) {
+ throw new MailboxException("Unable to save flags update for message " + message + " in mailbox " + mailbox, e);
+ }
+ } else {
+ MaildirMessage maildirMessage = (MaildirMessage) message;
+ MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+ long uid = 0;
+ // a new message
// save file to "tmp" folder
File tmpFolder = folder.getTmpFolder();
- // The only case in which we could get problems with clashing names is if the system clock
- // has been set backwards, then the server is restarted with the same pid, delivers the same
- // number of messages since its start in the exact same millisecond as done before and the
+ // The only case in which we could get problems with clashing names
+ // is if the system clock
+ // has been set backwards, then the server is restarted with the
+ // same pid, delivers the same
+ // number of messages since its start in the exact same millisecond
+ // as done before and the
// random number generator returns the same number.
- // In order to prevent this case we would need to check ALL files in all folders and compare
- // them to this message name. We rather let this happen once in a billion years...
- MaildirMessageName messageName = MaildirMessageName.createUniqueName(folder,
- message.getFullContentOctets());
+ // In order to prevent this case we would need to check ALL files in
+ // all folders and compare
+ // them to this message name. We rather let this happen once in a
+ // billion years...
+ MaildirMessageName messageName = MaildirMessageName.createUniqueName(folder, message.getFullContentOctets());
File messageFile = new File(tmpFolder, messageName.getFullName());
FileOutputStream fos = null;
InputStream input = null;
@@ -321,11 +427,9 @@ public class MaildirMessageMapper extend
int len = 0;
while ((len = input.read(b)) != -1)
fos.write(b, 0, len);
- }
- catch (IOException ioe) {
- throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, ioe );
- }
- finally {
+ } catch (IOException ioe) {
+ throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, ioe);
+ } finally {
try {
if (fos != null)
fos.close();
@@ -342,157 +446,67 @@ public class MaildirMessageMapper extend
if (maildirMessage.isRecent()) {
messageName.setFlags(message.createFlags());
newMessageFile = new File(folder.getNewFolder(), messageName.getFullName());
- //System.out.println("save new recent " + message + " as " + newMessageFile.getName());
+ // System.out.println("save new recent " + message + " as " +
+ // newMessageFile.getName());
}
- // appended via IMAP (might already have flags etc, goes to ./cur directly)
+ // appended via IMAP (might already have flags etc, goes to ./cur
+ // directly)
else {
messageName.setFlags(message.createFlags());
newMessageFile = new File(folder.getCurFolder(), messageName.getFullName());
- //System.out.println("save new not recent " + message + " as " + newMessageFile.getName());
+ // System.out.println("save new not recent " + message + " as "
+ // + newMessageFile.getName());
}
try {
FileUtils.moveFile(messageFile, newMessageFile);
} catch (IOException e) {
// TODO: Try copy and delete
- throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e );
+ throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e);
}
try {
uid = folder.appendMessage(newMessageFile.getName());
maildirMessage.setUid(uid);
} catch (IOException e) {
- throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e );
+ throw new MailboxException("Failure while save Message " + message + " in Mailbox " + mailbox, e);
}
- } else {
- throw new MailboxException("Message already exists!");
}
-
- return new SimpleMessageMetaData(maildirMessage);
- }
-
-
-
- /*
- * (non-Javadoc)
- * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#endRequest()
- */
- public void endRequest() {
- // not used
-
}
- /*
- * (non-Javadoc)
- * @see org.apache.james.mailbox.store.mail.MessageMapper#updateFlags(org.apache.james.mailbox.store.mail.model.Mailbox, javax.mail.Flags, boolean, boolean, org.apache.james.mailbox.MessageRange)
+ /**
+ * Do nothing as maildir store the uid and modseq everytime by it own
*/
- public Iterator<UpdatedFlags> updateFlags(final Mailbox<Integer> mailbox, final Flags flags, final boolean value, final boolean replace, MessageRange set) throws MailboxException {
- final List<UpdatedFlags> updatedFlags = new ArrayList<UpdatedFlags>();
- final MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-
- findInMailbox(mailbox, set, new MailboxMembershipCallback<Integer>() {
-
- public void onMailboxMembers(List<Message<Integer>> members) throws MailboxException {
- for (final Message<Integer> member : members) {
- Flags originalFlags = member.createFlags();
- if (replace) {
- member.setFlags(flags);
- } else {
- Flags current = member.createFlags();
- if (value) {
- current.add(flags);
- } else {
- current.remove(flags);
- }
- member.setFlags(current);
- }
- Flags newFlags = member.createFlags();
-
- try {
- AbstractMaildirMessage maildirMessage = (AbstractMaildirMessage) member;
- MaildirMessageName messageName = folder.getMessageNameByUid(maildirMessage.getUid());
- File messageFile = messageName.getFile();
- // System.out.println("save existing " + message +
- // " as " + messageFile.getName());
- messageName.setFlags(maildirMessage.createFlags());
- // this automatically moves messages from new to cur if
- // needed
- String newMessageName = messageName.getFullName();
-
- File newMessageFile;
-
- // See MAILBOX-57
- if (newFlags.contains(Flag.RECENT)) {
- // message is recent so save it in the new folder
- newMessageFile = new File(folder.getNewFolder(), newMessageName);
- } else {
- newMessageFile = new File(folder.getCurFolder(), newMessageName);
- }
- long modSeq;
- // if the flags don't have change we should not try to move the file
- if (newMessageFile.equals(messageFile) == false) {
- FileUtils.moveFile(messageFile, newMessageFile );
- modSeq = newMessageFile.lastModified();
-
- } else {
- modSeq = messageFile.lastModified();
- }
- maildirMessage.setModSeq(modSeq);
-
- updatedFlags.add(new UpdatedFlags(member.getUid(), modSeq, originalFlags, newFlags));
-
- long uid = maildirMessage.getUid();
- folder.update(uid, newMessageName);
- } catch (IOException e) {
- throw new MailboxException("Failure while save Message " + member + " in Mailbox " + mailbox, e);
- }
-
- }
- }
- });
-
- return updatedFlags.iterator();
+ protected void saveSequences(Mailbox<Integer> mailbox, long lastUid, long highestModSeq) throws MailboxException {
+ // Nothing todo as maildir does its own sequence-keeping
}
/*
* (non-Javadoc)
- * @see org.apache.james.mailbox.store.mail.MessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.store.mail.model.Message)
+ * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#begin()
*/
- public MessageMetaData copy(Mailbox<Integer> mailbox, Message<Integer> original) throws MailboxException {
- MaildirMessage theCopy = new MaildirMessage(mailbox, (AbstractMaildirMessage) original);
-
- return add(mailbox, theCopy);
+ protected void begin() throws MailboxException {
+ //nothing todo
}
/*
* (non-Javadoc)
- * @see org.apache.james.mailbox.store.mail.MessageMapper#getHighestModSeq(org.apache.james.mailbox.store.mail.model.Mailbox)
+ * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#commit()
*/
- public long getHighestModSeq(Mailbox<Integer> mailbox) throws MailboxException {
- MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
- try {
- return folder.getHighestModSeq();
- } catch (IOException e) {
- throw new MailboxException("Unable to get highest mod-seq for mailbox " + mailbox, e);
- }
-
-
+ protected void commit() throws MailboxException {
+ //nothing todo
}
+
/*
* (non-Javadoc)
- * @see org.apache.james.mailbox.store.mail.MessageMapper#getLastUid(org.apache.james.mailbox.store.mail.model.Mailbox)
+ * @see org.apache.james.mailbox.store.transaction.TransactionalMapper#rollback()
*/
- public long getLastUid(Mailbox<Integer> mailbox) throws MailboxException {
- MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
- try {
- return folder.getLastUid();
- } catch (IOException e) {
- throw new MailboxException("Unable to get last uid for mailbox " + mailbox, e);
- }
+ protected void rollback() throws MailboxException {
+ //nothing todo
}
}
Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java (original)
+++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java Mon May 30 18:44:56 2011
@@ -37,7 +37,7 @@ public class InMemoryMailboxSessionMappe
public InMemoryMailboxSessionMapperFactory() {
mailboxMapper = new InMemoryMailboxMapper();
- messageMapper = new InMemoryMessageMapper();
+ messageMapper = new InMemoryMessageMapper(null);
subscriptionMapper = new InMemorySubscriptionMapper();
}
Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java (original)
+++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java Mon May 30 18:44:56 2011
@@ -28,6 +28,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageMetaData;
import org.apache.james.mailbox.MessageRange;
import org.apache.james.mailbox.inmemory.mail.model.SimpleMailboxMembership;
@@ -41,7 +42,8 @@ public class InMemoryMessageMapper exten
private Map<Long, Map<Long, Message<Long>>> mailboxByUid;
private static final int INITIAL_SIZE = 256;
- public InMemoryMessageMapper() {
+ public InMemoryMessageMapper(MailboxSession session) {
+ super(session);
this.mailboxByUid = new ConcurrentHashMap<Long, Map<Long, Message<Long>>>(INITIAL_SIZE);
}
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=1129288&r1=1129287&r2=1129288&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 Mon May 30 18:44:56 2011
@@ -25,7 +25,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
@@ -46,11 +45,8 @@ import org.apache.james.mailbox.MessageM
import org.apache.james.mailbox.MessageRange;
import org.apache.james.mailbox.MessageResult;
import org.apache.james.mailbox.SearchQuery;
-import org.apache.james.mailbox.SearchQuery.NumericRange;
-import org.apache.james.mailbox.SearchQuery.UidCriterion;
import org.apache.james.mailbox.UpdatedFlags;
import org.apache.james.mailbox.MessageResult.FetchGroup;
-import org.apache.james.mailbox.SearchQuery.Criterion;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.mail.MessageMapperFactory;
import org.apache.james.mailbox.store.mail.model.Header;
@@ -600,62 +596,7 @@ public abstract class StoreMessageManage
*/
public Iterator<Long> search(SearchQuery query, MailboxSession mailboxSession) throws MailboxException {
MessageMapper<Id> messageMapper = mapperFactory.getMessageMapper(mailboxSession);
- List<Criterion> crits = query.getCriterias();
-
- if (crits.size() == 1 && crits.get(0) instanceof UidCriterion) {
- final List<Long> uids = new ArrayList<Long>();
- UidCriterion uidCrit = (UidCriterion) crits.get(0);
- NumericRange[] ranges = uidCrit.getOperator().getRange();
- for (int i = 0; i < ranges.length; i++) {
- NumericRange r = ranges[i];
- messageMapper.findInMailbox(getMailboxEntity(), MessageRange.range(r.getLowValue(), r.getHighValue()), new MailboxMembershipCallback<Id>() {
-
- public void onMailboxMembers(List<Message<Id>> list) throws MailboxException {
- for (int i = 0; i < list.size(); i++) {
- long uid = list.get(i).getUid();
- if (uids.contains(uid) == false) {
- uids.add(uid);
- }
- }
- }
- });
- }
- Collections.sort(uids);
- return uids.iterator();
-
-
- } else {
- final List<Message<Id>> hits = new ArrayList<Message<Id>>();
-
- messageMapper.findInMailbox(getMailboxEntity(), MessageRange.all(), new MailboxMembershipCallback<Id>() {
-
- public void onMailboxMembers(List<Message<Id>> list) throws MailboxException {
- for (int i = 0; i < list.size(); i++) {
- Message<Id> m = list.get(i);
- if (hits.contains(m) == false) {
- hits.add(m);
- }
- }
- }
- });
- Collections.sort(hits);
-
- return new SearchQueryIterator(new Iterator<Message<?>>() {
- final Iterator<Message<Id>> it = hits.iterator();
- public boolean hasNext() {
- return it.hasNext();
- }
-
- public Message<?> next() {
- return it.next();
- }
-
- public void remove() {
- it.remove();
- }
-
- }, query, mailboxSession.getLog());
- }
+ return messageMapper.search(getMailboxEntity(), query);
}
Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java Mon May 30 18:44:56 2011
@@ -19,6 +19,7 @@
package org.apache.james.mailbox.store.mail;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -31,7 +32,13 @@ import org.apache.james.mailbox.MailboxE
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageMetaData;
import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.SearchQuery;
import org.apache.james.mailbox.UpdatedFlags;
+import org.apache.james.mailbox.SearchQuery.Criterion;
+import org.apache.james.mailbox.SearchQuery.NumericRange;
+import org.apache.james.mailbox.SearchQuery.UidCriterion;
+import org.apache.james.mailbox.store.MessageSearchIndex;
+import org.apache.james.mailbox.store.SearchQueryIterator;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.Message;
import org.apache.james.mailbox.store.transaction.TransactionalMapper;
@@ -46,7 +53,19 @@ public abstract class AbstractMessageMap
private final static ConcurrentHashMap<Object, AtomicLong> seqs = new ConcurrentHashMap<Object, AtomicLong>();
private final static ConcurrentHashMap<Object, AtomicLong> uids = new ConcurrentHashMap<Object, AtomicLong>();
-
+ protected final MailboxSession mailboxSession;
+ protected final MessageSearchIndex<Id> index;
+
+ public AbstractMessageMapper(MailboxSession mailboxSession) {
+ this(mailboxSession, null);
+ }
+
+ public AbstractMessageMapper(MailboxSession mailboxSession, MessageSearchIndex<Id> index) {
+ this.mailboxSession = mailboxSession;
+ this.index = index;
+ }
+
+
/*
* (non-Javadoc)
* @see org.apache.james.mailbox.store.mail.MessageMapper#getHighestModSeq(org.apache.james.mailbox.store.mail.model.Mailbox)
@@ -154,6 +173,12 @@ public abstract class AbstractMessageMap
saveSequences(mailbox, nextUid(mailbox), nextModSeq(mailbox));
}
+ if (index != null) {
+ Iterator<MessageRange> rangeIt = MessageRange.toRanges(new ArrayList<Long>(data.keySet())).iterator();
+ while(rangeIt.hasNext()) {
+ index.delete(mailboxSession, mailbox, rangeIt.next());
+ }
+ }
return data;
}
@@ -190,16 +215,21 @@ public abstract class AbstractMessageMap
// increase the mod-seq as we changed the flags
member.setModSeq(modSeq);
save(mailbox, member);
+
+
+ if (index != null) {
+ index.update(mailboxSession, mailbox, MessageRange.one(member.getUid()), newFlags);
+ }
}
+
UpdatedFlags uFlags = new UpdatedFlags(member.getUid(), member.getModSeq(), originalFlags, newFlags);
updatedFlags.add(uFlags);
}
-
}
});
@@ -214,6 +244,9 @@ public abstract class AbstractMessageMap
message.setUid(nextUid(mailbox));
message.setModSeq(nextModSeq(mailbox));
save(mailbox, message);
+ if (index != null) {
+ index.add(mailboxSession, mailbox, message);
+ }
return new SimpleMessageMetaData(message);
}
@@ -232,6 +265,74 @@ public abstract class AbstractMessageMap
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.mailbox.store.mail.MessageMapper#search(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.SearchQuery)
+ */
+ public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery query) throws MailboxException {
+ if (index == null) {
+ List<Criterion> crits = query.getCriterias();
+
+ if (crits.size() == 1 && crits.get(0) instanceof UidCriterion) {
+ final List<Long> uids = new ArrayList<Long>();
+ UidCriterion uidCrit = (UidCriterion) crits.get(0);
+ NumericRange[] ranges = uidCrit.getOperator().getRange();
+ for (int i = 0; i < ranges.length; i++) {
+ NumericRange r = ranges[i];
+ findInMailbox(mailbox, MessageRange.range(r.getLowValue(), r.getHighValue()), new MailboxMembershipCallback<Id>() {
+
+ public void onMailboxMembers(List<Message<Id>> list) throws MailboxException {
+ for (int i = 0; i < list.size(); i++) {
+ long uid = list.get(i).getUid();
+ if (uids.contains(uid) == false) {
+ uids.add(uid);
+ }
+ }
+ }
+ });
+ }
+ Collections.sort(uids);
+ return uids.iterator();
+
+
+ } else {
+ final List<Message<Id>> hits = new ArrayList<Message<Id>>();
+
+ findInMailbox(mailbox, MessageRange.all(), new MailboxMembershipCallback<Id>() {
+
+ public void onMailboxMembers(List<Message<Id>> list) throws MailboxException {
+ for (int i = 0; i < list.size(); i++) {
+ Message<Id> m = list.get(i);
+ if (hits.contains(m) == false) {
+ hits.add(m);
+ }
+ }
+ }
+ });
+ Collections.sort(hits);
+
+ return new SearchQueryIterator(new Iterator<Message<?>>() {
+ final Iterator<Message<Id>> it = hits.iterator();
+ public boolean hasNext() {
+ return it.hasNext();
+ }
+
+ public Message<?> next() {
+ return it.next();
+ }
+
+ public void remove() {
+ it.remove();
+ }
+
+ }, query, mailboxSession.getLog());
+ }
+ } else {
+ return index.search(mailboxSession, mailbox, query);
+ }
+
+ }
+
/**
* Return the higest mod-seq for the given {@link Mailbox}. This method is called in a lazy fashion. So when the first mod-seq is needed for a {@link Mailbox}
* it will get called to get the higest used. After that it will stored in memory and just increment there on each {@link #nextModSeq(MailboxSession, Mailbox)} call.
Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java?rev=1129288&r1=1129287&r2=1129288&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java Mon May 30 18:44:56 2011
@@ -25,8 +25,10 @@ import java.util.Map;
import javax.mail.Flags;
import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageMetaData;
import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.SearchQuery;
import org.apache.james.mailbox.UpdatedFlags;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.Message;
@@ -170,5 +172,8 @@ public interface MessageMapper<Id> exten
* @throws MailboxException
*/
public abstract long getHighestModSeq(Mailbox<Id> mailbox) throws MailboxException;
+
+ public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery query) throws MailboxException;
+
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org