Further SavedRequestWrapper related tests and tidying up.
This commit is contained in:
@@ -33,44 +33,42 @@ import java.util.NoSuchElementException;
|
||||
* @author Andrey Grebnev
|
||||
* @version $Id$
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public class Enumerator implements Enumeration {
|
||||
public class Enumerator<T> implements Enumeration<T> {
|
||||
//~ Instance fields ================================================================================================
|
||||
|
||||
/**
|
||||
* The <code>Iterator</code> over which the <code>Enumeration</code> represented by this class actually operates.
|
||||
*/
|
||||
private Iterator iterator = null;
|
||||
private Iterator<T> iterator = null;
|
||||
|
||||
//~ Constructors ===================================================================================================
|
||||
|
||||
/**
|
||||
/**
|
||||
* Return an Enumeration over the values of the specified Collection.
|
||||
*
|
||||
* @param collection Collection whose values should be enumerated
|
||||
*/
|
||||
public Enumerator(Collection collection) {
|
||||
public Enumerator(Collection<T> collection) {
|
||||
this(collection.iterator());
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Return an Enumeration over the values of the specified Collection.
|
||||
*
|
||||
* @param collection Collection whose values should be enumerated
|
||||
* @param clone true to clone iterator
|
||||
*/
|
||||
public Enumerator(Collection collection, boolean clone) {
|
||||
public Enumerator(Collection<T> collection, boolean clone) {
|
||||
this(collection.iterator(), clone);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Return an Enumeration over the values returned by the specified
|
||||
* Iterator.
|
||||
*
|
||||
* @param iterator Iterator to be wrapped
|
||||
*/
|
||||
public Enumerator(Iterator iterator) {
|
||||
super();
|
||||
public Enumerator(Iterator<T> iterator) {
|
||||
this.iterator = iterator;
|
||||
}
|
||||
|
||||
@@ -81,12 +79,12 @@ public class Enumerator implements Enumeration {
|
||||
* @param iterator Iterator to be wrapped
|
||||
* @param clone true to clone iterator
|
||||
*/
|
||||
public Enumerator(Iterator iterator, boolean clone) {
|
||||
public Enumerator(Iterator<T> iterator, boolean clone) {
|
||||
|
||||
if (!clone) {
|
||||
this.iterator = iterator;
|
||||
} else {
|
||||
List list = new ArrayList();
|
||||
List<T> list = new ArrayList<T>();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
list.add(iterator.next());
|
||||
@@ -101,17 +99,17 @@ public class Enumerator implements Enumeration {
|
||||
*
|
||||
* @param map Map whose values should be enumerated
|
||||
*/
|
||||
public Enumerator(Map map) {
|
||||
public Enumerator(Map<?, T> map) {
|
||||
this(map.values().iterator());
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Return an Enumeration over the values of the specified Map.
|
||||
*
|
||||
* @param map Map whose values should be enumerated
|
||||
* @param clone true to clone iterator
|
||||
*/
|
||||
public Enumerator(Map map, boolean clone) {
|
||||
public Enumerator(Map<?, T> map, boolean clone) {
|
||||
this(map.values().iterator(), clone);
|
||||
}
|
||||
|
||||
@@ -135,7 +133,7 @@ public class Enumerator implements Enumeration {
|
||||
*
|
||||
* @exception NoSuchElementException if no more elements exist
|
||||
*/
|
||||
public Object nextElement() throws NoSuchElementException {
|
||||
public T nextElement() throws NoSuchElementException {
|
||||
return (iterator.next());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import org.springframework.util.Assert;
|
||||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
@@ -46,7 +47,6 @@ import java.util.TreeMap;
|
||||
* @author Ben Alex
|
||||
* @version $Id$
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public class SavedRequest implements java.io.Serializable {
|
||||
//~ Static fields/initializers =====================================================================================
|
||||
|
||||
@@ -54,10 +54,10 @@ public class SavedRequest implements java.io.Serializable {
|
||||
|
||||
//~ Instance fields ================================================================================================
|
||||
|
||||
private ArrayList cookies = new ArrayList();
|
||||
private ArrayList locales = new ArrayList();
|
||||
private Map headers = new TreeMap(String.CASE_INSENSITIVE_ORDER);
|
||||
private Map parameters = new TreeMap(String.CASE_INSENSITIVE_ORDER);
|
||||
private ArrayList<SavedCookie> cookies = new ArrayList<SavedCookie>();
|
||||
private ArrayList<Locale> locales = new ArrayList<Locale>();
|
||||
private Map<String, List<String>> headers = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
|
||||
private Map<String, String[]> parameters = new TreeMap<String, String[]>(String.CASE_INSENSITIVE_ORDER);
|
||||
private String contextPath;
|
||||
private String method;
|
||||
private String pathInfo;
|
||||
@@ -71,6 +71,7 @@ public class SavedRequest implements java.io.Serializable {
|
||||
|
||||
//~ Constructors ===================================================================================================
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public SavedRequest(HttpServletRequest request, PortResolver portResolver) {
|
||||
Assert.notNull(request, "Request required");
|
||||
Assert.notNull(portResolver, "PortResolver required");
|
||||
@@ -85,20 +86,19 @@ public class SavedRequest implements java.io.Serializable {
|
||||
}
|
||||
|
||||
// Headers
|
||||
Enumeration names = request.getHeaderNames();
|
||||
Enumeration<String> names = request.getHeaderNames();
|
||||
|
||||
while (names.hasMoreElements()) {
|
||||
String name = (String) names.nextElement();
|
||||
Enumeration values = request.getHeaders(name);
|
||||
String name = names.nextElement();
|
||||
Enumeration<String> values = request.getHeaders(name);
|
||||
|
||||
while (values.hasMoreElements()) {
|
||||
String value = (String) values.nextElement();
|
||||
this.addHeader(name, value);
|
||||
this.addHeader(name, values.nextElement());
|
||||
}
|
||||
}
|
||||
|
||||
// Locales
|
||||
Enumeration locales = request.getLocales();
|
||||
Enumeration<Locale> locales = request.getLocales();
|
||||
|
||||
while (locales.hasMoreElements()) {
|
||||
Locale locale = (Locale) locales.nextElement();
|
||||
@@ -106,15 +106,12 @@ public class SavedRequest implements java.io.Serializable {
|
||||
}
|
||||
|
||||
// Parameters
|
||||
Map parameters = request.getParameterMap();
|
||||
Iterator paramNames = parameters.keySet().iterator();
|
||||
Map<String,Object> parameters = request.getParameterMap();
|
||||
|
||||
while (paramNames.hasNext()) {
|
||||
String paramName = (String) paramNames.next();
|
||||
Object o = parameters.get(paramName);
|
||||
if (o instanceof String[]) {
|
||||
String[] paramValues = (String[]) o;
|
||||
this.addParameter(paramName, paramValues);
|
||||
for(String paramName : parameters.keySet()) {
|
||||
Object paramValues = parameters.get(paramName);
|
||||
if (paramValues instanceof String[]) {
|
||||
this.addParameter(paramName, (String[]) paramValues);
|
||||
} else {
|
||||
if (logger.isWarnEnabled()) {
|
||||
logger.warn("ServletRequest.getParameterMap() returned non-String array");
|
||||
@@ -142,10 +139,10 @@ public class SavedRequest implements java.io.Serializable {
|
||||
}
|
||||
|
||||
private void addHeader(String name, String value) {
|
||||
ArrayList values = (ArrayList) headers.get(name);
|
||||
List<String> values = headers.get(name);
|
||||
|
||||
if (values == null) {
|
||||
values = new ArrayList();
|
||||
values = new ArrayList<String>();
|
||||
headers.put(name, values);
|
||||
}
|
||||
|
||||
@@ -163,10 +160,6 @@ public class SavedRequest implements java.io.Serializable {
|
||||
/**
|
||||
* Determines if the current request matches the <code>SavedRequest</code>. All URL arguments are
|
||||
* considered, but <em>not</em> method (POST/GET), cookies, locales, headers or parameters.
|
||||
*
|
||||
* @param request DOCUMENT ME!
|
||||
* @param portResolver DOCUMENT ME!
|
||||
* @return DOCUMENT ME!
|
||||
*/
|
||||
public boolean doesRequestMatch(HttpServletRequest request, PortResolver portResolver) {
|
||||
Assert.notNull(request, "Request required");
|
||||
@@ -216,12 +209,13 @@ public class SavedRequest implements java.io.Serializable {
|
||||
return contextPath;
|
||||
}
|
||||
|
||||
public List getCookies() {
|
||||
List cookieList = new ArrayList(cookies.size());
|
||||
for (Iterator iterator = cookies.iterator(); iterator.hasNext();) {
|
||||
SavedCookie savedCookie = (SavedCookie) iterator.next();
|
||||
public List<Cookie> getCookies() {
|
||||
List<Cookie> cookieList = new ArrayList<Cookie>(cookies.size());
|
||||
|
||||
for (SavedCookie savedCookie : cookies) {
|
||||
cookieList.add(savedCookie.getCookie());
|
||||
}
|
||||
|
||||
return cookieList;
|
||||
}
|
||||
|
||||
@@ -234,33 +228,33 @@ public class SavedRequest implements java.io.Serializable {
|
||||
return UrlUtils.getFullRequestUrl(this);
|
||||
}
|
||||
|
||||
public Iterator getHeaderNames() {
|
||||
public Iterator<String> getHeaderNames() {
|
||||
return (headers.keySet().iterator());
|
||||
}
|
||||
|
||||
public Iterator getHeaderValues(String name) {
|
||||
ArrayList values = (ArrayList) headers.get(name);
|
||||
public Iterator<String> getHeaderValues(String name) {
|
||||
List<String> values = headers.get(name);
|
||||
|
||||
if (values == null) {
|
||||
return ((new ArrayList()).iterator());
|
||||
} else {
|
||||
return (values.iterator());
|
||||
values = Collections.emptyList();
|
||||
}
|
||||
|
||||
return (values.iterator());
|
||||
}
|
||||
|
||||
public Iterator getLocales() {
|
||||
public Iterator<Locale> getLocales() {
|
||||
return (locales.iterator());
|
||||
}
|
||||
|
||||
public String getMethod() {
|
||||
return (this.method);
|
||||
return method;
|
||||
}
|
||||
|
||||
public Map getParameterMap() {
|
||||
public Map<String, String[]> getParameterMap() {
|
||||
return parameters;
|
||||
}
|
||||
|
||||
public Iterator getParameterNames() {
|
||||
public Iterator<String> getParameterNames() {
|
||||
return (parameters.keySet().iterator());
|
||||
}
|
||||
|
||||
|
||||
@@ -15,18 +15,7 @@
|
||||
|
||||
package org.springframework.security.wrapper;
|
||||
|
||||
import org.springframework.security.ui.AbstractProcessingFilter;
|
||||
import org.springframework.security.ui.savedrequest.Enumerator;
|
||||
import org.springframework.security.ui.savedrequest.FastHttpDateFormat;
|
||||
import org.springframework.security.ui.savedrequest.SavedRequest;
|
||||
|
||||
import org.springframework.security.util.PortResolver;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Enumeration;
|
||||
@@ -38,12 +27,19 @@ import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.security.ui.AbstractProcessingFilter;
|
||||
import org.springframework.security.ui.savedrequest.Enumerator;
|
||||
import org.springframework.security.ui.savedrequest.FastHttpDateFormat;
|
||||
import org.springframework.security.ui.savedrequest.SavedRequest;
|
||||
import org.springframework.security.util.PortResolver;
|
||||
|
||||
|
||||
/**
|
||||
* Provides request parameters, headers and cookies from either an original request or a saved request.
|
||||
@@ -121,16 +117,18 @@ public class SavedRequestAwareWrapper extends SecurityContextHolderAwareRequestW
|
||||
|
||||
//~ Methods ========================================================================================================
|
||||
|
||||
@Override
|
||||
public Cookie[] getCookies() {
|
||||
if (savedRequest == null) {
|
||||
return super.getCookies();
|
||||
} else {
|
||||
List cookies = savedRequest.getCookies();
|
||||
List<Cookie> cookies = savedRequest.getCookies();
|
||||
|
||||
return (Cookie[]) cookies.toArray(new Cookie[cookies.size()]);
|
||||
return cookies.toArray(new Cookie[cookies.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getDateHeader(String name) {
|
||||
if (savedRequest == null) {
|
||||
return super.getDateHeader(name);
|
||||
@@ -152,15 +150,16 @@ public class SavedRequestAwareWrapper extends SecurityContextHolderAwareRequestW
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeader(String name) {
|
||||
if (savedRequest == null) {
|
||||
return super.getHeader(name);
|
||||
} else {
|
||||
String header = null;
|
||||
Iterator iterator = savedRequest.getHeaderValues(name);
|
||||
Iterator<String> iterator = savedRequest.getHeaderValues(name);
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
header = (String) iterator.next();
|
||||
header = iterator.next();
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -169,22 +168,25 @@ public class SavedRequestAwareWrapper extends SecurityContextHolderAwareRequestW
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration getHeaderNames() {
|
||||
if (savedRequest == null) {
|
||||
return super.getHeaderNames();
|
||||
} else {
|
||||
return new Enumerator(savedRequest.getHeaderNames());
|
||||
return new Enumerator<String>(savedRequest.getHeaderNames());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration getHeaders(String name) {
|
||||
if (savedRequest == null) {
|
||||
return super.getHeaders(name);
|
||||
} else {
|
||||
return new Enumerator(savedRequest.getHeaderValues(name));
|
||||
return new Enumerator<String>(savedRequest.getHeaderValues(name));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIntHeader(String name) {
|
||||
if (savedRequest == null) {
|
||||
return super.getIntHeader(name);
|
||||
@@ -199,12 +201,13 @@ public class SavedRequestAwareWrapper extends SecurityContextHolderAwareRequestW
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Locale getLocale() {
|
||||
if (savedRequest == null) {
|
||||
return super.getLocale();
|
||||
} else {
|
||||
Locale locale = null;
|
||||
Iterator iterator = savedRequest.getLocales();
|
||||
Iterator<Locale> iterator = savedRequest.getLocales();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
locale = (Locale) iterator.next();
|
||||
@@ -220,23 +223,25 @@ public class SavedRequestAwareWrapper extends SecurityContextHolderAwareRequestW
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration getLocales() {
|
||||
if (savedRequest == null) {
|
||||
return super.getLocales();
|
||||
} else {
|
||||
Iterator iterator = savedRequest.getLocales();
|
||||
|
||||
if (iterator.hasNext()) {
|
||||
return new Enumerator(iterator);
|
||||
} else {
|
||||
ArrayList results = new ArrayList();
|
||||
results.add(defaultLocale);
|
||||
|
||||
return new Enumerator(results.iterator());
|
||||
}
|
||||
}
|
||||
|
||||
Iterator<Locale> iterator = savedRequest.getLocales();
|
||||
|
||||
if (iterator.hasNext()) {
|
||||
return new Enumerator<Locale>(iterator);
|
||||
}
|
||||
// Fall back to default locale
|
||||
ArrayList<Locale> results = new ArrayList<Locale>(1);
|
||||
results.add(defaultLocale);
|
||||
|
||||
return new Enumerator<Locale>(results.iterator());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethod() {
|
||||
if (savedRequest == null) {
|
||||
return super.getMethod();
|
||||
@@ -257,83 +262,82 @@ public class SavedRequestAwareWrapper extends SecurityContextHolderAwareRequestW
|
||||
* If the value from the wrapped request is null, an attempt will be made to retrieve the parameter
|
||||
* from the SavedRequest, if available..
|
||||
*/
|
||||
@Override
|
||||
public String getParameter(String name) {
|
||||
String value = super.getParameter(name);
|
||||
|
||||
|
||||
if (value != null || savedRequest == null) {
|
||||
return value;
|
||||
return value;
|
||||
}
|
||||
|
||||
String[] values = savedRequest.getParameterValues(name);
|
||||
if (values == null)
|
||||
return null;
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
value = values[i];
|
||||
break;
|
||||
}
|
||||
if (values == null || values.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return value;
|
||||
return values[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map getParameterMap() {
|
||||
if (savedRequest == null) {
|
||||
if (savedRequest == null) {
|
||||
return super.getParameterMap();
|
||||
}
|
||||
|
||||
Set names = getCombinedParameterNames();
|
||||
Iterator nameIter = names.iterator();
|
||||
Map parameterMap = new HashMap(names.size());
|
||||
|
||||
while (nameIter.hasNext()) {
|
||||
String name = (String) nameIter.next();
|
||||
parameterMap.put(name, getParameterValues(name));
|
||||
}
|
||||
|
||||
return parameterMap;
|
||||
}
|
||||
|
||||
private Set getCombinedParameterNames() {
|
||||
Set names = new HashSet();
|
||||
names.addAll(super.getParameterMap().keySet());
|
||||
|
||||
if (savedRequest != null) {
|
||||
names.addAll(savedRequest.getParameterMap().keySet());
|
||||
}
|
||||
|
||||
return names;
|
||||
|
||||
Set<String> names = getCombinedParameterNames();
|
||||
Map<String, String[]> parameterMap = new HashMap<String, String[]>(names.size());
|
||||
|
||||
for (String name : names) {
|
||||
parameterMap.put(name, getParameterValues(name));
|
||||
}
|
||||
|
||||
return parameterMap;
|
||||
}
|
||||
|
||||
private Set<String> getCombinedParameterNames() {
|
||||
Set<String> names = new HashSet<String>();
|
||||
names.addAll(super.getParameterMap().keySet());
|
||||
|
||||
if (savedRequest != null) {
|
||||
names.addAll(savedRequest.getParameterMap().keySet());
|
||||
}
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration getParameterNames() {
|
||||
return new Enumerator(getCombinedParameterNames());
|
||||
return new Enumerator(getCombinedParameterNames());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getParameterValues(String name) {
|
||||
if (savedRequest == null) {
|
||||
return super.getParameterValues(name);
|
||||
}
|
||||
|
||||
String[] savedRequestParams = savedRequest.getParameterValues(name);
|
||||
String[] wrappedRequestParams = super.getParameterValues(name);
|
||||
if (savedRequest == null) {
|
||||
return super.getParameterValues(name);
|
||||
}
|
||||
|
||||
if (savedRequestParams == null) {
|
||||
return wrappedRequestParams;
|
||||
}
|
||||
|
||||
if (wrappedRequestParams == null) {
|
||||
return savedRequestParams;
|
||||
}
|
||||
String[] savedRequestParams = savedRequest.getParameterValues(name);
|
||||
String[] wrappedRequestParams = super.getParameterValues(name);
|
||||
|
||||
// We have params in both saved and wrapped requests so have to merge them
|
||||
List wrappedParamsList = Arrays.asList(wrappedRequestParams);
|
||||
List combinedParams = new ArrayList(wrappedParamsList);
|
||||
if (savedRequestParams == null) {
|
||||
return wrappedRequestParams;
|
||||
}
|
||||
|
||||
// We want to add all parameters of the saved request *apart from* duplicates of those already added
|
||||
for (int i = 0; i < savedRequestParams.length; i++) {
|
||||
if (!wrappedParamsList.contains(savedRequestParams[i])) {
|
||||
combinedParams.add(savedRequestParams[i]);
|
||||
}
|
||||
}
|
||||
if (wrappedRequestParams == null) {
|
||||
return savedRequestParams;
|
||||
}
|
||||
|
||||
return (String[]) combinedParams.toArray(new String[combinedParams.size()]);
|
||||
// We have parameters in both saved and wrapped requests so have to merge them
|
||||
List<String> wrappedParamsList = Arrays.asList(wrappedRequestParams);
|
||||
List<String> combinedParams = new ArrayList<String>(wrappedParamsList);
|
||||
|
||||
// We want to add all parameters of the saved request *apart from* duplicates of those already added
|
||||
for (int i = 0; i < savedRequestParams.length; i++) {
|
||||
if (!wrappedParamsList.contains(savedRequestParams[i])) {
|
||||
combinedParams.add(savedRequestParams[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return combinedParams.toArray(new String[combinedParams.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,6 +89,7 @@ public class SecurityContextHolderAwareRequestWrapper extends HttpServletRequest
|
||||
*
|
||||
* @return the username or <code>null</code> if unavailable
|
||||
*/
|
||||
@Override
|
||||
public String getRemoteUser() {
|
||||
Authentication auth = getAuthentication();
|
||||
|
||||
@@ -109,6 +110,7 @@ public class SecurityContextHolderAwareRequestWrapper extends HttpServletRequest
|
||||
*
|
||||
* @return the <code>Authentication</code>, or <code>null</code>
|
||||
*/
|
||||
@Override
|
||||
public Principal getUserPrincipal() {
|
||||
Authentication auth = getAuthentication();
|
||||
|
||||
@@ -158,6 +160,7 @@ public class SecurityContextHolderAwareRequestWrapper extends HttpServletRequest
|
||||
* @return <code>true</code> if an <b>exact</b> (case sensitive) matching granted authority is located,
|
||||
* <code>false</code> otherwise
|
||||
*/
|
||||
@Override
|
||||
public boolean isUserInRole(String role) {
|
||||
return isGranted(role);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user