]> 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
bd5b3700572094c3b248dfba15a27e7a6ce14d08
[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.List;
5 import java.util.Properties;
6
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;
13
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;
26
27 public abstract class MultipleRepositoryHandlerMapping implements
28 HandlerMapping, ApplicationContextAware, ServletContextAware {
29 private final static Log log = LogFactory
30 .getLog(MultipleRepositoryHandlerMapping.class);
31
32 private final static String MKCOL = "MKCOL";
33
34 private ConfigurableApplicationContext applicationContext;
35 private ServletContext servletContext;
36
37 private RepositoryRegister repositoryRegister;
38
39 /** Actually creates the servlet to be registered. */
40 protected abstract HttpServlet createServlet(Repository repository,
41 String pathPrefix) throws ServletException;
42
43 public HandlerExecutionChain getHandler(HttpServletRequest request)
44 throws Exception {
45 if (log.isTraceEnabled()) {
46 log.trace("getContextPath=" + request.getContextPath());
47 log.trace("getServletPath=" + request.getServletPath());
48 log.trace("getPathInfo=" + request.getPathInfo());
49 }
50
51 String pathInfo = request.getPathInfo();
52
53 // tokenize path
54 List<String> tokens = JcrUtils.tokenize(pathInfo);
55
56 // check if repository can be found
57 if (tokens.size() == 0
58 || (tokens.size() == 1 && tokens.get(0).equals("")))
59 return null;
60 // MKCOL on repository or root node doesn't make sense
61 if ((tokens.size() == 1 || tokens.size() == 2)
62 && request.getMethod().equals(MKCOL))
63 return null;
64 String repositoryName = extractRepositoryName(tokens);
65 String pathPrefix = request.getServletPath() + '/' + repositoryName;
66 String beanName = pathPrefix;
67
68 if (!applicationContext.containsBean(beanName)) {
69 Repository repository = repositoryRegister.getRepositories().get(
70 repositoryName);
71 HttpServlet servlet = createServlet(repository, pathPrefix);
72 applicationContext.getBeanFactory().registerSingleton(beanName,
73 servlet);
74 // TODO: unregister it as well
75 }
76 HttpServlet remotingServlet = (HttpServlet) applicationContext
77 .getBean(beanName);
78 HandlerExecutionChain hec = new HandlerExecutionChain(remotingServlet);
79 return hec;
80 }
81
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(
88 currName.toString()))
89 return currName.toString();
90 currName.append('/');
91 }
92 throw new ArgeoException("No repository can be found for request "
93 + pathTokens);
94 }
95
96 public void setApplicationContext(ApplicationContext applicationContext)
97 throws BeansException {
98 this.applicationContext = (ConfigurableApplicationContext) applicationContext;
99 }
100
101 public void setServletContext(ServletContext servletContext) {
102 this.servletContext = servletContext;
103 }
104
105 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
106 this.repositoryRegister = repositoryRegister;
107 }
108
109 protected class DelegatingServletConfig implements ServletConfig {
110 private String name;
111 private Properties initParameters;
112
113 public DelegatingServletConfig(String name, Properties initParameters) {
114 super();
115 this.name = name;
116 this.initParameters = initParameters;
117 }
118
119 public String getServletName() {
120 return name;
121 }
122
123 public ServletContext getServletContext() {
124 return servletContext;
125 }
126
127 public String getInitParameter(String paramName) {
128 return initParameters.getProperty(paramName);
129 }
130
131 @SuppressWarnings("rawtypes")
132 public Enumeration getInitParameterNames() {
133 return initParameters.keys();
134 }
135 }
136 }