示例#1
0
 /// <summary>
 /// Write a data body content into FlyWriter
 /// </summary>
 /// <param name="writer">object of transport used for transmitting data in streaming <see cref="IFlyWriter"/></param>
 public override void WriterBody(IFlyWriter writer)
 {
     FlyLog.WriteLog(this, FlyLog.LogTypeEnum.All, "Writing Data Result");
     Parser(Rea, Builder, writer);
     Conn.Close();
     FlyLog.WriteLog(this, FlyLog.LogTypeEnum.All, "Writing the result successfully completed");
 }
示例#2
0
        /// <summary>
        ///Start Write data message and Call Write20DataMessage or Write21DataMessage
        /// Create a XElement to return back
        /// </summary>
        /// <param name="TableResponse">Headers of response</param>
        /// <param name="writer"> Contains the object of transport used for transmitting data in streaming</param>
        internal void WriteDataMessage(IDataTableMessageObject TableResponse, IFlyWriter writer)
        {
            try
            {
                this._tableResponse = TableResponse;
                WriterDataBase writerData = null;
                if (writer.FlyMediaType == FlyMediaEnum.Rdf)
                {
                    writerData = new WriteRDFDataMessage();
                }
                else if (writer.FlyMediaType == FlyMediaEnum.Dspl)
                {
                    writerData = new WriteDSPLDataMessage();
                }
                else if (writer.FlyMediaType == FlyMediaEnum.Json)
                {
                    writerData = new WriteJsonDataMessage();
                }
                else if (_versionTypeResp == SdmxSchemaEnumType.VersionTwo)
                {
                    writerData = new Write20DataMessage();
                }
                else
                {
                    writerData = new Write21DataMessage();
                }

                writerData.MessageType            = this.MessageType;
                writerData._tableResponse         = this._tableResponse;
                writerData._retrievalManager      = this._retrievalManager;
                writerData.DimensionAtObservation = this.DimensionAtObservation;

                writerData.WriteDataMessage(writer);
                FlyLog.WriteLog(this, FlyLog.LogTypeEnum.All, "Total Rows return from Database {0}", this._tableResponse.RowsCounter);



                //StreamReader rdr = new System.IO.StreamReader(ms);
                //ms.Position = 0;
                //string DSDris = rdr.ReadToEnd();
                ////return XElement.Parse(DSDris);
                //ms.Position = 0;
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.WriteDataMessage, ex);
            }
        }
