in sdk/core/azure-core-jackson/src/main/java/com/azure/android/core/serde/jackson/JacksonSerder.java [257:317]
public <T> T deserialize(Map<String, String> headers, Type deserializedHeadersType) throws IOException {
if (deserializedHeadersType == null) {
return null;
}
final String headersJsonString = this.headerMapper.writeValueAsString(headers);
T deserializedHeaders =
this.headerMapper.readValue(headersJsonString, createJavaType(deserializedHeadersType));
final Class<?> deserializedHeadersClass = TypeUtil.getRawClass(deserializedHeadersType);
final Field[] declaredFields = deserializedHeadersClass.getDeclaredFields();
for (final Field declaredField : declaredFields) {
if (!declaredField.isAnnotationPresent(HeaderCollection.class)) {
continue;
}
final Type declaredFieldType = declaredField.getGenericType();
if (!TypeUtil.isTypeOrSubTypeOf(declaredField.getType(), Map.class)) {
continue;
}
final Type[] mapTypeArguments = TypeUtil.getTypeArguments(declaredFieldType);
if (mapTypeArguments.length == 2
&& mapTypeArguments[0] == String.class
&& mapTypeArguments[1] == String.class) {
final HeaderCollection headerCollectionAnnotation = declaredField.getAnnotation(HeaderCollection.class);
final String headerCollectionPrefix = headerCollectionAnnotation.value().toLowerCase(Locale.ROOT);
final int headerCollectionPrefixLength = headerCollectionPrefix.length();
if (headerCollectionPrefixLength > 0) {
final Map<String, String> headerCollection = new HashMap<>();
for (final Map.Entry<String, String> header : headers.entrySet()) {
final String headerName = header.getKey();
if (headerName.toLowerCase(Locale.ROOT).startsWith(headerCollectionPrefix)) {
headerCollection.put(headerName.substring(headerCollectionPrefixLength),
header.getValue());
}
}
final boolean declaredFieldAccessibleBackup = declaredField.isAccessible();
try {
if (!declaredFieldAccessibleBackup) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
declaredField.setAccessible(true);
return null;
});
}
declaredField.set(deserializedHeaders, headerCollection);
} catch (IllegalAccessException ignored) {
} finally {
if (!declaredFieldAccessibleBackup) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
declaredField.setAccessible(false);
return null;
});
}
}
}
}
}
return deserializedHeaders;
}