athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/serde/v2/ObjectMapperFactoryV2.java [77:173]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    private static class StrictSerializerFactory extends BeanSerializerFactory
    {
        private StrictSerializerFactory(SerializerFactoryConfig config)
        {
            super(config);
        }

        @Override
        public StrictSerializerFactory withConfig(SerializerFactoryConfig config)
        {
            if (_factoryConfig == config) {
                return this;
            }
            return new StrictSerializerFactory(config);
        }

        @Override
        @SuppressWarnings("unchecked")
        public JsonSerializer<Object> createSerializer(SerializerProvider prov, JavaType origType)
                throws JsonMappingException
        {
            for (Serializers serializers : customSerializers()) {
                JsonSerializer<?> ser = serializers.findSerializer(prov.getConfig(), origType, null);
                if (ser != null) {
                    return (JsonSerializer<Object>) ser;
                }
            }
            throw new IllegalArgumentException("No explicitly configured serializer for " + origType);
        }
    }

    /**
     * Custom DeserializerFactory that *only* uses the custom deserializers that we inject into the {@link ObjectMapper}.
     */
    private static class StrictDeserializerFactory extends BeanDeserializerFactory
    {
        private StrictDeserializerFactory(DeserializerFactoryConfig config)
        {
            super(config);
        }

        @Override
        public DeserializerFactory withConfig(DeserializerFactoryConfig config)
        {
            if (_factoryConfig == config) {
                return this;
            }
            return new StrictDeserializerFactory(config);
        }

        @Override
        @SuppressWarnings("unchecked")
        public JsonDeserializer<Object> createBeanDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc)
                throws JsonMappingException
        {
            for (Deserializers d  : _factoryConfig.deserializers()) {
                JsonDeserializer<?> deser = d.findBeanDeserializer(type, ctxt.getConfig(), beanDesc);
                if (deser != null) {
                    return (JsonDeserializer<Object>) deser;
                }
            }
            throw new IllegalArgumentException("No explicitly configured deserializer for " + type);
        }
    }

    /**
     * Locked down ObjectMapper that only uses the serializers/deserializers provided and does not fall back to annotation or reflection
     * based serialization.
     */
    private static class StrictObjectMapper extends ObjectMapper
    {
        private StrictObjectMapper(BlockAllocator allocator)
        {
            super(JSON_FACTORY);
            _serializerFactory = SERIALIZER_FACTORY;

            ImmutableMap<Class<?>, JsonDeserializer<?>> desers = ImmutableMap.of(
                    FederationRequest.class, createRequestDeserializer(allocator),
                    FederationResponse.class, createResponseDeserializer(allocator),
                    LambdaFunctionException.class, new LambdaFunctionExceptionSerDe.Deserializer());
            SimpleDeserializers deserializers = new SimpleDeserializers(desers);
            DeserializerFactoryConfig dConfig = new DeserializerFactoryConfig().withAdditionalDeserializers(deserializers);
            _deserializationContext = new DefaultDeserializationContext.Impl(new StrictDeserializerFactory(dConfig));
            // required by LambdaInvokerFactory
            disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        }
    }

    public static ObjectMapper create(BlockAllocator allocator)
    {
        return new StrictObjectMapper(allocator);
    }

    private static FederationRequestSerDe.Serializer createRequestSerializer()
    {
        FederatedIdentitySerDe.Serializer identity = new FederatedIdentitySerDe.Serializer();
        TableNameSerDe.Serializer tableName = new TableNameSerDe.Serializer();
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/serde/v3/ObjectMapperFactoryV3.java [107:203]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    private static class StrictSerializerFactory extends BeanSerializerFactory
    {
        private StrictSerializerFactory(SerializerFactoryConfig config)
        {
            super(config);
        }

        @Override
        public StrictSerializerFactory withConfig(SerializerFactoryConfig config)
        {
            if (_factoryConfig == config) {
                return this;
            }
            return new StrictSerializerFactory(config);
        }

        @Override
        @SuppressWarnings("unchecked")
        public JsonSerializer<Object> createSerializer(SerializerProvider prov, JavaType origType)
                throws JsonMappingException
        {
            for (Serializers serializers : customSerializers()) {
                JsonSerializer<?> ser = serializers.findSerializer(prov.getConfig(), origType, null);
                if (ser != null) {
                    return (JsonSerializer<Object>) ser;
                }
            }
            throw new IllegalArgumentException("No explicitly configured serializer for " + origType);
        }
    }

    /**
     * Custom DeserializerFactory that *only* uses the custom deserializers that we inject into the {@link ObjectMapper}.
     */
    private static class StrictDeserializerFactory extends BeanDeserializerFactory
    {
        private StrictDeserializerFactory(DeserializerFactoryConfig config)
        {
            super(config);
        }

        @Override
        public DeserializerFactory withConfig(DeserializerFactoryConfig config)
        {
            if (_factoryConfig == config) {
                return this;
            }
            return new StrictDeserializerFactory(config);
        }

        @Override
        @SuppressWarnings("unchecked")
        public JsonDeserializer<Object> createBeanDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc)
                throws JsonMappingException
        {
            for (Deserializers d  : _factoryConfig.deserializers()) {
                JsonDeserializer<?> deser = d.findBeanDeserializer(type, ctxt.getConfig(), beanDesc);
                if (deser != null) {
                    return (JsonDeserializer<Object>) deser;
                }
            }
            throw new IllegalArgumentException("No explicitly configured deserializer for " + type);
        }
    }

    /**
     * Locked down ObjectMapper that only uses the serializers/deserializers provided and does not fall back to annotation or reflection
     * based serialization.
     */
    private static class StrictObjectMapper extends ObjectMapper
    {
        private StrictObjectMapper(BlockAllocator allocator)
        {
            super(JSON_FACTORY);
            _serializerFactory = SERIALIZER_FACTORY;

            ImmutableMap<Class<?>, JsonDeserializer<?>> desers = ImmutableMap.of(
                    FederationRequest.class, createRequestDeserializer(allocator),
                    FederationResponse.class, createResponseDeserializer(allocator),
                    LambdaFunctionException.class, new LambdaFunctionExceptionSerDe.Deserializer());
            SimpleDeserializers deserializers = new SimpleDeserializers(desers);
            DeserializerFactoryConfig dConfig = new DeserializerFactoryConfig().withAdditionalDeserializers(deserializers);
            _deserializationContext = new DefaultDeserializationContext.Impl(new StrictDeserializerFactory(dConfig));
            // required by LambdaInvokerFactory
            disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        }
    }

    public static ObjectMapper create(BlockAllocator allocator)
    {
        return new StrictObjectMapper(allocator);
    }

    private static FederationRequestSerDe.Serializer createRequestSerializer()
    {
        FederatedIdentitySerDe.Serializer identity = new FederatedIdentitySerDe.Serializer();
        TableNameSerDe.Serializer tableName = new TableNameSerDe.Serializer();
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



