コード例 #1
0
        private static bool IsAlreadyIncludedInProject(string folderPath, ProjectItem folderItem, string generatedFileName, ProjectItem fileItem)
        {
            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(fileItem.ContainingProject))
            {
                return(File.Exists(Path.Combine(folderPath, generatedFileName)));
            }

            var otherRamlFiles        = GetOtherRamlFilesInProject(folderPath, fileItem);
            var alreadyIncludedInProj = false;

            foreach (var ramlFile in otherRamlFiles)
            {
                var fileName          = Path.GetFileName(ramlFile);
                var otherRamlFileItem =
                    folderItem.ProjectItems.Cast <ProjectItem>().FirstOrDefault(i => i.Name == fileName);

                if (otherRamlFileItem == null)
                {
                    continue;
                }
                var item = otherRamlFileItem.ProjectItems.Cast <ProjectItem>().FirstOrDefault(i => i.Name == generatedFileName);
                alreadyIncludedInProj = alreadyIncludedInProj || (item != null);
            }
            return(alreadyIncludedInProj);
        }
コード例 #2
0
        private void RemoveReverseEngineeringCommandOnBeforeQueryStatus(object sender, EventArgs e)
        {
            var menuCommand = sender as OleMenuCommand;

            if (menuCommand == null)
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, false);

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

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                return;
            }

            if (!IsWebApiExplorerInstalled())
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, true);
        }
コード例 #3
0
        private void ExtractRAMLCommandOnBeforeQueryStatus(object sender, EventArgs e)
        {
            var menuCommand = sender as OleMenuCommand;

            if (menuCommand == null)
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, false);

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

            if (!VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj) && !IsWebApiCoreInstalled(proj))
            {
                return;
            }

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj) && !IsAspNet5MvcInstalled(proj))
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, true);
        }
コード例 #4
0
        private static bool IsAVisualStudio2015Project()
        {
            var dte  = ServiceProvider.GlobalProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            return(VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj));
        }
コード例 #5
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);
            }
        }
コード例 #6
0
        private static void ShowOrHideCommandForFolder(object sender, string folderName)
        {
            // get the menu that fired the event
            var menuCommand = sender as OleMenuCommand;

            if (menuCommand == null)
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, false);

            if (IsInFolder(folderName))
            {
                return;
            }

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

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj) && !IsAspNet5MvcInstalled(proj))
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, true);
        }
コード例 #7
0
        private static void ShowOrHideForFolderIfNotVs2015(object sender, string folderName)
        {
            var menuCommand = sender as OleMenuCommand;

            if (menuCommand == null)
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, false);

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

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                return;
            }

            if (IsInFolder(folderName))
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, true);
        }
コード例 #8
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);
        }
コード例 #9
0
        private static string GetTargetFolderPath(string folderPath, string targetFilename, Project proj)
        {
            var targetFolderPath = folderPath;

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                targetFolderPath += Path.GetFileNameWithoutExtension(targetFilename) + Path.DirectorySeparatorChar;
            }

            return(targetFolderPath);
        }
コード例 #10
0
        private static bool IsAspNet5OrWebApiCoreInstalled()
        {
            var dte  = ServiceProvider.GlobalProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                return(IsAspNet5MvcInstalled(proj));
            }

            return(IsWebApiCoreInstalled(proj));
        }
コード例 #11
0
        public static RamlReferenceServiceBase GetRamlReferenceService(ServiceProvider serviceProvider, ILogger logger)
        {
            var dte  = serviceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);
            RamlReferenceServiceBase service;

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                service = new RamlReferenceServiceNetCore(serviceProvider, logger);
            }
            else
            {
                service = new RamlReferenceServiceNetFramework(serviceProvider, logger);
            }
            return(service);
        }
