private static void WriteMarketDocument(Utf8JsonWriter writer, RsmHeader header)
        {
            writer.WriteStartObject("MarketDocument");

            writer.WriteString("mRID", header.Identification);
            writer.WriteString("Type", header.DocumentType);
            writer.WriteString("CreatedDateTime", header.Creation.ToString());

            WriteMarketParticipant(
                writer,
                "SenderMarketParticipant",
                header.SenderIdentification,
                "VA",
                header.EnergyBusinessProcessRole);
            WriteMarketParticipant(
                writer,
                "RecipientMarketParticipant",
                header.RecipientIdentification,
                "VA",
                null);

            writer.WriteString("ProcessType", header.EnergyBusinessProcess);
            writer.WriteString("MarketServiceCategory_Kind", header.EnergyIndustryClassification);

            writer.WriteEndObject();
        }
示例#2
0
        private static async ValueTask ParseRsmHeaderAsync(XmlReader reader, RsmHeader header)
        {
            string rootElement = string.Empty;
            string ns          = string.Empty;

            while (await reader.ReadAsync().ConfigureAwait(false))
            {
                if (RootElementNotFound(reader, rootElement, ns))
                {
                    continue;
                }

                if (IfRootElementIsNotAssigned(rootElement, ns))
                {
                    rootElement = reader.LocalName;
                    ns          = reader.NamespaceURI;
                }
                else if (reader.Is("HeaderEnergyDocument", ns))
                {
                    await ReadHeaderEnergyDocumentAsync(reader, header, ns).ConfigureAwait(false);
                }
                else if (reader.Is("ProcessEnergyContext", ns))
                {
                    await ReadProcessEnergyContextAsync(reader, header, ns).ConfigureAwait(false);
                }

                if (reader.Is("ProcessEnergyContext", ns, XmlNodeType.EndElement))
                {
                    break;
                }
            }
        }
示例#3
0
        private static async ValueTask ParseMessageContainerAsync(XmlReader reader, RsmHeader header)
        {
            while (await reader.ReadAsync().ConfigureAwait(false))
            {
                if (reader.Is("MessageReference", B2BNamespace))
                {
                    header.MessageReference = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);

                    break; // We do not need further values
                }
            }
        }
示例#4
0
        public async ValueTask ConvertAsync(Stream input, Stream output, string correlationId)
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }

            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            using (var reader = XmlReader.Create(input, new XmlReaderSettings {
                Async = true
            }))
            {
                var header = new RsmHeader();
                var writer = new Utf8JsonWriter(output);

                try
                {
                    reader.ReadToFollowing("MessageContainer", B2BNamespace);

                    await ParseMessageContainerAsync(reader, header).ConfigureAwait(false);

                    reader.ReadToFollowing("Payload", B2BNamespace);

                    await ParseRsmHeaderAsync(reader, header).ConfigureAwait(false);

                    await ConvertPayloadAsync(reader, header, writer, correlationId).ConfigureAwait(false);

                    await writer.FlushAsync().ConfigureAwait(false);
                }
                finally
                {
                    output.Position = 0;
                    await writer.DisposeAsync().ConfigureAwait(false);
                }
            }
        }
        protected override async ValueTask ConvertPayloadAsync(
            XmlReader reader,
            RsmHeader header,
            Utf8JsonWriter writer,
            string correlationId)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (header == null)
            {
                throw new ArgumentNullException(nameof(header));
            }

            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            writer.WriteStartArray();

            while (await reader.ReadAsync().ConfigureAwait(false))
            {
                if (reader.Is("PayloadEnergyTimeSeries", B2BNamespace))
                {
                    await ProcessPayloadEnergyTimeSeriesAsync(reader, header, writer, correlationId)
                    .ConfigureAwait(false);
                }

                if (reader.Is("DK_MeteredDataTimeSeries", B2BNamespace, XmlNodeType.EndElement))
                {
                    break;
                }
            }

            writer.WriteEndArray();
        }