示例#3
0
        /// <summary>
        /// Write a DataMessage in XmlWriter
        /// </summary>
        /// <param name="writer">Stream Destination</param>
        public override void WriteDataMessage(IFlyWriter writer)
        {
            try
            {
                JsonWriter             jsonwriter       = new JsonTextWriter(writer.__DsplJSONTextWriter);
                SdmxJsonBaseDataWriter dataWriterEngine = null;
                switch (MessageType)
                {
                case MessageTypeEnum.Json:
                    dataWriterEngine = new SdmxJsonBaseDataWriter(jsonwriter);
                    break;
                }

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

                dataWriterEngine.WriteHeaderForDownloadJson();

                IHeader header = FlyConfiguration.HeaderSettings.GetHeader();
                dataWriterEngine.WriteHeader(header);
                DataStructureObjectImpl dsd = _retrievalManager._dsd;

                dataWriterEngine._dsd = dsd.Immutated;

                // start dataset
                dataWriterEngine.StartDataset(_retrievalManager.GetDataflowFromSdmxObject(), dsd.Immutated, null, null);


                this.LastSeriesKey = null;
                WriteTimeSeriesData(dataWriterEngine);

                dataWriterEngine.WriteSDMXJsonStructure(_retrievalManager.GetDataflowFromSdmxObject(), new SdmxJsonBaseDataWriter.RetreiveCodelistDelegate(GetCodelist));

                writer.__DsplJSONTextWriter.Flush();
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteDataMessage, ex);
            }
        }
        /// <summary>
        /// Write a metadata body content into FlyWriter
        /// </summary>
        /// <param name="writer">object of transport used for transmitting data in streaming <see cref="IFlyWriter"/></param>
        public override void WriterBody(IFlyWriter writer)
        {
            FlyLog.WriteLog(this, FlyLog.LogTypeEnum.All, "Writing Metadata Result");
            switch (writer.FlyMediaType)
            {
            case FlyMediaEnum.Sdmx:
                Org.Sdmxsource.Sdmx.Structureparser.Manager.StructureWriterManager Struwriter = new Org.Sdmxsource.Sdmx.Structureparser.Manager.StructureWriterManager(new Org.Sdmxsource.Sdmx.Structureparser.Factory.SdmxStructureWriterFactory(writer.__SdmxXml));
                Struwriter.WriteStructures(SdmxObject, StructureFormat, null);
                break;

            case FlyMediaEnum.Rdf:
                RDFProvider.Structure.Manager.StructureRDFWritingManager RDFStruwriter = new RDFProvider.Structure.Manager.StructureRDFWritingManager(new RDFProvider.Structure.Factory.RDFStructureWriterFactory(writer.__SdmxXml));
                RDFStruwriter.RDFWriteStructures(SdmxObject, null);
                break;

            case FlyMediaEnum.Dspl:
            case FlyMediaEnum.Json:
            default:
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.NotImplemented, new Exception("MediaType=" + writer.FlyMediaType.ToString()));
            }

            FlyLog.WriteLog(this, FlyLog.LogTypeEnum.All, "Writing the result successfully completed");
        }
 /// <summary>
 /// Overridable Function for Write Data
 /// </summary>
 /// <param name="retData">return XmlWriter</param>
 public abstract void WriteDataMessage(IFlyWriter retData);
        /// <summary>
        /// Get Database response and call delegate WriteBuilder
        /// </summary>
        /// <param name="rea">SqlDataReader response</param>
        /// <param name="builder"> Delegate for callback of Write response</param>
        /// <param name="writer"> Contains the object of transport used for transmitting data in streaming</param>
        public void GetDBResponse(SqlDataReader rea, WriteResponseDelegate builder, IFlyWriter writer)
        {
            try
            {
                DataTable schemaTable = rea.GetSchemaTable();


                IDataTableMessageObject DTMessage = new DataTableMessageObject();
                List <string>           columns   = new List <string>();
                foreach (DataRow item in schemaTable.Rows)
                {
                    string itemColumnName = item["ColumnName"].ToString();
                    columns.Add(itemColumnName);
                    SpacialColumsNamesEnum tipoSpeciale;

                    IConceptObjectImpl conc = Concepts.Find(c =>
                                                            (c.Id.Trim().ToUpper() == itemColumnName.Trim().ToUpper()) ||
                                                            (c.Id.Trim().ToUpper() == itemColumnName.Trim().ToUpper().Substring(1)) ||
                                                            CheckRenamedFrequency(c, itemColumnName) ||
                                                            CheckRenamedFrequency(c, itemColumnName.Substring(1)));

                    if (conc != null)
                    {
                        DTMessage.Colums.Add(itemColumnName, conc);
                    }
                    else if (Enum.TryParse <SpacialColumsNamesEnum>(itemColumnName.Trim().ToUpper(), true, out tipoSpeciale))
                    {
                        switch (tipoSpeciale)
                        {
                        case SpacialColumsNamesEnum._TIME_:
                        case SpacialColumsNamesEnum._TIME:
                            DTMessage.Colums.Add(itemColumnName, Concepts.Find(c => c.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)c).DimensionType == DimensionTypeEnum.Time));
                            break;

                        case SpacialColumsNamesEnum.VALUE:
                        case SpacialColumsNamesEnum._VALUE_:
                            if (Concepts.Exists(c => c.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)c).IsValueAttribute))
                            {
                                DTMessage.Colums.Add(itemColumnName, Concepts.Find(c => c.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)c).IsValueAttribute));
                            }
                            break;

                        case SpacialColumsNamesEnum.FLAGS:
                            if (Concepts.Exists(c => c.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)c).IsFlagAttribute))
                            {
                                DTMessage.Colums.Add(itemColumnName, Concepts.Find(c => c.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)c).IsFlagAttribute));
                            }
                            break;
                        }
                    }
                }

                //La colonna Frequency è obbligatoria (Se non c'è l'aggiungo)
                if (string.IsNullOrEmpty(DTMessage.FrequencyCol))
                {
                    var _freqconcept = Concepts.Find(c => c.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)c).DimensionType == DimensionTypeEnum.Frequency && ((IDimensionConcept)c).IsFakeFrequency);
                    if (_freqconcept != null)
                    {
                        DTMessage.Colums.Add(_freqconcept.ConceptObjectCode, _freqconcept);
                    }
                }
                //Inseriamo anche la colonna TimeFormat a meno che non ci sia già nel db
                if (string.IsNullOrEmpty(DTMessage.TimeFormatCol))
                {
                    IConceptObjectImpl _timeFormatCol = Concepts.Find(co => co.ConceptType == ConceptTypeEnum.Attribute && co.Id == FlyConfiguration.Time_Format_Id);
                    if (_timeFormatCol != null)
                    {
                        DTMessage.Colums.Add(_timeFormatCol.ConceptObjectCode, _timeFormatCol);
                    }
                }

                DTMessage.DBDataReader     = rea;
                DTMessage.isFakeTimeFormat = !columns.Contains(DTMessage.TimeFormatCol);

                builder(DTMessage, writer);
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.GetTableMessage, ex);
            }
        }
