X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.jcr.mvc%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjcr%2Fmvc%2FMultipleRepositoryHandlerMapping.java;h=bd5b3700572094c3b248dfba15a27e7a6ce14d08;hb=22365726e2fdcb12e76c3d78060960ae7161628e;hp=10bb8b570ad8762aa5f40532b87718a9b93722cf;hpb=a69d9c12043132bd39c53e40e43fad822b242dcf;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java index 10bb8b570..bd5b37005 100644 --- a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java +++ b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java @@ -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 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; @@ -58,18 +75,14 @@ public abstract class MultipleRepositoryHandlerMapping implements } HttpServlet remotingServlet = (HttpServlet) applicationContext .getBean(beanName); - return new HandlerExecutionChain(remotingServlet); + HandlerExecutionChain hec = new HandlerExecutionChain(remotingServlet); + return hec; } /** 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 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())) @@ -77,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) @@ -120,5 +133,4 @@ public abstract class MultipleRepositoryHandlerMapping implements return initParameters.keys(); } } - }