Author: norman
Date: Wed Jun 30 20:04:57 2010
New Revision: 959420

URL: http://svn.apache.org/viewvc?rev=959420&view=rev
Log:
Handle the construction of the node path for the username in a protected method 
(IMAP-173)

Modified:
    
james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/AbstractStressTest.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxSessionMapperFactory.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java

Modified: 
james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/AbstractStressTest.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/AbstractStressTest.java?rev=959420&r1=959419&r2=959420&view=diff
==============================================================================
--- 
james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/AbstractStressTest.java
 (original)
+++ 
james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/AbstractStressTest.java
 Wed Jun 30 20:04:57 2010
@@ -49,7 +49,7 @@ public abstract class AbstractStressTest
         
         MailboxSession session = 
getMailboxManager().createSystemSession("test", new SimpleLog("Test"));
         getMailboxManager().startProcessingRequest(session);
-        
getMailboxManager().createMailbox(StoreMailboxManager.USER_NAMESPACE_PREFIX 
+".INBOX", session);
+        
getMailboxManager().createMailbox(StoreMailboxManager.USER_NAMESPACE_PREFIX 
+".username.INBOX", session);
         getMailboxManager().endProcessingRequest(session);
         getMailboxManager().logout(session, false);
         final AtomicBoolean fail = new AtomicBoolean(false);
@@ -68,7 +68,7 @@ public abstract class AbstractStressTest
 
                     try {
                         getMailboxManager().startProcessingRequest(session);
-                        Mailbox m = 
getMailboxManager().getMailbox(StoreMailboxManager.USER_NAMESPACE_PREFIX 
+".INBOX", session);
+                        Mailbox m = 
getMailboxManager().getMailbox(StoreMailboxManager.USER_NAMESPACE_PREFIX 
+".username.INBOX", session);
                         
                         System.out.println("Append message with uid=" + 
m.appendMessage(new ByteArrayInputStream("Subject: 
test\r\n\r\ntestmail".getBytes()), new Date(), session, false, new Flags()));
                         getMailboxManager().endProcessingRequest(session);

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java?rev=959420&r1=959419&r2=959420&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/AbstractJCRMapper.java
 Wed Jun 30 20:04:57 2010
@@ -18,10 +18,12 @@
  ****************************************************************/
 package org.apache.james.imap.jcr;
 
+import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.apache.commons.logging.Log;
+import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.mailbox.MailboxException;
 import org.apache.james.imap.mailbox.MailboxSession;
@@ -40,12 +42,15 @@ public abstract class AbstractJCRMapper 
     private final MailboxSessionJCRRepository repository;
     private final MailboxSession mSession;
     private final NodeLocker locker;
-
-    public AbstractJCRMapper(final MailboxSessionJCRRepository repository, 
MailboxSession mSession, NodeLocker locker, Log logger) {
+    private final int scaling;
+    private final static char PAD ='_';
+    
+    public AbstractJCRMapper(final MailboxSessionJCRRepository repository, 
MailboxSession mSession, NodeLocker locker, int scaling, Log logger) {
         this.repository = repository;
         this.mSession = mSession;
         this.logger = logger;
         this.locker = locker;
+        this.scaling = scaling;
     }
 
     public NodeLocker getNodeLocker() {
@@ -114,6 +119,70 @@ public abstract class AbstractJCRMapper 
        repository.logout(mSession);
     }
         
-    
+    /**
+     * Construct the user node path part, using the specified scaling factor.
+     * If the username is not long enough it will fill it with {...@link #PAD}
+     * 
+     * So if you use a scaling of 2 it will look like:
+     * 
+     * foo:
+     *     f/fo/foo
+     *     
+     * fo:
+     *     f/fo/fo
+     * 
+     * f: 
+     *    f/f_/fo
+     * 
+     * @param username
+     * @return path
+     */
+    protected String constructUserPathPart(String username) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0 ; i < scaling; i++) {
+            if (username.length() > i) {
+                sb.append(username.substring(0,i+1));
+            } else {
+                sb.append(username);
+                int a = i - username.length();
+                for (int b = 0; b < a; b++) {
+                    sb.append(PAD);
+                }
+            }
+            sb.append(NODE_DELIMITER);
+        }
+        sb.append(username);
+        return sb.toString();
+
+    }
+
+    /**
+     * Create the needed Node structure for the given username using the given 
Node as parent.
+     * 
+     * The method will use {...@link #constructUserPathPart(String)} for 
create the needed node path and split
+     * it when a NODE_DELIMITER was found
+     * 
+     * @param parent
+     * @param username
+     * @return userNode
+     * @throws RepositoryException
+     */
+    protected Node createUserPathStructure(Node parent, String username)
+            throws RepositoryException {
+        String userpath = constructUserPathPart(username);
+
+        String[] userPathParts = userpath.split(NODE_DELIMITER);
+        for (int a = 0; a < userPathParts.length; a++) {
+            parent = JcrUtils.getOrAddNode(parent, userPathParts[a],
+                    "nt:unstructured");
+
+            // thats the last user node so add the right mixin type
+            if (a + 1 == userPathParts.length)
+                parent.addMixin("jamesMailbox:user");
+        }
+
+        return parent;
+
+    }
 
 }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxSessionMapperFactory.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxSessionMapperFactory.java?rev=959420&r1=959419&r2=959420&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxSessionMapperFactory.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxSessionMapperFactory.java
 Wed Jun 30 20:04:57 2010
@@ -44,6 +44,7 @@ public class JCRMailboxSessionMapperFact
     private final Log logger;
     private final char delimiter;
     private final NodeLocker locker;
+    private final int DEFAULT_SCALING = 2;
 
     public JCRMailboxSessionMapperFactory(final MailboxSessionJCRRepository 
repository, final NodeLocker locker) {
         this(repository, locker, DEFAULT_FOLDER_DELIMITER);
@@ -59,19 +60,19 @@ public class JCRMailboxSessionMapperFact
     
     @Override
     public MailboxMapper<String> createMailboxMapper(MailboxSession session) 
throws MailboxException {
-        JCRMailboxMapper mapper = new JCRMailboxMapper(repository, session, 
locker, logger, delimiter);
+        JCRMailboxMapper mapper = new JCRMailboxMapper(repository, session, 
locker, DEFAULT_SCALING, logger, delimiter);
         return mapper;
     }
 
     @Override
     public MessageMapper<String> createMessageMapper(MailboxSession session) 
throws MailboxException {
-        JCRMessageMapper messageMapper = new JCRMessageMapper(repository, 
session, locker, logger);
+        JCRMessageMapper messageMapper = new JCRMessageMapper(repository, 
session, locker, DEFAULT_SCALING, logger);
         return messageMapper;
     }
 
     @Override
     public SubscriptionMapper createSubscriptionMapper(MailboxSession session) 
throws SubscriptionException {
-        JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(repository, 
session, locker, logger);
+        JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(repository, 
session, locker, DEFAULT_SCALING, logger);
         return mapper;
     }
     

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java?rev=959420&r1=959419&r2=959420&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMailboxMapper.java
 Wed Jun 30 20:04:57 2010
@@ -53,8 +53,8 @@ public class JCRMailboxMapper extends Ab
 
     private char delimiter;
 
-    public JCRMailboxMapper(final MailboxSessionJCRRepository repos, 
MailboxSession session, final NodeLocker locker, final Log logger, char 
delimiter) {
-        super(repos, session, locker, logger);
+    public JCRMailboxMapper(final MailboxSessionJCRRepository repos, 
MailboxSession session, final NodeLocker locker, final int scaling, final Log 
logger, char delimiter) {
+        super(repos, session, locker, scaling, logger);
         this.delimiter = delimiter;
     }
 
@@ -191,21 +191,12 @@ public class JCRMailboxMapper extends Ab
                         
                         //split the name so we can construct a nice node tree
                         final String nameParts[] = name.split("\\" + 
String.valueOf(delimiter), 3);
+                        node = JcrUtils.getOrAddNode(node, nameParts[0], 
"nt:unstructured");
+                        node = createUserPathStructure(node, nameParts[1]);
+                        node = JcrUtils.getOrAddNode(node, nameParts[2], 
"nt:unstructured");
+                        node.addMixin("jamesMailbox:mailbox");
+                        
                         
-                        // this loop will create a structure like:
-                        // /mailboxes/u/user/INBOX
-                        //
-                        // This is needed to minimize the child nodes a bit
-                        for (int i = 0; i < nameParts.length; i++) {
-                           String part = nameParts[i];
-                           if (i == 1) {
-                               node = JcrUtils.getOrAddNode(node, 
String.valueOf(part.charAt(0)), "nt:unstructured");   
-
-                           } 
-                           node = JcrUtils.getOrAddNode(node, part, 
"nt:unstructured");
-                           node.addMixin("jamesMailbox:mailbox");
-                           
-                        }
                         jcrMailbox.merge(node);
 
                         getSession().save();
@@ -223,6 +214,7 @@ public class JCRMailboxMapper extends Ab
            }
             
         } catch (RepositoryException e) {
+            e.printStackTrace();
             throw new StorageException(HumanReadableText.SAVE_FAILED, e);
         } catch (InterruptedException e) {
             throw new StorageException(HumanReadableText.SAVE_FAILED, e);

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java?rev=959420&r1=959419&r2=959420&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/JCRMessageMapper.java
 Wed Jun 30 20:04:57 2010
@@ -58,8 +58,8 @@ import org.apache.james.imap.store.mail.
  */
 public class JCRMessageMapper extends AbstractJCRMapper implements 
MessageMapper<String> {
 
-    public JCRMessageMapper(final MailboxSessionJCRRepository repos, 
MailboxSession session, NodeLocker locker, final Log logger) {
-        super(repos, session, locker, logger);
+    public JCRMessageMapper(final MailboxSessionJCRRepository repos, 
MailboxSession session, NodeLocker locker, final int scaling, final Log logger) 
{
+        super(repos, session, locker, scaling, logger);
     }
 
     /**

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java?rev=959420&r1=959419&r2=959420&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
 Wed Jun 30 20:04:57 2010
@@ -49,8 +49,8 @@ import org.apache.james.imap.store.user.
  */
 public class JCRSubscriptionMapper extends AbstractJCRMapper implements 
SubscriptionMapper {
 
-    public JCRSubscriptionMapper(final MailboxSessionJCRRepository repos, 
MailboxSession session, final NodeLocker locker, final Log log) {
-        super(repos,session, locker, log);
+    public JCRSubscriptionMapper(final MailboxSessionJCRRepository repos, 
MailboxSession session, final NodeLocker locker, final int scaling, final Log 
log) {
+        super(repos,session, locker, scaling, log);
     }
 
     /*
@@ -174,14 +174,8 @@ public class JCRSubscriptionMapper exten
             if (sub == null) {
                 Node subscriptionsNode = 
JcrUtils.getOrAddNode(getSession().getRootNode(), MAILBOXES_PATH);
                 
-                // this loop will create a structure like:
-                // /mailboxes/u/user
-                //
                 // This is needed to minimize the child nodes a bit
-                Node userNode = JcrUtils.getOrAddNode(subscriptionsNode, 
String.valueOf(username.charAt(0)));
-                userNode = JcrUtils.getOrAddNode(userNode, 
String.valueOf(username));
-                node = JcrUtils.getOrAddNode(userNode, mailbox, 
"nt:unstructured");
-                node.addMixin("jamesMailbox:user");
+                node = createUserPathStructure(subscriptionsNode, username);
             } else {
                 node = sub.getNode();
             }



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

Reply via email to