Java and Android template changes to accommodate query params defined by the collection-format.

This commit is contained in:
Raghav Sidhanti
2015-06-19 14:06:25 -07:00
parent 6ad3a717fe
commit 7a9a41fe01
30 changed files with 556 additions and 120 deletions

View File

@@ -22,6 +22,8 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import java.util.Date;
import java.util.TimeZone;
@@ -238,6 +240,61 @@ public class ApiClient {
}
}
/*
Format to {@code QueryParam} objects.
*/
public Set<QueryParam> parameterToQueryParams(String collectionFormat, String name, Object value){
Set<QueryParam> params = new HashSet<QueryParam>();
// preconditions
if (name == null || name.isEmpty() || value == null) return params;
Collection<String> valueCollection = null;
if (value instanceof Collection) {
valueCollection = (Collection<String>) value;
}
if (valueCollection == null) {
params.add(new QueryParam(name, String.valueOf(value)));
return params;
} else if (valueCollection.isEmpty()) {
return params;
}
collectionFormat = (collectionFormat == null || collectionFormat.isEmpty() ? "csv" : collectionFormat); // default: csv
if (collectionFormat.equals("csv")) {
params.add(new QueryParam(name, parameterToString(value)));
} else if (collectionFormat.equals("multi")) {
for (String item : valueCollection) {
params.add(new QueryParam(name, item));
}
} else if (collectionFormat.equals("ssv")) {
StringBuilder sb = new StringBuilder() ;
for (String item : valueCollection) {
sb.append(" ");
sb.append(item);
}
params.add(new QueryParam(name, sb.substring(1)));
} else if (collectionFormat.equals("tsv")) {
StringBuilder sb = new StringBuilder() ;
for (String item : valueCollection) {
sb.append("\t");
sb.append(item);
}
params.add(new QueryParam(name, sb.substring(1)));
} else if (collectionFormat.equals("pipes")) {
StringBuilder sb = new StringBuilder() ;
for (String item : valueCollection) {
sb.append("|");
sb.append(item);
}
params.add(new QueryParam(name, sb.substring(1)));
}
return params;
}
/**
* Select the Accept header's value from the given accepts array:
* if JSON exists in the given array, use it;
@@ -341,23 +398,25 @@ public class ApiClient {
* @param authNames The authentications to apply
* @return The response body in type of string
*/
public String invokeAPI(String path, String method, Map<String, String> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String accept, String contentType, String[] authNames) throws ApiException {
public String invokeAPI(String path, String method, Set<QueryParam> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String accept, String contentType, String[] authNames) throws ApiException {
updateParamsForAuth(authNames, queryParams, headerParams);
Client client = getClient();
StringBuilder b = new StringBuilder();
for(String key : queryParams.keySet()) {
String value = queryParams.get(key);
if (value != null){
if(b.toString().length() == 0)
b.append("?");
else
b.append("?");
if (queryParams != null){
for (QueryParam queryParam : queryParams){
if (!queryParam.getName().isEmpty()) {
b.append(escapeString(queryParam.getName()));
b.append("=");
b.append(escapeString(queryParam.getValue()));
b.append("&");
b.append(escapeString(key)).append("=").append(escapeString(value));
}
}
}
String querystring = b.toString();
String querystring = b.substring(0, b.length() - 1);
Builder builder;
if (accept == null)
@@ -457,7 +516,7 @@ public class ApiClient {
*
* @param authNames The authentications to apply
*/
private void updateParamsForAuth(String[] authNames, Map<String, String> queryParams, Map<String, String> headerParams) {
private void updateParamsForAuth(String[] authNames, Set<QueryParam> queryParams, Map<String, String> headerParams) {
for (String authName : authNames) {
Authentication auth = authentications.get(authName);
if (auth == null) throw new RuntimeException("Authentication undefined: " + authName);

View File

@@ -0,0 +1,38 @@
package {{invokerPackage}};
public class QueryParam {
private String name = "";
private String value = "";
public QueryParam(String name, String value) {
setName(name);
setValue(value);
}
private void setName(String name) {
if (!isValidString(name)) return;
this.name = name;
}
private void setValue(String value) {
if (!isValidString(value)) return;
this.value = value;
}
public String getName() {
return this.name;
}
public String getValue() {
return this.value;
}
private boolean isValidString(String arg) {
if (arg == null) return false;
if (arg.trim().isEmpty()) return false;
return true;
}
}

View File

@@ -3,6 +3,7 @@ package {{package}};
import {{invokerPackage}}.ApiException;
import {{invokerPackage}}.ApiClient;
import {{invokerPackage}}.Configuration;
import {{invokerPackage}}.QueryParam;
import {{modelPackage}}.*;
@@ -61,16 +62,16 @@ public class {{classname}} {
.replaceAll("\\{" + "{{paramName}}" + "\\}", apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}};
// query params
Map<String, String> queryParams = new HashMap<String, String>();
Set<QueryParam> queryParams = new HashSet<QueryParam>();
Map<String, String> headerParams = new HashMap<String, String>();
Map<String, String> formParams = new HashMap<String, String>();
{{#queryParams}}if ({{paramName}} != null)
queryParams.put("{{baseName}}", apiClient.parameterToString({{paramName}}));
{{#queryParams}}
queryParams.addAll(apiClient.parameterToQueryParams("{{#collectionFormat}}{{{collectionFormat}}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
{{/queryParams}}
{{#headerParams}}if ({{paramName}} != null)
headerParams.put("{{baseName}}", apiClient.parameterToString({{paramName}}));
headerParams.put("{{baseName}}", apiClient.parameterToString({{paramName}}));
{{/headerParams}}
final String[] accepts = {

View File

@@ -1,6 +1,9 @@
package {{invokerPackage}}.auth;
import {{invokerPackage}}.QueryParam;
import java.util.Map;
import java.util.Set;
public class ApiKeyAuth implements Authentication {
private final String location;
@@ -39,7 +42,7 @@ public class ApiKeyAuth implements Authentication {
}
@Override
public void applyToParams(Map<String, String> queryParams, Map<String, String> headerParams) {
public void applyToParams(Set<QueryParam> queryParams, Map<String, String> headerParams) {
String value;
if (apiKeyPrefix != null) {
value = apiKeyPrefix + " " + apiKey;
@@ -47,7 +50,7 @@ public class ApiKeyAuth implements Authentication {
value = apiKey;
}
if (location == "query") {
queryParams.put(paramName, value);
queryParams.add(new QueryParam(paramName, value));
} else if (location == "header") {
headerParams.put(paramName, value);
}

View File

@@ -1,8 +1,11 @@
package {{invokerPackage}}.auth;
import {{invokerPackage}}.QueryParam;
import java.util.Map;
import java.util.Set;
public interface Authentication {
/** Apply authentication settings to header and query params. */
void applyToParams(Map<String, String> queryParams, Map<String, String> headerParams);
void applyToParams(Set<QueryParam> queryParams, Map<String, String> headerParams);
}

View File

@@ -1,6 +1,9 @@
package {{invokerPackage}}.auth;
import {{invokerPackage}}.QueryParam;
import java.util.Map;
import java.util.Set;
import java.io.UnsupportedEncodingException;
import javax.xml.bind.DatatypeConverter;
@@ -26,7 +29,7 @@ public class HttpBasicAuth implements Authentication {
}
@Override
public void applyToParams(Map<String, String> queryParams, Map<String, String> headerParams) {
public void applyToParams(Set<QueryParam> queryParams, Map<String, String> headerParams) {
String str = (username == null ? "" : username) + ":" + (password == null ? "" : password);
try {
headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8")));

View File

@@ -1,10 +1,13 @@
package {{invokerPackage}}.auth;
import {{invokerPackage}}.QueryParam;
import java.util.Map;
import java.util.Set;
public class OAuth implements Authentication {
@Override
public void applyToParams(Map<String, String> queryParams, Map<String, String> headerParams) {
public void applyToParams(Set<QueryParam> queryParams, Map<String, String> headerParams) {
// TODO: support oauth
}
}