]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java
Improve JCR remoting and proxying
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jcr.mvc / src / main / java / org / argeo / jcr / mvc / MultipleRepositoryHandlerMapping.java
index 16ecdd89ecff8de8b5fda232a33ad74124015060..bd5b3700572094c3b248dfba15a27e7a6ce14d08 100644 (file)
@@ -1,6 +1,7 @@
 package org.argeo.jcr.mvc;
 
 import java.util.Enumeration;
+import java.util.List;
 import java.util.Properties;
 
 import javax.jcr.Repository;
@@ -13,6 +14,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
+import org.argeo.jcr.JcrUtils;
 import org.argeo.jcr.RepositoryRegister;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
@@ -27,6 +29,8 @@ public abstract class MultipleRepositoryHandlerMapping implements
        private final static Log log = LogFactory
                        .getLog(MultipleRepositoryHandlerMapping.class);
 
+       private final static String MKCOL = "MKCOL";
+
        private ConfigurableApplicationContext applicationContext;
        private ServletContext servletContext;
 
@@ -44,7 +48,20 @@ public abstract class MultipleRepositoryHandlerMapping implements
                        log.trace("getPathInfo=" + request.getPathInfo());
                }
 
-               String repositoryName = extractRepositoryName(request);
+               String pathInfo = request.getPathInfo();
+
+               // tokenize path
+               List<String> tokens = JcrUtils.tokenize(pathInfo);
+
+               // check if repository can be found
+               if (tokens.size() == 0
+                               || (tokens.size() == 1 && tokens.get(0).equals("")))
+                       return null;
+               // MKCOL on repository or root node doesn't make sense
+               if ((tokens.size() == 1 || tokens.size() == 2)
+                               && request.getMethod().equals(MKCOL))
+                       return null;
+               String repositoryName = extractRepositoryName(tokens);
                String pathPrefix = request.getServletPath() + '/' + repositoryName;
                String beanName = pathPrefix;
 
@@ -63,14 +80,9 @@ public abstract class MultipleRepositoryHandlerMapping implements
        }
 
        /** The repository name is the first part of the path info */
-       protected String extractRepositoryName(HttpServletRequest request) {
-               String pathInfo = request.getPathInfo();
-               // TODO: optimize by checking character by character
-               String[] tokens = pathInfo.split("/");
+       protected String extractRepositoryName(List<String> pathTokens) {
                StringBuffer currName = new StringBuffer("");
-               tokens: for (String token : tokens) {
-                       if (token.equals(""))
-                               continue tokens;
+               for (String token : pathTokens) {
                        currName.append(token);
                        if (repositoryRegister.getRepositories().containsKey(
                                        currName.toString()))
@@ -78,7 +90,7 @@ public abstract class MultipleRepositoryHandlerMapping implements
                        currName.append('/');
                }
                throw new ArgeoException("No repository can be found for request "
-                               + pathInfo);
+                               + pathTokens);
        }
 
        public void setApplicationContext(ApplicationContext applicationContext)