All Downloads are FREE. Search and download functionalities are using the official Maven repository.

software.amazon.awssdk.protocols.xml.internal.unmarshall.HeaderUnmarshaller Maven / Gradle / Ivy

The newest version!
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

package software.amazon.awssdk.protocols.xml.internal.unmarshall;

import static software.amazon.awssdk.utils.StringUtils.replacePrefixIgnoreCase;
import static software.amazon.awssdk.utils.StringUtils.startsWithIgnoreCase;

import java.time.Instant;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.protocols.core.StringToValueConverter;
import software.amazon.awssdk.protocols.query.unmarshall.XmlElement;
import software.amazon.awssdk.utils.Logger;

@SdkInternalApi
public final class HeaderUnmarshaller {
    public static final XmlUnmarshaller STRING = new SimpleHeaderUnmarshaller<>(StringToValueConverter.TO_STRING);
    public static final XmlUnmarshaller INTEGER = new SimpleHeaderUnmarshaller<>(StringToValueConverter.TO_INTEGER);
    public static final XmlUnmarshaller LONG = new SimpleHeaderUnmarshaller<>(StringToValueConverter.TO_LONG);
    public static final XmlUnmarshaller SHORT = new SimpleHeaderUnmarshaller<>(StringToValueConverter.TO_SHORT);
    public static final XmlUnmarshaller FLOAT = new SimpleHeaderUnmarshaller<>(StringToValueConverter.TO_FLOAT);
    public static final XmlUnmarshaller DOUBLE = new SimpleHeaderUnmarshaller<>(StringToValueConverter.TO_DOUBLE);
    public static final XmlUnmarshaller BOOLEAN = new SimpleHeaderUnmarshaller<>(StringToValueConverter.TO_BOOLEAN);
    public static final XmlUnmarshaller INSTANT =
        new SimpleHeaderUnmarshaller<>(XmlProtocolUnmarshaller.INSTANT_STRING_TO_VALUE);

    // Only supports string value type
    public static final XmlUnmarshaller> MAP = ((context, content, field) -> {
        Map result = new HashMap<>();

        context.response().forEachHeader((name, value) -> {
            if (startsWithIgnoreCase(name, field.locationName())) {
                result.put(replacePrefixIgnoreCase(name, field.locationName(), ""), String.join(",", value));
            }
        });

        return result;
    });

    // Only supports string value type
    public static final XmlUnmarshaller> LIST = (context, content, field) ->
        context.response().matchingHeaders(field.locationName());

    private HeaderUnmarshaller() {
    }

    private static class SimpleHeaderUnmarshaller implements XmlUnmarshaller {
        private static final Logger log = Logger.loggerFor(SimpleHeaderUnmarshaller.class);

        private final StringToValueConverter.StringToValue stringToValue;

        private SimpleHeaderUnmarshaller(StringToValueConverter.StringToValue stringToValue) {
            this.stringToValue = stringToValue;
        }

        @Override
        public T unmarshall(XmlUnmarshallerContext context, List content, SdkField field) {
            try {
                return context.response().firstMatchingHeader(field.locationName())
                              .map(s -> stringToValue.convert(s, field))
                              .orElse(null);
            } catch (RuntimeException e) {
                log.warn(() -> "Exception found while parsing response header " , e);
                if (field.ignoreDataTypeConversionFailures()) {
                    return null;
                }
                throw e;
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy