コード例 #1
0
        /// <summary>
        /// Given a single JSON-encoded event, parses the event envelope and returns a CloudEvent.
        /// </summary>
        /// <param name="binaryData"> Specifies the instance of <see cref="BinaryData"/>. </param>
        /// <returns> A <see cref="CloudEvent"/>. </returns>
        public static CloudEvent ToCloudEvent(this BinaryData binaryData)
        {
            // Deserialize JsonElement to single event, parse event envelope properties
            JsonDocument       requestDocument    = JsonDocument.Parse(binaryData.Bytes);
            CloudEventInternal cloudEventInternal = CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement);

            // Case where Data and Type are null - cannot pass null Type into CloudEvent constructor
            if (cloudEventInternal.Type == null)
            {
                cloudEventInternal.Type = "";
            }

            CloudEvent cloudEvent = new CloudEvent(
                cloudEventInternal.Source,
                cloudEventInternal.Type)
            {
                Id              = cloudEventInternal.Id,
                Time            = cloudEventInternal.Time,
                DataBase64      = cloudEventInternal.DataBase64,
                DataSchema      = cloudEventInternal.Dataschema,
                DataContentType = cloudEventInternal.Datacontenttype,
                Subject         = cloudEventInternal.Subject,
                SerializedData  = cloudEventInternal.Data
            };

            if (cloudEventInternal.AdditionalProperties != null)
            {
                foreach (KeyValuePair <string, object> kvp in cloudEventInternal.AdditionalProperties)
                {
                    cloudEvent.ExtensionAttributes.Add(kvp.Key, kvp.Value);
                }
            }

            return(cloudEvent);
        }
コード例 #2
0
        /// <summary>
        /// Given a single JSON-encoded event, parses the event envelope and returns a CloudEvent.
        /// </summary>
        /// <param name="binaryData"> Specifies the instance of <see cref="BinaryData"/>. </param>
        /// <returns> A <see cref="CloudEvent"/>. </returns>
        public static CloudEvent ToCloudEvent(this BinaryData binaryData)
        {
            // Deserialize JsonElement to single event, parse event envelope properties
            JsonDocument       requestDocument    = JsonDocument.Parse(binaryData.ToMemory());
            CloudEventInternal cloudEventInternal = CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement);

            CloudEvent cloudEvent = new CloudEvent(
                cloudEventInternal.Id,
                cloudEventInternal.Source,
                cloudEventInternal.Type,
                cloudEventInternal.Time,
                cloudEventInternal.Dataschema,
                cloudEventInternal.Datacontenttype,
                cloudEventInternal.Subject,
                cloudEventInternal.Data,
                cloudEventInternal.DataBase64);

            if (cloudEventInternal.AdditionalProperties != null)
            {
                foreach (KeyValuePair <string, object> kvp in cloudEventInternal.AdditionalProperties)
                {
                    cloudEvent.ExtensionAttributes.Add(kvp.Key, kvp.Value);
                }
            }

            return(cloudEvent);
        }
コード例 #3
0
        /// <summary>
        /// Given JSON-encoded events, parses the event envelope and returns an array of CloudEvents.
        /// </summary>
        /// <param name="requestContent"> The JSON-encoded representation of either a single event or an array or events, in the CloudEvent schema. </param>
        /// <returns> A list of <see cref="CloudEvent"/>. </returns>
        public static CloudEvent[] Parse(string requestContent)
        {
            List <CloudEventInternal> cloudEventsInternal = new List <CloudEventInternal>();
            List <CloudEvent>         cloudEvents         = new List <CloudEvent>();
            JsonDocument requestDocument = JsonDocument.Parse(requestContent);

            // Parse JsonElement into separate events, deserialize event envelope properties
            if (requestDocument.RootElement.ValueKind == JsonValueKind.Object)
            {
                cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement));
            }
            else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array)
            {
                foreach (JsonElement property in requestDocument.RootElement.EnumerateArray())
                {
                    cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(property));
                }
            }

            foreach (CloudEventInternal cloudEventInternal in cloudEventsInternal)
            {
                cloudEvents.Add(new CloudEvent(cloudEventInternal));
            }

            return(cloudEvents.ToArray());
        }
コード例 #4
0
        /// <summary>
        /// Given JSON-encoded events, parses the event envelope and returns an array of CloudEvents.
        /// </summary>
        /// <param name="requestContent"> The JSON-encoded representation of either a single event or an array or events, in the CloudEvent schema. </param>
        /// <returns> A list of <see cref="CloudEvent"/>. </returns>
        public static CloudEvent[] Parse(string requestContent)
        {
            List <CloudEventInternal> cloudEventsInternal = new List <CloudEventInternal>();
            List <CloudEvent>         cloudEvents         = new List <CloudEvent>();
            JsonDocument requestDocument = JsonDocument.Parse(requestContent);

            // Parse JsonElement into separate events, deserialize event envelope properties
            if (requestDocument.RootElement.ValueKind == JsonValueKind.Object)
            {
                cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement));
            }
            else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array)
            {
                foreach (JsonElement property in requestDocument.RootElement.EnumerateArray())
                {
                    cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(property));
                }
            }

            foreach (CloudEventInternal cloudEventInternal in cloudEventsInternal)
            {
                // Case where Data and Type are null - cannot pass null Type into CloudEvent constructor
                if (cloudEventInternal.Type == null)
                {
                    cloudEventInternal.Type = "";
                }

                CloudEvent cloudEvent = new CloudEvent(
                    cloudEventInternal.Source,
                    cloudEventInternal.Type)
                {
                    Id              = cloudEventInternal.Id,
                    Time            = cloudEventInternal.Time,
                    DataBase64      = cloudEventInternal.DataBase64,
                    DataSchema      = cloudEventInternal.Dataschema,
                    DataContentType = cloudEventInternal.Datacontenttype,
                    Subject         = cloudEventInternal.Subject,
                    SerializedData  = cloudEventInternal.Data
                };

                if (cloudEventInternal.AdditionalProperties != null)
                {
                    foreach (KeyValuePair <string, object> kvp in cloudEventInternal.AdditionalProperties)
                    {
                        cloudEvent.ExtensionAttributes.Add(kvp.Key, kvp.Value);
                    }
                }

                cloudEvents.Add(cloudEvent);
            }

            return(cloudEvents.ToArray());
        }
コード例 #5
0
        /// <summary>
        /// Given JSON-encoded events, parses the event envelope and returns an array of CloudEvents.
        /// </summary>
        /// <param name="requestContent"> The JSON-encoded representation of either a single event or an array or events, in the CloudEvent schema. </param>
        /// <returns> A list of <see cref="CloudEvent"/>. </returns>
        public static CloudEvent[] Parse(string requestContent)
        {
            List <CloudEventInternal> cloudEventsInternal = new List <CloudEventInternal>();
            List <CloudEvent>         cloudEvents         = new List <CloudEvent>();
            JsonDocument requestDocument = JsonDocument.Parse(requestContent);

            // Parse JsonElement into separate events, deserialize event envelope properties
            if (requestDocument.RootElement.ValueKind == JsonValueKind.Object)
            {
                cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement));
            }
            else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array)
            {
                foreach (JsonElement property in requestDocument.RootElement.EnumerateArray())
                {
                    cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(property));
                }
            }

            foreach (CloudEventInternal cloudEventInternal in cloudEventsInternal)
            {
                CloudEvent cloudEvent = new CloudEvent(
                    cloudEventInternal.Id,
                    cloudEventInternal.Source,
                    cloudEventInternal.Type,
                    cloudEventInternal.Time,
                    cloudEventInternal.Dataschema,
                    cloudEventInternal.Datacontenttype,
                    cloudEventInternal.Subject,
                    cloudEventInternal.Data,
                    cloudEventInternal.DataBase64);

                if (cloudEventInternal.AdditionalProperties != null)
                {
                    foreach (KeyValuePair <string, object> kvp in cloudEventInternal.AdditionalProperties)
                    {
                        cloudEvent.ExtensionAttributes.Add(kvp.Key, kvp.Value);
                    }
                }

                cloudEvents.Add(cloudEvent);
            }

            return(cloudEvents.ToArray());
        }
コード例 #6
0
        private static List <CloudEvent> DeserializeRequest(Request request)
        {
            var content = request.Content as Utf8JsonRequestContent;
            var stream  = new MemoryStream();

            content.WriteTo(stream, CancellationToken.None);
            stream.Position = 0;
            JsonDocument requestDocument = JsonDocument.Parse(stream);
            var          cloudEvents     = new List <CloudEvent>();

            // Parse JsonElement into separate events, deserialize event envelope properties
            if (requestDocument.RootElement.ValueKind == JsonValueKind.Object)
            {
                cloudEvents.Add(new CloudEvent(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement)));
            }
            else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array)
            {
                foreach (JsonElement property in requestDocument.RootElement.EnumerateArray())
                {
                    cloudEvents.Add(new CloudEvent(CloudEventInternal.DeserializeCloudEventInternal(property)));
                }
            }
            return(cloudEvents);
        }
