]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java
16ecdd89ecff8de8b5fda232a33ad74124015060
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jcr.mvc / src / main / java / org / argeo / jcr / mvc / MultipleRepositoryHandlerMapping.java
1 package org.argeo.jcr.mvc;
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 HandlerExecutionChain hec = new HandlerExecutionChain(remotingServlet);
62 return hec;
63 }
64
65 /** The repository name is the first part of the path info */
66 protected String extractRepositoryName(HttpServletRequest request) {
67 String pathInfo = request.getPathInfo();
68 // TODO: optimize by checking character by character
69 String[] tokens = pathInfo.split("/");
70 StringBuffer currName = new StringBuffer("");
71 tokens: for (String token : tokens) {
72 if (token.equals(""))
73 continue tokens;
74 currName.append(token);
75 if (repositoryRegister.getRepositories().containsKey(
76 currName.toString()))
77 return currName.toString();
78 currName.append('/');
79 }
80 throw new ArgeoException("No repository can be found for request "
81 + pathInfo);
82 }
83
84 public void setApplicationContext(ApplicationContext applicationContext)
85 throws BeansException {
86 this.applicationContext = (ConfigurableApplicationContext) applicationContext;
87 }
88
89 public void setServletContext(ServletContext servletContext) {
90 this.servletContext = servletContext;
91 }
92
93 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
94 this.repositoryRegister = repositoryRegister;
95 }
96
97 protected class DelegatingServletConfig implements ServletConfig {
98 private String name;
99 private Properties initParameters;
100
101 public DelegatingServletConfig(String name, Properties initParameters) {
102 super();
103 this.name = name;
104 this.initParameters = initParameters;
105 }
106
107 public String getServletName() {
108 return name;
109 }
110
111 public ServletContext getServletContext() {
112 return servletContext;
113 }
114
115 public String getInitParameter(String paramName) {
116 return initParameters.getProperty(paramName);
117 }
118
119 @SuppressWarnings("rawtypes")
120 public Enumeration getInitParameterNames() {
121 return initParameters.keys();
122 }
123 }
124 }