diff --git a/aws-lambda-java-runtime-interface-client/pom.xml b/aws-lambda-java-runtime-interface-client/pom.xml index 48a16dfe..7e87d099 100644 --- a/aws-lambda-java-runtime-interface-client/pom.xml +++ b/aws-lambda-java-runtime-interface-client/pom.xml @@ -51,12 +51,12 @@ com.amazonaws aws-lambda-java-core - 1.2.1 + 1.2.2 com.amazonaws aws-lambda-java-serialization - 1.0.0 + 1.1.0 diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java index fc16d43f..65b95fcb 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java +++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java @@ -69,6 +69,11 @@ private EventHandlerLoader() { } */ @SuppressWarnings({"unchecked", "rawtypes"}) private static PojoSerializer getSerializer(Platform platform, Type type) { + PojoSerializer customSerializer = PojoSerializerLoader.getCustomerSerializer(type); + if (customSerializer != null) { + return customSerializer; + } + // if serializing a Class that is a Lambda supported event, use Jackson with customizations if (type instanceof Class) { Class clazz = ((Class)type); diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoader.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoader.java new file mode 100644 index 00000000..d4b4a5d1 --- /dev/null +++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoader.java @@ -0,0 +1,77 @@ +/* Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ + +package com.amazonaws.services.lambda.runtime.api.client; + +import com.amazonaws.services.lambda.runtime.serialization.PojoSerializer; +import com.amazonaws.services.lambda.runtime.CustomPojoSerializer; + +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Type; +import java.util.Iterator; +import java.util.ServiceConfigurationError; +import java.util.ServiceLoader; + +public class PojoSerializerLoader { + // The serializer obtained from the provider will always be the same so we can cache it as a filed. + private static CustomPojoSerializer customPojoSerializer; + // If Input and Output type are different, the runtime will try to search for a serializer twice due to + // the getSerializerCached method. Save the initialization state in order to search for the provider only once. + private static boolean initialized = false; + + private static CustomPojoSerializer loadSerializer() + throws ServiceConfigurationError, TooManyServiceProvidersFoundException { + + if (customPojoSerializer != null) { + return customPojoSerializer; + } + + ServiceLoader loader = ServiceLoader.load(CustomPojoSerializer.class, AWSLambda.customerClassLoader); + Iterator serializers = loader.iterator(); + + if (!serializers.hasNext()) { + initialized = true; + return null; + } + + customPojoSerializer = serializers.next(); + + if (serializers.hasNext()) { + throw new TooManyServiceProvidersFoundException( + "Too many serializers provided inside the META-INF/services folder, only one is allowed" + ); + } + + initialized = true; + return customPojoSerializer; + } + + public static PojoSerializer getCustomerSerializer(Type type) + throws SerializersNotFoundException { + + if (!initialized) { + customPojoSerializer = loadSerializer(); + } + + if (customPojoSerializer == null) { + return null; + } + + return new PojoSerializer() { + @Override + public Object fromJson(InputStream input) { + return customPojoSerializer.fromJson(input, type); + } + + @Override + public Object fromJson(String input) { + return customPojoSerializer.fromJson(input, type); + } + + @Override + public void toJson(Object value, OutputStream output) { + customPojoSerializer.toJson(value, output, type); + } + }; + } +} diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/SerializersNotFoundException.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/SerializersNotFoundException.java new file mode 100644 index 00000000..efd941cd --- /dev/null +++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/SerializersNotFoundException.java @@ -0,0 +1,21 @@ +/* Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ + +package com.amazonaws.services.lambda.runtime.api.client; + +public class SerializersNotFoundException extends IllegalArgumentException { + public SerializersNotFoundException() { + + } + + public SerializersNotFoundException(String errorMessage) { + super(errorMessage); + } + + public SerializersNotFoundException(Throwable cause) { + super(cause); + } + + public SerializersNotFoundException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/TooManyServiceProvidersFoundException.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/TooManyServiceProvidersFoundException.java new file mode 100644 index 00000000..c4b94e37 --- /dev/null +++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/TooManyServiceProvidersFoundException.java @@ -0,0 +1,21 @@ +/* Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ + +package com.amazonaws.services.lambda.runtime.api.client; + +public class TooManyServiceProvidersFoundException extends RuntimeException { + public TooManyServiceProvidersFoundException() { + + } + + public TooManyServiceProvidersFoundException(String errorMessage) { + super(errorMessage); + } + + public TooManyServiceProvidersFoundException(Throwable cause) { + super(cause); + } + + public TooManyServiceProvidersFoundException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/Dockerfile.agent b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/Dockerfile.agent index 9b31c16b..3dbdb3c6 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/Dockerfile.agent +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/Dockerfile.agent @@ -1,20 +1,14 @@ FROM public.ecr.aws/amazoncorretto/amazoncorretto:8 -ARG ARCHITECTURE="amd64" - -ENV DOCKER_CLI_PLUGIN_DIR="/root/.docker/cli-plugins" -ENV PATH="$PATH:/tmp/apache-maven-3.8.7/bin" - +# Install docker and buildx extension RUN amazon-linux-extras enable docker && \ yum clean metadata && \ - yum install -y docker tar gzip unzip file wget + yum install -y docker tar gzip unzip file -RUN mkdir -p "${DOCKER_CLI_PLUGIN_DIR}" -RUN wget \ - "$(curl https://api.github.com/repos/docker/buildx/releases/latest | grep browser_download_url | grep "linux-${ARCHITECTURE}" | cut -d '"' -f 4)" \ - -O "${DOCKER_CLI_PLUGIN_DIR}"/docker-buildx -RUN chmod +x "${DOCKER_CLI_PLUGIN_DIR}"/docker-buildx +COPY --from=docker/buildx-bin:latest /buildx /usr/libexec/docker/cli-plugins/docker-buildx -WORKDIR /tmp -RUN curl -O https://archive.apache.org/dist/maven/maven-3/3.8.7/binaries/apache-maven-3.8.7-bin.tar.gz && \ - tar xf apache-maven-3.8.7-bin.tar.gz \ No newline at end of file +# Install maven from apache.org, as version in the yum repository doesn't support latest maven plugins +ENV PATH="$PATH:/apache-maven/bin" +RUN mkdir /apache-maven && \ + curl https://archive.apache.org/dist/maven/maven-3/3.8.7/binaries/apache-maven-3.8.7-bin.tar.gz | \ + tar -xz -C /apache-maven --strip-components 1 \ No newline at end of file diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh index c4554805..76153f18 100755 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh @@ -6,25 +6,17 @@ set -euo pipefail echo "Setting up multi-arch build environment" ARCHITECTURE=$(arch) if [[ "$ARCHITECTURE" == "x86_64" ]]; then - ARCHITECTURE_ALIAS="amd64" TARGET_EMULATOR="arm64" elif [[ "$ARCHITECTURE" == "aarch64" ]]; then - ARCHITECTURE_ALIAS="arm64" TARGET_EMULATOR="amd64" else echo "Architecture $ARCHITECTURE is not currently supported." exit 1 fi + echo "Installing ${TARGET_EMULATOR} emulator" docker pull public.ecr.aws/eks-distro-build-tooling/binfmt-misc:qemu-v6.1.0 docker run --rm --privileged public.ecr.aws/eks-distro-build-tooling/binfmt-misc:qemu-v6.1.0 --install ${TARGET_EMULATOR} -# Install buildx plugin only if not already present (i.e. it's installed for the local-agent) -if [[ ! -f "${DOCKER_CLI_PLUGIN_DIR}/docker-buildx" ]]; then - echo "docker-buildx not found, installing now" - mkdir -p "${DOCKER_CLI_PLUGIN_DIR}" - BUILDX_URL=$(curl https://api.github.com/repos/docker/buildx/releases/latest | grep browser_download_url | grep "linux-${ARCHITECTURE_ALIAS}" | cut -d '"' -f 4) - wget "${BUILDX_URL}" -O "${DOCKER_CLI_PLUGIN_DIR}"/docker-buildx - chmod +x "${DOCKER_CLI_PLUGIN_DIR}"/docker-buildx -fi echo "Setting docker build command to default to buildx" +echo "Docker buildx version: $(docker buildx version)" docker buildx install diff --git a/aws-lambda-java-serialization/RELEASE.CHANGELOG.md b/aws-lambda-java-serialization/RELEASE.CHANGELOG.md index 76400917..3fd99c70 100644 --- a/aws-lambda-java-serialization/RELEASE.CHANGELOG.md +++ b/aws-lambda-java-serialization/RELEASE.CHANGELOG.md @@ -1,6 +1,6 @@ -### November 21, 2022 -`1.0.1`: -- Updated `jackson-databind` dependency from 2.12.6.1 to 2.13.4.1 +### February 24, 2023 +`1.0.1-java17`: +- Add support for tumbling windows events ### December 01, 2020 `1.0.0`: diff --git a/aws-lambda-java-serialization/pom.xml b/aws-lambda-java-serialization/pom.xml index 468bf1a2..1f0be649 100644 --- a/aws-lambda-java-serialization/pom.xml +++ b/aws-lambda-java-serialization/pom.xml @@ -4,7 +4,7 @@ com.amazonaws aws-lambda-java-serialization - 1.0.1 + 1.0.1-java17 jar AWS Lambda Java Runtime Serialization @@ -32,6 +32,8 @@ 1.8 1.8 com.amazonaws.lambda.thirdparty + 2.10.5.1 + 2.8.9 5.9.1 7.3.2 @@ -41,12 +43,12 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.1 + ${jackson.version} com.google.code.gson gson - 2.8.9 + ${gson.version} org.json