/// <summary> /// Handles the Structure top level elements /// This includes Concept Scheme /// </summary> /// <param name="parent"> /// The parent <see cref="IMutableObjects"/> /// </param> /// <param name="localName"> /// The name of the current xml element /// </param> protected override ElementActions HandleTopLevel(IMutableObjects parent, object localName) { ElementActions actions = null; if (NameTableCache.IsElement(localName, ElementNameTable.ConceptScheme)) { var cs = new ConceptSchemeMutableCore(); ParseAttributes(cs, this.Attributes); parent.AddConceptScheme(cs); actions = this.AddNameableAction(cs, this.HandleChildElements); } return actions; }
/// <summary> /// Builds the concept scheme. /// </summary> /// <returns> /// The <see cref="IConceptSchemeObject"/>. /// </returns> public IConceptSchemeObject BuildConceptScheme() { IConceptSchemeMutableObject conceptSchemeMutable = new ConceptSchemeMutableCore(); conceptSchemeMutable.AgencyId = "SDMXSOURCE"; conceptSchemeMutable.Id = "CONCEPTS"; conceptSchemeMutable.Version = "1.0"; conceptSchemeMutable.AddName("en", "Web Service Concepts"); conceptSchemeMutable.CreateItem("COUNTRY", "Country"); conceptSchemeMutable.CreateItem("INDICATOR", "World Developement Indicators"); conceptSchemeMutable.CreateItem("TIME", "Time"); conceptSchemeMutable.CreateItem("OBS_VALUE", "Observation Value"); return conceptSchemeMutable.ImmutableInstance; }
/// <summary> /// Create a ImmutableInstance of ConceptScheme /// </summary> /// <param name="AgencyId">Agency Id</param> /// <param name="Version">Artefact Version</param> /// <returns>IConceptSchemeObject</returns> public IConceptSchemeObject BuildConceptScheme(string AgencyId, string Version) { try { IConceptSchemeMutableObject cs = new ConceptSchemeMutableCore(); cs.AgencyId = AgencyId; cs.Version = Version; cs.Id = this.Code; if (this.Names != null) { foreach (SdmxObjectNameDescription item in this.Names) { cs.AddName(item.Lingua, item.Name); } } if (!this.ParsingObject.ReturnStub) { foreach (IConceptMutableObject _dim in Concepts) { cs.AddItem(_dim); } } cs.FinalStructure = TertiaryBool.ParseBoolean(true); if (this.ParsingObject.isReferenceOf || this.ParsingObject.ReturnStub) { cs.ExternalReference = TertiaryBool.ParseBoolean(true); cs.StructureURL = RetreivalStructureUrl.Get(this, cs.Id, cs.AgencyId, cs.Version); } return(cs.ImmutableInstance); } catch (SdmxException) { throw; } catch (Exception ex) { throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.CreateImmutable, ex); } }
public void TestDataWriterEngineDimensionAtObs(DataEnumType format, string dimAtObs) { string outfile = string.Format("{0}-{1}.xml", format, dimAtObs); DataType fromEnum = DataType.GetFromEnum(format); using (Stream writer = File.Create(outfile)) { IConceptSchemeMutableObject conceptScheme = new ConceptSchemeMutableCore { Id = "CONCEPTS_TEST", AgencyId = "TEST" }; conceptScheme.AddName("en", "Dummy concept scheme build for this tests"); ////conceptScheme.Annotations.Add(new AnnotationMutableCore() { Id = "ANNOTABLETEST", Title = "Test", Type = "ATYPE" }); conceptScheme.FinalStructure = TertiaryBool.GetFromEnum(TertiaryBoolEnumType.True); IConceptSchemeObject parent = conceptScheme.ImmutableInstance; IConceptObject freqConcept = CreateConcept(parent, "FREQ", "Frequency"); IConceptObject adjustmentConcept = CreateConcept(parent, "ADJUSTMENT", "The Adjustment"); IConceptObject activityConcpet = CreateConcept(parent, "STS_ACTIVITY", "Name of activity "); IConceptObject timeDimensionConcpet = CreateConcept(parent, "TIME_PERIOD", "Name of Time Period"); IConceptObject decimalsConcept = CreateConcept(parent, "DECIMALS", "Name of concept"); IConceptObject obsConcept = CreateConcept(parent, "OBS_VALUE", "Name of observation value"); ICodelistObject freqCl = CreateCodelist("CL_FREQ", "Freq codelist", "Q", "A", "M"); ICodelistObject adjCl = CreateCodelist("CL_ADJUSTMENT", "Adjustment codelist", "N", "S", "W"); ICodelistObject actCl = CreateCodelist("CL_ACTIVITY", "Activity codelist", "A", "B", "C"); ICodelistObject deciCl = CreateCodelist("CL_DECIMALS", "DECIMALS codelist", "1", "2", "0"); IDataStructureMutableObject mutable = new DataStructureMutableCore { Id = "TEST_DSD", AgencyId = "TEST" }; mutable.AddName("en", "FOO BAR"); mutable.AddDimension( new DimensionMutableCore { ConceptRef = freqConcept.AsReference, FrequencyDimension = true, Representation = new RepresentationMutableCore { Representation = freqCl.AsReference } }); mutable.AddDimension(new DimensionMutableCore { ConceptRef = adjustmentConcept.AsReference, Representation = new RepresentationMutableCore { Representation = adjCl.AsReference } }); mutable.AddDimension(new DimensionMutableCore { ConceptRef = activityConcpet.AsReference, Representation = new RepresentationMutableCore { Representation = actCl.AsReference } }); mutable.AddDimension(new DimensionMutableCore { ConceptRef = timeDimensionConcpet.AsReference, TimeDimension = true }); IList<string> dimList = new List<string> { freqConcept.Id, adjustmentConcept.Id, adjustmentConcept.Id }; var attributeMutableCore = new AttributeMutableCore { ConceptRef = decimalsConcept.AsReference, Representation = new RepresentationMutableCore { Representation = deciCl.AsReference }, AttachmentLevel = AttributeAttachmentLevel.DimensionGroup, AssignmentStatus = AttributeAssignmentStatus.Mandatory.ToString() }; attributeMutableCore.DimensionReferences.AddAll(dimList); mutable.AddAttribute(attributeMutableCore); mutable.PrimaryMeasure = new PrimaryMeasureMutableCore { ConceptRef = obsConcept.AsReference }; var manager = new DataWriterManager(); IDataWriterEngine dataWriter = manager.GetDataWriterEngine(new SdmxDataFormatCore(fromEnum), writer); IDataStructureObject dataStructureObject = mutable.ImmutableInstance; IList<IDatasetStructureReference> structures = new List<IDatasetStructureReference> { new DatasetStructureReferenceCore(null, dataStructureObject.AsReference, null, null, dimAtObs) }; IList<IParty> receiver = new List<IParty> { new PartyCore(new List<ITextTypeWrapper>(), "ZZ9", new List<IContact>(), null) }; var sender = new PartyCore(new List<ITextTypeWrapper> { new TextTypeWrapperImpl("en", "TEST SENDER", null) }, "ZZ1", null, null); IHeader header = new HeaderImpl( null, structures, null, DatasetAction.GetFromEnum(DatasetActionEnumType.Information), "TEST_DATAFLOW", "DATASET_ID", null, DateTime.Now, DateTime.Now, null, null, new List<ITextTypeWrapper> { new TextTypeWrapperImpl("en", "test header name", null) }, new List<ITextTypeWrapper> { new TextTypeWrapperImpl("en", "source 1", null) }, receiver, sender, true); dataWriter.WriteHeader(header); dataWriter.StartDataset(null, dataStructureObject, new DatasetHeaderCore(null, DatasetAction.GetFromEnum(DatasetActionEnumType.Information), structures.First())); var sw = new Stopwatch(); sw.Start(); var startTime = new DateTime(2005, 1, 1); var series = (from f in freqCl.Items from ad in adjCl.Items from ac in actCl.Items from t in Enumerable.Range(0, 100) select new { Freq = f.Id, Adj = ad.Id, Activity = ac.Id, Time = BuildPeriodResolver(f.Id, startTime)(t) }).OrderBy( arg => BuildOrderBy(arg.Freq, arg.Adj, arg.Activity, arg.Time, dimAtObs)).ToArray(); sw.Stop(); Trace.WriteLine(sw.Elapsed); sw.Reset(); sw.Start(); string lastKey = null; int i = 0; foreach (var key in series) { var currentKey = new List<string>(); string crossValue = null; if (!string.Equals(freqConcept.Id, dimAtObs)) { currentKey.Add(key.Freq); } else { crossValue = key.Freq; } if (!string.Equals(adjustmentConcept.Id, dimAtObs)) { currentKey.Add(key.Adj); } else { crossValue = key.Adj; } if (!string.Equals(activityConcpet.Id, dimAtObs)) { currentKey.Add(key.Activity); } else { crossValue = key.Activity; } if (!string.Equals(timeDimensionConcpet.Id, dimAtObs)) { currentKey.Add(key.Time); } else { crossValue = key.Time; } var currentKeyValues = string.Join(",", currentKey); if (lastKey == null || !lastKey.Equals(currentKeyValues)) { lastKey = currentKeyValues; i = 0; dataWriter.StartSeries(); if (!string.Equals(freqConcept.Id, dimAtObs)) { dataWriter.WriteSeriesKeyValue(freqConcept.Id, key.Freq); } if (!string.Equals(adjustmentConcept.Id, dimAtObs)) { dataWriter.WriteSeriesKeyValue(adjustmentConcept.Id, key.Adj); } if (!string.Equals(activityConcpet.Id, dimAtObs)) { dataWriter.WriteSeriesKeyValue(activityConcpet.Id, key.Activity); } if (!string.Equals(timeDimensionConcpet.Id, dimAtObs)) { dataWriter.WriteSeriesKeyValue(timeDimensionConcpet.Id, key.Time); } } dataWriter.WriteObservation(crossValue, i.ToString(CultureInfo.InvariantCulture)); i++; } dataWriter.Close(); sw.Stop(); Trace.WriteLine(sw.Elapsed); } if (fromEnum.BaseDataFormat.EnumType == BaseDataFormatEnumType.Generic) { var fileReadableDataLocation = new FileReadableDataLocation(outfile); XMLParser.ValidateXml(fileReadableDataLocation, fromEnum.SchemaVersion); } }
public void TestDataWriterEngineAllDimensions(DataEnumType format) { string outfile = string.Format("{0}-alldim.xml", format); DataType fromEnum = DataType.GetFromEnum(format); using (Stream writer = File.Create(outfile)) { IConceptSchemeMutableObject conceptScheme = new ConceptSchemeMutableCore { Id = "CONCEPTS_TEST", AgencyId = "TEST" }; conceptScheme.AddName("en", "Dummy concept scheme build for this tests"); ////conceptScheme.Annotations.Add(new AnnotationMutableCore() { Id = "ANNOTABLETEST", Title = "Test", Type = "ATYPE" }); conceptScheme.FinalStructure = TertiaryBool.GetFromEnum(TertiaryBoolEnumType.True); IConceptSchemeObject parent = conceptScheme.ImmutableInstance; IConceptObject freqConcept = CreateConcept(parent, "FREQ", "Frequency"); IConceptObject adjustmentConcept = CreateConcept(parent, "ADJUSTMENT", "The Adjustment"); IConceptObject activityConcpet = CreateConcept(parent, "STS_ACTIVITY", "Name of activity "); IConceptObject timeDimensionConcpet = CreateConcept(parent, "TIME_PERIOD", "Name of Time Period"); IConceptObject decimalsConcept = CreateConcept(parent, "DECIMALS", "Name of concept"); IConceptObject obsConcept = CreateConcept(parent, "OBS_VALUE", "Name of observation value"); ICodelistObject freqCl = CreateCodelist("CL_FREQ", "Freq codelist", "Q", "A", "M"); ICodelistObject adjCl = CreateCodelist("CL_ADJUSTMENT", "Adjustment codelist", "N", "S", "W"); ICodelistObject actCl = CreateCodelist("CL_ACTIVITY", "Activity codelist", "A", "B", "C"); ICodelistObject deciCl = CreateCodelist("CL_DECIMALS", "DECIMALS codelist", "1", "2", "0"); IDataStructureMutableObject mutable = new DataStructureMutableCore { Id = "TEST_DSD", AgencyId = "TEST" }; mutable.AddName("en", "FOO BAR"); mutable.AddDimension( new DimensionMutableCore { ConceptRef = freqConcept.AsReference, FrequencyDimension = true, Representation = new RepresentationMutableCore { Representation = freqCl.AsReference } }); mutable.AddDimension(new DimensionMutableCore { ConceptRef = adjustmentConcept.AsReference, Representation = new RepresentationMutableCore { Representation = adjCl.AsReference } }); mutable.AddDimension(new DimensionMutableCore { ConceptRef = activityConcpet.AsReference, Representation = new RepresentationMutableCore { Representation = actCl.AsReference } }); mutable.AddDimension(new DimensionMutableCore { ConceptRef = timeDimensionConcpet.AsReference, TimeDimension = true }); IList<string> dimList = new List<string> { freqConcept.Id, adjustmentConcept.Id, adjustmentConcept.Id }; var attributeMutableCore = new AttributeMutableCore { ConceptRef = decimalsConcept.AsReference, Representation = new RepresentationMutableCore { Representation = deciCl.AsReference }, AttachmentLevel = AttributeAttachmentLevel.DimensionGroup, AssignmentStatus = AttributeAssignmentStatus.Mandatory.ToString() }; attributeMutableCore.DimensionReferences.AddAll(dimList); mutable.AddAttribute(attributeMutableCore); mutable.PrimaryMeasure = new PrimaryMeasureMutableCore { ConceptRef = obsConcept.AsReference }; var manager = new DataWriterManager(); IDataWriterEngine dataWriter = manager.GetDataWriterEngine(new SdmxDataFormatCore(fromEnum), writer); IDataStructureObject dataStructureObject = mutable.ImmutableInstance; IList<IDatasetStructureReference> structures = new List<IDatasetStructureReference> { new DatasetStructureReferenceCore( null, dataStructureObject.AsReference, null, null, DatasetStructureReference.AllDimensions) }; IList<IParty> receiver = new List<IParty> { new PartyCore(new List<ITextTypeWrapper>(), "ZZ9", new List<IContact>(), null) }; var sender = new PartyCore(new List<ITextTypeWrapper> { new TextTypeWrapperImpl("en", "TEST SENDER", null) }, "ZZ1", null, null); IHeader header = new HeaderImpl( null, structures, null, DatasetAction.GetFromEnum(DatasetActionEnumType.Information), "TEST_DATAFLOW", "DATASET_ID", null, DateTime.Now, DateTime.Now, null, null, new List<ITextTypeWrapper> { new TextTypeWrapperImpl("en", "test header name", null) }, new List<ITextTypeWrapper> { new TextTypeWrapperImpl("en", "source 1", null) }, receiver, sender, true); dataWriter.WriteHeader(header); dataWriter.StartDataset(null, dataStructureObject, new DatasetHeaderCore(null, DatasetAction.GetFromEnum(DatasetActionEnumType.Information), structures.First())); var sw = new Stopwatch(); sw.Start(); var series = from f in freqCl.Items from ad in adjCl.Items from ac in actCl.Items select new { f, ad, ac }; sw.Stop(); Trace.WriteLine(sw.Elapsed); sw.Reset(); var startTime = new DateTime(2005, 1, 1); sw.Start(); foreach (var key in series) { dataWriter.StartSeries(); dataWriter.WriteSeriesKeyValue(freqConcept.Id, key.f.Id); dataWriter.WriteSeriesKeyValue(adjustmentConcept.Id, key.ad.Id); dataWriter.WriteSeriesKeyValue(activityConcpet.Id, key.ac.Id); Func<int, string> getPeriod = null; switch (key.f.Id) { case "Q": getPeriod = i => { DateTime months = startTime.AddMonths(3 * i); return DateUtil.FormatDate(months, TimeFormatEnumType.QuarterOfYear); }; dataWriter.WriteAttributeValue(decimalsConcept.Id, "1"); break; case "A": getPeriod = i => { DateTime months = startTime.AddMonths(12 * i); return DateUtil.FormatDate(months, TimeFormatEnumType.Year); }; dataWriter.WriteAttributeValue(decimalsConcept.Id, "0"); break; case "M": getPeriod = i => { DateTime months = startTime.AddMonths(i + 1); return DateUtil.FormatDate(months, TimeFormatEnumType.Month); }; dataWriter.WriteAttributeValue(decimalsConcept.Id, "2"); break; default: Assert.Fail("Test bug. Check CL_FREQ codes"); break; } for (int i = 0; i < 100; i++) { string period = getPeriod(i); dataWriter.WriteObservation(DimensionObject.TimeDimensionFixedId, period, i.ToString(CultureInfo.InvariantCulture)); } } dataWriter.Close(); sw.Stop(); Trace.WriteLine(sw.Elapsed); } if (fromEnum.BaseDataFormat.EnumType == BaseDataFormatEnumType.Generic) { var fileReadableDataLocation = new FileReadableDataLocation(outfile); XMLParser.ValidateXml(fileReadableDataLocation, fromEnum.SchemaVersion); } }
private IConceptSchemeMutableObject GetConceptschemeForm() { bool isInError = false; // Indicatore di errore string messagesGroup = string.Empty; // Stringa di raggruppamento errori int errorCounter = 1; // Contatore errori #region CONCEPTSCHEME ID if (!ValidationUtils.CheckIdFormat(txtDSDID.Text)) { messagesGroup += Convert.ToString(errorCounter) + ")" + Resources.Messages.err_id_format + "<br /><br />"; errorCounter++; isInError = true; } #endregion #region CONCEPTSCHEME AGENCY if (cmbAgencies.Text.Trim().Equals(string.Empty)) { messagesGroup += Convert.ToString(errorCounter) + ") " + Resources.Messages.err_agency_missing + "<br /><br />"; errorCounter++; isInError = true; } #endregion #region CONCEPTSCHEME VERSION if (!ValidationUtils.CheckVersionFormat(txtVersion.Text)) { messagesGroup += Convert.ToString(errorCounter) + ")" + Resources.Messages.err_version_format + "<br /><br />"; errorCounter++; isInError = true; } #endregion /* URI NOT REQUIRED */ #region CONCEPTSCHEME URI if ((txtDSDURI.Text != string.Empty) && !ValidationUtils.CheckUriFormat(txtDSDURI.Text)) { messagesGroup += Convert.ToString(errorCounter) + ")" + Resources.Messages.err_uri_format + "<br /><br />"; errorCounter++; isInError = true; } #endregion #region CONCEPTSCHEME NAMES if (AddTextName.TextObjectList == null || AddTextName.TextObjectList.Count == 0) { messagesGroup += Convert.ToString(errorCounter) + ")" + Resources.Messages.err_list_name_format + "<br /><br />"; errorCounter++; isInError = true; } #endregion #region CONCEPTSCHEME START END DATE bool checkForDatesCombination = true; if (!txtValidFrom.Text.Trim().Equals(string.Empty) && !ValidationUtils.CheckDateFormat(txtValidFrom.Text)) { messagesGroup += Convert.ToString(errorCounter) + ")" + Resources.Messages.err_date_from_format + "<br /><br />"; errorCounter++; checkForDatesCombination = false; isInError = true; } if (!txtValidTo.Text.Trim().Equals(string.Empty) && !ValidationUtils.CheckDateFormat(txtValidTo.Text)) { messagesGroup += Convert.ToString(errorCounter) + ")" + Resources.Messages.err_date_to_format + "<br /><br />"; errorCounter++; checkForDatesCombination = false; isInError = true; } if (!txtValidFrom.Text.Trim().Equals(string.Empty) && !txtValidTo.Text.Trim().Equals(string.Empty)) { // Controllo congruenza date if (checkForDatesCombination) { if (!ValidationUtils.CheckDates(txtValidFrom.Text, txtValidTo.Text)) { messagesGroup += Convert.ToString(errorCounter) + ")" + Resources.Messages.err_date_diff + "<br /><br />"; errorCounter++; isInError = true; } } } #endregion if (isInError) { Utils.ShowDialog(messagesGroup, 300); return null; } IConceptSchemeMutableObject tmpConceptscheme = new ConceptSchemeMutableCore(); #region CREATE CONCEPTSCHEME FROM FORM tmpConceptscheme.AgencyId = GetAgencyValue(); tmpConceptscheme.Id = txtDSDID.Text; tmpConceptscheme.Version = txtVersion.Text; tmpConceptscheme.FinalStructure = TertiaryBool.ParseBoolean(chkIsFinal.Checked); tmpConceptscheme.Uri = (!txtDSDURI.Text.Trim().Equals(string.Empty) && ValidationUtils.CheckUriFormat(txtDSDURI.Text)) ? new Uri(txtDSDURI.Text) : null; if (!txtValidFrom.Text.Trim().Equals(string.Empty)) { tmpConceptscheme.StartDate = DateTime.ParseExact(txtValidFrom.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture); } if (!txtValidTo.Text.Trim().Equals(string.Empty)) { tmpConceptscheme.EndDate = DateTime.ParseExact(txtValidTo.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture); } foreach (var tmpName in AddTextName.TextObjectList) { tmpConceptscheme.AddName(tmpName.Locale, tmpName.Value); } if (AddTextDescription.TextObjectList != null) foreach (var tmpDescription in AddTextDescription.TextObjectList) { tmpConceptscheme.AddDescription(tmpDescription.Locale, tmpDescription.Value); } if (AnnotationGeneralControl.AnnotationObjectList != null) foreach (var annotation in AnnotationGeneralControl.AnnotationObjectList) { tmpConceptscheme.AddAnnotation(annotation); } #endregion return tmpConceptscheme; }