public static StringBuilder httpBuildQueryImpl(String path, Value formdata,
public static StringBuilder httpBuildQueryImpl(Env env, String path, Value formdata,
  public static StringBuilder httpBuildQueryImpl(String path, Value formdata,                                                  String numeric_prefix)  {    StringBuilder result = new StringBuilder();        Set<Map.Entry<Value,Value>> entrySet;    if (formdata.isArray())      entrySet = ((ArrayValue)formdata).entrySet();    else if (formdata.isObject()) {      Set<Map.Entry<String,Value>> stringEntrySet        = ((ObjectValue)formdata).entrySet();      LinkedHashMap<Value,Value> valueMap = new LinkedHashMap<Value,Value>();      for (Map.Entry<String,Value> entry : stringEntrySet)        valueMap.put(new StringValueImpl(entry.getKey()), entry.getValue());      entrySet = valueMap.entrySet();    } else {      env.warning("formdata must be an array or object");      return result;     }    for (Map.Entry<Value,Value> entry : entrySet) {      String newPath = makeNewPath(path, entry.getKey(), numeric_prefix);      if (entry.getValue().isArray() || entry.getValue().isObject()) {        // can always throw away the numeric prefix on recursive calls        result.append(httpBuildQueryImpl(newPath, entry.getValue(), null));        result.append("&");      } else {        result.append(newPath + "=");        result.append(urlencode(entry.getValue().toString()));        result.append("&");      }    }    // trim any trailing &'s    if (result.length() > 0)       result.deleteCharAt(result.length() - 1);    return result;  }