diff --git a/api/src/main/java/io/cloudevents/v03/CloudEventBuilder.java b/api/src/main/java/io/cloudevents/v03/CloudEventBuilder.java index c23a251b..6bbdb83a 100644 --- a/api/src/main/java/io/cloudevents/v03/CloudEventBuilder.java +++ b/api/src/main/java/io/cloudevents/v03/CloudEventBuilder.java @@ -21,6 +21,7 @@ import java.net.URI; import java.time.ZonedDateTime; import java.util.Collection; import java.util.HashSet; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -80,6 +81,47 @@ public final class CloudEventBuilder implements return new CloudEventBuilder(); } + public static CloudEventBuilder builder( + CloudEvent base) { + Objects.requireNonNull(base); + + CloudEventBuilder result = new CloudEventBuilder<>(); + + 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); + }); + + 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' @@ -89,7 +131,8 @@ public final class CloudEventBuilder implements * @throws IllegalStateException When there are specification constraints * violations */ - public static CloudEventImpl of(T data, AttributesImpl attributes) { + public static CloudEventImpl of(T data, AttributesImpl attributes, + Collection extensions) { CloudEventBuilder builder = CloudEventBuilder.builder() .withId(attributes.getId()) .withSource(attributes.getSource()) @@ -115,6 +158,11 @@ public final class CloudEventBuilder implements builder.withSubject(subject); }); + extensions.stream() + .forEach(extension -> { + builder.withExtension(extension); + }); + builder.withData(data); return builder.build(); @@ -123,7 +171,7 @@ public final class CloudEventBuilder implements @Override public CloudEvent build(T data, AttributesImpl attributes, Collection extensions){ - return CloudEventBuilder.of(data, attributes); + return CloudEventBuilder.of(data, attributes, extensions); } /**