/// <summary> /// Submits the specified structural meta-data . /// </summary> /// <param name="dataLocation">The data location pointing to the structural meta-data.</param> /// <returns>The imported objects</returns> /// <exception cref="Estat.Sri.Ws.SubmitStructure.SubmitStructureException">An error occurred while importing structural meta-data.</exception> public ISdmxObjects Submit(IReadableDataLocation dataLocation, SubmitStructureConstant.ActionType actionType = SubmitStructureConstant.ActionType.Replace) { // Parse structures IStructureParsingManager is an instance field. IStructureWorkspace structureWorkspace = this._parsingManager.ParseStructures(dataLocation); // Get immutable objects from workspace ISdmxObjects objects = structureWorkspace.GetStructureObjects(false); // create a new instance of the MappingStoreManager class which implements the IStructurePersistenceManager IList <ArtefactImportStatus> importStatus = new List <ArtefactImportStatus>(); IStructurePersistenceManager persistenceManager = new MappingStoreManager(this._connectionStringSettings, importStatus); switch (actionType) { case SubmitStructureConstant.ActionType.Append: break; case SubmitStructureConstant.ActionType.Replace: // Save the structure to the mapping store database. persistenceManager.SaveStructures(objects); // Validate objects. ValidateImport(importStatus); break; case SubmitStructureConstant.ActionType.Delete: // Delete the structure to the mapping store database. persistenceManager.DeleteStructures(objects); break; default: break; } // Return the immutable object container. return(objects); }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <returns></returns> public Message SubmitStructure(Message request) { var submitStructureController = new SubmitStructureController(SettingsManager.MappingStoreConnectionSettings); var responseBuilder = new SubmitStructureResponseBuilder(); ISdmxObjects sdmxObjects; XTypedElement response; try { // Il documento template che verrà caricato con gli artefatti da importare XmlDocument xDomTemp = new XmlDocument(); // Il documento sorgente passato in input XmlDocument xDomSource = SubmitStructureUtil.MessageToXDom(request); // Creo gli elementi del file template xDomTemp.InnerXml = SubmitStructureConstant.xmlTemplate; // Valido il documento e ricavo l'action string actionValue = SubmitStructureUtil.ValidateDocument(xDomSource); SubmitStructureConstant.ActionType action = Ws.SubmitStructure.SubmitStructureConstant.ActionType.Replace; if (actionValue != string.Empty) { action = (SubmitStructureConstant.ActionType)Enum.Parse(typeof(SubmitStructureConstant.ActionType), actionValue); } // Imposto l'Header SubmitStructureUtil.SetHeader(xDomTemp, xDomSource); // Il nodo root "Structure" del template XmlNode xTempStructNode = xDomTemp.SelectSingleNode("//*[local-name()='Structure']"); // Creo il nodo "Structures" che conterrà gli artefatti XmlNode xSourceStructNode = xDomTemp.CreateNode(XmlNodeType.Element, "Structures", "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message"); // Inserisco nel nodo "Structures" gli aertefatti presenti nell' sdmx passato in input xSourceStructNode.InnerXml = xDomSource.SelectSingleNode("//*[local-name()='Structures']").InnerXml; // Aggiungo al template l'elemento "Structures" con gli artefatti da caricare xTempStructNode.AppendChild(xSourceStructNode); // Converto il documento in un MemoryReadableLocation MemoryReadableLocation mRL = new MemoryReadableLocation(SubmitStructureUtil.ConvertToBytes(xDomTemp)); // Richiamo del metodo che esegue il SaveStructures e inserisce nel DB sdmxObjects = submitStructureController.Submit(mRL, action); // Success response response = responseBuilder.BuildSuccessResponse(sdmxObjects, SdmxSchemaEnumType.VersionTwoPointOne); } catch (SubmitStructureException e) { // Error response response = responseBuilder.BuildErrorResponse(e, e.StructureReference, SdmxSchemaEnumType.VersionTwoPointOne); } catch (Exception ex) { response = responseBuilder.BuildErrorResponse(ex, new StructureReferenceImpl(), SdmxSchemaEnumType.VersionTwoPointOne); } var streamController = new StreamController <XmlWriter>( (writer, queue) => { queue.RunAll(); // This is required to write the soap envelope submitStructureController.Write(writer, response); // Write the response }); return(new SdmxMessageSoap( streamController, exception => _messageFaultBuilder.BuildException(exception, SoapOperation.SubmitStructure.ToString()), SoapOperation.SubmitStructure.GetQueryRootElementV21())); }