blob: 02e68edbb3550b012f6a6fa98f9db82d6aad34aa [file] [log] [blame]
dhanji52ce3212008-12-15 09:42:36 +00001/**
2 * Copyright (C) 2008 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.google.inject.servlet;
17
dhanji52ce3212008-12-15 09:42:36 +000018import com.google.inject.AbstractModule;
19import com.google.inject.Key;
sberlind9c913a2011-06-26 21:02:54 +000020import com.google.common.collect.Lists;
21import com.google.common.collect.Sets;
limpbizkit50581d12009-04-24 18:19:41 +000022import com.google.inject.internal.UniqueAnnotations;
dhanji52ce3212008-12-15 09:42:36 +000023import java.util.HashMap;
24import java.util.List;
25import java.util.Map;
dhanji87dfe5b2009-01-07 06:49:07 +000026import java.util.Set;
dhanji52ce3212008-12-15 09:42:36 +000027import javax.servlet.http.HttpServlet;
28
29/**
dhanji6634fe12008-12-21 11:31:25 +000030 * Builds the guice module that binds configured servlets, with their
31 * wrapper ServletDefinitions. Is part of the binding EDSL. Very similar to
32 * {@link com.google.inject.servlet.FiltersModuleBuilder}.
dhanji52ce3212008-12-15 09:42:36 +000033 *
34 * @author Dhanji R. Prasanna (dhanji@gmail.com)
dhanji52ce3212008-12-15 09:42:36 +000035 */
dhanji6634fe12008-12-21 11:31:25 +000036class ServletsModuleBuilder extends AbstractModule {
37 private final List<ServletDefinition> servletDefinitions = Lists.newArrayList();
dhanjie477c782009-10-30 13:19:19 +000038 private final List<ServletInstanceBindingEntry> servletInstanceEntries = Lists.newArrayList();
dhanji52ce3212008-12-15 09:42:36 +000039
40 //invoked on injector config
dhanji6634fe12008-12-21 11:31:25 +000041 @Override
dhanji52ce3212008-12-15 09:42:36 +000042 protected void configure() {
dhanjie477c782009-10-30 13:19:19 +000043 // Create bindings for servlet instances
44 for (ServletInstanceBindingEntry entry : servletInstanceEntries) {
45 bind(entry.key).toInstance(entry.servlet);
46 }
dhanji87dfe5b2009-01-07 06:49:07 +000047
48 // Ensure that servlets are not bound twice to the same pattern.
49 Set<String> servletUris = Sets.newHashSet();
50 for (ServletDefinition servletDefinition : servletDefinitions) {
51 if (servletUris.contains(servletDefinition.getPattern())) {
52 addError("More than one servlet was mapped to the same URI pattern: "
53 + servletDefinition.getPattern());
54 }
55 else {
sberlinb4b7f722010-08-22 18:48:23 +000056 bind(Key.get(ServletDefinition.class, UniqueAnnotations.create())).toProvider(servletDefinition);
dhanji87dfe5b2009-01-07 06:49:07 +000057 servletUris.add(servletDefinition.getPattern());
58 }
59 }
dhanji52ce3212008-12-15 09:42:36 +000060 }
61
62 //the first level of the EDSL--
dhanjiae3de7d2008-12-24 06:39:43 +000063 public ServletModule.ServletKeyBindingBuilder serve(List<String> urlPatterns) {
64 return new ServletKeyBindingBuilderImpl(urlPatterns, UriPatternType.SERVLET);
dhanji52ce3212008-12-15 09:42:36 +000065 }
66
dhanjiae3de7d2008-12-24 06:39:43 +000067 public ServletModule.ServletKeyBindingBuilder serveRegex(List<String> regexes) {
68 return new ServletKeyBindingBuilderImpl(regexes, UriPatternType.REGEX);
dhanji52ce3212008-12-15 09:42:36 +000069 }
70
dhanjie477c782009-10-30 13:19:19 +000071 private static class ServletInstanceBindingEntry {
72 final Key<HttpServlet> key;
73 final HttpServlet servlet;
74
75 ServletInstanceBindingEntry(Key<HttpServlet> key, HttpServlet servlet) {
76 this.key = key;
77 this.servlet = servlet;
78 }
79 }
80
dhanji52ce3212008-12-15 09:42:36 +000081 //non-static inner class so it can access state of enclosing module class
dhanji6634fe12008-12-21 11:31:25 +000082 class ServletKeyBindingBuilderImpl implements ServletModule.ServletKeyBindingBuilder {
dhanjiae3de7d2008-12-24 06:39:43 +000083 private final List<String> uriPatterns;
dhanji52ce3212008-12-15 09:42:36 +000084 private final UriPatternType uriPatternType;
85
dhanjiae3de7d2008-12-24 06:39:43 +000086 private ServletKeyBindingBuilderImpl(List<String> uriPatterns, UriPatternType uriPatternType) {
87 this.uriPatterns = uriPatterns;
dhanji52ce3212008-12-15 09:42:36 +000088 this.uriPatternType = uriPatternType;
89 }
90
dhanji6634fe12008-12-21 11:31:25 +000091 public void with(Class<? extends HttpServlet> servletKey) {
92 with(Key.get(servletKey));
dhanji52ce3212008-12-15 09:42:36 +000093 }
94
dhanji6634fe12008-12-21 11:31:25 +000095 public void with(Key<? extends HttpServlet> servletKey) {
96 with(servletKey, new HashMap<String, String>());
dhanji52ce3212008-12-15 09:42:36 +000097 }
98
dhanjie477c782009-10-30 13:19:19 +000099 public void with(HttpServlet servlet) {
100 with(servlet, new HashMap<String, String>());
101 }
102
dhanji6634fe12008-12-21 11:31:25 +0000103 public void with(Class<? extends HttpServlet> servletKey,
sberlin99ca2d62010-08-22 23:08:21 +0000104 Map<String, String> initParams) {
105 with(Key.get(servletKey), initParams);
dhanji52ce3212008-12-15 09:42:36 +0000106 }
107
dhanji6634fe12008-12-21 11:31:25 +0000108 public void with(Key<? extends HttpServlet> servletKey,
sberlin99ca2d62010-08-22 23:08:21 +0000109 Map<String, String> initParams) {
110 with(servletKey, initParams, null);
sberlinb4b7f722010-08-22 18:48:23 +0000111 }
112
113 private void with(Key<? extends HttpServlet> servletKey,
sberlin99ca2d62010-08-22 23:08:21 +0000114 Map<String, String> initParams,
sberlinb4b7f722010-08-22 18:48:23 +0000115 HttpServlet servletInstance) {
dhanjiae3de7d2008-12-24 06:39:43 +0000116 for (String pattern : uriPatterns) {
117 servletDefinitions.add(
dhanjib7ed1bb2008-12-30 06:32:41 +0000118 new ServletDefinition(pattern, servletKey, UriPatternType.get(uriPatternType, pattern),
sberlin99ca2d62010-08-22 23:08:21 +0000119 initParams, servletInstance));
dhanjiae3de7d2008-12-24 06:39:43 +0000120 }
dhanji52ce3212008-12-15 09:42:36 +0000121 }
dhanjie477c782009-10-30 13:19:19 +0000122
123 public void with(HttpServlet servlet,
sberlin99ca2d62010-08-22 23:08:21 +0000124 Map<String, String> initParams) {
dhanjie477c782009-10-30 13:19:19 +0000125 Key<HttpServlet> servletKey = Key.get(HttpServlet.class, UniqueAnnotations.create());
126 servletInstanceEntries.add(new ServletInstanceBindingEntry(servletKey, servlet));
sberlin99ca2d62010-08-22 23:08:21 +0000127 with(servletKey, initParams, servlet);
dhanjie477c782009-10-30 13:19:19 +0000128 }
dhanji52ce3212008-12-15 09:42:36 +0000129 }
sberlinb4b7f722010-08-22 18:48:23 +0000130}