示例#6
0
        protected override async ValueTask ConvertPayloadAsync(
            XmlReader reader,
            RsmHeader header,
            Utf8JsonWriter writer,
            string correlationId)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (header == null)
            {
                throw new ArgumentNullException(nameof(header));
            }

            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            writer.WriteStartArray();

            while (await reader.ReadAsync().ConfigureAwait(false))
            {
                if (reader.Is("DK_RequestChangeOfSupplier", B2BNamespace, XmlNodeType.EndElement))
                {
                    break;
                }
                else if (reader.Is("PayloadMPEvent", B2BNamespace))
                {
                    await ProcessPayloadMpEventAsync(reader, header, writer, correlationId).ConfigureAwait(false);
                }
            }

            writer.WriteEndArray();
        }
示例#7
0
        public async Task Parser_should_fill_header()
        {
            await using var fs = File.OpenRead("Assets/Rsm001CPR.xml");

            var     sut    = new RsmValidationParser();
            Context actual = await sut.ParseAsync(fs).ConfigureAwait(false);

            Assert.NotNull(actual);

            var expected = new RsmHeader
            {
                Creation                     = Instant.FromUtc(2020, 02, 20, 10, 56, 46),
                Identification               = "MsgId-0.58755000-1582196206",
                DocumentType                 = "392",
                RecipientIdentification      = "5790001330552",
                SenderIdentification         = "5790002263057",
                EnergyBusinessProcess        = "E03",
                EnergyIndustryClassification = "23",
                EnergyBusinessProcessRole    = "DDQ",
                MessageReference             = null,
            };

            Assert.Equal(expected, actual.RsmHeader);
        }
        private static async ValueTask ProcessPayloadEnergyTimeSeriesAsync(
            XmlReader reader,
            RsmHeader header,
            Utf8JsonWriter writer,
            string correlationId)
        {
            var fragments = new RSM012Fragments();

            do
            {
                if (reader.NodeType != XmlNodeType.Element && reader.NodeType != XmlNodeType.EndElement)
                {
                    continue;
                }

                if (reader.Is("PayloadEnergyTimeSeries", B2BNamespace))
                {
                    writer.WriteStartObject();
                    writer.WriteString("CorrelationId", correlationId);
                }
                else if (reader.Is("Identification", B2BNamespace))
                {
                    fragments.PayloadEnergyTimeSeriesIdentification = await reader.ReadElementContentAsStringAsync()
                                                                      .ConfigureAwait(false);
                }
                else if (reader.Is("Function", B2BNamespace))
                {
                    fragments.Function = await reader.ReadElementContentAsStringAsync()
                                         .ConfigureAwait(false);
                }
                else if (reader.Is("ObservationTimeSeriesPeriod", B2BNamespace))
                {
                    fragments.ObservationTimeSeriesPeriod = await ProcessObservationTimeSeriesPeriodAsync(reader)
                                                            .ConfigureAwait(false);
                }
                else if (reader.Is("IncludedProductCharacteristic", B2BNamespace))
                {
                    fragments.IncludedProductCharacteristic = await ProcessIncludedProductCharacteristicAsync(reader)
                                                              .ConfigureAwait(false);
                }
                else if (reader.Is("DetailMeasurementMeteringPointCharacteristic", B2BNamespace))
                {
                    fragments.DetailMeasurementMeteringPointCharacteristic = await ProcessDetailMeasurementMeteringPointCharacteristicAsync(reader)
                                                                             .ConfigureAwait(false);
                }
                else if (reader.Is("MeteringPointDomainLocation", B2BNamespace))
                {
                    fragments.MeteringPointDomainLocationIdentification = await GetChildIdentificationAsync(reader)
                                                                          .ConfigureAwait(false);

                    /* 2020-12-22 - XMDJE - At this point we have all the necessary information to write everything to the stream up until points.
                     *  Points are specifically written immediately to the stream in the effort to save memory.
                     *  This means we will write everything up to that segment to the stream to be ready */
                    WriteTimeSeriesUpUntilIndividualPoints(writer, fragments, header);
                }
                else if (reader.Is("IntervalEnergyObservation", B2BNamespace))
                {
                    // Notice: We write each point to the stream immediately, unlike the rest of the parsing
                    var point = await ProcessPointsAsync(reader)
                                .ConfigureAwait(false);

                    WriteTimeSeriesPoint(writer, point, fragments);
                }
                else if (reader.Is("PayloadEnergyTimeSeries", B2BNamespace, XmlNodeType.EndElement))
                {
                    // We have now parsed all the points and can write the remaining parts of the document
                    WriteTimeSeriesFromAfterPoints(writer, fragments);
                    writer.WriteEndObject();
                }
            }while (await reader.ReadAsync().ConfigureAwait(false));
        }
 private static void WriteIdentifications(Utf8JsonWriter writer, RsmHeader header, RSM012Fragments fragments)
 {
     writer.WriteString("mRID", fragments.PayloadEnergyTimeSeriesIdentification);
     writer.WriteString("MessageReference", header.MessageReference);
 }
 private static void WriteTimeSeriesUpUntilIndividualPoints(Utf8JsonWriter writer, RSM012Fragments fragments, RsmHeader header)
 {
     WriteIdentifications(writer, header, fragments);
     WriteMarketDocument(writer, header);
     WriteActivityRecordStatus(writer, fragments);
     WriteCharacteristics(writer, fragments);
     WriteMarketEvaluationPointMRID(writer, fragments);
     WritePeriodUpToPoints(writer, fragments);
 }
