private HashMap extractResponseParameters()

in aws-xray-recorder-sdk-aws-sdk/src/main/java/com/amazonaws/xray/handlers/TracingHandler.java [286:348]


    private HashMap<String, Object> extractResponseParameters(Request<?> request, Object response) {
        HashMap<String, Object> ret = new HashMap<>();
        if (null == awsServiceHandlerManifest) {
            return ret;
        }

        AWSOperationHandlerManifest serviceHandler =
            awsServiceHandlerManifest.getOperationHandlerManifest(extractServiceName(request));
        if (null == serviceHandler) {
            return ret;
        }

        AWSOperationHandler operationHandler = serviceHandler.getOperationHandler(extractOperationName(request));
        if (null == operationHandler) {
            return ret;
        }

        if (null != operationHandler.getResponseParameters()) {
            operationHandler.getResponseParameters().forEach(parameterName -> {
                try {
                    Object parameterValue = response
                        .getClass().getMethod(GETTER_METHOD_NAME_PREFIX + parameterName).invoke(response);
                    if (null != parameterValue) {
                        ret.put(SNAKE_CASE_NAMING_STRATEGY.translate(parameterName), parameterValue);
                    }
                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                    logger.error("Error getting response parameter: " + parameterName, e);
                }
            });
        }

        if (null != operationHandler.getResponseDescriptors()) {
            operationHandler.getResponseDescriptors().forEach((responseKeyName, responseDescriptor) -> {
                try {
                    if (responseDescriptor.isMap() && responseDescriptor.shouldGetKeys()) {
                        @SuppressWarnings("unchecked")
                        Map<String, Object> parameterValue =
                            (Map<String, Object>) response
                                .getClass().getMethod(GETTER_METHOD_NAME_PREFIX + responseKeyName).invoke(response);
                        if (null != parameterValue) {
                            String renameTo =
                                null != responseDescriptor.getRenameTo() ? responseDescriptor.getRenameTo() : responseKeyName;
                            ret.put(SNAKE_CASE_NAMING_STRATEGY.translate(renameTo), parameterValue.keySet());
                        }
                    } else if (responseDescriptor.isList() && responseDescriptor.shouldGetCount()) {
                        @SuppressWarnings("unchecked")
                        List<Object> parameterValue =
                            (List<Object>) response
                                .getClass().getMethod(GETTER_METHOD_NAME_PREFIX + responseKeyName).invoke(response);
                        if (null != parameterValue) {
                            String renameTo =
                                null != responseDescriptor.getRenameTo() ? responseDescriptor.getRenameTo() : responseKeyName;
                            ret.put(SNAKE_CASE_NAMING_STRATEGY.translate(renameTo), parameterValue.size());
                        }
                    }
                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | ClassCastException e) {
                    logger.error("Error getting request parameter: " + responseKeyName, e);
                }
            });
        }

        return ret;
    }