public void UpdateRaml(string ramlFilePath)
        {
            var dte  = ServiceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);
            var contractsFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar + ContractsFolderName + Path.DirectorySeparatorChar;

            var refFilePath        = InstallerServices.GetRefFilePath(ramlFilePath);
            var includesFolderPath = contractsFolderPath + Path.DirectorySeparatorChar + InstallerServices.IncludesFolderName;
            var ramlSource         = RamlReferenceReader.GetRamlSource(refFilePath);

            if (string.IsNullOrWhiteSpace(ramlSource))
            {
                ramlSource = ramlFilePath;
            }

            var includesManager = new RamlIncludesManager();
            var result          = includesManager.Manage(ramlSource, includesFolderPath, contractsFolderPath + Path.DirectorySeparatorChar);

            if (result.IsSuccess)
            {
                File.WriteAllText(ramlFilePath, result.ModifiedContents);
                var parameters = new RamlChooserActionParams(ramlFilePath, ramlFilePath, null, null,
                                                             Path.GetFileName(ramlFilePath).ToLowerInvariant(),
                                                             RamlReferenceReader.GetRamlNamespace(refFilePath), null)
                {
                    UseAsyncMethods = RamlReferenceReader.GetRamlUseAsyncMethods(refFilePath),
                    IncludeApiVersionInRoutePrefix = RamlReferenceReader.GetRamlIncludeApiVersionInRoutePrefix(refFilePath),
                    ModelsFolder = RamlReferenceReader.GetModelsFolder(refFilePath),
                    ImplementationControllersFolder = RamlReferenceReader.GetImplementationControllersFolder(refFilePath),
                    AddGeneratedSuffixToFiles       = RamlReferenceReader.GetAddGeneratedSuffix(refFilePath)
                };
                Scaffold(ramlFilePath, parameters);
            }
        }
        private void AddOrUpdateUnitTestsControllerBase(RamlChooserActionParams parameters, string unitTestFolderPath,
                                                        WebApiGeneratorModel model, ProjectItem folderItem, string extensionPath)
        {
            templatesManager.CopyServerTemplateToProjectFolder(unitTestFolderPath, UnitTestsControllerTemplateName,
                                                               RAML.Tools.Properties.Settings.Default.BaseControllerTestsTemplateTitle, TemplateSubFolder);
            var templatesFolder = Path.Combine(unitTestFolderPath, "Templates");

            var targetFolderPath = GetTargetFolderPath(unitTestFolderPath, Path.GetFileName(parameters.RamlFilePath));

            var controllerBaseTemplateParams =
                new TemplateParams <ControllerObject>(Path.Combine(templatesFolder, UnitTestsControllerTemplateName),
                                                      folderItem, "controllerObject", model.Controllers, targetFolderPath, folderItem, extensionPath,
                                                      parameters.ControllersNamespace, "ControllerTests", true,
                                                      GetVersionPrefix(parameters.IncludeApiVersionInRoutePrefix, model.ApiVersion))
            {
                Title            = RAML.Tools.Properties.Settings.Default.BaseControllerTestsTemplateTitle,
                IncludeHasModels = true,
                HasModels        = model.Objects.Any(o => o.IsScalar == false) || model.Enums.Any(),
                UseAsyncMethods  = parameters.UseAsyncMethods,
                IncludeApiVersionInRoutePrefix = parameters.IncludeApiVersionInRoutePrefix,
                ApiVersion      = model.ApiVersion,
                TargetFolder    = targetFolderPath,
                TestsNamespace  = parameters.TestsNamespace,
                ModelsNamespace = parameters.ModelsNamespace
            };

            codeGenerator.GenerateCodeFromTemplate(controllerBaseTemplateParams);
        }
        private void AddOrUpdateModels(RamlChooserActionParams parameters, string contractsFolderPath, ProjectItem ramlItem, WebApiGeneratorModel model, ProjectItem contractsFolderItem, string extensionPath)
        {
            templatesManager.CopyServerTemplateToProjectFolder(contractsFolderPath, ModelTemplateName,
                                                               Settings.Default.ModelsTemplateTitle, TemplateSubFolder);
            var templatesFolder = Path.Combine(contractsFolderPath, "Templates");

            var models = model.Objects;

            // when is an XML model, skip empty objects
            if (model.Objects.Any(o => !string.IsNullOrWhiteSpace(o.GeneratedCode)))
            {
                models = model.Objects.Where(o => o.Properties.Any() || !string.IsNullOrWhiteSpace(o.GeneratedCode));
            }

            models = models.Where(o => !o.IsArray || o.Type == null); // skip array of primitives
            models = models.Where(o => !o.IsScalar);                  // skip scalar types

            var targetFolderPath = GetTargetFolderPath(contractsFolderPath, ramlItem.FileNames[0]);

            var apiObjectTemplateParams = new TemplateParams <ApiObject>(
                Path.Combine(templatesFolder, ModelTemplateName), ramlItem, "apiObject", models,
                contractsFolderPath, contractsFolderItem, extensionPath, parameters.TargetNamespace,
                GetVersionPrefix(parameters.IncludeApiVersionInRoutePrefix, model.ApiVersion) +
                (parameters.AddGeneratedSuffixToFiles ? ".generated" : string.Empty))
            {
                Title          = Settings.Default.ModelsTemplateTitle,
                RelativeFolder = parameters.ModelsFolder,
                TargetFolder   = TargetFolderResolver.GetModelsTargetFolder(ramlItem.ContainingProject,
                                                                            targetFolderPath, parameters.ModelsFolder)
            };

            codeGenerator.GenerateCodeFromTemplate(apiObjectTemplateParams);
        }
