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 2010/12/04 16:03:27 UTC
svn commit: r1042197 - 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/ parent/
Author: norman
Date: Sat Dec 4 15:03:27 2010
New Revision: 1042197
URL: http://svn.apache.org/viewvc?rev=1042197&view=rev
Log:
upgrade to jackrabbit 2.2-SNAPSHOT and remove the NodeLocker usage in JCRMessageMapper. I also removed the nested folder structure to store mails (break done per day). This allows us to store 8x faster then before
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/parent/pom.xml
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=1042197&r1=1042196&r2=1042197&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 Sat Dec 4 15:03:27 2010
@@ -38,20 +38,14 @@ public abstract class AbstractJCRMapper
private final Log logger;
private final MailboxSessionJCRRepository repository;
protected final MailboxSession mSession;
- private final NodeLocker locker;
- public AbstractJCRMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession, NodeLocker locker, Log logger) {
+ public AbstractJCRMapper(final MailboxSessionJCRRepository repository, MailboxSession mSession, Log logger) {
this.repository = repository;
this.mSession = mSession;
this.logger = logger;
- this.locker = locker;
}
- public NodeLocker getNodeLocker() {
- return locker;
- }
-
/**
* Return the logger
*
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=1042197&r1=1042196&r2=1042197&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 Sat Dec 4 15:03:27 2010
@@ -34,8 +34,8 @@ public abstract class AbstractJCRScaling
private final int scaling;
private final static char PAD ='_';
- public AbstractJCRScalingMapper(MailboxSessionJCRRepository repository, MailboxSession mSession, NodeLocker locker, int scaling, Log logger) {
- super(repository, mSession, locker, logger);
+ public AbstractJCRScalingMapper(MailboxSessionJCRRepository repository, MailboxSession mSession, int scaling, Log logger) {
+ super(repository, mSession, logger);
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=1042197&r1=1042196&r2=1042197&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 Sat Dec 4 15:03:27 2010
@@ -44,20 +44,18 @@ public class JCRMailboxSessionMapperFact
private final Log logger;
private final NodeLocker locker;
private final static int DEFAULT_SCALING = 2;
- private int scaling;
- private int messageScaling;
- private UidProvider<String> provider;
+ private final int scaling;
+ private final UidProvider<String> provider;
public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository, final NodeLocker locker, final UidProvider<String> uidProvider) {
- this(repository, locker, uidProvider, DEFAULT_SCALING, JCRMessageMapper.MESSAGE_SCALE_DAY);
+ this(repository, locker, uidProvider, DEFAULT_SCALING);
}
- public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository, final NodeLocker locker, final UidProvider<String> provider, final int scaling, final int messageScaling) {
+ public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository repository, final NodeLocker locker, final UidProvider<String> provider, final int scaling) {
this.repository = repository;
this.logger = LogFactory.getLog(JCRMailboxSessionMapperFactory.class);
this.locker = locker;
this.scaling = scaling;
- this.messageScaling = messageScaling;
this.provider = provider;
}
@@ -69,13 +67,13 @@ public class JCRMailboxSessionMapperFact
@Override
public MessageMapper<String> createMessageMapper(MailboxSession session) throws MailboxException {
- JCRMessageMapper messageMapper = new JCRMessageMapper(repository, session, locker, provider, logger, messageScaling);
+ JCRMessageMapper messageMapper = new JCRMessageMapper(repository, session, provider, logger);
return messageMapper;
}
@Override
public SubscriptionMapper createSubscriptionMapper(MailboxSession session) throws SubscriptionException {
- JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(repository, session, locker, DEFAULT_SCALING, logger);
+ JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(repository, session, DEFAULT_SCALING, logger);
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=1042197&r1=1042196&r2=1042197&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 Sat Dec 4 15:03:27 2010
@@ -54,8 +54,11 @@ import org.apache.james.mailbox.store.ma
*/
public class JCRMailboxMapper extends AbstractJCRScalingMapper implements MailboxMapper<String> {
- public JCRMailboxMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final NodeLocker locker, final int scaling, final Log logger) {
- super(repos, session, locker, scaling, logger);
+ private NodeLocker locker;
+
+ public JCRMailboxMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final NodeLocker locker, final int scaling, final Log logger) {
+ super(repos, session, scaling, logger);
+ this.locker = locker;
}
/*
@@ -165,7 +168,6 @@ public class JCRMailboxMapper extends Ab
} else {
mailboxNode = rootNode.getNode(MAILBOXES_PATH);
}
- NodeLocker locker = getNodeLocker();
locker.execute(new NodeLockedExecution<Void>() {
public Void execute(Node node) throws RepositoryException {
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=1042197&r1=1042196&r2=1042197&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 Sat Dec 4 15:03:27 2010
@@ -20,8 +20,6 @@ package org.apache.james.mailbox.jcr.mai
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
import java.util.Iterator;
import java.util.List;
@@ -34,20 +32,16 @@ import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import org.apache.commons.logging.Log;
-import org.apache.jackrabbit.JcrConstants;
-import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.util.ISO9075;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.SearchQuery;
import org.apache.james.mailbox.MessageRange.Type;
+import org.apache.james.mailbox.SearchQuery;
import org.apache.james.mailbox.SearchQuery.Criterion;
import org.apache.james.mailbox.SearchQuery.NumericRange;
import org.apache.james.mailbox.jcr.AbstractJCRMapper;
import org.apache.james.mailbox.jcr.MailboxSessionJCRRepository;
-import org.apache.james.mailbox.jcr.NodeLocker;
-import org.apache.james.mailbox.jcr.NodeLocker.NodeLockedExecution;
import org.apache.james.mailbox.jcr.mail.model.JCRMessage;
import org.apache.james.mailbox.store.SearchQueryIterator;
import org.apache.james.mailbox.store.mail.MessageMapper;
@@ -56,76 +50,24 @@ import org.apache.james.mailbox.store.ma
import org.apache.james.mailbox.store.mail.model.MailboxMembership;
/**
- * JCR implementation of a {@link MessageMapper}
+ * JCR implementation of a {@link MessageMapper}. The implementation store each message as
+ * a seperate child node under the mailbox
*
*/
public class JCRMessageMapper extends AbstractJCRMapper implements MessageMapper<String> {
- /**
- * Store the messages directly in the mailbox:
- * .../mailbox/
- */
- public final static int MESSAGE_SCALE_NONE = 0;
-
- /**
- * Store the messages under a year directory in the mailbox:
- * .../mailbox/2010/
- */
- public final static int MESSAGE_SCALE_YEAR = 1;
-
- /**
- * Store the messages under a year/month directory in the mailbox:
- * .../mailbox/2010/05/
- */
- public final static int MESSAGE_SCALE_MONTH = 2;
-
- /**
- * Store the messages under a year/month/day directory in the mailbox:
- * .../mailbox/2010/05/01/
- */
- public final static int MESSAGE_SCALE_DAY = 3;
-
- /**
- * Store the messages under a year/month/day/hour directory in the mailbox:
- * .../mailbox/2010/05/02/11
- */
- public final static int MESSAGE_SCALE_HOUR = 4;
-
-
- /**
- * Store the messages under a year/month/day/hour/min directory in the mailbox:
- * .../mailbox/2010/05/02/11/59
- */
- public final static int MESSAGE_SCALE_MINUTE = 5;
-
- private final int scaleType;
-
private UidProvider<String> uidGenerator;
/**
- *
- * @see #JCRMessageMapper(MailboxSessionJCRRepository, MailboxSession, NodeLocker, Log, int)
- *
- * In this case {@link #MESSAGE_SCALE_DAY} is used
- */
- public JCRMessageMapper(final MailboxSessionJCRRepository repos, MailboxSession session, NodeLocker locker, final UidProvider<String> uidGenerator, final Log logger) {
- this(repos, session, locker, uidGenerator, logger, MESSAGE_SCALE_DAY);
- }
-
- /**
* Construct a new {@link JCRMessageMapper} instance
*
* @param repos {@link MailboxSessionJCRRepository} to use
* @param session {@link MailboxSession} to which the mapper is bound
- * @param locker {@link NodeLocker} for locking Nodes
- * @param logger Lo
- * @param scaleType the scale type to use when storing messages. See {@link #MESSAGE_SCALE_NONE}, {@link #MESSAGE_SCALE_YEAR}, {@link #MESSAGE_SCALE_MONTH}, {@link #MESSAGE_SCALE_DAY},
- * {@link #MESSAGE_SCALE_HOUR}, {@link #MESSAGE_SCALE_MINUTE}
- */
- public JCRMessageMapper(final MailboxSessionJCRRepository repos, MailboxSession session, NodeLocker locker, final UidProvider<String> uidGenerator, final Log logger, int scaleType) {
- super(repos, session, locker, logger);
- this.scaleType = scaleType;
+ * @param logger Log
+ */
+ public JCRMessageMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final UidProvider<String> uidGenerator, final Log logger) {
+ super(repos, session, logger);
this.uidGenerator = uidGenerator;
}
@@ -477,102 +419,23 @@ public class JCRMessageMapper extends Ab
}
if (messageNode == null) {
- Date date = message.getInternalDate();
- if (date == null) {
- date = new Date();
- }
-
- // extracte the date from the message to create node structure
- // later
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- final String year = convertIntToString(cal.get(Calendar.YEAR));
- final String month = convertIntToString(cal.get(Calendar.MONTH) + 1);
- final String day = convertIntToString(cal.get(Calendar.DAY_OF_MONTH));
- final String hour = convertIntToString(cal.get(Calendar.HOUR_OF_DAY));
- final String min = convertIntToString(cal.get(Calendar.MINUTE));
-
- Node node = null;
+
Node mailboxNode = getSession().getNodeByIdentifier(mailbox.getMailboxId());
final long nextUid = uidGenerator.nextUid(mSession, mailbox);
- NodeLocker locker = getNodeLocker();
+ messageNode = mailboxNode.addNode(String.valueOf(nextUid), "nt:file");
+ messageNode.addMixin("jamesMailbox:message");
+ try {
+ membership.merge(messageNode);
+ messageNode.setProperty(JCRMessage.UID_PROPERTY, nextUid);
- if (scaleType > MESSAGE_SCALE_NONE) {
- // we lock the whole mailbox with all its childs while
- // adding the folder structure for the date
-
- // TODO: Maybe we should just lock the last child folder to
- // improve performance
- node = locker.execute(new NodeLocker.NodeLockedExecution<Node>() {
-
- public Node execute(Node node) throws RepositoryException {
-
- if (scaleType >= MESSAGE_SCALE_YEAR) {
- node = JcrUtils.getOrAddFolder(node, year);
- node.addMixin(JcrConstants.MIX_LOCKABLE);
-
- if (scaleType >= MESSAGE_SCALE_MONTH) {
- node = JcrUtils.getOrAddFolder(node, month);
- node.addMixin(JcrConstants.MIX_LOCKABLE);
-
- if (scaleType >= MESSAGE_SCALE_DAY) {
- node = JcrUtils.getOrAddFolder(node, day);
- node.addMixin(JcrConstants.MIX_LOCKABLE);
-
- if (scaleType >= MESSAGE_SCALE_HOUR) {
- node = JcrUtils.getOrAddFolder(node, hour);
- node.addMixin(JcrConstants.MIX_LOCKABLE);
-
- if (scaleType >= MESSAGE_SCALE_MINUTE) {
- node = JcrUtils.getOrAddFolder(node, min);
- node.addMixin(JcrConstants.MIX_LOCKABLE);
- }
- }
- }
- }
- }
-
- // save the folders for now
- getSession().save();
- return node;
- }
-
- public boolean isDeepLocked() {
- return true;
- }
- }, mailboxNode, Node.class);
- } else {
- node = mailboxNode;
+ } catch (IOException e) {
+ throw new RepositoryException("Unable to merge message in to tree", e);
}
-
- // lock the day node and add the message
- locker.execute(new NodeLockedExecution<Void>() {
-
- public Void execute(Node node) throws RepositoryException {
- Node messageNode = node.addNode(String.valueOf(nextUid), "nt:file");
- messageNode.addMixin("jamesMailbox:message");
- try {
- membership.merge(messageNode);
- messageNode.setProperty(JCRMessage.UID_PROPERTY, nextUid);
-
- } catch (IOException e) {
- throw new RepositoryException("Unable to merge message in to tree", e);
- }
- // save the message
- getSession().save();
-
- return null;
- }
-
- public boolean isDeepLocked() {
- return true;
- }
- }, node, Void.class);
return nextUid;
-
+
} else {
membership.merge(messageNode);
return membership.getUid();
@@ -581,26 +444,10 @@ public class JCRMessageMapper extends Ab
throw new MailboxException("Unable to save message " + message + " in mailbox " + mailbox, e);
} catch (IOException e) {
throw new MailboxException("Unable to save message " + message + " in mailbox " + mailbox, e);
- } catch (InterruptedException e) {
- throw new MailboxException("Unable to save message " + message + " in mailbox " + mailbox, e);
}
}
- /**
- * Convert the given int value to a String. If the int value is smaller then 9 it will prefix the String with 0.
- *
- * @param value
- * @return stringValue
- */
- private String convertIntToString(int value) {
- if (value <= 9) {
- return "0" +String.valueOf(value);
- } else {
- return String.valueOf(value);
- }
- }
-
/*
* (non-Javadoc)
* @see org.apache.james.mailbox.store.mail.MessageMapper#searchMailbox(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.SearchQuery)
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=1042197&r1=1042196&r2=1042197&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 Sat Dec 4 15:03:27 2010
@@ -39,7 +39,6 @@ import org.apache.james.mailbox.MailboxS
import org.apache.james.mailbox.SubscriptionException;
import org.apache.james.mailbox.jcr.AbstractJCRScalingMapper;
import org.apache.james.mailbox.jcr.MailboxSessionJCRRepository;
-import org.apache.james.mailbox.jcr.NodeLocker;
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;
@@ -50,8 +49,8 @@ import org.apache.james.mailbox.store.us
*/
public class JCRSubscriptionMapper extends AbstractJCRScalingMapper implements SubscriptionMapper {
- public JCRSubscriptionMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final NodeLocker locker, final int scaling, final Log log) {
- super(repos,session, locker, scaling, log);
+ public JCRSubscriptionMapper(final MailboxSessionJCRRepository repos, MailboxSession session, final int scaling, final Log log) {
+ super(repos,session, scaling, log);
}
/*
Modified: james/mailbox/trunk/parent/pom.xml
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/parent/pom.xml?rev=1042197&r1=1042196&r2=1042197&view=diff
==============================================================================
--- james/mailbox/trunk/parent/pom.xml (original)
+++ james/mailbox/trunk/parent/pom.xml Sat Dec 4 15:03:27 2010
@@ -531,12 +531,12 @@
<dependency>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>jackrabbit-jcr-commons</artifactId>
- <version>2.1.2</version>
+ <version>2.2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>jackrabbit-core</artifactId>
- <version>2.1.2</version>
+ <version>2.2-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org