internal async Task AddGeneratedClientExtensionsCodeAsync(string generatedFileName) { if (!File.Exists(generatedFileName)) { await this.Context.Logger.WriteMessageAsync(LoggerMessageCategory.Warning, "Client Proxy for OData V3 was not generated."); return; } await this.Context.Logger.WriteMessageAsync(LoggerMessageCategory.Information, "Generating Client Proxy extensions class for OData V3..."); var tempFile = Path.GetTempFileName(); var t4Folder = Path.Combine(CurrentAssemblyPath, "Templates"); var functionMethods = string.Empty; if (this.ServiceConfiguration.IncludeExtensionsT4File && this.ServiceConfiguration.GenerateOperationImports) { try { functionMethods = FunctionImportsHelper.GetFunctionImportsCode(this.ServiceConfiguration); } catch (Exception ex) { await this.Context.Logger.WriteMessageAsync(LoggerMessageCategory.Error, $"Error: {ex.Message}."); } } using (var writer = File.CreateText(tempFile)) { var proxyClassText = File.ReadAllText(generatedFileName); var proxyClassNamespace = Regex.Match(proxyClassText, @"(namespace\s)\w+.+", RegexOptions.IgnoreCase | RegexOptions.Multiline).Value.Trim().Replace("namespace ", string.Empty).Trim(); var proxyClassName = Regex.Match(proxyClassText, @"(public partial class\s)\w+", RegexOptions.IgnoreCase | RegexOptions.Multiline).Value.Trim().Replace("public partial class ", string.Empty).Trim(); var text = File.ReadAllText(Path.Combine(t4Folder, Common.Constants.V3ExtensionsT4FileName)); text = Regex.Replace(text, "(namespace )\\$rootnamespace\\$", "$1" + (string.IsNullOrEmpty(ServiceConfiguration.NamespacePrefix) ? proxyClassNamespace : ServiceConfiguration.NamespacePrefix)); text = Regex.Replace(text, "\\$proxyClassName\\$", proxyClassName); text = Regex.Replace(text, "\\$functionMethods\\$", !string.IsNullOrEmpty(functionMethods) ? functionMethods : string.Empty); text = Regex.Replace(text, "\\$generationDate\\$", $"{DateTime.Now:yyyy-MM-dd hh:mm:ss}"); text = Regex.Replace(text, "(new Uri\\()\"\\$metadataDocumentUri\\$\"\\)\\)", "$1\"" + (File.Exists(ServiceConfiguration.Endpoint) ? ServiceConfiguration.Endpoint : ServiceConfiguration.Endpoint.Replace("$metadata", string.Empty)).Replace("\\", "\\\\") + "\"))"); if (this.ServiceConfiguration.OperationImportsGenerator != Constants.OperationImportsGenerator.SimpleOData) { text = Regex.Replace(text, "using Simple.OData.Client;", string.Empty); } await writer.WriteAsync(text); await writer.FlushAsync(); } await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); var outputFile = Path.Combine(this.ReferenceFileFolder, this.GeneratedFileNamePrefix + "Extensions.cs"); await this.Context.HandlerHelper.AddFileAsync(tempFile, outputFile, new AddFileOptions { OpenOnComplete = this.Instance.ServiceConfig.OpenGeneratedFilesOnComplete }); await this.Context.Logger.WriteMessageAsync(LoggerMessageCategory.Information, "Client Proxy extensions class for OData V3 was generated."); }
public Wizard(ConnectedServiceProviderContext context) { this.Context = context; this.UserSettings = UserSettings.Load(context.Logger); ConfigODataEndpointViewModel = new ConfigODataEndpointViewModel(this.UserSettings, this); AdvancedSettingsViewModel = new AdvancedSettingsViewModel(this.UserSettings, this); FunctionImportsViewModel = new FunctionImportsViewModel(this.UserSettings, this); if (this.Context.IsUpdating) { // Since ServiceConfigurationV4 is a derived type of ServiceConfiguration. So we can deserialize a ServiceConfiguration into a ServiceConfigurationV4. var serviceConfig = this.Context.GetExtendedDesignerData <ServiceConfigurationV4>(); ConfigODataEndpointViewModel.LanguageOption = serviceConfig.LanguageOption; ConfigODataEndpointViewModel.Endpoint = serviceConfig.Endpoint; ConfigODataEndpointViewModel.EdmxVersion = serviceConfig.EdmxVersion; ConfigODataEndpointViewModel.ServiceName = serviceConfig.ServiceName; ConfigODataEndpointViewModel.AcceptAllUntrustedCertificates = serviceConfig.AcceptAllUntrustedCertificates; ConfigODataEndpointViewModel.UseWebProxy = serviceConfig.UseWebProxy; ConfigODataEndpointViewModel.NetworkCredentialsDomain = serviceConfig.NetworkCredentialsDomain; ConfigODataEndpointViewModel.NetworkCredentialsUserName = serviceConfig.NetworkCredentialsUserName; ConfigODataEndpointViewModel.NetworkCredentialsPassword = serviceConfig.NetworkCredentialsPassword; ConfigODataEndpointViewModel.WebProxyNetworkCredentialsDomain = serviceConfig.WebProxyNetworkCredentialsDomain; ConfigODataEndpointViewModel.WebProxyNetworkCredentialsUserName = serviceConfig.WebProxyNetworkCredentialsUserName; ConfigODataEndpointViewModel.WebProxyNetworkCredentialsPassword = serviceConfig.WebProxyNetworkCredentialsPassword; ConfigODataEndpointViewModel.UseNetworkCredentials = serviceConfig.UseNetworkCredentials; ConfigODataEndpointViewModel.WebProxyUri = serviceConfig.WebProxyUri; if (ConfigODataEndpointViewModel.View is ConfigODataEndpoint configODataEndpoint) { configODataEndpoint.IsEnabled = false; } // The Viewmodel should always be filled otherwise if the wizard is completed without visiting this page the generated code becomes wrong AdvancedSettingsViewModel.GeneratedFileNameEnabled = false; // advancedSettings.ReferenceFileName.IsEnabled = false; AdvancedSettingsViewModel.GeneratedFileNamePrefix = serviceConfig.GeneratedFileNamePrefix; AdvancedSettingsViewModel.UseNamespacePrefix = serviceConfig.UseNameSpacePrefix; AdvancedSettingsViewModel.NamespacePrefix = serviceConfig.NamespacePrefix; AdvancedSettingsViewModel.UseDataServiceCollection = serviceConfig.UseDataServiceCollection; AdvancedSettingsViewModel.UseAsyncDataServiceCollection = serviceConfig.UseAsyncDataServiceCollection; AdvancedSettingsViewModel.OperationImportsGenerator = serviceConfig.OperationImportsGenerator; AdvancedSettingsViewModel.SelectOperationImports = serviceConfig.GenerateOperationImports; AdvancedSettingsViewModel.ExcludedOperationImportsNames = serviceConfig.ExcludedOperationImportsNames; if (serviceConfig.EdmxVersion == Common.Constants.EdmxVersion4) { AdvancedSettingsViewModel.IgnoreUnexpectedElementsAndAttributes = serviceConfig.IgnoreUnexpectedElementsAndAttributes; AdvancedSettingsViewModel.GenerateDynamicPropertiesCollection = serviceConfig.GenerateDynamicPropertiesCollection; AdvancedSettingsViewModel.DynamicPropertiesCollectionName = serviceConfig.DynamicPropertiesCollectionName; AdvancedSettingsViewModel.EnableNamingAlias = serviceConfig.EnableNamingAlias; AdvancedSettingsViewModel.IncludeT4File = serviceConfig.IncludeT4File; AdvancedSettingsViewModel.MakeTypesInternal = serviceConfig.MakeTypesInternal; AdvancedSettingsViewModel.IncludeT4FileEnabled = true; } // Restore the advanced settings to UI elements. AdvancedSettingsViewModel.PageEntering += (sender, args) => { if (sender is AdvancedSettingsViewModel advancedSettingsViewModel) { if (advancedSettingsViewModel.View is AdvancedSettings advancedSettings) { advancedSettings.ReferenceFileName.IsEnabled = false; advancedSettingsViewModel.GeneratedFileNamePrefix = serviceConfig.GeneratedFileNamePrefix; advancedSettingsViewModel.UseNamespacePrefix = serviceConfig.UseNameSpacePrefix; advancedSettingsViewModel.NamespacePrefix = serviceConfig.NamespacePrefix; advancedSettingsViewModel.UseDataServiceCollection = serviceConfig.UseDataServiceCollection; advancedSettingsViewModel.UseAsyncDataServiceCollection = serviceConfig.UseAsyncDataServiceCollection; advancedSettingsViewModel.OperationImportsGenerator = serviceConfig.OperationImportsGenerator; advancedSettingsViewModel.SelectOperationImports = serviceConfig.GenerateOperationImports; advancedSettingsViewModel.ExcludedOperationImportsNames = serviceConfig.ExcludedOperationImportsNames; if (serviceConfig.EdmxVersion == Common.Constants.EdmxVersion4) { advancedSettingsViewModel.IgnoreUnexpectedElementsAndAttributes = serviceConfig.IgnoreUnexpectedElementsAndAttributes; advancedSettingsViewModel.GenerateDynamicPropertiesCollection = serviceConfig.GenerateDynamicPropertiesCollection; advancedSettingsViewModel.DynamicPropertiesCollectionName = serviceConfig.DynamicPropertiesCollectionName; advancedSettingsViewModel.EnableNamingAlias = serviceConfig.EnableNamingAlias; advancedSettingsViewModel.IncludeT4File = serviceConfig.IncludeT4File; advancedSettingsViewModel.MakeTypesInternal = serviceConfig.MakeTypesInternal; advancedSettingsViewModel.IncludeT4FileEnabled = true; advancedSettings.IncludeT4File.IsEnabled = true; } if (!advancedSettingsViewModel.SelectOperationImports || UserSettings.LanguageOption != LanguageOption.GenerateCSharpCode) { RemoveOperationImportsSettingsPage(); } else { AddOperationImportsSettingsPage(); } } } }; FunctionImportsViewModel.FunctionImports = serviceConfig.FunctionImports ?? new List <FunctionImportModel>(); FunctionImportsViewModel.OperationImports = serviceConfig.OperationImports ?? new List <OperationImportModel>(); FunctionImportsViewModel.FunctionImportsCount = serviceConfig.FunctionImports?.Count ?? 0; FunctionImportsViewModel.OperationImportsCount = serviceConfig.OperationImports?.Count ?? 0; } AdvancedSettingsViewModel.PageEntering += (sender, args) => { if (sender is AdvancedSettingsViewModel advancedSettingsViewModel) { advancedSettingsViewModel.IncludeExtensionsT4File = AdvancedSettingsViewModel.IncludeExtensionsT4File; advancedSettingsViewModel.IncludeExtensionsT4FileVisibility = ConfigODataEndpointViewModel.EdmxVersion != Common.Constants.EdmxVersion4 ? Visibility.Visible : Visibility.Collapsed; advancedSettingsViewModel.OperationImportsGenerator = AdvancedSettingsViewModel.OperationImportsGenerator; advancedSettingsViewModel.SelectOperationImports = AdvancedSettingsViewModel.SelectOperationImports; advancedSettingsViewModel.IncludeT4FileEnabled = true; if (!advancedSettingsViewModel.SelectOperationImports || UserSettings.LanguageOption != LanguageOption.GenerateCSharpCode) { RemoveOperationImportsSettingsPage(); } else { AddOperationImportsSettingsPage(); } } }; FunctionImportsViewModel.PageEntering += (sender, args) => { if (sender is FunctionImportsViewModel functionImportsViewModel) { if (ConfigODataEndpointViewModel.EdmxVersion == Common.Constants.EdmxVersion4 && (FunctionImportsViewModel.OperationImports == null || !FunctionImportsViewModel.OperationImports.Any() || (AdvancedSettingsViewModel.UseNamespacePrefix && FunctionImportsViewModel.OperationImports.Any(fi => fi.Namespace != AdvancedSettingsViewModel.NamespacePrefix)) || FunctionImportsViewModel.OperationImports.Any(fi => !this.UserSettings.Endpoint.Contains(fi.EndpointUri)))) { FunctionImportsViewModel.OperationImports = OperationImportsHelper.GetOperationsImports( (this.CreateServiceConfiguration() as ServiceConfigurationV4).GetODataEdmModel(), AdvancedSettingsViewModel.UseNamespacePrefix ? AdvancedSettingsViewModel.NamespacePrefix : null, File.Exists(ConfigODataEndpointViewModel.Endpoint) ? ConfigODataEndpointViewModel.Endpoint : ConfigODataEndpointViewModel.Endpoint.Replace("$metadata", string.Empty)); FunctionImportsViewModel.OperationImportsCount = FunctionImportsViewModel.OperationImports?.Count ?? 0; } if (ConfigODataEndpointViewModel.EdmxVersion != Common.Constants.EdmxVersion4 && (FunctionImportsViewModel.FunctionImports == null || !FunctionImportsViewModel.FunctionImports.Any() || (AdvancedSettingsViewModel.UseNamespacePrefix && FunctionImportsViewModel.FunctionImports.Any(fi => fi.Namespace != AdvancedSettingsViewModel.NamespacePrefix)) || FunctionImportsViewModel.FunctionImports.Any(fi => !this.UserSettings.Endpoint.Contains(fi.EndpointUri)))) { FunctionImportsViewModel.FunctionImports = FunctionImportsHelper.GetFunctionImports( this.CreateServiceConfiguration().GetDataEdmModel(), AdvancedSettingsViewModel.UseNamespacePrefix ? AdvancedSettingsViewModel.NamespacePrefix : null, File.Exists(ConfigODataEndpointViewModel.Endpoint) ? ConfigODataEndpointViewModel.Endpoint : ConfigODataEndpointViewModel.Endpoint.Replace("$metadata", string.Empty)); FunctionImportsViewModel.FunctionImportsCount = FunctionImportsViewModel.FunctionImports?.Count ?? 0; } functionImportsViewModel.FunctionImports = FunctionImportsViewModel.FunctionImports; functionImportsViewModel.FunctionImportsCount = functionImportsViewModel.FunctionImports?.Count ?? 0; functionImportsViewModel.OperationImports = FunctionImportsViewModel.OperationImports; functionImportsViewModel.OperationImportsCount = functionImportsViewModel.OperationImports?.Count ?? 0; } }; this.Pages.Add(ConfigODataEndpointViewModel); this.Pages.Add(AdvancedSettingsViewModel); this.IsFinishEnabled = true; }
internal async Task AddGeneratedClientExtensionsCode(string generatedFileName) { if (!File.Exists(generatedFileName)) { await this.Context.Logger.WriteMessageAsync(LoggerMessageCategory.Warning, "Client Proxy for OData V3 was not generated."); return; } await this.Context.Logger.WriteMessageAsync(LoggerMessageCategory.Information, "Generating Client Proxy extensions class for OData V3..."); var tempFile = Path.GetTempFileName(); var t4Folder = Path.Combine(CurrentAssemblyPath, "Templates"); var proxyClassText = File.ReadAllText(generatedFileName); var proxyClassNamespace = Regex.Match(proxyClassText, @"(namespace\s)\w+.+", RegexOptions.IgnoreCase | RegexOptions.Multiline).Value.Trim().Replace("namespace ", string.Empty).Trim(); var proxyClassName = Regex.Match(proxyClassText, @"(public partial class\s)\w+", RegexOptions.IgnoreCase | RegexOptions.Multiline).Value.Trim().Replace("public partial class ", string.Empty).Trim(); var functionMethods = string.Empty; if (this.ServiceConfiguration.IncludeExtensionsT4File && this.ServiceConfiguration.GenerateFunctionImports) { try { var xmlUrlResolver = new XmlUrlResolver { Credentials = this.UseNetworkCredentials ? new NetworkCredential(this.NetworkCredentialsUserName, this.NetworkCredentialsPassword, this.NetworkCredentialsDomain) : System.Net.CredentialCache.DefaultNetworkCredentials }; if (this.UseWebProxy) { xmlUrlResolver.Proxy = new WebProxy(this.WebProxyUri, true); if (this.UseWebProxyCredentials) { xmlUrlResolver.Proxy = new WebProxy(this.WebProxyUri, true, new string[0], new NetworkCredential { UserName = WebProxyNetworkCredentialsUserName, Password = WebProxyNetworkCredentialsPassword, Domain = WebProxyNetworkCredentialsDomain }); } else { xmlUrlResolver.Proxy = new WebProxy(this.WebProxyUri); } } var settings = new XmlReaderSettings { XmlResolver = new XmlSecureResolver(xmlUrlResolver, new PermissionSet(System.Security.Permissions.PermissionState.Unrestricted)) }; using (var reader = XmlReader.Create(ServiceConfiguration.Endpoint, settings)) { if (EdmxReader.TryParse(reader, out var model, out var parseErrors)) { functionMethods = FunctionImportsHelper.GetFunctionImportsCode(model, proxyClassNamespace, proxyClassName, ServiceConfiguration.Endpoint.Replace("$metadata", string.Empty), this.ServiceConfiguration.FunctionImportsGenerator); } else { foreach (var error in parseErrors) { await this.Context.Logger.WriteMessageAsync(LoggerMessageCategory.Warning, error.ErrorMessage); } } }