Author: norman
Date: Fri Mar 19 14:29:19 2010
New Revision: 925235

URL: http://svn.apache.org/viewvc?rev=925235&view=rev
Log:
Support for "auto scaling" of nodes. By default it will use the max scaling for 
better performance(IMAP-118)

Added:
    james/imap/trunk/jcr/src/test/
    james/imap/trunk/jcr/src/test/java/
    james/imap/trunk/jcr/src/test/java/org/
    james/imap/trunk/jcr/src/test/java/org/apache/
    james/imap/trunk/jcr/src/test/java/org/apache/james/
    james/imap/trunk/jcr/src/test/java/org/apache/james/imap/
    james/imap/trunk/jcr/src/test/java/org/apache/james/imap/jcr/
    
james/imap/trunk/jcr/src/test/java/org/apache/james/imap/jcr/JCRUtilsTest.java
Modified:
    
james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.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/JCRGlobalMailbox.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
    james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.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/mail/model/JCRMessage.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/user/JCRSubscriptionMapper.java
    
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java

Modified: 
james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java
 (original)
+++ 
james/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jcr/JCRHostSystem.java
 Fri Mar 19 14:29:19 2010
@@ -28,6 +28,7 @@ import org.apache.james.imap.functional.
 import org.apache.james.imap.functional.InMemoryUserManager;
 import org.apache.james.imap.jcr.JCRGlobalUserMailboxManager;
 import org.apache.james.imap.jcr.JCRGlobalUserSubscriptionManager;
+import org.apache.james.imap.jcr.JCRImapConstants;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
 import org.apache.james.imap.processor.main.DefaultImapProcessorFactory;
 import org.apache.james.test.functional.HostSystem;
@@ -57,7 +58,7 @@ public class JCRHostSystem extends ImapH
 
             userManager = new InMemoryUserManager();
 
-            mailboxManager = new JCRGlobalUserMailboxManager(userManager, new 
JCRGlobalUserSubscriptionManager(repository, null, "user", "pass"), repository, 
null, "user", "pass");
+            mailboxManager = new JCRGlobalUserMailboxManager(userManager, new 
JCRGlobalUserSubscriptionManager(repository, null, "user", "pass", 
JCRImapConstants.MAX_SCALING), repository, null, "user", "pass", 
JCRImapConstants.MAX_SCALING);
 
             final DefaultImapProcessorFactory defaultImapProcessorFactory = 
new DefaultImapProcessorFactory();
             resetUserMetaData();

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=925235&r1=925234&r2=925235&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
 Fri Mar 19 14:29:19 2010
@@ -37,9 +37,15 @@ import org.apache.james.imap.store.trans
 public abstract class AbstractJCRMapper extends AbstractTransactionalMapper 
