From 1cff239ab4949952c52b7fd6f1fb104994a2aea3 Mon Sep 17 00:00:00 2001 From: Ruben Romero Montes Date: Thu, 24 Oct 2019 16:40:34 +0200 Subject: [PATCH] Allow providing an external validator Signed-off-by: Ruben Romero Montes --- .../io/cloudevents/v03/CloudEventBuilder.java | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/api/src/main/java/io/cloudevents/v03/CloudEventBuilder.java b/api/src/main/java/io/cloudevents/v03/CloudEventBuilder.java index 896b031b..e22d6350 100644 --- a/api/src/main/java/io/cloudevents/v03/CloudEventBuilder.java +++ b/api/src/main/java/io/cloudevents/v03/CloudEventBuilder.java @@ -42,8 +42,15 @@ import io.cloudevents.fun.EventBuilder; */ public final class CloudEventBuilder implements EventBuilder { - private CloudEventBuilder() {} - + + private CloudEventBuilder(Validator validator) { + if(validator == null) { + this.validator = getValidator(); + } else { + this.validator = validator; + } + } + private static Validator VALIDATOR; public static final String SPEC_VERSION = "0.3"; @@ -65,6 +72,7 @@ public final class CloudEventBuilder implements private T data; private final Set extensions = new HashSet<>(); + private final Validator validator; private static Validator getValidator() { if(null== VALIDATOR) { @@ -78,54 +86,62 @@ public final class CloudEventBuilder implements * @param The 'data' type */ public static CloudEventBuilder builder() { - return new CloudEventBuilder(); + return new CloudEventBuilder(null); + } + + public static CloudEventBuilder builder(Validator validator) { + return new CloudEventBuilder(validator); } - public static CloudEventBuilder builder( CloudEvent base) { + return builder(base, null); + } + + public static CloudEventBuilder builder( + CloudEvent base, Validator validator) { Objects.requireNonNull(base); - - CloudEventBuilder result = new CloudEventBuilder<>(); - + + CloudEventBuilder result = new CloudEventBuilder<>(validator); + AttributesImpl attributes = base.getAttributes(); - + result .withId(attributes.getId()) .withSource(attributes.getSource()) .withType(attributes.getType()); - + attributes.getTime().ifPresent(time -> { result.withTime(time); }); - + attributes.getSchemaurl().ifPresent((schema) -> { result.withSchemaurl(schema); }); - + attributes.getDatacontenttype().ifPresent(dc -> { result.withDatacontenttype(dc); }); - + attributes.getDatacontentencoding().ifPresent(dce -> { result.withDatacontentencoding(dce); }); - + attributes.getSubject().ifPresent(subject -> { result.withSubject(subject); }); - + Accessor.extensionsOf(base) .forEach(extension -> { result.withExtension(extension); }); - + base.getData().ifPresent(data -> { result.withData(data); }); - + return result; } - + /** * Build an event from data and attributes * @param the type of 'data' @@ -194,9 +210,9 @@ public final class CloudEventBuilder implements new CloudEventImpl(attributes, data, extensions); Set> violations = - getValidator().validate(cloudEvent); + validator.validate(cloudEvent); - violations.addAll(getValidator().validate(cloudEvent.getAttributes())); + violations.addAll(validator.validate(cloudEvent.getAttributes())); final String errs = violations.stream()