示例#4
0
        public override void AddRamlReference(RamlChooserActionParams parameters)
        {
            try
            {
                Logger.LogInformation("Add RAML Reference process started");
                var dte  = ServiceProvider.GetService(typeof(SDTE)) as DTE;
                var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

                AddPortableImports(proj);

                InstallNugetDependencies(proj);
                Logger.LogInformation("Nuget Dependencies installed");

                AddFilesToProject(parameters.RamlFilePath, proj, parameters.TargetNamespace, parameters.RamlSource, parameters.TargetFileName, parameters.ClientRootClassName);
                Logger.LogInformation("Files added to project");
            }
            catch (Exception ex)
            {
                Logger.LogError(ex);
                var errorMessage = "Error when trying to add the RAML reference. " + ex.Message;
                if (ex.InnerException != null)
                {
                    errorMessage += " - " + ex.InnerException;
                }

                MessageBox.Show(errorMessage);
                throw;
            }
        }
        public void ScaffoldToProject(RamlChooserActionParams parameters, Project proj)
        {
            Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
            var data = parameters.Data;

            if (data == null || data.RamlDocument == null)
            {
                return;
            }

            var model = new WebApiGeneratorService(data.RamlDocument, parameters.ControllersNamespace, parameters.ModelsNamespace).BuildModel();

            var unitTestsFolderItem = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, UnitTestsFolderName);
            var unitTestsFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar +
                                      UnitTestsFolderName + Path.DirectorySeparatorChar;

            var templates = new[]
            {
                UnitTestsControllerTemplateName,
                UnitTestsControllerImplementationTemplateName,
                ModelTemplateName,
                EnumTemplateName
            };

            if (!templatesManager.ConfirmWhenIncompatibleServerTemplate(unitTestsFolderPath, templates))
            {
                return;
            }

            var extensionPath = Path.GetDirectoryName(GetType().Assembly.Location) + Path.DirectorySeparatorChar;

            AddOrUpdateUnitTestsControllerBase(parameters, unitTestsFolderPath, model, unitTestsFolderItem, extensionPath);
            AddOrUpdateUnitTestsControllerImplementations(parameters, unitTestsFolderPath, proj, model, unitTestsFolderItem, extensionPath);
        }
示例#6
0
        public void AddContract(RamlChooserActionParams parameters)
        {
            var dte  = serviceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            InstallNugetDependencies(proj);
            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                AddXmlFormatterInWebApiConfig(proj);
            }

            var folderItem          = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, contractsFolderName);
            var contractsFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar + contractsFolderName + Path.DirectorySeparatorChar;

            var targetFolderPath = GetTargetFolderPath(contractsFolderPath, parameters.TargetFileName, proj);

            if (!Directory.Exists(targetFolderPath))
            {
                Directory.CreateDirectory(targetFolderPath);
            }

            if (string.IsNullOrWhiteSpace(parameters.RamlSource) && !string.IsNullOrWhiteSpace(parameters.RamlTitle))
            {
                AddEmptyContract(folderItem, contractsFolderPath, parameters);
            }
            else
            {
                AddContractFromFile(folderItem, contractsFolderPath, parameters);
            }
        }
        public override void AddContract(RamlChooserActionParams parameters)
        {
            var dte  = ServiceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            InstallNugetDependencies(proj, newtonsoftJsonForCorePackageVersion);

            var folderItem          = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, ContractsFolderName);
            var contractsFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar + ContractsFolderName + Path.DirectorySeparatorChar;

            var targetFolderPath = GetTargetFolderPath(contractsFolderPath, parameters.TargetFileName);

            if (!Directory.Exists(targetFolderPath))
            {
                Directory.CreateDirectory(targetFolderPath);
            }

            if (string.IsNullOrWhiteSpace(parameters.RamlSource) && !string.IsNullOrWhiteSpace(parameters.RamlTitle))
            {
                AddEmptyContract(folderItem, contractsFolderPath, parameters);
            }
            else
            {
                AddContractFromFile(folderItem, contractsFolderPath, parameters);
            }
        }
