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=fb3f1ae65fe8c7aa455dd432a07b7eaccedaf630;hb=3a3d316af102ba410d1d9e6de349d0c8f7ac044f;hp=bc333ba4400d15d87e951c85ca8aa6400d295bb7;hpb=a171094436482fa16e8da47d5501df59ec06e595;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 bc333ba44..fb3f1ae65 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,11 +1,26 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed 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.argeo.jcr.mvc; -import java.util.ArrayList; import java.util.Enumeration; -import java.util.List; import java.util.Properties; +import java.util.StringTokenizer; import javax.jcr.Repository; +import javax.jcr.RepositoryFactory; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -14,8 +29,8 @@ 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.RepositoryRegister; +import org.argeo.jcr.ArgeoJcrConstants; +import org.argeo.jcr.ArgeoJcrUtils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -24,6 +39,7 @@ import org.springframework.web.context.ServletContextAware; import org.springframework.web.servlet.HandlerExecutionChain; import org.springframework.web.servlet.HandlerMapping; +/** Handles multiple JCR servers with a single servlet. */ public abstract class MultipleRepositoryHandlerMapping implements HandlerMapping, ApplicationContextAware, ServletContextAware { private final static Log log = LogFactory @@ -34,7 +50,8 @@ public abstract class MultipleRepositoryHandlerMapping implements private ConfigurableApplicationContext applicationContext; private ServletContext servletContext; - private RepositoryRegister repositoryRegister; + // private RepositoryRegister repositoryRegister; + private RepositoryFactory repositoryFactory; /** Actually creates the servlet to be registered. */ protected abstract HttpServlet createServlet(Repository repository, @@ -49,44 +66,34 @@ public abstract class MultipleRepositoryHandlerMapping implements } String pathInfo = request.getPathInfo(); + String repositoryAlias = extractRepositoryAlias(pathInfo); + if (repositoryAlias.equals("")) + return null; - // 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(); + // MKCOL on repository or root node doesn't make sense + // and causes issues + if (request.getMethod().equals(MKCOL)) { + StringTokenizer st = new StringTokenizer(pathInfo, "/"); + if (!st.hasMoreTokens()) + return null; + st.nextToken();// repository + if (!st.hasMoreTokens()) + return null; + st.nextToken();// workspace + if (!st.hasMoreTokens()) + return null; } - // 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; + request.setAttribute(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, + repositoryAlias); + String pathPrefix = request.getServletPath() + '/' + repositoryAlias; String beanName = pathPrefix; if (!applicationContext.containsBean(beanName)) { - Repository repository = repositoryRegister.getRepositories().get( - repositoryName); + Repository repository = ArgeoJcrUtils.getRepositoryByAlias( + repositoryFactory, repositoryAlias); + // Repository repository = repositoryRegister.getRepositories().get( + // repositoryAlias); HttpServlet servlet = createServlet(repository, pathPrefix); applicationContext.getBeanFactory().registerSingleton(beanName, servlet); @@ -98,20 +105,43 @@ public abstract class MultipleRepositoryHandlerMapping implements return hec; } - /** The repository name is the first part of the path info */ - protected String extractRepositoryName(List pathTokens) { - StringBuffer currName = new StringBuffer(""); - for (String token : pathTokens) { - currName.append(token); - if (repositoryRegister.getRepositories().containsKey( - currName.toString())) - return currName.toString(); - currName.append('/'); + /** Returns the first two token of the path */ + // protected String[] extractPrefix(String pathInfo) { + // String[] res = new String[2]; + // StringTokenizer st = new StringTokenizer(pathInfo, "/"); + // if (st.hasMoreTokens()) + // res[0] = st.nextToken(); + // if (st.hasMoreTokens()) + // res[1] = st.nextToken(); + // return res; + // } + + /** Returns the first token of the path */ + protected String extractRepositoryAlias(String pathInfo) { + StringBuffer buf = new StringBuffer(); + for (int i = 1; i < pathInfo.length(); i++) { + char c = pathInfo.charAt(i); + if (c == '/') + break; + buf.append(c); } - throw new ArgeoException("No repository can be found for request " - + pathTokens); + return buf.toString(); } + /** The repository name is the first part of the path info */ + // protected String extractRepositoryName(List pathTokens) { + // StringBuffer currName = new StringBuffer(""); + // for (String token : pathTokens) { + // currName.append(token); + // if (repositoryRegister.getRepositories().containsKey( + // currName.toString())) + // return currName.toString(); + // currName.append('/'); + // } + // throw new ArgeoException("No repository can be found for request " + // + pathTokens); + // } + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = (ConfigurableApplicationContext) applicationContext; @@ -121,8 +151,13 @@ public abstract class MultipleRepositoryHandlerMapping implements this.servletContext = servletContext; } - public void setRepositoryRegister(RepositoryRegister repositoryRegister) { - this.repositoryRegister = repositoryRegister; + // public void setRepositoryRegister(RepositoryRegister repositoryRegister) + // { + // this.repositoryRegister = repositoryRegister; + // } + + public void setRepositoryFactory(RepositoryFactory repositoryFactory) { + this.repositoryFactory = repositoryFactory; } protected class DelegatingServletConfig implements ServletConfig {