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