1 package org
.argeo
.jcr
.mvc
;
3 import java
.util
.Enumeration
;
5 import java
.util
.Properties
;
7 import javax
.jcr
.Repository
;
8 import javax
.servlet
.ServletConfig
;
9 import javax
.servlet
.ServletContext
;
10 import javax
.servlet
.ServletException
;
11 import javax
.servlet
.http
.HttpServlet
;
12 import javax
.servlet
.http
.HttpServletRequest
;
14 import org
.apache
.commons
.logging
.Log
;
15 import org
.apache
.commons
.logging
.LogFactory
;
16 import org
.argeo
.ArgeoException
;
17 import org
.argeo
.jcr
.JcrUtils
;
18 import org
.argeo
.jcr
.RepositoryRegister
;
19 import org
.springframework
.beans
.BeansException
;
20 import org
.springframework
.context
.ApplicationContext
;
21 import org
.springframework
.context
.ApplicationContextAware
;
22 import org
.springframework
.context
.ConfigurableApplicationContext
;
23 import org
.springframework
.web
.context
.ServletContextAware
;
24 import org
.springframework
.web
.servlet
.HandlerExecutionChain
;
25 import org
.springframework
.web
.servlet
.HandlerMapping
;
27 public abstract class MultipleRepositoryHandlerMapping
implements
28 HandlerMapping
, ApplicationContextAware
, ServletContextAware
{
29 private final static Log log
= LogFactory
30 .getLog(MultipleRepositoryHandlerMapping
.class);
32 private final static String MKCOL
= "MKCOL";
34 private ConfigurableApplicationContext applicationContext
;
35 private ServletContext servletContext
;
37 private RepositoryRegister repositoryRegister
;
39 /** Actually creates the servlet to be registered. */
40 protected abstract HttpServlet
createServlet(Repository repository
,
41 String pathPrefix
) throws ServletException
;
43 public HandlerExecutionChain
getHandler(HttpServletRequest request
)
45 if (log
.isTraceEnabled()) {
46 log
.trace("getContextPath=" + request
.getContextPath());
47 log
.trace("getServletPath=" + request
.getServletPath());
48 log
.trace("getPathInfo=" + request
.getPathInfo());
51 String pathInfo
= request
.getPathInfo();
54 List
<String
> tokens
= JcrUtils
.tokenize(pathInfo
);
56 // check if repository can be found
57 if (tokens
.size() == 0
58 || (tokens
.size() == 1 && tokens
.get(0).equals("")))
60 // MKCOL on repository or root node doesn't make sense
61 if ((tokens
.size() == 1 || tokens
.size() == 2)
62 && request
.getMethod().equals(MKCOL
))
64 String repositoryName
= extractRepositoryName(tokens
);
65 String pathPrefix
= request
.getServletPath() + '/' + repositoryName
;
66 String beanName
= pathPrefix
;
68 if (!applicationContext
.containsBean(beanName
)) {
69 Repository repository
= repositoryRegister
.getRepositories().get(
71 HttpServlet servlet
= createServlet(repository
, pathPrefix
);
72 applicationContext
.getBeanFactory().registerSingleton(beanName
,
74 // TODO: unregister it as well
76 HttpServlet remotingServlet
= (HttpServlet
) applicationContext
78 HandlerExecutionChain hec
= new HandlerExecutionChain(remotingServlet
);
82 /** The repository name is the first part of the path info */
83 protected String
extractRepositoryName(List
<String
> pathTokens
) {
84 StringBuffer currName
= new StringBuffer("");
85 for (String token
: pathTokens
) {
86 currName
.append(token
);
87 if (repositoryRegister
.getRepositories().containsKey(
89 return currName
.toString();
92 throw new ArgeoException("No repository can be found for request "
96 public void setApplicationContext(ApplicationContext applicationContext
)
97 throws BeansException
{
98 this.applicationContext
= (ConfigurableApplicationContext
) applicationContext
;
101 public void setServletContext(ServletContext servletContext
) {
102 this.servletContext
= servletContext
;
105 public void setRepositoryRegister(RepositoryRegister repositoryRegister
) {
106 this.repositoryRegister
= repositoryRegister
;
109 protected class DelegatingServletConfig
implements ServletConfig
{
111 private Properties initParameters
;
113 public DelegatingServletConfig(String name
, Properties initParameters
) {
116 this.initParameters
= initParameters
;
119 public String
getServletName() {
123 public ServletContext
getServletContext() {
124 return servletContext
;
127 public String
getInitParameter(String paramName
) {
128 return initParameters
.getProperty(paramName
);
131 @SuppressWarnings("rawtypes")
132 public Enumeration
getInitParameterNames() {
133 return initParameters
.keys();