in sdk/core/azure-core-rest/src/main/java/com/azure/android/core/rest/HttpResponseMapper.java [343:396]
private Pair<Type, Type> tryExtractContentAndHeaderDecodeType(Type callbackTypeArg,
Type responseBaseType,
String swaggerMethodName) {
if (!responseBaseType.equals(ResponseBase.class) && !responseBaseType.equals(PagedResponseBase.class)) {
throw logger.logExceptionAsError(
new IllegalArgumentException("responseBaseType must be 'ResponseBase' or 'PagedResponseBase'"));
}
if (!TypeUtil.isTypeOrSubTypeOf(callbackTypeArg, responseBaseType)) {
return null;
}
Type responseTypeItr = callbackTypeArg;
List<Type> responseTypeHierarchy = new ArrayList<>();
responseTypeHierarchy.add(responseTypeItr);
while (!TypeUtil.getRawClass(responseTypeItr).equals(responseBaseType)) {
responseTypeItr = TypeUtil.getSuperType(responseTypeItr);
responseTypeHierarchy.add(responseTypeItr);
}
// responseTypeItr == Ref to 'ResponseBase' or 'PagedResponseBase' in the response type hierarchy.
//
if (!(responseTypeItr instanceof ParameterizedType)) {
throw logger.logExceptionAsError(new IllegalStateException(String.format(
NON_PARAMETERIZED_RESPONSE,
responseBaseType.toString(), Callback.class.getName(),
swaggerMethodName, responseBaseType.toString() + "<FooHeader, Foo>>")));
}
Type headerDecodeType = null;
Type contentDecodeType = null;
for (Type responseType : responseTypeHierarchy) {
final Type[] responseArgTypes = TypeUtil.getTypeArguments(responseType);
if (responseArgTypes != null && responseArgTypes.length > 0) {
if (responseArgTypes.length >= 2) {
if (contentDecodeType == null) {
contentDecodeType = responseArgTypes[responseArgTypes.length - 1];
}
if (headerDecodeType == null) {
headerDecodeType = responseArgTypes[responseArgTypes.length - 2];
}
} else {
if (headerDecodeType == null) {
headerDecodeType = responseArgTypes[responseArgTypes.length - 1];
}
}
}
}
return Pair.create(headerDecodeType, contentDecodeType);
}