]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/MultipleRepositoryHandlerMapping.java
077aa4fe63fee37860ecac424a872746e967848d
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / server / jackrabbit / webdav / MultipleRepositoryHandlerMapping.java
1 package org.argeo.server.jackrabbit.webdav;
2
3 import java.util.Enumeration;
4 import java.util.Properties;
5
6 import javax.jcr.Repository;
7 import javax.servlet.ServletConfig;
8 import javax.servlet.ServletContext;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet;
15 import org.argeo.jcr.RepositoryRegister;
16 import org.springframework.beans.BeansException;
17 import org.springframework.context.ApplicationContext;
18 import org.springframework.context.ApplicationContextAware;
19 import org.springframework.context.ConfigurableApplicationContext;
20 import org.springframework.web.context.ServletContextAware;
21 import org.springframework.web.servlet.HandlerExecutionChain;
22 import org.springframework.web.servlet.HandlerMapping;
23 import org.springframework.web.servlet.mvc.ServletWrappingController;
24
25 public class MultipleRepositoryHandlerMapping implements HandlerMapping,
26 ApplicationContextAware, ServletContextAware {
27 private final static Log log = LogFactory
28 .getLog(MultipleRepositoryHandlerMapping.class);
29
30 private ConfigurableApplicationContext applicationContext;
31 private ServletContext servletContext;
32
33 private RepositoryRegister repositoryRegister;
34
35 public HandlerExecutionChain getHandler(HttpServletRequest request)
36 throws Exception {
37 log.debug(request);
38 log.debug("getContextPath=" + request.getContextPath());
39 log.debug("getServletPath=" + request.getServletPath());
40 log.debug("getPathInfo=" + request.getPathInfo());
41
42 String repositoryName = "repo";
43 String pathPrefix = "/remoting/repo";
44 String beanName = "remoting_" + repositoryName;
45
46 if (!applicationContext.containsBean(beanName)) {
47 Repository repository = repositoryRegister.getRepositories().get(
48 repositoryName);
49 JcrRemotingServlet jcrRemotingServlet = new JcrRemotingServlet(
50 repository);
51 Properties initParameters = new Properties();
52 initParameters.setProperty(
53 JCRWebdavServerServlet.INIT_PARAM_RESOURCE_PATH_PREFIX,
54 pathPrefix);
55 jcrRemotingServlet.init(new DelegatingServletConfig(beanName,
56 initParameters));
57 applicationContext.getBeanFactory().registerSingleton(beanName,
58 jcrRemotingServlet);
59 }
60 HttpServlet remotingServlet = (HttpServlet) applicationContext
61 .getBean(beanName);
62 return new HandlerExecutionChain(remotingServlet);
63 }
64
65 public void setApplicationContext(ApplicationContext applicationContext)
66 throws BeansException {
67 this.applicationContext = (ConfigurableApplicationContext) applicationContext;
68 }
69
70 public void setServletContext(ServletContext servletContext) {
71 this.servletContext = servletContext;
72 }
73
74 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
75 this.repositoryRegister = repositoryRegister;
76 }
77
78 private class DelegatingServletConfig implements ServletConfig {
79 private String name;
80 private Properties initParameters;
81
82 public DelegatingServletConfig(String name, Properties initParameters) {
83 super();
84 this.name = name;
85 this.initParameters = initParameters;
86 }
87
88 public String getServletName() {
89 return name;
90 }
91
92 public ServletContext getServletContext() {
93 return servletContext;
94 }
95
96 public String getInitParameter(String paramName) {
97 return initParameters.getProperty(paramName);
98 }
99
100 public Enumeration getInitParameterNames() {
101 return initParameters.keys();
102 }
103 }
104
105 }