| ServletRequestPropertyReader.java |
/*
* $Id: ServletRequestPropertyReader.java,v 1.31 2012/03/03 10:41:19 agoubard Exp $
*
* See the COPYRIGHT file for redistribution and use restrictions.
*/
package org.xins.common.servlet;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.xins.common.MandatoryArgumentChecker;
import org.xins.common.collections.AbstractPropertyReader;
import org.xins.common.text.ParseException;
import org.xins.common.text.TextUtils;
import org.xins.common.text.URLEncoding;
/**
* Implementation of a <code>PropertyReader</code> that returns the
* request parameters from a <code>ServletRequest</code> object.
*
* @version $Revision: 1.31 $ $Date: 2012/03/03 10:41:19 $
* @author <a href="mailto:ernst@ernstdehaan.com">Ernst de Haan</a>
* @author <a href="mailto:anthony.goubard@japplis.com">Anthony Goubard</a>
*
* @since XINS 1.0.0
*/
@Deprecated
public final class ServletRequestPropertyReader extends AbstractPropertyReader {
/**
* Constructs a new <code>ServletRequestPropertyReader</code> for a
* <code>ServletRequest</code>.
*
* @param request
* the {@link ServletRequest} object, cannot be <code>null</code>.
*
* @throws NullPointerException
* if <code>request == null</code>.
*/
public ServletRequestPropertyReader(ServletRequest request)
throws NullPointerException {
super(request.getParameterMap());
}
/**
* Constructs a new <code>ServletRequestPropertyReader</code> for an
* <code>HttpServletRequest</code>.
*
* @param request
* the {@link HttpServletRequest} object, cannot be <code>null</code>.
*
* @throws IllegalArgumentException
* if <code>request == null</code>.
*
* @throws ParseException
* if the query string in the specified servlet request cannot be
* parsed.
*
* @since XINS 1.4.0
*/
public ServletRequestPropertyReader(HttpServletRequest request)
throws IllegalArgumentException, ParseException {
// Initially allocate a complete HashMap already
super(new HashMap(20));
// Check preconditions
MandatoryArgumentChecker.check("request", request);
Map properties = getPropertiesMap();
// Get the HTTP query string
String query = request.getQueryString();
// Short-circuit if the query string is empty
if (TextUtils.isEmpty(query)) {
return;
}
// Parse the parameters in the HTTP query string
try {
StringTokenizer st = new StringTokenizer(query, "&");
while (st.hasMoreTokens()) {
String token = st.nextToken();
int equalsPos = token.indexOf('=');
if (equalsPos != -1) {
String parameterKey = URLEncoding.decode(token.substring(0, equalsPos));
String parameterValue = URLEncoding.decode(token.substring(equalsPos + 1));
add(properties, parameterKey, parameterValue);
} else {
add(properties, token, "");
}
}
// URLEncoder.decode(String url, String enc) may throw an UnsupportedEncodingException
// or an IllegalArgumentException
} catch (Exception cause) {
throw new ParseException("Failed to parse HTTP query string.",
cause,
"URL decoding failed.");
}
}
/**
* Sets a parameter to the specified value. If the parameter is already set
* to a different value, then an exception is thrown.
*
* <p>This function is used during parsing of a HTTP query string, which is
* why a {@link ParseException} is thrown in case of conflicting values.
*
* @param properties
* the set of parameters, should not be <code>null</code>.
*
* @param key
* the parameter key, should not be <code>null</code>.
*
* @param value
* the parameter value, should not be <code>null</code>.
*
* @throws NullPointerException
* if <code>properties == null</code>.
*
* @throws ParseException
* if a conflicting value is found for a certain parameter.
*/
private static void add(Map properties, String key, String value)
throws NullPointerException, ParseException {
Object existingValue = properties.get(key);
if (existingValue != null && ! existingValue.equals(value)) {
String detail = "Conflicting values found for parameter \""
+ key
+ "\": \""
+ (String) existingValue
+ "\" versus \""
+ value
+ "\".";
throw new ParseException("Failed to parse HTTP query string.",
(Throwable) null, detail);
}
properties.put(key, value);
}
}