/** * Wrapper around the service chain to ensure a servlet is servicing what it must and provides it * with a wrapped request. * * @return Returns true if this servlet triggered for the given request. Or false if guice-servlet * should continue dispatching down the servlet pipeline. * @throws IOException If thrown by underlying servlet * @throws ServletException If thrown by underlying servlet */ public boolean service(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException { final HttpServletRequest request = (HttpServletRequest) servletRequest; final String path = ServletUtils.getContextRelativePath(request); final boolean serve = shouldServe(path); //invocations of the chain end at the first matched servlet if (serve) { doService(servletRequest, servletResponse); } //return false if no servlet matched (so we can proceed down to the web.xml servlets) return serve; }
public boolean service(ServletRequest request, ServletResponse response) throws IOException, ServletException { //stop at the first matching servlet and service for (ServletDefinition servletDefinition : servletDefinitions) { if (servletDefinition.service(request, response)) { return true; } } //there was no match... return false; }
new ServletDefinition( Key.get(HttpServlet.class), UriPatternType.get(UriPatternType.SERVLET, mapping), null); servletDefinition.init(null, injector, Sets.<HttpServlet>newIdentityHashSet()); servletDefinition.doService(request, response);
public void testServiceWithContextPath() throws IOException, ServletException { String pattern = "/*"; //some init params Map<String, String> initParams = new ImmutableMap.Builder<String, String>() .put("ahsd", "asdas24dok") .put("ahssd", "asdasd124ok") .build(); final ServletDefinition servletDefinition = new ServletDefinition( Key.get(HttpServlet.class), UriPatternType.get(UriPatternType.SERVLET, pattern), initParams, null); HttpServletResponse servletResponse = createMock(HttpServletResponse.class); HttpServletRequest servletRequest = createMock(HttpServletRequest.class); expect(servletRequest.getContextPath()).andReturn("/a_context_path"); expect(servletRequest.getRequestURI()).andReturn("/test.html"); replay(servletRequest, servletResponse); servletDefinition.service(servletRequest, servletResponse); verify(servletRequest, servletResponse); } }
String pattern = "blah.html"; final ServletDefinition servletDefinition = new ServletDefinition( Key.get(HttpServlet.class), UriPatternType.get(UriPatternType.SERVLET, pattern), servletDefinition.init(null, injector, Sets.<HttpServlet>newIdentityHashSet());
private void doServiceImpl( ServletDefinition servletDefinition, ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { servletRequest.setAttribute(REQUEST_DISPATCHER_REQUEST, Boolean.TRUE); try { servletDefinition.doService(servletRequest, servletResponse); } finally { servletRequest.removeAttribute(REQUEST_DISPATCHER_REQUEST); } } };
if (servletDefinition.shouldServe(path)) { return new RequestDispatcher() { @Override
public void destroy() { Set<HttpServlet> destroyedSoFar = Sets.newIdentityHashSet(); for (ServletDefinition servletDefinition : servletDefinitions) { servletDefinition.destroy(destroyedSoFar); } }
public void init(ServletContext servletContext, Injector injector) throws ServletException { Set<HttpServlet> initializedSoFar = Sets.newIdentityHashSet(); for (ServletDefinition servletDefinition : servletDefinitions) { servletDefinition.init(servletContext, injector, initializedSoFar); } }
private void with( Key<? extends HttpServlet> servletKey, Map<String, String> initParams, HttpServlet servletInstance) { for (UriPatternMatcher pattern : uriPatterns) { binder .bind(Key.get(ServletDefinition.class, UniqueAnnotations.create())) .toProvider(new ServletDefinition(servletKey, pattern, initParams, servletInstance)); } }
@Override protected void configure() { // Create bindings for servlet instances for (ServletInstanceBindingEntry entry : servletInstanceEntries) { bind(entry.key).toInstance(entry.servlet); } // Ensure that servlets are not bound twice to the same pattern. Set<String> servletUris = Sets.newHashSet(); for (ServletDefinition servletDefinition : servletDefinitions) { if (servletUris.contains(servletDefinition.getPattern())) { addError("More than one servlet was mapped to the same URI pattern: " + servletDefinition.getPattern()); } else { bind(Key.get(ServletDefinition.class, UniqueAnnotations.create())).toProvider(servletDefinition); servletUris.add(servletDefinition.getPattern()); } } }
@Inject public ServletInfo(Injector injector) { // Extract pattern to servlet key information from ServletDefinition configure using ServletModule List<Binding<ServletDefinition>> servletBindings = injector.findBindingsByType(TypeLiteral.get(ServletDefinition.class)); for (Binding<ServletDefinition> binding : servletBindings) { ServletDefinition def = binding.getProvider().get(); servlets.put(def.getPattern(), def.getKey()); } // Extract pattern to filter key information from FilterDefinition configure using ServletModule List<Binding<FilterDefinition>> filterBindings = injector.findBindingsByType(TypeLiteral.get(FilterDefinition.class)); for (Binding<FilterDefinition> binding : filterBindings) { FilterDefinition def = binding.getProvider().get(); try { Field patternField = def.getClass().getDeclaredField("pattern"); patternField.setAccessible(true); Field keyField = def.getClass().getDeclaredField("filterKey"); keyField.setAccessible(true); filters.put(patternField.get(def).toString(), keyField.get(def).toString()); } catch (Exception e) { LOG.debug("Unable to get details for {}", def.toString(), e); } } }
doServiceImpl(request, (HttpServletResponse) servletResponse);
public final void testIncludeManagedServlet() throws IOException, ServletException { String pattern = "blah.html"; final ServletDefinition servletDefinition = new ServletDefinition( Key.get(HttpServlet.class), UriPatternType.get(UriPatternType.SERVLET, pattern), servletDefinition.init(null, injector, Sets.<HttpServlet>newIdentityHashSet());
public void include(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { // route to the target servlet servletDefinition.doService(servletRequest, servletResponse); } };
if (servletDefinition.shouldServe(path)) { return new RequestDispatcher() {
public void destroy() { Set<HttpServlet> destroyedSoFar = Sets.newIdentityHashSet(); for (ServletDefinition servletDefinition : servletDefinitions) { servletDefinition.destroy(destroyedSoFar); } }
public void init(ServletContext servletContext, Injector injector) throws ServletException { Set<HttpServlet> initializedSoFar = Sets.newIdentityHashSet(); for (ServletDefinition servletDefinition : servletDefinitions) { servletDefinition.init(servletContext, injector, initializedSoFar); } }
private void with(Key<? extends HttpServlet> servletKey, Map<String, String> initParams, HttpServlet servletInstance) { for (String pattern : uriPatterns) { servletDefinitions.add( new ServletDefinition(pattern, servletKey, UriPatternType.get(uriPatternType, pattern), initParams, servletInstance)); } }
@Override protected void configure() { // Ensure that servlets are not bound twice to the same pattern. Set<String> servletUris = Sets.newHashSet(); for (ServletDefinition servletDefinition : servletDefinitions) { if (servletUris.contains(servletDefinition.getPattern())) { addError("More than one servlet was mapped to the same URI pattern: " + servletDefinition.getPattern()); } else { servletUris.add(servletDefinition.getPattern()); } } // Bind these servlet definitions to a unique random key. Doesn't matter what it is, // coz it's never used. bind(Key.get(new TypeLiteral<List<ServletDefinition>>() {}, UniqueAnnotations.create())) .toInstance(servletDefinitions); }