* Implement automatic parsing of foo[bar][baz] parameter names to objects.

This commit is contained in:
hns 2007-04-24 14:38:11 +00:00
parent 79970a0b77
commit 20ff053619

View file

@ -23,6 +23,8 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
/** /**
* A Transmitter for a request from the servlet client. Objects of this * A Transmitter for a request from the servlet client. Objects of this
@ -75,6 +77,8 @@ public class RequestTrans implements Serializable {
private String httpUsername; private String httpUsername;
private String httpPassword; private String httpPassword;
static private final Pattern paramPattern = Pattern.compile("\\[(.+?)\\]");
/** /**
* Create a new Request transmitter with an empty data map. * Create a new Request transmitter with an empty data map.
*/ */
@ -119,10 +123,35 @@ public class RequestTrans implements Serializable {
} }
/** /**
* Set a parameter value in this request transmitter. * Set a parameter value in this request transmitter. This
* parses foo[bar][baz] as nested objects/maps.
*/ */
public void set(String name, Object value) { public void set(String name, Object value) {
values.put(name, value); int bracket = name.indexOf('[');
if (bracket > -1 && name.endsWith("]")) {
Matcher m = paramPattern.matcher(name);
String partName = name.substring(0, bracket);
Map map = values;
while (m.find()) {
Object previousValue = map.get(partName);
Map partMap;
if (previousValue == null) {
partMap = new SystemMap();
map.put(partName, partMap);
} else if (previousValue instanceof Map) {
partMap = (Map) previousValue;
} else {
throw new RuntimeException("Conflicting HTTP Parameters for '" + name + "'");
}
partName = m.group(1);
map = partMap;
}
if (map.put(partName, value) != null)
throw new RuntimeException("Conflicting HTTP Parameters for '" + name + "'");;
} else {
if (values.put(name, value) != null)
throw new RuntimeException("Conflicting HTTP Parameters for '" + name + "'");;
}
} }
/** /**