152ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji/**
252ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * Copyright (C) 2008 Google Inc.
352ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji *
452ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * Licensed under the Apache License, Version 2.0 (the "License");
552ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * you may not use this file except in compliance with the License.
652ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * You may obtain a copy of the License at
752ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji *
852ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * http://www.apache.org/licenses/LICENSE-2.0
952ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji *
1052ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * Unless required by applicable law or agreed to in writing, software
1152ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * distributed under the License is distributed on an "AS IS" BASIS,
1252ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * See the License for the specific language governing permissions and
1452ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * limitations under the License.
1552ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji */
1652ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanjipackage com.google.inject.servlet;
1752ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
18d9c913acca55023ef5d76a32c3d4a51ee6b420cbsberlinimport com.google.common.collect.Sets;
19fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlinimport com.google.inject.Binder;
20b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport com.google.inject.Key;
2150581d1c21373c293922b39c71f45908abe5f6f0limpbizkitimport com.google.inject.internal.UniqueAnnotations;
22b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
2352ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanjiimport java.util.HashMap;
2452ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanjiimport java.util.List;
2552ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanjiimport java.util.Map;
2687dfe5b5942ed30f5be1520cf78a617d78f8078fdhanjiimport java.util.Set;
27b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
2852ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanjiimport javax.servlet.http.HttpServlet;
2952ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
3052ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji/**
316634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji * Builds the guice module that binds configured servlets, with their
326634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji * wrapper ServletDefinitions. Is part of the binding EDSL. Very similar to
336634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji * {@link com.google.inject.servlet.FiltersModuleBuilder}.
3452ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji *
3552ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji * @author Dhanji R. Prasanna (dhanji@gmail.com)
3652ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji */
37fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlinclass ServletsModuleBuilder {
38fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin
39fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin  private final Set<String> servletUris = Sets.newHashSet();
40fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin  private final Binder binder;
41fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin
42fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin  public ServletsModuleBuilder(Binder binder) {
43fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin    this.binder = binder;
4452ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji  }
4552ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
4652ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji  //the first level of the EDSL--
47ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji  public ServletModule.ServletKeyBindingBuilder serve(List<String> urlPatterns) {
48ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji    return new ServletKeyBindingBuilderImpl(urlPatterns, UriPatternType.SERVLET);
4952ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji  }
5052ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
51ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji  public ServletModule.ServletKeyBindingBuilder serveRegex(List<String> regexes) {
52ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji    return new ServletKeyBindingBuilderImpl(regexes, UriPatternType.REGEX);
5352ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji  }
5452ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
5552ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji  //non-static inner class so it can access state of enclosing module class
566634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji  class ServletKeyBindingBuilderImpl implements ServletModule.ServletKeyBindingBuilder {
57ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji    private final List<String> uriPatterns;
5852ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji    private final UriPatternType uriPatternType;
5952ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
60ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji    private ServletKeyBindingBuilderImpl(List<String> uriPatterns, UriPatternType uriPatternType) {
61ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji      this.uriPatterns = uriPatterns;
6252ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji      this.uriPatternType = uriPatternType;
6352ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji    }
6452ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
656634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji    public void with(Class<? extends HttpServlet> servletKey) {
666634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji      with(Key.get(servletKey));
6752ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji    }
6852ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
696634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji    public void with(Key<? extends HttpServlet> servletKey) {
706634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji      with(servletKey, new HashMap<String, String>());
7152ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji    }
7252ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
73e477c78bf7288d6c1e2d40c12b4cebe8d403bef6dhanji    public void with(HttpServlet servlet) {
74e477c78bf7288d6c1e2d40c12b4cebe8d403bef6dhanji      with(servlet, new HashMap<String, String>());
75e477c78bf7288d6c1e2d40c12b4cebe8d403bef6dhanji    }
76e477c78bf7288d6c1e2d40c12b4cebe8d403bef6dhanji
776634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji    public void with(Class<? extends HttpServlet> servletKey,
7899ca2d6dfd9c1f10bc48a0bb4e635144298a6006sberlin        Map<String, String> initParams) {
7999ca2d6dfd9c1f10bc48a0bb4e635144298a6006sberlin      with(Key.get(servletKey), initParams);
8052ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji    }
8152ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji
826634fe165d3729e2fcdf5309d815a8ea2906f6a8dhanji    public void with(Key<? extends HttpServlet> servletKey,
8399ca2d6dfd9c1f10bc48a0bb4e635144298a6006sberlin        Map<String, String> initParams) {
8499ca2d6dfd9c1f10bc48a0bb4e635144298a6006sberlin      with(servletKey, initParams, null);
85b4b7f7209570bd75352eb322825ae79392f03978sberlin    }
86fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin
87fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin    private void with(Key<? extends HttpServlet> servletKey, Map<String, String> initParams,
88b4b7f7209570bd75352eb322825ae79392f03978sberlin        HttpServlet servletInstance) {
89ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji      for (String pattern : uriPatterns) {
90fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin        // Ensure two servlets aren't bound to the same pattern.
91fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin        if (!servletUris.add(pattern)) {
92fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin          binder.addError("More than one servlet was mapped to the same URI pattern: " + pattern);
93fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin        } else {
94fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin          binder.bind(Key.get(ServletDefinition.class, UniqueAnnotations.create())).toProvider(
95fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin              new ServletDefinition(pattern, servletKey, UriPatternType
96fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin                  .get(uriPatternType, pattern), initParams, servletInstance));
97fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin        }
98ae3de7d2721b95e7ae8c8d86654e484ca16d52b9dhanji      }
9952ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji    }
100e477c78bf7288d6c1e2d40c12b4cebe8d403bef6dhanji
101e477c78bf7288d6c1e2d40c12b4cebe8d403bef6dhanji    public void with(HttpServlet servlet,
10299ca2d6dfd9c1f10bc48a0bb4e635144298a6006sberlin        Map<String, String> initParams) {
103e477c78bf7288d6c1e2d40c12b4cebe8d403bef6dhanji      Key<HttpServlet> servletKey = Key.get(HttpServlet.class, UniqueAnnotations.create());
104fee2d237bd4d6f89ed510861a25d4f3eafa8f1d1Sam Berlin      binder.bind(servletKey).toInstance(servlet);
10599ca2d6dfd9c1f10bc48a0bb4e635144298a6006sberlin      with(servletKey, initParams, servlet);
106e477c78bf7288d6c1e2d40c12b4cebe8d403bef6dhanji    }
10752ce3210230b14cf4f55c4b3f2c17d2743fb134bdhanji  }
108b4b7f7209570bd75352eb322825ae79392f03978sberlin}
109