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