示例#8
0
        public override void AddContract(RamlChooserActionParams parameters)
        {
            Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
            Tracking.Track("Asp.Net WebApi Scaffold");

            var dte  = ServiceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            InstallDependencies(proj, newtonsoftJsonPackageVersion);

            AddXmlFormatterInWebApiConfig(proj);

            var folderItem          = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, ContractsFolderName);
            var contractsFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar + ContractsFolderName + Path.DirectorySeparatorChar;

            var targetFolderPath = GetTargetFolderPath(contractsFolderPath, parameters.TargetFileName);

            if (!Directory.Exists(targetFolderPath))
            {
                Directory.CreateDirectory(targetFolderPath);
            }

            if (string.IsNullOrWhiteSpace(parameters.RamlSource) && !string.IsNullOrWhiteSpace(parameters.RamlTitle))
            {
                AddEmptyContract(folderItem, contractsFolderPath, parameters);
            }
            else
            {
                AddContractFromFile(folderItem, contractsFolderPath, parameters);
            }
        }
        private void AddOrUpdateControllerImplementations(RamlChooserActionParams parameters, string contractsFolderPath, Project proj,
                                                          WebApiGeneratorModel model, ProjectItem folderItem, string extensionPath)
        {
            templatesManager.CopyServerTemplateToProjectFolder(contractsFolderPath, ControllerImplementationTemplateName,
                                                               Settings.Default.ControllerImplementationTemplateTitle, TemplateSubFolder);
            var controllersFolderItem = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, "Controllers");

            var templatesFolder = Path.Combine(contractsFolderPath, "Templates");
            var controllerImplementationTemplateParams =
                new TemplateParams <ControllerObject>(
                    Path.Combine(templatesFolder, ControllerImplementationTemplateName),
                    controllersFolderItem, "controllerObject", model.Controllers, contractsFolderPath, folderItem,
                    extensionPath, parameters.TargetNamespace, "Controller", false,
                    GetVersionPrefix(parameters.IncludeApiVersionInRoutePrefix, model.ApiVersion))
            {
                TargetFolder     = TargetFolderResolver.GetImplementationControllersFolderPath(proj, parameters.ImplementationControllersFolder),
                RelativeFolder   = parameters.ImplementationControllersFolder,
                Title            = Settings.Default.ControllerImplementationTemplateTitle,
                IncludeHasModels = true,
                HasModels        = model.Objects.Any(o => o.IsScalar == false) || model.Enums.Any(),
                UseAsyncMethods  = parameters.UseAsyncMethods,
                IncludeApiVersionInRoutePrefix = parameters.IncludeApiVersionInRoutePrefix,
                ApiVersion = model.ApiVersion
            };

            codeGenerator.GenerateCodeFromTemplate(controllerImplementationTemplateParams);
        }
        private void AddOrUpdateControllerBase(RamlChooserActionParams parameters, string contractsFolderPath, ProjectItem ramlItem,
                                               WebApiGeneratorModel model, ProjectItem folderItem, string extensionPath)
        {
            templatesManager.CopyServerTemplateToProjectFolder(contractsFolderPath, ControllerBaseTemplateName,
                                                               Settings.Default.BaseControllerTemplateTitle, TemplateSubFolder);
            var templatesFolder = Path.Combine(contractsFolderPath, "Templates");

            var targetFolderPath = GetTargetFolderPath(contractsFolderPath, ramlItem.FileNames[0]);

            var controllerBaseTemplateParams =
                new TemplateParams <ControllerObject>(Path.Combine(templatesFolder, ControllerBaseTemplateName),
                                                      ramlItem, "controllerObject", model.Controllers, targetFolderPath, folderItem, extensionPath,
                                                      parameters.TargetNamespace, "Controller", true,
                                                      GetVersionPrefix(parameters.IncludeApiVersionInRoutePrefix, model.ApiVersion))
            {
                Title            = Settings.Default.BaseControllerTemplateTitle,
                IncludeHasModels = true,
                HasModels        = model.Objects.Any(o => o.IsScalar == false) || model.Enums.Any(),
                UseAsyncMethods  = parameters.UseAsyncMethods,
                IncludeApiVersionInRoutePrefix = parameters.IncludeApiVersionInRoutePrefix,
                ApiVersion   = model.ApiVersion,
                TargetFolder = targetFolderPath
            };

            codeGenerator.GenerateCodeFromTemplate(controllerBaseTemplateParams);
        }
        public void Scaffold(string ramlSource, RamlChooserActionParams parameters)
        {
            Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
            var dte  = ServiceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            ScaffoldToProject(parameters, proj);
        }