コード例 #12
0
        private static void AddFileToProject(ProjectItem contractsFolderItem, string fileName, string file)
        {
            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(contractsFolderItem.ContainingProject))
            {
                return;
            }

            var fileItem = contractsFolderItem.ProjectItems.Cast <ProjectItem>().FirstOrDefault(i => i.Name == fileName);

            if (fileItem != null)
            {
                return;
            }

            contractsFolderItem.ProjectItems.AddFromFile(file);
        }
コード例 #13
0
        public static RamlScaffoldServiceBase GetRamlScaffoldService(ServiceProvider serviceProvider)
        {
            var dte  = serviceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);
            RamlScaffoldServiceBase service;

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                service = new RamlScaffoldServiceAspNetCore(new T4Service(serviceProvider), serviceProvider);
            }
            else
            {
                service = new RamlScaffoldServiceWebApi(new T4Service(serviceProvider), serviceProvider);
            }
            return(service);
        }
コード例 #14
0
        public static ReverseEngineeringServiceBase GetReverseEngineeringService(ServiceProvider serviceProvider)
        {
            var dte  = serviceProvider.GetService(typeof(SDTE)) as DTE;
            var proj = VisualStudioAutomationHelper.GetActiveProject(dte);
            ReverseEngineeringServiceBase service;

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                service = new ReverseEngineeringAspNetCore(serviceProvider);
            }
            else
            {
                service = new ReverseEngineeringServiceWebApi(serviceProvider);
            }
            return(service);
        }
コード例 #15
0
        public void GenerateCodeFromTemplate <T>(RamlScaffoldService.TemplateParams <T> templateParams) where T : IHasName
        {
            if (!Directory.Exists(templateParams.TargetFolder))
            {
                Directory.CreateDirectory(templateParams.TargetFolder);
            }

            foreach (var parameter in templateParams.ParameterCollection)
            {
                var generatedFileName = GetGeneratedFileName(templateParams.Suffix, templateParams.Prefix, parameter);
                var destinationFile   = Path.Combine(templateParams.TargetFolder, generatedFileName);

                var result = t4Service.TransformText(templateParams.TemplatePath, templateParams.ParameterName, parameter, templateParams.BinPath, templateParams.TargetNamespace,
                                                     templateParams.UseAsyncMethods, templateParams.IncludeHasModels, templateParams.HasModels, templateParams.IncludeApiVersionInRoutePrefix, templateParams.ApiVersion);

                var contents = templatesManager.AddServerMetadataHeader(result.Content, Path.GetFileNameWithoutExtension(templateParams.TemplatePath), templateParams.Title);

                if (templateParams.Ovewrite || !File.Exists(destinationFile))
                {
                    File.WriteAllText(destinationFile, contents);
                }

                if (templateParams.ParameterName == "controllerObject" || templateParams.TargetFolder == templateParams.FolderPath)
                {
                    // add file if it does not exist
                    var fileItem = templateParams.ProjItem.ProjectItems.Cast <ProjectItem>()
                                   .FirstOrDefault(i => i.Name == generatedFileName);
                    if (fileItem != null)
                    {
                        continue;
                    }

                    // var alreadyIncludedInProj = IsAlreadyIncludedInProject(templateParams.FolderPath, templateParams.FolderItem, generatedFileName, templateParams.ProjItem);
                    //if (!alreadyIncludedInProj)
                    if (!VisualStudioAutomationHelper.IsAVisualStudio2015Project(templateParams.FolderItem.ContainingProject))
                    {
                        templateParams.ProjItem.ProjectItems.AddFromFile(destinationFile);
                    }
                }
                else
                {
                    var folder = templateParams.TargetFolder.TrimEnd(Path.DirectorySeparatorChar);
                    var proj   = templateParams.ProjItem.ContainingProject;
                    AddItem(folder, proj, generatedFileName, destinationFile, templateParams.RelativeFolder);
                }
            }
        }
コード例 #16
0
        private static ProjectItem CreateFolderItem(Project proj, string path, string relativeFolder)
        {
            if (ContainsSubFolders(relativeFolder))
            {
                var folders    = relativeFolder.Split(PossibleDirectorySeparatorChars);
                var folderItem = VisualStudioAutomationHelper.AddFolderIfNotExists(proj, folders[0]);
                return(CreateFolderItem(folderItem, folders, 1));
            }

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                return(null);
            }

            var folderName = path.Substring(path.LastIndexOf(Path.DirectorySeparatorChar) + 1);

            return(VisualStudioAutomationHelper.AddFolderIfNotExists(proj, folderName));
        }
コード例 #17
0
        private void AddRamlRefCommandOnBeforeQueryStatus(object sender, EventArgs eventArgs)
        {
            var menuCommand = sender as OleMenuCommand;

            if (menuCommand == null)
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, false);

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

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, true);
        }
コード例 #18
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);
        }
コード例 #19
0
        private void InstallNugetDependencies(Project proj)
        {
            var packageVersion = VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj) ? newtonsoftJsonForCorePackageVersion : newtonsoftJsonPackageVersion;

            var componentModel    = (IComponentModel)serviceProvider.GetService(typeof(SComponentModel));
            var installerServices = componentModel.GetService <IVsPackageInstallerServices>();
            var installer         = componentModel.GetService <IVsPackageInstaller>();

            var packs = installerServices.GetInstalledPackages(proj).ToArray();

            // RAML.Api.Core dependencies
            NugetInstallerHelper.InstallPackageIfNeeded(proj, packs, installer, newtonsoftJsonPackageId, packageVersion, Settings.Default.NugetExternalPackagesSource);
            NugetInstallerHelper.InstallPackageIfNeeded(proj, packs, installer, microsoftNetHttpPackageId, microsoftNetHttpPackageVersion, Settings.Default.NugetExternalPackagesSource);

            // System.Xml.XmlSerializer 4.0.11-beta-23516
            // NugetInstallerHelper.InstallPackageIfNeeded(proj, packs, installer, "System.Xml.XmlSerializer", "4.0.11-beta-23516");

            // RAML.Api.Core
            if (!installerServices.IsPackageInstalled(proj, ramlApiCorePackageId))
            {
                installer.InstallPackage(nugetPackagesSource, proj, ramlApiCorePackageId, ramlApiCorePackageVersion, false);
            }
        }
コード例 #20
0
        private static void ShowOrHideUpdateRamlRefCommand(object sender, string containingFolderName)
        {
            // get the menu that fired the event
            var menuCommand = sender as OleMenuCommand;

            if (menuCommand == null)
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, false);

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

            if (VisualStudioAutomationHelper.IsAVisualStudio2015Project(proj))
            {
                return;
            }

            IVsHierarchy hierarchy;
            uint         itemid;

            if (!IsSingleProjectItemSelection(out hierarchy, out itemid))
            {
                return;
            }
            // Get the file path
            string itemFullPath;

            ((IVsProject)hierarchy).GetMkDocument(itemid, out itemFullPath);

            FileInfo transformFileInfo;

            try
            {
                transformFileInfo = new FileInfo(itemFullPath);
            }
            catch (Exception)
            {
                return;
            }

            var endsWithExtension = transformFileInfo.Name.EndsWith(".raml");

            // if not leave the menu hidden
            if (!endsWithExtension)
            {
                return;
            }

            if (!itemFullPath.Contains(containingFolderName))
            {
                return;
            }

            var folder = Path.GetDirectoryName(itemFullPath);

            if (folder.EndsWith(InstallerServices.IncludesFolderName))
            {
                return;
            }

            var refFile = InstallerServices.GetRefFilePath(itemFullPath);
            var source  = RamlReferenceReader.GetRamlSource(refFile);

            if (string.IsNullOrWhiteSpace(source))
            {
                return;
            }

            ShowAndEnableCommand(menuCommand, true);
        }