示例#11
0
        private static async ValueTask ProcessConsumerPartyAsync(
            XmlReader reader,
            RsmHeader header,
            Utf8JsonWriter writer)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (header == null)
            {
                throw new ArgumentNullException(nameof(header));
            }

            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            string?cpr       = null;
            string?cvr       = null;
            string?qualifier = null;
            string?name      = null;

            while (await reader.ReadAsync().ConfigureAwait(false))
            {
                if (reader.Is("ConsumerConsumerParty", B2BNamespace, XmlNodeType.EndElement))
                {
                    break;
                }

                if (reader.Is("CPR", B2BNamespace) && cpr == null)
                {
                    cpr = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);

                    qualifier = "ARR";
                }
                else if (reader.Is("CVR", B2BNamespace) && cvr == null)
                {
                    cvr = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);

                    qualifier = "VA";
                }
                else if (reader.Is("Name", B2BNamespace))
                {
                    name = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);
                }
            }

            if ((cvr != null && cpr != null) || (cvr == null && cpr == null))
            {
                throw new Exception("Inconsistency in CVR or CPR");
            }

            writer.WriteStartObject("Consumer");
            writer.WriteString("mRID", cvr ?? cpr);
            writer.WriteString("qualifier", qualifier);

            if (name != null)
            {
                writer.WriteString("name", name);
            }

            writer.WriteEndObject();
        }
