]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/MultipleRepositoryHandlerMapping.java
Improve build and maven structure
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jackrabbit / remote / MultipleRepositoryHandlerMapping.java
1 package org.argeo.jackrabbit.remote;
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.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.argeo.ArgeoException;
16 import org.argeo.jcr.RepositoryRegister;
17 import org.springframework.beans.BeansException;
18 import org.springframework.context.ApplicationContext;
19 import org.springframework.context.ApplicationContextAware;
20 import org.springframework.context.ConfigurableApplicationContext;
21 import org.springframework.web.context.ServletContextAware;
22 import org.springframework.web.servlet.HandlerExecutionChain;
23 import org.springframework.web.servlet.HandlerMapping;
24
25 public abstract class MultipleRepositoryHandlerMapping implements
26 HandlerMapping, 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 /** Actually creates the servlet to be registered. */
36 protected abstract HttpServlet createServlet(Repository repository,
37 String pathPrefix) throws ServletException;
38
39 public HandlerExecutionChain getHandler(HttpServletRequest request)
40 throws Exception {
41 if (log.isTraceEnabled()) {
42 log.trace("getContextPath=" + request.getContextPath());
43 log.trace("getServletPath=" + request.getServletPath());
44 log.trace("getPathInfo=" + request.getPathInfo());
45 }
46
47 String repositoryName = extractRepositoryName(request);
48 String pathPrefix = request.getServletPath() + '/' + repositoryName;
49 String beanName = pathPrefix;
50
51 if (!applicationContext.containsBean(beanName)) {
52 Repository repository = repositoryRegister.getRepositories().get(
53 repositoryName);
54 HttpServlet servlet = createServlet(repository, pathPrefix);
55 applicationContext.getBeanFactory().registerSingleton(beanName,
56 servlet);
57 // TODO: unregister it as well
58 }
59 HttpServlet remotingServlet = (HttpServlet) applicationContext
60 .getBean(beanName);
61 return new HandlerExecutionChain(remotingServlet);
62 }
63
64 /** The repository name is the first part of the path info */
65 protected String extractRepositoryName(HttpServletRequest request) {
66 String pathInfo = request.getPathInfo();
67 // TODO: optimize by checking character by character
68 String[] tokens = pathInfo.split("/");
69 StringBuffer currName = new StringBuffer("");
70 tokens: for (String token : tokens) {
71 if (token.equals(""))
72 continue tokens;
73 currName.append(token);
74 if (repositoryRegister.getRepositories().containsKey(
75 currName.toString()))
76 return currName.toString();
77 currName.append('/');
78 }
79 throw new ArgeoException("No repository can be found for request "
80 + pathInfo);
81 }
82
83 public void setApplicationContext(ApplicationContext applicationContext)
84 throws BeansException {
85 this.applicationContext = (ConfigurableApplicationContext) applicationContext;
86 }
87
88 public void setServletContext(ServletContext servletContext) {
89 this.servletContext = servletContext;
90 }
91
92 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
93 this.repositoryRegister = repositoryRegister;
94 }
95
96 protected class DelegatingServletConfig implements ServletConfig {
97 private String name;
98 private Properties initParameters;
99
100 public DelegatingServletConfig(String name, Properties initParameters) {
101 super();
102 this.name = name;
103 this.initParameters = initParameters;
104 }
105
106 public String getServletName() {
107 return name;
108 }
109
110 public ServletContext getServletContext() {
111 return servletContext;
112 }
113
114 public String getInitParameter(String paramName) {
115 return initParameters.getProperty(paramName);
116 }
117
118 @SuppressWarnings("rawtypes")
119 public Enumeration getInitParameterNames() {
120 return initParameters.keys();
121 }
122 }
123
124 }