示例#12
0
        public void Scaffold(string ramlSource, RamlChooserActionParams parameters)
        {
            var data = RamlScaffolderHelper.GetRamlData(ramlSource, parameters.TargetNamespace);

            if (data == null || data.Model == null)
            {
                return;
            }

            var model = data.Model;

            var dte  = serviceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            var contractsFolderItem = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, contractsFolderName);
            var ramlItem            =
                contractsFolderItem.ProjectItems.Cast <ProjectItem>()
                .First(i => i.Name.ToLowerInvariant() == parameters.TargetFileName.ToLowerInvariant());
            var contractsFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar +
                                      contractsFolderName + Path.DirectorySeparatorChar;

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                templateSubFolder = "AspNet5";
            }
            else
            {
                templateSubFolder = "RAMLWebApi2Scaffolder";
            }

            var templates = new[]
            {
                ControllerBaseTemplateName,
                ControllerInterfaceTemplateName,
                ControllerImplementationTemplateName,
                ModelTemplateName,
                EnumTemplateName
            };

            if (!templatesManager.ConfirmWhenIncompatibleServerTemplate(contractsFolderPath, templates))
            {
                return;
            }

            var extensionPath = Path.GetDirectoryName(GetType().Assembly.Location) + Path.DirectorySeparatorChar;

            AddOrUpdateModels(parameters, contractsFolderPath, ramlItem, model, contractsFolderItem, extensionPath);

            AddOrUpdateEnums(parameters, contractsFolderPath, ramlItem, model, contractsFolderItem, extensionPath);

            AddOrUpdateControllerBase(parameters, contractsFolderPath, ramlItem, model, contractsFolderItem, extensionPath);

            AddOrUpdateControllerInterfaces(parameters, contractsFolderPath, ramlItem, model, contractsFolderItem, extensionPath);

            AddOrUpdateControllerImplementations(parameters, contractsFolderPath, proj, model, contractsFolderItem, extensionPath);
        }
 private RamlProperties Map(RamlChooserActionParams parameters)
 {
     return(new RamlProperties
     {
         IncludeApiVersionInRoutePrefix = parameters.IncludeApiVersionInRoutePrefix,
         UseAsyncMethods = parameters.UseAsyncMethods,
         Namespace = parameters.TargetNamespace,
         Source = parameters.RamlSource,
         ClientName = parameters.ClientRootClassName,
         ModelsFolder = parameters.ModelsFolder,
         ImplementationControllersFolder = parameters.ImplementationControllersFolder,
         AddGeneratedSuffix = parameters.AddGeneratedSuffixToFiles
     });
 }
