Пример #1
0
        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;
        }
Пример #3
0
        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);
                            }
                        }
                    }