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=bc333ba4400d15d87e951c85ca8aa6400d295bb7;hb=a171094436482fa16e8da47d5501df59ec06e595;hp=16ecdd89ecff8de8b5fda232a33ad74124015060;hpb=d51f86803bfbf9594c659a03360abf5771796477;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 16ecdd89e..bc333ba44 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,8 @@ package org.argeo.jcr.mvc; +import java.util.ArrayList; import java.util.Enumeration; +import java.util.List; import java.util.Properties; import javax.jcr.Repository; @@ -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,39 @@ public abstract class MultipleRepositoryHandlerMapping implements log.trace("getPathInfo=" + request.getPathInfo()); } - String repositoryName = extractRepositoryName(request); + String pathInfo = request.getPathInfo(); + + // tokenize path + // TODO factorize + List tokens = new ArrayList(); + StringBuffer curr = new StringBuffer(); + char[] arr = pathInfo.toCharArray(); + chars: for (int i = 0; i < arr.length; i++) { + char c = arr[i]; + if (c == '/') { + if (i == 0 || (i == arr.length - 1)) + continue chars; + if (curr.length() > 0) { + tokens.add(curr.toString()); + curr = new StringBuffer(); + } + } else + curr.append(c); + } + if (curr.length() > 0) { + tokens.add(curr.toString()); + curr = new StringBuffer(); + } + + // 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 +99,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 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 +109,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)