示例#12
0
        private static async ValueTask ProcessPayloadMpEventAsync(
            XmlReader reader,
            RsmHeader header,
            Utf8JsonWriter writer,
            string correlationId)
        {
            do
            {
                if (reader.NodeType != XmlNodeType.Element && reader.NodeType != XmlNodeType.EndElement)
                {
                    continue;
                }

                if (reader.Is("PayloadMPEvent", B2BNamespace))
                {
                    writer.WriteStartObject();
                    writer.WriteString("CorrelationId", correlationId);
                }
                else if (reader.Is("PayloadMPEvent", B2BNamespace, XmlNodeType.EndElement))
                {
                    writer.WriteEndObject();
                }
                else if (reader.Is("Identification", B2BNamespace))
                {
                    writer.WriteStartObject("Transaction");
                    writer.WriteString("mRID", await reader.ReadElementContentAsStringAsync().ConfigureAwait(false));
                    writer.WriteEndObject();
                }
                else if (reader.Is("StartOfOccurrence", B2BNamespace))
                {
                    var instantResult = InstantPattern.ExtendedIso.Parse(
                        await reader.ReadElementContentAsStringAsync().ConfigureAwait(false));
                    if (instantResult.Success)
                    {
                        writer.WriteString("StartDate", instantResult.Value.ToString());
                    }
                }
                else if (reader.Is("MeteringPointDomainLocation", B2BNamespace))
                {
                    writer.WriteStartObject("MarketEvaluationPoint");
                    writer.WriteString("mRID", await GetChildIdentificationAsync(reader).ConfigureAwait(false));
                    writer.WriteEndObject();
                }
                else if (reader.Is("BalanceSupplierEnergyParty", B2BNamespace))
                {
                    writer.WriteStartObject("EnergySupplier");
                    writer.WriteString("mRID", await GetChildIdentificationAsync(reader).ConfigureAwait(false));
                    writer.WriteEndObject();
                }
                else if (reader.Is("BalanceResponsiblePartyEnergyParty", B2BNamespace))
                {
                    writer.WriteStartObject("BalanceResponsibleParty");
                    writer.WriteString("mRID", await GetChildIdentificationAsync(reader).ConfigureAwait(false));
                    writer.WriteEndObject();
                }
                else if (reader.Is("ConsumerConsumerParty", B2BNamespace))
                {
                    await ProcessConsumerPartyAsync(reader, header, writer).ConfigureAwait(false);
                }
            }while (await reader.ReadAsync().ConfigureAwait(false));
        }
示例#13
0
 protected abstract ValueTask ConvertPayloadAsync(XmlReader reader, RsmHeader header, Utf8JsonWriter writer, string correlationId);
示例#14
0
        private static async ValueTask ReadProcessEnergyContextAsync(XmlReader reader, RsmHeader rsmHeader, string ns)
        {
            while (await reader.ReadAsync().ConfigureAwait(false))
            {
                if (reader.Is("ProcessEnergyContext", ns, XmlNodeType.EndElement))
                {
                    return;
                }

                if (reader.Is("EnergyBusinessProcess", ns))
                {
                    rsmHeader.EnergyBusinessProcess = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);
                }
                else if (reader.Is("EnergyBusinessProcessRole", ns))
                {
                    rsmHeader.EnergyBusinessProcessRole = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);
                }
                else if (reader.Is("EnergyIndustryClassification", ns))
                {
                    rsmHeader.EnergyIndustryClassification = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);
                }
            }
        }
示例#15
0
        private static async ValueTask ReadHeaderEnergyDocumentAsync(XmlReader reader, RsmHeader rsmHeader, string ns)
        {
            while (await reader.ReadAsync().ConfigureAwait(false))
            {
                if (reader.LocalName == "HeaderEnergyDocument" && reader.NodeType == XmlNodeType.EndElement)
                {
                    return;
                }
                else if (reader.Is("Identification", ns))
                {
                    var content = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);

                    rsmHeader.Identification = content;
                }
                else if (reader.Is("DocumentType", ns))
                {
                    rsmHeader.DocumentType = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);
                }
                else if (reader.Is("Creation", ns))
                {
                    rsmHeader.Creation = Instant.FromDateTimeUtc(reader.ReadElementContentAsDateTime());
                }
                else if (reader.Is("SenderEnergyParty", ns))
                {
                    rsmHeader.SenderIdentification = await ReadIdentificationAsync(reader, ns).ConfigureAwait(false);
                }
                else if (reader.Is("RecipientEnergyParty", ns))
                {
                    rsmHeader.RecipientIdentification = await ReadIdentificationAsync(reader, ns).ConfigureAwait(false);
                }
            }
        }