コード例 #7
0
        /// <summary>
        /// Given JSON-encoded events, parses the event envelope and returns an array of CloudEvents.
        /// </summary>
        /// <param name="requestContent"> The JSON-encoded representation of either a single event or an array or events, in the CloudEvent schema. </param>
        /// <returns> A list of <see cref="CloudEvent"/>. </returns>
        public static CloudEvent[] Parse(string requestContent)
        {
            Argument.AssertNotNull(requestContent, nameof(requestContent));

            CloudEvent[] cloudEvents     = null;
            JsonDocument requestDocument = JsonDocument.Parse(requestContent);

            // Parse JsonElement into separate events, deserialize event envelope properties
            if (requestDocument.RootElement.ValueKind == JsonValueKind.Object)
            {
                cloudEvents    = new CloudEvent[1];
                cloudEvents[0] = (new CloudEvent(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement)));
            }
            else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array)
            {
                cloudEvents = new CloudEvent[requestDocument.RootElement.GetArrayLength()];
                int i = 0;
                foreach (JsonElement property in requestDocument.RootElement.EnumerateArray())
                {
                    cloudEvents[i++] = new CloudEvent(CloudEventInternal.DeserializeCloudEventInternal(property));
                }
            }
            return(cloudEvents ?? Array.Empty <CloudEvent>());
        }
コード例 #8
0
        private async Task <CloudEvent[]> DeserializeCloudEventsInternal(string requestContent, bool async, CancellationToken cancellationToken = default)
        {
            List <CloudEventInternal> cloudEventsInternal = new List <CloudEventInternal>();
            List <CloudEvent>         cloudEvents         = new List <CloudEvent>();

            // Deserialize raw JSON string into separate events, deserialize event envelope properties
            JsonDocument requestDocument = await ParseJsonToDocument(requestContent, async, cancellationToken).ConfigureAwait(false);

            foreach (JsonElement property in requestDocument.RootElement.EnumerateArray())
            {
                cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(property));
            }

            // Deserialize 'Data' property from JsonElement for each event
            foreach (CloudEventInternal cloudEventInternal in cloudEventsInternal)
            {
                object cloudEventData = null;
                if (cloudEventInternal.DataBase64 != null)
                {
                    cloudEventData = Convert.FromBase64String(cloudEventInternal.DataBase64);
                }
                else
                {
                    JsonElement?dataElement = cloudEventInternal.Data;

                    if (dataElement.HasValue && dataElement.Value.ValueKind != JsonValueKind.Null)
                    {
                        // Reserialize JsonElement to stream
                        MemoryStream dataStream = SerializePayloadToStream(dataElement, cancellationToken);

                        // First, let's attempt to find the mapping for the event type in the custom event mapping.
                        if (_customEventTypeMappings.TryGetValue(cloudEventInternal.Type, out Type typeOfEventData))
                        {
                            if (!TryGetPrimitiveFromJsonElement(dataElement.Value, out cloudEventData))
                            {
                                if (async)
                                {
                                    cloudEventData = await _dataSerializer.DeserializeAsync(dataStream, typeOfEventData, cancellationToken).ConfigureAwait(false);
                                }
                                else
                                {
                                    cloudEventData = _dataSerializer.Deserialize(dataStream, typeOfEventData, cancellationToken);
                                }
                            }
                        }
                        // If a custom mapping doesn't exist, let's attempt to find the mapping for the deserialization function in the system event type mapping.
                        else if (SystemEventTypeMappings.SystemEventDeserializers.TryGetValue(cloudEventInternal.Type, out Func <JsonElement, object> systemDeserializationFunction))
                        {
                            cloudEventData = systemDeserializationFunction(dataElement.Value);
                        }
                        // If no custom mapping was added, either return a primitive/string, or an object wrapped as BinaryData
                        else
                        {
                            // If event data is not a primitive/string, return as BinaryData
                            if (!TryGetPrimitiveFromJsonElement(dataElement.Value, out cloudEventData))
                            {
                                cloudEventData = BinaryData.FromStream(dataStream);
                            }
                        }
                    }
                    else // Event has null data
                    {
                        cloudEventData          = null;
                        cloudEventInternal.Type = "";
                    }
                }

                cloudEvents.Add(new CloudEvent(
                                    cloudEventInternal.Source,
                                    cloudEventInternal.Type)
                {
                    Id              = cloudEventInternal.Id,
                    Data            = cloudEventData,
                    Time            = cloudEventInternal.Time,
                    DataSchema      = cloudEventInternal.Dataschema,
                    DataContentType = cloudEventInternal.Datacontenttype,
                    Subject         = cloudEventInternal.Subject
                });
            }

            return(cloudEvents.ToArray());
        }