/* * Copyright (c) 2015, Inversoft Inc., All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific * language governing permissions and limitations under the License. */ package org.primeframework.mvc.security.saved; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.primeframework.mvc.util.IteratorEnumeration; /** * This class allows the Saved Request handling to mock out a previous requests parameters. * * @author Brian Pontarelli */ public class SavedRequestHttpServletRequest extends HttpServletRequestWrapper { private final SavedHttpRequest savedRequest; /** * Constructs a new request facade. * * @param request The request to wrap. * @param savedRequest The saved request. */ public SavedRequestHttpServletRequest(HttpServletRequest request, SavedHttpRequest savedRequest) { super(request); this.savedRequest = savedRequest; } @Override public String getMethod() { return savedRequest.method.toString(); } @Override public String getParameter(String key) { if (savedRequest.parameters != null && savedRequest.parameters.containsKey(key) && savedRequest.parameters.get(key) != null) { return savedRequest.parameters.get(key)[0]; } return super.getParameter(key); } @Override public Map<String, String[]> getParameterMap() { Map<String, String[]> complete = new HashMap<>(); if (savedRequest.parameters != null) { complete.putAll(savedRequest.parameters); } complete.putAll(super.getParameterMap()); return complete; } @Override public Enumeration<String> getParameterNames() { Set<String> names = new HashSet<>(); if (savedRequest.parameters != null) { names.addAll(savedRequest.parameters.keySet()); } names.addAll(super.getParameterMap().keySet()); return new IteratorEnumeration<>(names.iterator()); } @Override public String[] getParameterValues(String key) { if (savedRequest.parameters != null && savedRequest.parameters.containsKey(key) && savedRequest.parameters.get(key) != null) { return savedRequest.parameters.get(key); } return super.getParameterValues(key); } @Override public RequestDispatcher getRequestDispatcher(String uri) { if (uri == null) { return super.getRequestDispatcher(null); } HttpServletRequest httpRequest = (HttpServletRequest) super.getRequest(); RequestDispatcher rd = httpRequest.getRequestDispatcher(uri); return new FacadeRequestDispatcher(rd, httpRequest); } @Override public String getRequestURI() { return super.getRequestURI(); } @Override public String getServletPath() { return super.getServletPath(); } public static class FacadeRequestDispatcher implements RequestDispatcher { private final HttpServletRequest httpRequest; private final RequestDispatcher requestDispatcher; public FacadeRequestDispatcher(RequestDispatcher requestDispatcher, HttpServletRequest httpRequest) { this.requestDispatcher = requestDispatcher; this.httpRequest = httpRequest; } public void forward(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { requestDispatcher.forward(httpRequest, servletResponse); } public void include(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { requestDispatcher.include(httpRequest, servletResponse); } } }