in google-http-client/src/main/java/com/google/api/client/http/UriTemplate.java [279:349]
public static String expand(String pathUri, Object parameters,
boolean addUnusedParamsAsQueryParams) {
Map<String, Object> variableMap = getMap(parameters);
StringBuilder pathBuf = new StringBuilder();
int cur = 0;
int length = pathUri.length();
while (cur < length) {
int next = pathUri.indexOf('{', cur);
if (next == -1) {
if (cur == 0 && !addUnusedParamsAsQueryParams) {
// No expansions exist and we do not need to add any query parameters.
return pathUri;
}
pathBuf.append(pathUri.substring(cur));
break;
}
pathBuf.append(pathUri.substring(cur, next));
int close = pathUri.indexOf('}', next + 2);
String template = pathUri.substring(next + 1, close);
cur = close + 1;
boolean containsExplodeModifier = template.endsWith("*");
CompositeOutput compositeOutput = getCompositeOutput(template);
int varNameStartIndex = compositeOutput.getVarNameStartIndex();
int varNameEndIndex = template.length();
if (containsExplodeModifier) {
// The expression contains an explode modifier '*' at the end, update end index.
varNameEndIndex = varNameEndIndex - 1;
}
// Now get varName devoid of any prefixes and explode modifiers.
String varName = template.substring(varNameStartIndex, varNameEndIndex);
Object value = variableMap.remove(varName);
if (value == null) {
// The value for this variable is undefined. continue with the next template.
continue;
}
if (value instanceof Iterator<?>) {
// Get the list property value.
Iterator<?> iterator = (Iterator<?>) value;
value = getListPropertyValue(varName, iterator, containsExplodeModifier, compositeOutput);
} else if (value instanceof Iterable<?> || value.getClass().isArray()) {
// Get the list property value.
Iterator<?> iterator = Types.iterableOf(value).iterator();
value = getListPropertyValue(varName, iterator, containsExplodeModifier, compositeOutput);
} else if (value.getClass().isEnum()) {
String name = FieldInfo.of((Enum<?>) value).getName();
if (name != null) {
value = CharEscapers.escapeUriPath(name);
}
} else if (!Data.isValueOfPrimitiveType(value)) {
// Parse the value as a key/value map.
Map<String, Object> map = getMap(value);
value = getMapPropertyValue(varName, map, containsExplodeModifier, compositeOutput);
} else {
// For everything else...
if (compositeOutput.getReservedExpansion()) {
value = CharEscapers.escapeUriPathWithoutReserved(value.toString());
} else {
value = CharEscapers.escapeUriPath(value.toString());
}
}
pathBuf.append(value);
}
if (addUnusedParamsAsQueryParams) {
// Add the parameters remaining in the variableMap as query parameters.
GenericUrl.addQueryParams(variableMap.entrySet(), pathBuf);
}
return pathBuf.toString();
}