示例#14
0
        public void AddContract(RamlChooserActionParams parameters)
        {
            var dte                 = serviceProvider.GetService(typeof(SDTE)) as DTE;
            var proj                = VisualStudioAutomationHelper.GetActiveProject(dte);
            var folderItem          = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, folderName);
            var generatedFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar + folderName + Path.DirectorySeparatorChar;

            if (string.IsNullOrWhiteSpace(parameters.RamlSource) && !string.IsNullOrWhiteSpace(parameters.RamlTitle))
            {
                AddEmptyContract(parameters.TargetFileName, parameters.RamlTitle, folderItem, generatedFolderPath, parameters.TargetNamespace, parameters.TargetFileName);
            }
            else
            {
                AddContractFromFile(parameters.RamlFilePath, parameters.TargetNamespace, parameters.RamlSource,
                                    parameters.DoNotScaffold, folderItem, generatedFolderPath, parameters.TargetFileName);
            }
        }
        private void AddOrUpdateModels(RamlChooserActionParams parameters, string contractsFolderPath, ProjectItem ramlItem, WebApiGeneratorModel model, ProjectItem contractsFolderItem, string extensionPath)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            templatesManager.CopyServerTemplateToProjectFolder(contractsFolderPath, ModelTemplateName,
                                                               RAML.Tools.Properties.Settings.Default.ModelsTemplateTitle, TemplateSubFolder);
            var templatesFolder = Path.Combine(contractsFolderPath, "Templates");

            var models = model.Objects;

            // when is an XML model, skip empty objects
            if (model.Objects.Any(o => !string.IsNullOrWhiteSpace(o.GeneratedCode)))
            {
                models = model.Objects.Where(o => o.Properties.Any() || !string.IsNullOrWhiteSpace(o.GeneratedCode));
            }

            // when array has no properties, set it collection on base type
            foreach (var arrayModel in models.Where(o => o.IsArray && o.Properties.Count == 0 && o.Type != null &&
                                                    CollectionTypeHelper.IsCollection(o.Type) && !NewNetTypeMapper.IsPrimitiveType(CollectionTypeHelper.GetBaseType(o.Type))))
            {
                arrayModel.BaseClass = arrayModel.Type.Substring(1); // remove the initil "I" to make it a concrete class
            }
            // skip array of primitives
            models = models.Where(o => o.Type == null || !(CollectionTypeHelper.IsCollection(o.Type) &&
                                                           NewNetTypeMapper.IsPrimitiveType(CollectionTypeHelper.GetBaseType(o.Type))));
            models = models.Where(o => !o.IsScalar); // skip scalar types

            var targetFolderPath = GetTargetFolderPath(contractsFolderPath, ramlItem.FileNames[0]);

            var apiObjectTemplateParams = new TemplateParams <ApiObject>(
                Path.Combine(templatesFolder, ModelTemplateName), ramlItem, "apiObject", models,
                contractsFolderPath, contractsFolderItem, extensionPath, parameters.ControllersNamespace,
                GetVersionPrefix(parameters.IncludeApiVersionInRoutePrefix, model.ApiVersion) +
                (parameters.AddGeneratedSuffixToFiles ? ".generated" : string.Empty))
            {
                Title          = RAML.Tools.Properties.Settings.Default.ModelsTemplateTitle,
                RelativeFolder = parameters.ModelsFolder,
                TargetFolder   = TargetFolderResolver.GetModelsTargetFolder(ramlItem.ContainingProject,
                                                                            targetFolderPath, parameters.ModelsFolder),
                ModelsNamespace = parameters.ModelsNamespace
            };

            codeGenerator.GenerateCodeFromTemplate(apiObjectTemplateParams);
        }
        private static void ScaffoldMainRamlFiles(IEnumerable <string> ramlFiles)
        {
            var service = GetRamlScaffoldService(Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider);

            foreach (var ramlFile in ramlFiles)
            {
                var refFilePath = InstallerServices.GetRefFilePath(ramlFile);
                var includeApiVersionInRoutePrefix = RamlReferenceReader.GetRamlIncludeApiVersionInRoutePrefix(refFilePath);
                var parameters = new RamlChooserActionParams(ramlFile, ramlFile, null, null, Path.GetFileName(ramlFile),
                                                             RamlReferenceReader.GetRamlNamespace(refFilePath), null)
                {
                    UseAsyncMethods = RamlReferenceReader.GetRamlUseAsyncMethods(refFilePath),
                    IncludeApiVersionInRoutePrefix = includeApiVersionInRoutePrefix,
                    ModelsFolder = RamlReferenceReader.GetModelsFolder(refFilePath),
                    ImplementationControllersFolder = RamlReferenceReader.GetImplementationControllersFolder(refFilePath),
                    AddGeneratedSuffixToFiles       = RamlReferenceReader.GetAddGeneratedSuffix(refFilePath)
                };
                service.Scaffold(ramlFile, parameters);
            }
        }
示例#17
0
        public override void AddTests(RamlChooserActionParams parameters)
        {
            Tracking.Track("Unit Tests Scaffold (Asp.Net Core)");

            var dte  = ServiceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            InstallDependencies(proj);

            var folderItem          = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, UnitTestsFolderName);
            var contractsFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar + UnitTestsFolderName + Path.DirectorySeparatorChar;

            var targetFolderPath = GetTargetFolderPath(contractsFolderPath, parameters.TargetFileName);

            if (!Directory.Exists(targetFolderPath))
            {
                Directory.CreateDirectory(targetFolderPath);
            }

            AddUnitTests(folderItem, contractsFolderPath, parameters);
        }
        private void AddOrUpdateEnums(RamlChooserActionParams parameters, string contractsFolderPath, ProjectItem ramlItem, WebApiGeneratorModel model, ProjectItem folderItem, string extensionPath)
        {
            templatesManager.CopyServerTemplateToProjectFolder(contractsFolderPath, EnumTemplateName,
                                                               Settings.Default.EnumsTemplateTitle, TemplateSubFolder);
            var templatesFolder = Path.Combine(contractsFolderPath, "Templates");

            var targetFolderPath = GetTargetFolderPath(contractsFolderPath, ramlItem.FileNames[0]);

            var apiEnumTemplateParams = new TemplateParams <ApiEnum>(
                Path.Combine(templatesFolder, EnumTemplateName), ramlItem, "apiEnum", model.Enums,
                targetFolderPath, folderItem, extensionPath, parameters.TargetNamespace,
                GetVersionPrefix(parameters.IncludeApiVersionInRoutePrefix, model.ApiVersion))
            {
                Title          = Settings.Default.ModelsTemplateTitle,
                RelativeFolder = parameters.ModelsFolder,
                TargetFolder   = TargetFolderResolver.GetModelsTargetFolder(ramlItem.ContainingProject,
                                                                            targetFolderPath, parameters.ModelsFolder)
            };

            codeGenerator.GenerateCodeFromTemplate(apiEnumTemplateParams);
        }
