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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to