implements JCRImapConstants{
 
     private final Session session;
+    private final int scaling;
 
-    public AbstractJCRMapper(final Session session) {
+    public AbstractJCRMapper(final Session session, final int scaling) {
         this.session = session;
+        this.scaling = scaling;
+    }
+    
+    protected int getScaling() {
+        return scaling;
     }
     
     /**
@@ -87,11 +93,4 @@ public abstract class AbstractJCRMapper 
         // no rollback supported by level 1 jcr
     }
     
-    protected void createNodeIfNotExists(String path) throws 
RepositoryException, PathNotFoundException {
-        
-        if (session.getRootNode().hasNode(path) == false) {
-           session.getRootNode().addNode(path);
-        }
-    }
-    
 }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalMailbox.java
 Fri Mar 19 14:29:19 2010
@@ -42,8 +42,8 @@ public class JCRGlobalMailbox extends JC
        private final char[] password;
        
        public JCRGlobalMailbox(final 
org.apache.james.imap.jcr.mail.model.JCRMailbox mailbox, MailboxSession session,
-                       Repository repository, String workspace, String 
username, char[] password,Log log) {
-               super(mailbox, session, repository, workspace, log);
+                       Repository repository, String workspace, String 
username, char[] password, final int scaling, Log log) {
+               super(mailbox, session, repository, workspace, scaling, log);
                this.username = username;
                this.password = password;
        }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
 Fri Mar 19 14:29:19 2010
@@ -47,8 +47,8 @@ public class JCRGlobalUserMailboxManager
     private final String username;
     private final char[] password; 
 
-    public JCRGlobalUserMailboxManager(final Authenticator authenticator, 
final Subscriber subscriber, final Repository repository, final String 
workspace, final String username, final String password) {
-        super(authenticator, subscriber, repository, workspace);
+    public JCRGlobalUserMailboxManager(final Authenticator authenticator, 
final Subscriber subscriber, final Repository repository, final String 
workspace, final String username, final String password, final int scaling) {
+        super(authenticator, subscriber, repository, workspace, scaling);
 
         this.username = username;
         if (password != null) {
@@ -61,7 +61,7 @@ public class JCRGlobalUserMailboxManager
 
     public void deleteEverything() throws MailboxException {
         Session session = getSession(null);
-        final MailboxMapper mapper = new JCRMailboxMapper(session,getLog());
+        final MailboxMapper mapper = new JCRMailboxMapper(session, 
getScaling(), getLog());
         mapper.execute(new TransactionalMapper.Transaction() {
 
             public void run() throws MailboxException {
@@ -75,7 +75,7 @@ public class JCRGlobalUserMailboxManager
     
     @Override
     protected StoreMailbox createMailbox(Mailbox mailboxRow, MailboxSession 
session) {
-        JCRMailbox mailbox = new 
JCRGlobalMailbox((org.apache.james.imap.jcr.mail.model.JCRMailbox) mailboxRow, 
session, getRepository(), getWorkspace(), username, password, getLog());
+        JCRMailbox mailbox = new 
JCRGlobalMailbox((org.apache.james.imap.jcr.mail.model.JCRMailbox) mailboxRow, 
session, getRepository(), getWorkspace(), username, password, getScaling(), 
getLog());
         return mailbox;
     }
     

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserSubscriptionManager.java
 Fri Mar 19 14:29:19 2010
@@ -40,8 +40,8 @@ public class JCRGlobalUserSubscriptionMa
     private final String username;
     private final char[] password;
 
-    public JCRGlobalUserSubscriptionManager(final Repository repository, final 
String workspace, final String username, final String password) {
-        super(repository, workspace);
+    public JCRGlobalUserSubscriptionManager(final Repository repository, final 
String workspace, final String username, final String password, final int 
scaling) {
+        super(repository, workspace, scaling);
         this.username = username;
         if (password != null) {
                this.password = password.toCharArray();

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRImapConstants.java
 Fri Mar 19 14:29:19 2010
@@ -24,6 +24,14 @@ package org.apache.james.imap.jcr;
  */
 public interface JCRImapConstants {
 
+    /**
+     * Node path scaling
+     */
+    public final static int MAX_SCALING = -1;
+
+    public final static int MIN_SCALING = 0;
+
+    
        /**
         * Delimiter for Nodes
         */

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java 
(original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailbox.java 
Fri Mar 19 14:29:19 2010
@@ -57,16 +57,27 @@ public class JCRMailbox extends StoreMai
     private final String workspace;
     private final Log log;
     private final String uuid;
+    private final int scaling;
     
-    public JCRMailbox(final org.apache.james.imap.jcr.mail.model.JCRMailbox 
mailbox, final MailboxSession session, final Repository repository, final 
String workspace, final Log log) {
+    public JCRMailbox(final org.apache.james.imap.jcr.mail.model.JCRMailbox 
mailbox, final MailboxSession session, final Repository repository, final 
String workspace, final int scaling, final Log log) {
         super(mailbox, session );
         this.repository = repository;
         this.workspace = workspace;
         this.log = log;
         this.uuid = mailbox.getUUID();
+        this.scaling = scaling;
         
     }
 
+    /**
+     * Return the scaling depth
+     * 
+     * @return scaling
+     */
+    protected int getScaling() {
+        return scaling;
+    }
+    
     @Override
     public long getMailboxId() {
         throw new UnsupportedOperationException("Please use getMailboxUUID for 
this implementation");
@@ -110,7 +121,7 @@ public class JCRMailbox extends StoreMai
         Session jcrSession = getSession(session);
         JCRUtils.addJCRSession(session, jcrSession);
         
-        JCRMessageMapper messageMapper = new JCRMessageMapper(jcrSession, 
getMailboxUUID(), log);
+        JCRMessageMapper messageMapper = new JCRMessageMapper(jcrSession, 
getMailboxUUID(), getScaling(), log);
         
         return messageMapper;
 
@@ -127,7 +138,7 @@ public class JCRMailbox extends StoreMai
         Session jcrSession = getSession(session);
         JCRUtils.addJCRSession(session, jcrSession);
         
-        JCRMailboxMapper mapper = new JCRMailboxMapper(jcrSession, log);
+        JCRMailboxMapper mapper = new JCRMailboxMapper(jcrSession, 
getScaling(), log);
         return mapper;
 
     }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRMailboxManager.java
 Fri Mar 19 14:29:19 2010
@@ -56,16 +56,26 @@ public class JCRMailboxManager extends S
     private final Repository repository;
     private final String workspace;
     private final Log logger = LogFactory.getLog(JCRMailboxManager.class);
-    public JCRMailboxManager(final Authenticator authenticator, final 
Subscriber subscriber, final Repository repository, final String workspace) {
+    private final int scaling;
+    public JCRMailboxManager(final Authenticator authenticator, final 
Subscriber subscriber, final Repository repository, final String workspace, 
final int scaling) {
         super(authenticator, subscriber);
         this.repository = repository;
         this.workspace = workspace;
+        this.scaling = scaling;
     }
 
+    /**
+     * Return the scaling depth
+     * 
+     * @return scaling
+     */
+    protected int getScaling() {
+        return scaling;
+    }
     
     @Override
     protected StoreMailbox createMailbox(Mailbox mailboxRow, MailboxSession 
session) {
-        JCRMailbox mailbox = new 
JCRMailbox((org.apache.james.imap.jcr.mail.model.JCRMailbox) mailboxRow, 
session, getRepository(), getWorkspace(), getLog());
+        JCRMailbox mailbox = new 
JCRMailbox((org.apache.james.imap.jcr.mail.model.JCRMailbox) mailboxRow, 
session, getRepository(), getWorkspace(), getScaling(), getLog());
         return mailbox;
     }
 
@@ -76,7 +86,7 @@ public class JCRMailboxManager extends S
 
         JCRUtils.addJCRSession(session, jcrSession);
         
-        JCRMailboxMapper mapper = new JCRMailboxMapper(jcrSession, getLog());
+        JCRMailboxMapper mapper = new JCRMailboxMapper(jcrSession, 
getScaling(), getLog());
         return mapper;
 
     }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRSubscriptionManager.java
 Fri Mar 19 14:29:19 2010
@@ -47,20 +47,32 @@ public class JCRSubscriptionManager exte
     private final Log logger = LogFactory.getLog(JCRSubscriptionManager.class);
     private final Repository repository;
     private final String workspace;
+    private final int scaling;
 
-    public JCRSubscriptionManager(final Repository repository, final String 
workspace) {
+    public JCRSubscriptionManager(final Repository repository, final String 
workspace, final int scaling) {
         super();
+        this.scaling = scaling;
         this.workspace = workspace;
         this.repository = repository;
     }
 
+
+    /**
+     * Return the scaling depth
+     * 
+     * @return scaling
+     */
+    protected int getScaling() {
+        return scaling;
+    }
+    
     @Override
     protected SubscriptionMapper createMapper(MailboxSession session) throws 
SubscriptionException {
         Session jcrSession = getSession(session);
         JCRUtils.addJCRSession(session, jcrSession);
         
         
-        JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(jcrSession, 
logger);
+        JCRSubscriptionMapper mapper = new JCRSubscriptionMapper(jcrSession, 
getScaling(), logger);
 
         return mapper;
     }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java 
(original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRUtils.java 
Fri Mar 19 14:29:19 2010
@@ -21,7 +21,14 @@ package org.apache.james.imap.jcr;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.jcr.ItemExistsException;
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.version.VersionException;
 
 import org.apache.jackrabbit.util.Text;
 import org.apache.james.imap.mailbox.MailboxSession;
@@ -37,13 +44,112 @@ public class JCRUtils implements JCRImap
      */
     public final static String JCR_SESSIONS = "JCR_SESSIONS";
 
+    
+    /**
+     * Create a scaled path for the given path, where scaling is the nesting 
mode. 
+     * There will be no escaping of illegal chars at this point
+     * 
+     * With scaling -1 it will create a sub-path for every  char in the path. 
+     * 
+     * So for example:
+     * 
+     * scaling  = -1 
+     * user/test:
+     *     u/us/use/user/t/te/tes/test
+     *   
+     * scaling = 2
+     * user/test:
+     *     u/us/user/t/te/test
+     *     
+     * scaling = 0
+     * user/test:
+     *     user/test
+     *     
+     *     
+     * @param path
+     * @param scaling
+     * @return scaledPath
+     */
+    public static String createScaledPath(String path, int scaling) {
+        if (scaling == MIN_SCALING) {
+            return path;
+        } else {
+            StringBuffer buffer = new StringBuffer();
+            String[] pathParts = path.split(NODE_DELIMITER);
+            
+            for (int a = 0; a < pathParts.length; a++) {
+                String subPath = pathParts[a];
+                
+                for (int i = 0; i < subPath.length(); i++) {
+                    
+                    if ( scaling != MAX_SCALING && i == scaling) {             
          
+                        buffer.append(subPath);
+                        
+                        if (a +1 != pathParts.length) {
+                            buffer.append(NODE_DELIMITER);
+                        }
+                        break;
+                    } else {
+                        buffer.append(subPath.substring(0,i +1));
+
+                        if (i +1 != subPath.length() || a +1 != 
pathParts.length) {
+                            buffer.append(NODE_DELIMITER);
+                        }
+                    }
+                }
+            }
+            return buffer.toString();
+        }
+    }
+    
+    public static String createScaledPath(String[] paths, int scaling) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < paths.length; i++) {
+            String path = paths[i];
+            sb.append(path);
+            if (i + 1 != path.length()) {
+                sb.append(NODE_DELIMITER);
+            }
+        }
+        return createScaledPath(sb.toString(), scaling);
+    }
+
+    
+    
+    /**
+     * Create a node path recursive from the given root {...@link Node}. This 
includes
+     * to create all subnodes
+     * 
+     * @param rootNode
+     * @param nodePath
+     * @return lastNode
+     * @throws PathNotFoundException
+     * @throws ItemExistsException
+     * @throws VersionException
+     * @throws ConstraintViolationException
+     * @throws LockException
+     * @throws RepositoryException
+     */
+    public static Node createNodeRecursive(Node rootNode, String nodePath) 
throws PathNotFoundException, ItemExistsException, VersionException, 
ConstraintViolationException, LockException, RepositoryException {
+        Node parent = rootNode;
+        String nodeNames[] = nodePath.split(NODE_DELIMITER);
+        for (int i = 0; i < nodeNames.length; i++) {
+            String nodeName = Text.escapeIllegalJcrChars(nodeNames[i]);
+            if (parent.hasNode(nodeName)) {
+                parent = parent.getNode(nodeName);
+            } else {
+                parent = parent.addNode(nodeName);
+            }
+        }
+        return parent;
+    }
     /**
      * Create a path which can be used for nodes. It handles the escaping etc
      * 
      * @param subNodes
      * @return completePath
      */
-    public static String createPath(String... subNodes) {
+    public static String escapePath(String... subNodes) {
         StringBuffer pathBuf = new StringBuffer();
 
         for (int i = 0; i < subNodes.length; i++) {
@@ -59,7 +165,6 @@ public class JCRUtils implements JCRImap
             }
         }
         return pathBuf.toString();
-
     }
 
     /**

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=925235&r1=925234&r2=925235&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
 Fri Mar 19 14:29:19 2010
@@ -52,8 +52,8 @@ public class JCRMailboxMapper extends Ab
     public final String PATH = PROPERTY_PREFIX + "mailboxes";
     private final Log logger;
 
-    public JCRMailboxMapper(final Session session, final Log logger) {
-        super(session);
+    public JCRMailboxMapper(final Session session, final int scaling,final Log 
logger) {
+        super(session, scaling);
         this.logger = logger;
     }
 
@@ -221,9 +221,7 @@ public class JCRMailboxMapper extends Ab
      */
     public void save(Mailbox mailbox) throws StorageException {
         
-        String nodePath = JCRUtils.createPath(PATH, mailbox.getName());
         try {
-            createNodeIfNotExists(PATH);
             JCRMailbox jcrMailbox = (JCRMailbox)mailbox;
             Node node = null;
 
@@ -231,7 +229,9 @@ public class JCRMailboxMapper extends Ab
                 node = getSession().getNodeByUUID(jcrMailbox.getUUID());
             }
             if (node == null) {
-                node = getSession().getRootNode().addNode(nodePath);
+                String nodePath = 
JCRUtils.escapePath(PATH,JCRUtils.createScaledPath(mailbox.getName(), 
getScaling()));
+
+                node = 
JCRUtils.createNodeRecursive(getSession().getRootNode(), nodePath);
                 node.addMixin(JcrConstants.MIX_REFERENCEABLE);
            } 
             

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=925235&r1=925234&r2=925235&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
 Fri Mar 19 14:29:19 2010
@@ -50,8 +50,8 @@ public class JCRMessageMapper extends Ab
     private final Log logger;
     private final String uuid;
 
-    public JCRMessageMapper(final Session session, final String uuid, final 
Log logger) {
-        super(session);
+    public JCRMessageMapper(final Session session, final String uuid, final 
int scaling, final Log logger) {
+        super(session,scaling);
         this.logger = logger;
         this.uuid = uuid;
     }
@@ -383,16 +383,16 @@ public class JCRMessageMapper extends Ab
     public void save(MailboxMembership message) throws StorageException {
         JCRMailboxMembership membership = (JCRMailboxMembership) message;
         try {
-            createNodeIfNotExists(PATH);
-            Node messageNode = null;;
+            JCRUtils.createNodeRecursive(getSession().getRootNode(), PATH);
+            Node messageNode = null;
             
             if (membership.isPersistent()) {
                 messageNode = getSession().getNodeByUUID(membership.getUUID());
             }
 
             if (messageNode == null) {
-                String path = JCRUtils.createPath(PATH, 
String.valueOf(membership.getUid()));
-
+                // TODO: Maybe we should use some kind of hashes for scaling 
here
+                String path = JCRUtils.escapePath(PATH, 
String.valueOf(membership.getUid()));
                 messageNode = getSession().getRootNode().addNode(path);
                 messageNode.addMixin(JcrConstants.MIX_REFERENCEABLE);
             }

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/mail/model/JCRMessage.java
 Fri Mar 19 14:29:19 2010
@@ -365,7 +365,7 @@ public class JCRMessage extends Abstract
         // store new properties
         for (int i = 0; i < newProperites.size(); i++) {
             JCRProperty prop = (JCRProperty)newProperites.get(i);
-            Node propNode = 
propertiesNode.addNode(JCRUtils.createPath(prop.getNamespace()+ "." + 
prop.getLocalName()));
+            Node propNode = 
propertiesNode.addNode(JCRUtils.escapePath(String.valueOf(prop.getOrder())));
             prop.merge(propNode);
         }
       

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=925235&r1=925234&r2=925235&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
 Fri Mar 19 14:29:19 2010
@@ -49,8 +49,8 @@ public class JCRSubscriptionMapper exten
     private final Log log;
     private final static String PATH = PROPERTY_PREFIX + "subscriptions";
 
-    public JCRSubscriptionMapper(final Session session, final Log log) {
-        super(session);
+    public JCRSubscriptionMapper(final Session session, final int 
scaling,final Log log) {
+        super(session, scaling);
         this.log = log;
     }
 
@@ -146,7 +146,6 @@ public class JCRSubscriptionMapper exten
     public void save(Subscription subscription) throws SubscriptionException {
         String username = subscription.getUser();
         String mailbox = subscription.getMailbox();
-        String nodename = JCRUtils.createPath(PATH, username, mailbox);
         try {
 
             Node node = null;
@@ -155,11 +154,9 @@ public class JCRSubscriptionMapper exten
             
             // its a new subscription
             if (sub == null) {
-                createNodeIfNotExists(PATH);
-                // just a hack for now
-                createNodeIfNotExists(JCRUtils.createPath(PATH,username));
+                String nodePath = 
JCRUtils.escapePath(PATH,JCRUtils.createScaledPath(new String[] {username, 
mailbox}, getScaling()));
                 
-                node = getSession().getRootNode().addNode(nodename);
+                node = 
JCRUtils.createNodeRecursive(getSession().getRootNode(), nodePath);
                 node.addMixin(JcrConstants.MIX_REFERENCEABLE);
             } else {
                 node = sub.getNode();

Added: 
james/imap/trunk/jcr/src/test/java/org/apache/james/imap/jcr/JCRUtilsTest.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/test/java/org/apache/james/imap/jcr/JCRUtilsTest.java?rev=925235&view=auto
==============================================================================
--- 
james/imap/trunk/jcr/src/test/java/org/apache/james/imap/jcr/JCRUtilsTest.java 
(added)
+++ 
james/imap/trunk/jcr/src/test/java/org/apache/james/imap/jcr/JCRUtilsTest.java 
Fri Mar 19 14:29:19 2010
@@ -0,0 +1,58 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.imap.jcr;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class JCRUtilsTest {
+    
+    @Test
+    public void testCreateScalingPath() {
+        String path = "user/myname";
+        
+        // no scaling at all
+        String scaledPath = JCRUtils.createScaledPath(path, 0);
+        assertEquals(path, scaledPath);
+        
+        // max scaling
+        String scaledPath2 = JCRUtils.createScaledPath(path, -1);     
+        assertEquals("u/us/use/user/m/my/myn/myna/mynam/myname", scaledPath2);
+        
+        // max scaling
+        String scaledPathInt = JCRUtils.createScaledPath(path, -1);     
+        assertEquals("1", scaledPathInt);
+        
+        // test with scaling longer then any sub path
+        String scaledPath3 = JCRUtils.createScaledPath(path, 10);
+        assertEquals("u/us/use/user/m/my/myn/myna/mynam/myname", scaledPath3);
+        
+        
+        // scaling of 2 
+        String scaledPath4 = JCRUtils.createScaledPath(path, 2);
+        assertEquals("u/us/user/m/my/myname", scaledPath4);
+        
+        // scaling of 4 
+        String scaledPath5 = JCRUtils.createScaledPath(path, 4);
+        assertEquals("u/us/use/user/m/my/myn/myna/myname", scaledPath5);
+        
+    }
+
+}

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java?rev=925235&r1=925234&r2=925235&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
 Fri Mar 19 14:29:19 2010
@@ -199,7 +199,6 @@ public abstract class StoreMailboxManage
 
                 public void run() throws MailboxException {
                     Mailbox mailbox = mapper.findMailboxByName(mailboxName);
-                    System.out.println(mailbox);
                     if (mailbox == null) {
                         throw new MailboxNotFoundException("Mailbox not 
found");
                     }



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

Reply via email to