示例#19
0
        private void AddContractFromFile(ProjectItem folderItem, string folderPath, RamlChooserActionParams parameters)
        {
            var includesFolderPath = folderPath + Path.DirectorySeparatorChar + InstallerServices.IncludesFolderName;

            var includesManager = new RamlIncludesManager();
            var result          = includesManager.Manage(parameters.RamlSource, includesFolderPath, confirmOverrite: true, rootRamlPath: folderPath + Path.DirectorySeparatorChar);

            var includesFolderItem = folderItem.ProjectItems.Cast <ProjectItem>().FirstOrDefault(i => i.Name == InstallerServices.IncludesFolderName);

            if (includesFolderItem == null && !VisualStudioAutomationHelper.IsAVisualStudio2015Project(folderItem.ContainingProject))
            {
                includesFolderItem = folderItem.ProjectItems.AddFolder(InstallerServices.IncludesFolderName);
            }

            foreach (var file in result.IncludedFiles)
            {
                if (!VisualStudioAutomationHelper.IsAVisualStudio2015Project(folderItem.ContainingProject) || !File.Exists(file))
                {
                    includesFolderItem.ProjectItems.AddFromFile(file);
                }
            }

            //var existingIncludeItems = includesFolderItem.ProjectItems.Cast<ProjectItem>();
            //var oldIncludedFiles = existingIncludeItems.Where(item => !result.IncludedFiles.Contains(item.FileNames[0]));
            //InstallerServices.RemoveSubItemsAndAssociatedFiles(oldIncludedFiles);

            var ramlProjItem = AddOrUpdateRamlFile(result.ModifiedContents, folderItem, folderPath, parameters.TargetFileName);

            InstallerServices.RemoveSubItemsAndAssociatedFiles(ramlProjItem);

            var targetFolderPath = GetTargetFolderPath(folderPath, parameters.TargetFileName, folderItem.ContainingProject);

            RamlProperties props       = Map(parameters);
            var            refFilePath = InstallerServices.AddRefFile(parameters.RamlFilePath, targetFolderPath, parameters.TargetFileName, props);

            ramlProjItem.ProjectItems.AddFromFile(refFilePath);

            Scaffold(ramlProjItem.FileNames[0], parameters);
        }
        public void AddRamlReference(RamlChooserActionParams parameters)
        {
            try
            {
                ActivityLog.LogInformation(VisualStudioAutomationHelper.RamlVsToolsActivityLogSource, "Add RAML Reference process started");
                var dte  = serviceProvider.GetService(typeof(SDTE)) as DTE;
                var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

                InstallNugetDependencies(proj);
                ActivityLog.LogInformation(VisualStudioAutomationHelper.RamlVsToolsActivityLogSource, "Nuget Dependencies installed");

                AddFilesToProject(parameters.RamlFilePath, proj, parameters.TargetNamespace, parameters.RamlSource, parameters.TargetFileName, parameters.ClientRootClassName);
                ActivityLog.LogInformation(VisualStudioAutomationHelper.RamlVsToolsActivityLogSource, "Files added to project");
            }
            catch (Exception ex)
            {
                ActivityLog.LogError(VisualStudioAutomationHelper.RamlVsToolsActivityLogSource,
                                     VisualStudioAutomationHelper.GetExceptionInfo(ex));
                MessageBox.Show("Error when trying to add the RAML reference. " + ex.Message);
                throw;
            }
        }
        public void AddContract(RamlChooserActionParams parameters)
        {
            var dte  = serviceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            InstallNugetDependencies(proj);
            AddXmlFormatterInWebApiConfig(proj);

            var folderItem          = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, ContractsFolderName);
            var generatedFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar + ContractsFolderName + Path.DirectorySeparatorChar;

            if (string.IsNullOrWhiteSpace(parameters.RamlSource) && !string.IsNullOrWhiteSpace(parameters.RamlTitle))
            {
                AddEmptyContract(parameters.TargetFileName, parameters.RamlTitle, folderItem, generatedFolderPath,
                                 parameters.TargetNamespace, parameters.TargetFileName, parameters.UseAsyncMethods);
            }
            else
            {
                AddContractFromFile(parameters.RamlFilePath, parameters.TargetNamespace, parameters.RamlSource, folderItem,
                                    generatedFolderPath, parameters.TargetFileName, parameters.UseAsyncMethods);
            }
        }
        protected void AddEmptyContract(ProjectItem folderItem, string folderPath, RamlChooserActionParams parameters)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            var newContractFile = Path.Combine(folderPath, parameters.TargetFileName);
            var contents        = CreateNewRamlContents(parameters.RamlTitle);

            ProjectItem ramlProjItem;

            if (File.Exists(newContractFile))
            {
                var dialogResult = InstallerServices.ShowConfirmationDialog(parameters.TargetFileName);
                if (dialogResult == MessageBoxResult.Yes)
                {
                    File.WriteAllText(newContractFile, contents);
                    ramlProjItem = folderItem.ProjectItems.AddFromFile(newContractFile);
                }
                else
                {
#pragma warning disable VSTHRD010 // Invoke single-threaded types on Main thread
                    ramlProjItem = folderItem.ProjectItems.Cast <ProjectItem>().FirstOrDefault(i => i.Name == newContractFile);
#pragma warning restore VSTHRD010 // Invoke single-threaded types on Main thread
                    if (ramlProjItem == null)
                    {
                        ramlProjItem = folderItem.ProjectItems.AddFromFile(newContractFile);
                    }
                }
            }
            else
            {
                File.WriteAllText(newContractFile, contents);
                ramlProjItem = folderItem.ProjectItems.AddFromFile(newContractFile);
            }

            var props            = Map(parameters);
            var targetFolderPath = GetTargetFolderPath(folderPath, parameters.TargetFileName);
            var refFilePath      = InstallerServices.AddRefFile(newContractFile, targetFolderPath, parameters.TargetFileName, props);
            ramlProjItem.ProjectItems.AddFromFile(refFilePath);
        }
        protected void AddUnitTests(ProjectItem folderItem, string folderPath, RamlChooserActionParams parameters)
        {
            Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
            var includesFolderPath = folderPath + Path.DirectorySeparatorChar + InstallerServices.IncludesFolderName;

            var includesManager = new RamlIncludesManager();
            var result          = includesManager.Manage(parameters.RamlSource, includesFolderPath, confirmOverrite: true, rootRamlPath: folderPath + Path.DirectorySeparatorChar);

            ManageIncludes(folderItem, result);

            var ramlProjItem = AddOrUpdateRamlFile(result.ModifiedContents, folderItem, folderPath, parameters.TargetFileName);

            InstallerServices.RemoveSubItemsAndAssociatedFiles(ramlProjItem);

            var targetFolderPath = GetTargetFolderPath(folderPath, parameters.TargetFileName);

            RamlProperties props       = Map(parameters);
            var            refFilePath = InstallerServices.AddRefFile(parameters.RamlFilePath, targetFolderPath, parameters.TargetFileName, props);

            ramlProjItem.ProjectItems.AddFromFile(refFilePath);

            Scaffold(ramlProjItem.FileNames[0], parameters);
        }
        protected void AddEmptyContract(ProjectItem folderItem, string folderPath, RamlChooserActionParams parameters)
        {
            var newContractFile = Path.Combine(folderPath, parameters.TargetFileName);
            var contents        = CreateNewRamlContents(parameters.RamlTitle);

            ProjectItem ramlProjItem;

            if (File.Exists(newContractFile))
            {
                var dialogResult = InstallerServices.ShowConfirmationDialog(parameters.TargetFileName);
                if (dialogResult == MessageBoxResult.Yes)
                {
                    File.WriteAllText(newContractFile, contents);
                    ramlProjItem = folderItem.ProjectItems.AddFromFile(newContractFile);
                }
                else
                {
                    ramlProjItem = folderItem.ProjectItems.Cast <ProjectItem>().FirstOrDefault(i => i.Name == newContractFile);
                    if (ramlProjItem == null)
                    {
                        ramlProjItem = folderItem.ProjectItems.AddFromFile(newContractFile);
                    }
                }
            }
            else
            {
                File.WriteAllText(newContractFile, contents);
                ramlProjItem = folderItem.ProjectItems.AddFromFile(newContractFile);
            }

            var props            = Map(parameters);
            var targetFolderPath = GetTargetFolderPath(folderPath, parameters.TargetFileName);
            var refFilePath      = InstallerServices.AddRefFile(newContractFile, targetFolderPath, parameters.TargetFileName, props);

            ramlProjItem.ProjectItems.AddFromFile(refFilePath);
        }
        public void Scaffold(string ramlSource, RamlChooserActionParams parameters)
        {
            var data = parameters.Data;

            if (data == null || data.RamlDocument == null)
            {
                return;
            }

            var model = new WebApiGeneratorService(data.RamlDocument, parameters.ControllersNamespace, parameters.ModelsNamespace).BuildModel();

            var dte  = ServiceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            var contractsFolderItem = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, ContractsFolderName);
            var ramlItem            =
                contractsFolderItem.ProjectItems.Cast <ProjectItem>()
                .First(i => i.Name.ToLowerInvariant() == parameters.TargetFileName.ToLowerInvariant());
            var contractsFolderPath = Path.GetDirectoryName(proj.FullName) + Path.DirectorySeparatorChar +
                                      ContractsFolderName + Path.DirectorySeparatorChar;

            var templates = new[]
            {
                ControllerBaseTemplateName,
                ControllerInterfaceTemplateName,
                ControllerImplementationTemplateName,
                ModelTemplateName,
                EnumTemplateName
            };

            if (!templatesManager.ConfirmWhenIncompatibleServerTemplate(contractsFolderPath, templates))
            {
                return;
            }

            var extensionPath = Path.GetDirectoryName(GetType().Assembly.Location) + Path.DirectorySeparatorChar;

            AddOrUpdateModels(parameters, contractsFolderPath, ramlItem, model, contractsFolderItem, extensionPath);

            AddOrUpdateEnums(parameters, contractsFolderPath, ramlItem, model, contractsFolderItem, extensionPath);

            AddOrUpdateControllerBase(parameters, contractsFolderPath, ramlItem, model, contractsFolderItem, extensionPath);

            AddOrUpdateControllerInterfaces(parameters, contractsFolderPath, ramlItem, model, contractsFolderItem, extensionPath);

            AddOrUpdateControllerImplementations(parameters, contractsFolderPath, proj, model, contractsFolderItem, extensionPath);

            AddJsonSchemaParsingErrors(model.Warnings, contractsFolderPath, contractsFolderItem, ramlItem);

            if (parameters.GenerateUnitTests.HasValue && parameters.GenerateUnitTests.Value)
            {
                var testsProj = VisualStudioAutomationHelper.GetProject(dte, parameters.TestsProjectName);

                parameters.TestsNamespace = VisualStudioAutomationHelper.GetDefaultNamespace(testsProj) + "." +
                                            NetNamingMapper.GetObjectName(Path.GetFileNameWithoutExtension(parameters.RamlFilePath));

                var unitTestsScaffoldService = UnitTestsScaffoldServiceBase.GetScaffoldService(Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider);
                unitTestsScaffoldService.InstallDependencies(testsProj);
                unitTestsScaffoldService.ScaffoldToProject(parameters, testsProj);
            }
        }
 public abstract void AddRamlReference(RamlChooserActionParams parameters);
 public abstract void AddTests(RamlChooserActionParams parameters);
 public abstract void AddContract(RamlChooserActionParams parameters);
        public void Import()
        {
            StartProgress();
            // DoEvents();

            if (string.IsNullOrWhiteSpace(Namespace))
            {
                ShowErrorAndStopProgress("Error: you must specify a namespace.");
                return;
            }

            if (!Filename.ToLowerInvariant().EndsWith(RamlFileExtension))
            {
                ShowErrorAndStopProgress("Error: the file must have the .raml extension.");
                return;
            }

            if (!IsContractUseCase && !File.Exists(RamlTempFilePath))
            {
                ShowErrorAndStopProgress("Error: the specified file does not exist.");
                return;
            }

            if (IsContractUseCase && UseApiVersion && string.IsNullOrWhiteSpace(ApiVersion))
            {
                ShowErrorAndStopProgress("Error: you need to specify a version.");
                return;
            }

            if (IsContractUseCase && ConfigFolders && HasInvalidPath(ModelsFolder))
            {
                ShowErrorAndStopProgress("Error: invalid path specified for models. Path must be relative.");
                //txtModels.Focus();
                return;
            }

            if (IsContractUseCase && ConfigFolders && HasInvalidPath(ImplementationControllersFolder))
            {
                ShowErrorAndStopProgress("Error: invalid path specified for controllers. Path must be relative.");
                //txtImplementationControllers.Focus();
                return;
            }

            var path = Path.GetDirectoryName(GetType().Assembly.Location) + Path.DirectorySeparatorChar;

            try
            {
                ResourcesPreview = "Processing. Please wait..." + Environment.NewLine + Environment.NewLine;

                // Execute action (add RAML Reference, Scaffold Web Api, etc)
                var parameters = new RamlChooserActionParams(RamlOriginalSource, RamlTempFilePath, RamlTitle, path,
                                                             Filename, Namespace, doNotScaffold: isNewContract);

                if (isContractUseCase)
                {
                    parameters.UseAsyncMethods = UseAsyncMethods;
                    parameters.IncludeApiVersionInRoutePrefix  = UseApiVersion;
                    parameters.ImplementationControllersFolder = ImplementationControllersFolder;
                    parameters.ModelsFolder = ModelsFolder;
                    parameters.AddGeneratedSuffixToFiles = AddSuffixToGeneratedCode;
                }

                if (!isContractUseCase)
                {
                    parameters.ClientRootClassName = ProxyClientName;
                }

                action(parameters);

                ResourcesPreview += "Succeeded";
                StopProgress();
                CanImport   = true;
                WasImported = true;
                TryClose();
            }
            catch (Exception ex)
            {
                ShowErrorAndStopProgress("Error: " + ex.Message);

                ActivityLog.LogError(VisualStudioAutomationHelper.RamlVsToolsActivityLogSource, VisualStudioAutomationHelper.GetExceptionInfo(ex));
            }
        }