Ejemplo n.º 1
0
        /// <summary>
        /// Write a DataMessage in XmlWriter calling WriteTimeSeriesData or WriteFlatData or WriteCrossSectional
        /// </summary>
        /// <param name="writer">Stream Destination</param>
        public override void WriteDataMessage(IFlyWriter writer)
        {
            try
            {
                IDataWriterEngine dataWriterEngine = null;
                switch (MessageType)
                {
                case MessageTypeEnum.GenericData_21:
                    dataWriterEngine = new GenericDataWriterEngine(writer.__SdmxXml, SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwoPointOne));
                    break;

                case MessageTypeEnum.GenericTimeSeries_21:
                    dataWriterEngine = new GenericDataWriterEngine(writer.__SdmxXml, SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwoPointOne));
                    break;

                case MessageTypeEnum.StructureSpecific_21:
                    dataWriterEngine = new CompactDataWriterEngine(writer.__SdmxXml, SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwoPointOne));
                    break;

                case MessageTypeEnum.StructureSpecificTimeSeries_21:
                    dataWriterEngine = new CompactDataWriterEngine(writer.__SdmxXml, SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwoPointOne));
                    break;
                }

                isFlat = false;
                if (!string.IsNullOrEmpty(this.DimensionAtObservation) && this.DimensionAtObservation == "AllDimensions")
                {
                    isFlat = true;
                }


                //Da capire!!!! perche in teoria le crossSectional dovrebbero essere GenericData_21 e StructureSpecific_21 mentre le atre 2 sono TimeSeries
                //Ma le CommonApi non supportano le TimeSeries e quelle che in teoria sono Cross in realtà sono TimeSeries

                //WriteCrossSectional(ref writer);
                //return;

                if (dataWriterEngine == null)
                {
                    throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.InternalError, new Exception("No Type Message recognized"));
                }


                // write header
                IHeader header = FlyConfiguration.HeaderSettings.GetHeader();
                dataWriterEngine.WriteHeader(header);

                // start dataset
                DataStructureObjectImpl dsd = _retrievalManager._dsd;
                dataWriterEngine.StartDataset(null, dsd.Immutated, null);

                // Aggiungo dataset Title
                if (FlyConfiguration.DatasetTitle && !string.IsNullOrEmpty(this._retrievalManager.DataFlowTitle))
                {
                    dataWriterEngine.WriteAttributeValue("Title", this._retrievalManager.DataFlowTitle);
                }

                //GROUPS
                if (_retrievalManager.Groups != null && _retrievalManager.Groups.Count > 0)
                {
                    foreach (DataGroupObject group in _retrievalManager.Groups)
                    {
                        dataWriterEngine.StartGroup(group.GroupId);
                        foreach (GroupReferenceObject GroupKey in group.DimensionReferences)
                        {
                            dataWriterEngine.WriteGroupKeyValue(GroupKey.ConceptCode, GroupKey.ConceptValue.ToString());
                        }

                        foreach (GroupReferenceObject GroupAttribute in group.AttributeReferences)
                        {
                            dataWriterEngine.WriteAttributeValue(GroupAttribute.ConceptCode, GroupAttribute.ConceptValue.ToString());
                        }
                    }
                }

                this.LastSeriesKey = null;
                if (isFlat)
                {
                    WriteFlatData(dataWriterEngine);
                }
                else
                {
                    WriteTimeSeriesData(dataWriterEngine);
                }
                dataWriterEngine.Close();
                writer.__SdmxXml.Flush();
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteDataMessage, ex);
            }
        }