示例#7
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);
            }
        }
 /// <summary>
 /// Write a data body content into FlyWriter
 /// </summary>
 /// <param name="writer">object of transport used for transmitting data in streaming <see cref="IFlyWriter"/></param>
 public abstract void WriterBody(IFlyWriter writer);
        /// <summary>
        /// Write a DataMessage in XmlWriter
        /// </summary>
        /// <param name="writer">Stream Destination</param>
        public override void WriteDataMessage(IFlyWriter writer)
        {
            try
            {
                IRDFDataWriterEngine dataWriterEngine = null;
                switch (MessageType)
                {
                case MessageTypeEnum.Rdf:
                    dataWriterEngine = new RDFDataWriterEngine(writer.__SdmxXml);
                    break;
                }


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

                DataStructureObjectImpl dsd = _retrievalManager._dsd;

                // start dataset
                dataWriterEngine.StartDataset(dsd.Immutated.TimeDimension.Id, _retrievalManager.DataFlowID, _retrievalManager._dsd.Id);



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


                //Aggiungo gli Attributi di Dataset
                //bool AddedDatasetAttribute = false;
                this.LastSeriesKey = null;
                List <DataMessageObject> dmo = _tableResponse.GetNext();

                do
                {
                    if (dmo == null)
                    {
                        break;
                    }
                    //if (!AddedDatasetAttribute)
                    //{
                    //    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyDatasetAttribute(att)))
                    //        dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                    //    AddedDatasetAttribute = true;
                    //}



                    //SERIE
                    //if (CheckChanged(dmo))
                    //{
                    List <string> Vals = new List <string>();
                    Vals.Add(RDFProvider.Constants.RDFConstants.RdfDataset + _retrievalManager.DataFlowID);
                    foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                    {
                        Vals.Add(seriesKey.Val.ToString());
                    }

                    dataWriterEngine.StartSeries(string.Join("/", Vals), _retrievalManager.DataFlowID);


                    foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                    {
                        if (seriesKey.ColImpl.ConceptDSDInfo != null)
                        {
                            dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString(), seriesKey.ColImpl.ConceptDSDInfo.CodelistVersion, seriesKey.ColImpl.ConceptDSDInfo.CodelistId);
                        }
                        else
                        {
                            dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString(), FlyConfiguration.Version, string.Format("CL_{0}", seriesKey.ColImpl.ConceptObjectCode));
                        }
                    }

                    //foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlySeriesAttribute(att)))
                    //    dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                    //}

                    //OBSERVATION
                    DataMessageObject val  = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);
                    DataMessageObject time = dmo.Find(dimT => dimT.ColImpl.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)dimT.ColImpl).DimensionType == DimensionTypeEnum.Time);
                    dataWriterEngine.RDFWriteObservation(time.ColImpl.ConceptObjectCode, time.Val.ToString(), val.Val.ToString());

                    //foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyObservationAttribute(att)))
                    //    dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());

                    dmo = _tableResponse.GetNext();
                } while (dmo != null);


                dataWriterEngine.Close();
                writer.__SdmxXml.Flush();
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteDataMessage, ex);
            }
        }
        /// <summary>
        /// Write a DataMessage in XmlWriter
        /// </summary>
        /// <param name="writer">Stream Destination</param>
        public override void WriteDataMessage(IFlyWriter writer)
        {
            try
            {
                using (TextWriter tw = new StreamWriter(new MemoryStream()))
                {
                    DsplTextWriter        dsplTextWriter   = new DsplTextWriter(tw);
                    IDsplDataWriterEngine dataWriterEngine = null;
                    switch (MessageType)
                    {
                    case MessageTypeEnum.Dspl:
                        dataWriterEngine = new DsplBaseDataWriter(dsplTextWriter);
                        break;
                    }

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

                        DataStructureObjectImpl dsd = _retrievalManager._dsd;
                        IHeader header = FlyConfiguration.HeaderSettings.GetHeader();
                        dataWriterEngine.WriteHeader(header);

                        // start dataset
                        dataWriterEngine.SetDsdOrder(dsd.Immutated);
                        dataWriterEngine.StartDataset(_retrievalManager.GetDataflowFromSdmxObject(), dsd.Immutated, new DsplBaseDataWriter.RetreiveCodelistDelegate(GetCodelist));


                        dataWriterEngine.StartSeries(null);
                        List <DataMessageObject> dmo = _tableResponse.GetNext();
                        do
                        {
                            if (dmo == null)
                            {
                                break;
                            }

                            foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                            {
                                dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString());
                            }

                            //OBSERVATION
                            DataMessageObject val  = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);
                            DataMessageObject time = dmo.Find(dimT => dimT.ColImpl.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)dimT.ColImpl).DimensionType == DimensionTypeEnum.Time);
                            dataWriterEngine.WriteObservation(time.Val.ToString(), val.Val.ToString());

                            dmo = _tableResponse.GetNext();
                        } while (dmo != null);


                        dataWriterEngine.CloseAndZip(writer.__DsplJSONTextWriter);
                        writer.__DsplJSONTextWriter.Flush();
                    }
                    catch (Exception ex)
                    {
                        throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteFlatData, ex);
                    }
                    finally
                    {
                        dataWriterEngine.ClearTempFolder();
                    }
                }
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteDataMessage, ex);
            }
        }
        /// <summary>
        /// Write a DataMessage in XmlWriter
        /// </summary>
        /// <param name="writer">Stream Destination</param>
        public override void WriteDataMessage(IFlyWriter writer)
        {
            try
            {
                IDataWriterEngine dataWriterEngine = null;
                switch (MessageType)
                {
                case MessageTypeEnum.Compact_20:
                    dataWriterEngine = new CompactDataWriterEngine(writer.__SdmxXml, SdmxSchema.GetFromEnum(SdmxSchemaEnumType.VersionTwo));
                    break;

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

                case MessageTypeEnum.CrossSectional_20:
                    break;
                }

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


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

                // 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);
                }



                this.LastSeriesKey = null;
                List <DataMessageObject> dmo = _tableResponse.GetNext();

                if (dmo != null)
                {
                    //Aggiungo gli Attributi di Dataset
                    foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyDatasetAttribute(att)))
                    {
                        dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                    }


                    //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());
                            }
                        }
                    }

                    do
                    {
                        if (dmo == null)
                        {
                            break;
                        }

                        //SERIE
                        if (CheckChanged(dmo))
                        {
                            dataWriterEngine.StartSeries();

                            foreach (DataMessageObject seriesKey in dmo.FindAll(dim => OnlySeriesKey(dim)))
                            {
                                dataWriterEngine.WriteSeriesKeyValue(seriesKey.ColImpl.ConceptObjectCode, seriesKey.Val.ToString());
                            }

                            foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlySeriesAttribute(att)))
                            {
                                dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                            }
                        }

                        //OBSERVATION
                        DataMessageObject val  = dmo.Find(dimV => dimV.ColImpl.ConceptType == ConceptTypeEnum.Attribute && ((IAttributeConcept)dimV.ColImpl).IsValueAttribute);
                        DataMessageObject time = dmo.Find(dimT => dimT.ColImpl.ConceptType == ConceptTypeEnum.Dimension && ((IDimensionConcept)dimT.ColImpl).DimensionType == DimensionTypeEnum.Time);
                        dataWriterEngine.WriteObservation(time.Val.ToString(), val.Val.ToString());

                        foreach (DataMessageObject seriesAttribute in dmo.FindAll(att => OnlyObservationAttribute(att)))
                        {
                            if (seriesAttribute.Val.ToString() != String.Empty)
                            {
                                dataWriterEngine.WriteAttributeValue(seriesAttribute.ColImpl.ConceptObjectCode, seriesAttribute.Val.ToString());
                            }
                        }

                        dmo = _tableResponse.GetNext();
                    } while (dmo != null);
                }

                dataWriterEngine.Close();
                writer.__SdmxXml.Flush();
            }
            catch (SdmxException) { throw; }
            catch (Exception ex)
            {
                throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.ErrorWriteDataMessage, ex);
            }
        }