From 936371e6f8e44e9a2f6b4a2e74f9d37941fcc431 Mon Sep 17 00:00:00 2001 From: Pankaj Agrawal Date: Tue, 3 Nov 2020 16:48:12 +0100 Subject: [PATCH 1/2] Rename helpers for validation module --- docs/content/utilities/validation.mdx | 12 ++++---- .../main/java/helloworld/AppValidation.java | 1 - ...datorConfig.java => ValidationConfig.java} | 8 +++--- .../{Validator.java => ValidationUtils.java} | 23 ++++++++------- .../validation/internal/ValidationAspect.java | 8 +++--- .../validation/Base64FunctionTest.java | 4 +-- .../validation/Base64GZipFunctionTest.java | 4 +-- ...atorTest.java => ValidationUtilsTest.java} | 28 +++++++++---------- .../internal/ValidationAspectTest.java | 8 +++--- 9 files changed, 49 insertions(+), 47 deletions(-) rename powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/{ValidatorConfig.java => ValidationConfig.java} (95%) rename powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/{Validator.java => ValidationUtils.java} (92%) rename powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/{ValidatorTest.java => ValidationUtilsTest.java} (88%) diff --git a/docs/content/utilities/validation.mdx b/docs/content/utilities/validation.mdx index c2f6accae..40cf6e9d7 100644 --- a/docs/content/utilities/validation.mdx +++ b/docs/content/utilities/validation.mdx @@ -101,7 +101,7 @@ Validate standalone function is used within the Lambda handler, or any other met You can also gracefully handle schema validation errors by catching `ValidationException`. ```java -import static software.amazon.lambda.powertools.validation.Validator.*; +import static software.amazon.lambda.powertools.validation.ValidationUtils.*; public class MyFunctionHandler implements RequestHandler { @@ -289,7 +289,7 @@ public class XMLFunction extends BaseFunction { Once your function is created, you need to add it to powertools: ```java -ValidatorConfig.get().addFunction(new XMLFunction()); +ValidationConfig.get().addFunction(new XMLFunction()); ``` You can then use it to do your validation: @@ -317,16 +317,16 @@ public class MyXMLEventHandler implements RequestHandler ## Change the schema version By default, powertools-validation is configured with [V7](https://json-schema.org/draft-07/json-schema-release-notes.html). -You can use the `ValidatorConfig` to change that behaviour: +You can use the `ValidationConfig` to change that behaviour: ```java -ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V4); +ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V4); ``` ## Advanced ObjectMapper settings -If you need to configure the Jackson ObjectMapper, you can use the `ValidatorConfig`: +If you need to configure the Jackson ObjectMapper, you can use the `ValidationConfig`: ```java -ObjectMapper objectMapper= ValidatorConfig.get().getObjectMapper(); +ObjectMapper objectMapper= ValidationConfig.get().getObjectMapper(); // update (de)serializationConfig or other properties ``` \ No newline at end of file diff --git a/example/HelloWorldFunction/src/main/java/helloworld/AppValidation.java b/example/HelloWorldFunction/src/main/java/helloworld/AppValidation.java index 40135722d..b66a0f864 100644 --- a/example/HelloWorldFunction/src/main/java/helloworld/AppValidation.java +++ b/example/HelloWorldFunction/src/main/java/helloworld/AppValidation.java @@ -5,7 +5,6 @@ import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import software.amazon.lambda.powertools.validation.Validation; -import software.amazon.lambda.powertools.validation.Validator; import java.io.BufferedReader; import java.io.IOException; diff --git a/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidatorConfig.java b/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationConfig.java similarity index 95% rename from powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidatorConfig.java rename to powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationConfig.java index 3ca8194b0..7e3bf3731 100644 --- a/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidatorConfig.java +++ b/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationConfig.java @@ -31,15 +31,15 @@ * Use this if you need to customize some part of the JSON Schema validation * (eg. specification version, Jackson ObjectMapper, or adding functions to JMESPath) */ -public class ValidatorConfig { - private ValidatorConfig() { +public class ValidationConfig { + private ValidationConfig() { } private static class ConfigHolder { - private final static ValidatorConfig instance = new ValidatorConfig(); + private final static ValidationConfig instance = new ValidationConfig(); } - public static ValidatorConfig get() { + public static ValidationConfig get() { return ConfigHolder.instance; } diff --git a/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/Validator.java b/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationUtils.java similarity index 92% rename from powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/Validator.java rename to powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationUtils.java index 758b05b6e..f57e1c251 100644 --- a/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/Validator.java +++ b/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationUtils.java @@ -30,11 +30,14 @@ /** * Validation utility, used to manually validate Json against Json Schema */ -public class Validator { +public class ValidationUtils { private static final String CLASSPATH = "classpath:"; private static final ConcurrentHashMap schemas = new ConcurrentHashMap<>(); + private ValidationUtils() { + } + /** * Validate part of a json object against a json schema * @@ -60,8 +63,8 @@ public static void validate(Object obj, JsonSchema jsonSchema, String envelope) } JsonNode subNode; try { - JsonNode jsonNode = ValidatorConfig.get().getObjectMapper().valueToTree(obj); - Expression expression = ValidatorConfig.get().getJmesPath().compile(envelope); + JsonNode jsonNode = ValidationConfig.get().getObjectMapper().valueToTree(obj); + Expression expression = ValidationConfig.get().getJmesPath().compile(envelope); subNode = expression.search(jsonNode); } catch (Exception e) { throw new ValidationException("Cannot find envelope <"+envelope+"> in the object <"+obj+">", e); @@ -103,7 +106,7 @@ public static void validate(Object obj, String jsonSchema) throws ValidationExce public static void validate(Object obj, JsonSchema jsonSchema) throws ValidationException { JsonNode jsonNode; try { - jsonNode = ValidatorConfig.get().getObjectMapper().valueToTree(obj); + jsonNode = ValidationConfig.get().getObjectMapper().valueToTree(obj); } catch (Exception e) { throw new ValidationException("Object <"+obj+"> is not valid against the schema provided", e); } @@ -132,7 +135,7 @@ public static void validate(String json, String jsonSchema) throws ValidationExc public static void validate(String json, JsonSchema jsonSchema) throws ValidationException { JsonNode jsonNode; try { - jsonNode = ValidatorConfig.get().getObjectMapper().readTree(json); + jsonNode = ValidationConfig.get().getObjectMapper().readTree(json); } catch (Exception e) { throw new ValidationException("Json <"+json+"> is not valid against the schema provided", e); } @@ -161,7 +164,7 @@ public static void validate(Map map, String jsonSchema) throws V public static void validate(Map map, JsonSchema jsonSchema) throws ValidationException { JsonNode jsonNode; try { - jsonNode = ValidatorConfig.get().getObjectMapper().valueToTree(map); + jsonNode = ValidationConfig.get().getObjectMapper().valueToTree(map); } catch (Exception e) { throw new ValidationException("Map <"+map+"> cannot be converted to json for validation", e); } @@ -194,7 +197,7 @@ public static void validate(JsonNode jsonNode, JsonSchema jsonSchema) throws Val if (!validationMessages.isEmpty()) { String message; try { - message = ValidatorConfig.get().getObjectMapper().writeValueAsString(new ValidationErrors(validationMessages)); + message = ValidationConfig.get().getObjectMapper().writeValueAsString(new ValidationErrors(validationMessages)); } catch (JsonProcessingException e) { message = validationMessages.stream().map(ValidationMessage::getMessage).collect(Collectors.joining(", ")); } @@ -233,13 +236,13 @@ public static JsonSchema getJsonSchema(String schema, boolean validateSchema) { if (schemaStream == null) { throw new IllegalArgumentException("'" + schema + "' is invalid, verify '" + filePath + "' is in your classpath"); } - jsonSchema = ValidatorConfig.get().getFactory().getSchema(schemaStream); + jsonSchema = ValidationConfig.get().getFactory().getSchema(schemaStream); } else { - jsonSchema = ValidatorConfig.get().getFactory().getSchema(schema); + jsonSchema = ValidationConfig.get().getFactory().getSchema(schema); } if (validateSchema) { - String version = ValidatorConfig.get().getSchemaVersion().toString(); + String version = ValidationConfig.get().getSchemaVersion().toString(); try { validate(jsonSchema.getSchemaNode(), getJsonSchema("classpath:/schemas/meta_schema_" + version)); diff --git a/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/internal/ValidationAspect.java b/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/internal/ValidationAspect.java index 38c4a14c7..b665ca2e0 100644 --- a/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/internal/ValidationAspect.java +++ b/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/internal/ValidationAspect.java @@ -20,14 +20,14 @@ import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import software.amazon.lambda.powertools.validation.Validation; -import software.amazon.lambda.powertools.validation.ValidatorConfig; +import software.amazon.lambda.powertools.validation.ValidationConfig; import static com.networknt.schema.SpecVersion.VersionFlag.V201909; import static java.nio.charset.StandardCharsets.UTF_8; import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isHandlerMethod; import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnRequestHandler; -import static software.amazon.lambda.powertools.validation.Validator.getJsonSchema; -import static software.amazon.lambda.powertools.validation.Validator.validate; +import static software.amazon.lambda.powertools.validation.ValidationUtils.getJsonSchema; +import static software.amazon.lambda.powertools.validation.ValidationUtils.validate; import static software.amazon.lambda.powertools.validation.jmespath.Base64Function.decode; import static software.amazon.lambda.powertools.validation.jmespath.Base64GZipFunction.decompress; @@ -48,7 +48,7 @@ public Object around(ProceedingJoinPoint pjp, boolean validationNeeded = false; if (validation.schemaVersion() != V201909) { - ValidatorConfig.get().setSchemaVersion(validation.schemaVersion()); + ValidationConfig.get().setSchemaVersion(validation.schemaVersion()); } if (isHandlerMethod(pjp) diff --git a/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/Base64FunctionTest.java b/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/Base64FunctionTest.java index 1fae8917c..b9bbd6f88 100644 --- a/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/Base64FunctionTest.java +++ b/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/Base64FunctionTest.java @@ -26,8 +26,8 @@ public class Base64FunctionTest { @Test public void testPowertoolsBase64() throws IOException { - JsonNode event = ValidatorConfig.get().getObjectMapper().readTree(this.getClass().getResourceAsStream("/custom_event.json")); - Expression expression = ValidatorConfig.get().getJmesPath().compile("basket.powertools_base64(hiddenProduct)"); + JsonNode event = ValidationConfig.get().getObjectMapper().readTree(this.getClass().getResourceAsStream("/custom_event.json")); + Expression expression = ValidationConfig.get().getJmesPath().compile("basket.powertools_base64(hiddenProduct)"); JsonNode result = expression.search(event); assertThat(result.getNodeType()).isEqualTo(JsonNodeType.STRING); assertThat(result.asText()).isEqualTo("{\n" + diff --git a/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/Base64GZipFunctionTest.java b/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/Base64GZipFunctionTest.java index ad099516e..4fc0e57c5 100644 --- a/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/Base64GZipFunctionTest.java +++ b/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/Base64GZipFunctionTest.java @@ -26,8 +26,8 @@ public class Base64GZipFunctionTest { @Test public void testPowertoolsGzip() throws IOException { - JsonNode event = ValidatorConfig.get().getObjectMapper().readTree(this.getClass().getResourceAsStream("/custom_event_gzip.json")); - Expression expression = ValidatorConfig.get().getJmesPath().compile("basket.powertools_base64_gzip(hiddenProduct)"); + JsonNode event = ValidationConfig.get().getObjectMapper().readTree(this.getClass().getResourceAsStream("/custom_event_gzip.json")); + Expression expression = ValidationConfig.get().getJmesPath().compile("basket.powertools_base64_gzip(hiddenProduct)"); JsonNode result = expression.search(event); assertThat(result.getNodeType()).isEqualTo(JsonNodeType.STRING); assertThat(result.asText()).isEqualTo("{ \"id\": 43242, \"name\": \"FooBar XY\", \"price\": 258}"); diff --git a/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/ValidatorTest.java b/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/ValidationUtilsTest.java similarity index 88% rename from powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/ValidatorTest.java rename to powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/ValidationUtilsTest.java index 6d5f573b9..d5e9332ed 100644 --- a/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/ValidatorTest.java +++ b/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/ValidationUtilsTest.java @@ -14,21 +14,21 @@ import java.util.Map; import static org.assertj.core.api.Assertions.*; -import static software.amazon.lambda.powertools.validation.Validator.getJsonSchema; -import static software.amazon.lambda.powertools.validation.Validator.validate; +import static software.amazon.lambda.powertools.validation.ValidationUtils.getJsonSchema; +import static software.amazon.lambda.powertools.validation.ValidationUtils.validate; -public class ValidatorTest { +public class ValidationUtilsTest { private JsonSchema schema = getJsonSchema("classpath:/schema_v7.json"); @BeforeEach public void setup() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V7); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V7); } @Test public void testLoadSchemaV7OK() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V7); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V7); JsonSchema jsonSchema = getJsonSchema("classpath:/schema_v7.json", true); assertThat(jsonSchema).isNotNull(); assertThat(jsonSchema.getCurrentUri()).asString().isEqualTo("http://example.com/product.json"); @@ -36,7 +36,7 @@ public void testLoadSchemaV7OK() { @Test public void testLoadSchemaV7KO() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V7); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V7); assertThatThrownBy(() -> getJsonSchema("classpath:/schema_v7_ko.json", true)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("The schema classpath:/schema_v7_ko.json is not valid, it does not respect the specification V7"); @@ -44,41 +44,41 @@ public void testLoadSchemaV7KO() { @Test public void testLoadMetaSchema_NoValidation() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V201909); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V201909); getJsonSchema("classpath:/schemas/meta_schema_V201909", false); } @Test public void testLoadMetaSchemaV2019() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V201909); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V201909); JsonSchema jsonSchema = getJsonSchema("classpath:/schemas/meta_schema_V201909", true); assertThat(jsonSchema).isNotNull(); } @Test public void testLoadMetaSchemaV7() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V7); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V7); JsonSchema jsonSchema = getJsonSchema("classpath:/schemas/meta_schema_V7", true); assertThat(jsonSchema).isNotNull(); } @Test public void testLoadMetaSchemaV6() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V6); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V6); JsonSchema jsonSchema = getJsonSchema("classpath:/schemas/meta_schema_V6", true); assertThat(jsonSchema).isNotNull(); } @Test public void testLoadMetaSchemaV4() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V4); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V4); JsonSchema jsonSchema = getJsonSchema("classpath:/schemas/meta_schema_V4", true); assertThat(jsonSchema).isNotNull(); } @Test public void testLoadSchemaV4OK() { - ValidatorConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V4); + ValidationConfig.get().setSchemaVersion(SpecVersion.VersionFlag.V4); JsonSchema jsonSchema = getJsonSchema("classpath:/schema_v4.json", true); assertThat(jsonSchema).isNotNull(); } @@ -92,14 +92,14 @@ public void testLoadSchemaNotFound() { @Test public void testValidateJsonNodeOK() throws IOException { - JsonNode node = ValidatorConfig.get().getObjectMapper().readTree(this.getClass().getResourceAsStream("/json_ok.json")); + JsonNode node = ValidationConfig.get().getObjectMapper().readTree(this.getClass().getResourceAsStream("/json_ok.json")); validate(node, schema); } @Test public void testValidateJsonNodeKO() throws IOException { - JsonNode node = ValidatorConfig.get().getObjectMapper().readTree(this.getClass().getResourceAsStream("/json_ko.json")); + JsonNode node = ValidationConfig.get().getObjectMapper().readTree(this.getClass().getResourceAsStream("/json_ko.json")); assertThatExceptionOfType(ValidationException.class).isThrownBy(() -> validate(node, schema)); } diff --git a/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/internal/ValidationAspectTest.java b/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/internal/ValidationAspectTest.java index e5be82c95..2bbe7cdaa 100644 --- a/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/internal/ValidationAspectTest.java +++ b/powertools-validation/src/test/java/software/amazon/lambda/powertools/validation/internal/ValidationAspectTest.java @@ -23,7 +23,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import software.amazon.lambda.powertools.validation.ValidationException; -import software.amazon.lambda.powertools.validation.ValidatorConfig; +import software.amazon.lambda.powertools.validation.ValidationConfig; import software.amazon.lambda.powertools.validation.handlers.*; import software.amazon.lambda.powertools.validation.model.MyCustomEvent; @@ -92,7 +92,7 @@ public void validate_inputKO_schemaInString_shouldThrowValidationException() { @Test public void validate_SQS() throws IOException { - SQSEvent event = ValidatorConfig.get().getObjectMapper().readValue(this.getClass().getResourceAsStream("/sqs.json"), SQSEvent.class); + SQSEvent event = ValidationConfig.get().getObjectMapper().readValue(this.getClass().getResourceAsStream("/sqs.json"), SQSEvent.class); SQSHandler handler = new SQSHandler(); assertThat(handler.handleRequest(event, context)).isEqualTo("OK"); @@ -100,7 +100,7 @@ public void validate_SQS() throws IOException { @Test public void validate_Kinesis() throws IOException { - KinesisEvent event = ValidatorConfig.get().getObjectMapper().readValue(this.getClass().getResourceAsStream("/kinesis.json"), KinesisEvent.class); + KinesisEvent event = ValidationConfig.get().getObjectMapper().readValue(this.getClass().getResourceAsStream("/kinesis.json"), KinesisEvent.class); KinesisHandler handler = new KinesisHandler(); assertThat(handler.handleRequest(event, context)).isEqualTo("OK"); @@ -108,7 +108,7 @@ public void validate_Kinesis() throws IOException { @Test public void validate_CustomObject() throws IOException { - MyCustomEvent event = ValidatorConfig.get().getObjectMapper().readValue(this.getClass().getResourceAsStream("/custom_event.json"), MyCustomEvent.class); + MyCustomEvent event = ValidationConfig.get().getObjectMapper().readValue(this.getClass().getResourceAsStream("/custom_event.json"), MyCustomEvent.class); MyCustomEventHandler handler = new MyCustomEventHandler(); assertThat(handler.handleRequest(event, context)).isEqualTo("OK"); From 53f145d74c35de95b12410076e3acdc76e59a8d4 Mon Sep 17 00:00:00 2001 From: Pankaj Agrawal Date: Tue, 3 Nov 2020 17:05:40 +0100 Subject: [PATCH 2/2] Include new modules in build process --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5f76940f5..e29c5f02e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,8 @@ on: - 'powertools-logging/**' - 'powertools-sqs/**' - 'powertools-tracing/**' + - 'powertools-validation/**' + - 'powertools-parameters/**' - 'pom.xml' push: branches: