private static bool ValidateXmlDocument(ConnectionData connectionData, IWriteToOutput iWriteToOutput, XDocument doc) { ContentCoparerHelper.ClearRoot(doc); XmlSchemaSet schemas = new XmlSchemaSet(); { var schemasResources = AbstractDynamicCommandXsdSchemas.GetXsdSchemas(AbstractDynamicCommandXsdSchemas.SchemaRibbonXml); if (schemasResources != null) { foreach (var fileName in schemasResources) { Uri uri = FileOperations.GetSchemaResourceUri(fileName); StreamResourceInfo info = Application.GetResourceStream(uri); using (StreamReader reader = new StreamReader(info.Stream)) { schemas.Add(string.Empty, XmlReader.Create(reader)); } } } } List <ValidationEventArgs> errors = new List <ValidationEventArgs>(); doc.Validate(schemas, (o, e) => { errors.Add(e); }); if (errors.Count > 0) { iWriteToOutput.WriteToOutput(connectionData, Properties.OutputStrings.TextIsNotValidForFieldFormat1, AbstractDynamicCommandXsdSchemas.SchemaRibbonXml); foreach (var item in errors) { iWriteToOutput.WriteToOutput(connectionData, string.Empty); iWriteToOutput.WriteToOutput(connectionData, string.Empty); iWriteToOutput.WriteToOutput(connectionData, Properties.OutputStrings.XmlValidationMessageFormat2, item.Severity, item.Message); iWriteToOutput.WriteErrorToOutput(connectionData, item.Exception); } iWriteToOutput.ActivateOutputWindow(connectionData); } return(errors.Count == 0); }
public async Task PerformUpdateRibbonDiffXml(IWriteToOutput iWriteToOutput, CommonConfiguration commonConfig, XDocument doc, EntityMetadata entityMetadata, RibbonCustomization ribbonCustomization) { if (entityMetadata == null && ribbonCustomization == null) { throw new ArgumentException("entityMetadata or ribbonCustomization"); } ContentCoparerHelper.ClearRoot(doc); Publisher publisherDefault = null; { var repositoryPublisher = new PublisherRepository(_service); publisherDefault = await repositoryPublisher.GetDefaultPublisherAsync(); if (publisherDefault == null) { iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.NotFoundedDefaultPublisher); iWriteToOutput.ActivateOutputWindow(_service.ConnectionData); return; } } var solutionUniqueName = string.Format("RibbonDiffXml_{0}", Guid.NewGuid()); solutionUniqueName = solutionUniqueName.Replace("-", "_"); var solution = new Solution() { UniqueName = solutionUniqueName, FriendlyName = solutionUniqueName, Description = "Temporary solution for exporting RibbonDiffXml.", PublisherId = publisherDefault.ToEntityReference(), Version = "1.0.0.0", }; iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.CreatingNewSolutionFormat1, solutionUniqueName); solution.Id = await _service.CreateAsync(solution); iWriteToOutput.WriteToOutputSolutionUri(_service.ConnectionData, solution.UniqueName, solution.Id); try { if (entityMetadata != null) { iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.AddingInSolutionEntityFormat3, _service.ConnectionData.Name, solutionUniqueName, entityMetadata.LogicalName); { var repositorySolutionComponent = new SolutionComponentRepository(_service); await repositorySolutionComponent.AddSolutionComponentsAsync(solutionUniqueName, new[] { new SolutionComponent() { ComponentType = new OptionSetValue((int)ComponentType.Entity), ObjectId = entityMetadata.MetadataId.Value, RootComponentBehaviorEnum = SolutionComponent.Schema.OptionSets.rootcomponentbehavior.Include_Subcomponents_0, } }); } iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.ExportingSolutionAndExtractingRibbonDiffXmlForEntityFormat2, solutionUniqueName, entityMetadata.LogicalName); } else if (ribbonCustomization != null) { iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.AddingInSolutionApplicationRibbonFormat2, _service.ConnectionData.Name, solutionUniqueName); { var repositorySolutionComponent = new SolutionComponentRepository(_service); await repositorySolutionComponent.AddSolutionComponentsAsync(solutionUniqueName, new[] { new SolutionComponent() { ComponentType = new OptionSetValue((int)ComponentType.RibbonCustomization), ObjectId = ribbonCustomization.Id, RootComponentBehaviorEnum = SolutionComponent.Schema.OptionSets.rootcomponentbehavior.Include_Subcomponents_0, } }); } iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.ExportingSolutionAndExtractingApplicationRibbonDiffXmlFormat1, solutionUniqueName); } var repository = new ExportSolutionHelper(_service); var solutionBodyBinary = await repository.ExportSolutionAndGetBodyBinaryAsync(solutionUniqueName); { string fileName = EntityFileNameFormatter.GetSolutionFileName(_service.ConnectionData.Name, solution.UniqueName, "Solution Backup", "zip"); string filePath = Path.Combine(commonConfig.FolderForExport, FileOperations.RemoveWrongSymbols(fileName)); File.WriteAllBytes(filePath, solutionBodyBinary); iWriteToOutput.WriteToOutput(_service.ConnectionData, "Solution {0} Backup exported to {1}", solution.UniqueName, filePath); iWriteToOutput.WriteToOutputFilePathUri(_service.ConnectionData, filePath); } string ribbonDiffXml = string.Empty; if (entityMetadata != null) { ribbonDiffXml = ExportSolutionHelper.GetRibbonDiffXmlForEntityFromSolutionBody(entityMetadata.LogicalName, solutionBodyBinary); } else if (ribbonCustomization != null) { ribbonDiffXml = ExportSolutionHelper.GetApplicationRibbonDiffXmlFromSolutionBody(solutionBodyBinary); } ribbonDiffXml = ContentCoparerHelper.FormatXmlByConfiguration(ribbonDiffXml, commonConfig, XmlOptionsControls.RibbonFull , schemaName: AbstractDynamicCommandXsdSchemas.SchemaRibbonXml , ribbonEntityName: entityMetadata?.LogicalName ?? string.Empty ); { string filePath = string.Empty; if (entityMetadata != null) { string fileName = EntityFileNameFormatter.GetEntityRibbonDiffXmlFileName(_service.ConnectionData.Name, entityMetadata.LogicalName, "BackUp", "xml"); filePath = Path.Combine(commonConfig.FolderForExport, FileOperations.RemoveWrongSymbols(fileName)); iWriteToOutput.WriteToOutput(_service.ConnectionData, "{0} RibbonDiffXml BackUp exported to {1}", entityMetadata.LogicalName, filePath); } else if (ribbonCustomization != null) { string fileName = EntityFileNameFormatter.GetApplicationRibbonDiffXmlFileName(_service.ConnectionData.Name, "BackUp", "xml"); filePath = Path.Combine(commonConfig.FolderForExport, FileOperations.RemoveWrongSymbols(fileName)); iWriteToOutput.WriteToOutput(_service.ConnectionData, "Application RibbonDiffXml BackUp exported to {0}", filePath); } File.WriteAllText(filePath, ribbonDiffXml, new UTF8Encoding(false)); iWriteToOutput.WriteToOutputFilePathUri(_service.ConnectionData, filePath); } if (entityMetadata != null) { solutionBodyBinary = ExportSolutionHelper.ReplaceRibbonDiffXmlForEntityInSolutionBody(entityMetadata.LogicalName, solutionBodyBinary, doc.Root); } else if (ribbonCustomization != null) { solutionBodyBinary = ExportSolutionHelper.ReplaceApplicationRibbonDiffXmlInSolutionBody(solutionBodyBinary, doc.Root); } { string fileName = EntityFileNameFormatter.GetSolutionFileName(_service.ConnectionData.Name, solution.UniqueName, "Changed Solution Backup", "zip"); string filePath = Path.Combine(commonConfig.FolderForExport, FileOperations.RemoveWrongSymbols(fileName)); File.WriteAllBytes(filePath, solutionBodyBinary); iWriteToOutput.WriteToOutput(_service.ConnectionData, "Changed Solution {0} Backup exported to {1}", solution.UniqueName, filePath); iWriteToOutput.WriteToOutputFilePathUri(_service.ConnectionData, filePath); } iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.ImportingSolutionFormat1, solutionUniqueName); await repository.ImportSolutionAsync(solutionBodyBinary); await DeleteSolution(iWriteToOutput, solution); { var repositoryPublish = new PublishActionsRepository(_service); if (entityMetadata != null) { iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.PublishingEntitiesFormat2, _service.ConnectionData.Name, entityMetadata.LogicalName); await repositoryPublish.PublishEntitiesAsync(new[] { entityMetadata.LogicalName }); } else if (ribbonCustomization != null) { iWriteToOutput.WriteToOutput(_service.ConnectionData, Properties.WindowStatusStrings.PublishingApplicationRibbonFormat1, _service.ConnectionData.Name); await repositoryPublish.PublishApplicationRibbonAsync(); } } } finally { #pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed DeleteSolution(iWriteToOutput, solution); #pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed } }