Ejemplo n.º 1
0
        public void GenerateDataServiceProject(DomainDataService dataService, string outputFolder)
        {
            outputFolder = Path.Combine(outputFolder, $"{dataService.Solution.NamespacePrefix}.{dataService.Name}.DataService");
            var interfacesFolder  = Path.Combine(outputFolder, "Interfaces");
            var mappingsFolder    = Path.Combine(outputFolder, "Mappings");
            var recordTypesFolder = Path.Combine(outputFolder, "RecordTypes");
            var validatorsFolder  = Path.Combine(outputFolder, "Validators");

            ReplaceDirectories(interfacesFolder, mappingsFolder, recordTypesFolder, validatorsFolder);

            var session = new Dictionary <string, object>();

            session.Add("DomainDataService", dataService);

            DataServiceProjectTemplate projectTemplate = new DataServiceProjectTemplate();

            projectTemplate.Session = session;
            projectTemplate.Initialize();
            string content = projectTemplate.TransformText();

            File.WriteAllText(Path.Combine(outputFolder, $"{dataService.Solution.NamespacePrefix}.{dataService.Name}.DataService.csproj"), content);

            IRepositoryTemplate repositoryInterfaceTemplate = new IRepositoryTemplate();

            repositoryInterfaceTemplate.Session = session;
            repositoryInterfaceTemplate.Initialize();
            content = repositoryInterfaceTemplate.TransformText();
            File.WriteAllText(Path.Combine(interfacesFolder, $"I{dataService.Name}DataServiceRespository.cs"), content);

            IDataServiceTemplate dataServiceInterfaceTemplate = new IDataServiceTemplate();

            dataServiceInterfaceTemplate.Session = session;
            dataServiceInterfaceTemplate.Initialize();
            content = dataServiceInterfaceTemplate.TransformText();
            File.WriteAllText(Path.Combine(interfacesFolder, $"I{dataService.Name}DataService.cs"), content);

            RepositoryTemplate repositoryTemplate = new RepositoryTemplate();

            repositoryTemplate.Session = session;
            repositoryTemplate.Initialize();
            content = repositoryTemplate.TransformText();
            File.WriteAllText(Path.Combine(outputFolder, $"{dataService.Name}DataServiceRespository.cs"), content);

            DataServiceTemplate dataServiceTemplate = new DataServiceTemplate();

            dataServiceTemplate.Session = session;
            dataServiceTemplate.Initialize();
            content = dataServiceTemplate.TransformText();
            File.WriteAllText(Path.Combine(outputFolder, $"{dataService.Name}DataService.cs"), content);

            KernelManipulationsTemplate kernelManipulationsTemplate = new KernelManipulationsTemplate();

            kernelManipulationsTemplate.Session = session;
            kernelManipulationsTemplate.Initialize();
            content = kernelManipulationsTemplate.TransformText();
            File.WriteAllText(Path.Combine(outputFolder, $"{dataService.Name}KernelManipulations.cs"), content);

            StartupTaskTemplate startupTaskTemplate = new StartupTaskTemplate();

            startupTaskTemplate.Session = session;
            startupTaskTemplate.Initialize();
            content = startupTaskTemplate.TransformText();
            File.WriteAllText(Path.Combine(outputFolder, $"{dataService.Name}Startup.cs"), content);

            if (!(dataService.Schemas is null))
            {
                foreach (var domainObject in dataService.Schemas.SelectMany(s => s.Objects))
                {
                    session["CurrentObject"] = domainObject;

                    MappingTemplate mappingTemplate = new MappingTemplate();
                    mappingTemplate.Session = session;
                    mappingTemplate.Initialize();
                    content = mappingTemplate.TransformText();
                    File.WriteAllText(Path.Combine(mappingsFolder, $"{domainObject.ObjectName}Mapping.cs"), content);

                    RecordTypeTemplate recordTypeTemplate = new RecordTypeTemplate();
                    recordTypeTemplate.Session = session;
                    recordTypeTemplate.Initialize();
                    content = recordTypeTemplate.TransformText();
                    File.WriteAllText(Path.Combine(recordTypesFolder, $"{domainObject.ObjectName}RecordType.cs"), content);

                    if (domainObject.SupportsIHaveId())
                    {
                        var modelValidatorsFolder = Path.Combine(validatorsFolder, domainObject.ObjectName);
                        ReplaceDirectories(modelValidatorsFolder);

                        ValidatorTemplate validatorTemplate = new ValidatorTemplate();
                        validatorTemplate.Session = session;
                        validatorTemplate.Initialize();
                        content = validatorTemplate.TransformText();
                        File.WriteAllText(Path.Combine(modelValidatorsFolder, $"{domainObject.ObjectName}Validator.cs"), content);

                        DeleteValidatorTemplate deleteValidatorTemplate = new DeleteValidatorTemplate();
                        deleteValidatorTemplate.Session = session;
                        deleteValidatorTemplate.Initialize();
                        content = deleteValidatorTemplate.TransformText();
                        File.WriteAllText(Path.Combine(modelValidatorsFolder, $"{domainObject.ObjectName}DeleteValidator.cs"), content);

                        BatchValidatorTemplate batchValidatorTemplate = new BatchValidatorTemplate();
                        batchValidatorTemplate.Session = session;
                        batchValidatorTemplate.Initialize();
                        content = batchValidatorTemplate.TransformText();
                        File.WriteAllText(Path.Combine(modelValidatorsFolder, $"{domainObject.ObjectName}BatchValidator.cs"), content);
                    }
                }
            }
        }
        public void ProjectFinishedGenerating(Project project)
        {
            DTE dte = project.DTE;

            var solItems = dte.Solution.Projects.Cast <Project>().FirstOrDefault(p => p.Name == "Solution Items" || p.Kind == EnvDTE.Constants.vsProjectItemKindSolutionItems);

            if (solItems == null)
            {
                Solution2 sol2 = (Solution2)dte.Solution;
                solItems = sol2.AddSolutionFolder("Solution Items");
                string solDir = Path.GetDirectoryName(sol2.FullName);

                if (outputRepoFile)
                {
                    RepositoryTemplate repositoryTemplate = new RepositoryTemplate {
                        Session = templateParameters
                    };
                    repositoryTemplate.Initialize();
                    string repositoryTemplateContent = repositoryTemplate.TransformText();
                    string repositoryFilePath        = $"{solDir}\\repository.json";
                    File.WriteAllText(repositoryFilePath, repositoryTemplateContent);
                    solItems.ProjectItems.AddFromFile(repositoryFilePath);
                }

                ConfigTemplate configTemplate = new ConfigTemplate {
                    Session = templateParameters
                };
                configTemplate.Initialize();
                string configTemplateContent = configTemplate.TransformText();
                string configFilePath        = $"{solDir}\\config.json";
                File.WriteAllText(configFilePath, configTemplateContent);
                solItems.ProjectItems.AddFromFile(configFilePath);

                string runtimePath = Directory.GetCurrentDirectory();
                solItems.ProjectItems.AddFromFileCopy(runtimePath + "\\.gitignore");
                solItems.ProjectItems.AddFromFileCopy(runtimePath + "\\pre_build.ps1");
                solItems.ProjectItems.AddFromFileCopy(runtimePath + "\\post_build.ps1");
                solItems.ProjectItems.AddFromFileCopy(runtimePath + "\\launch_game.ps1");

                // pre-copy references
                Directory.CreateDirectory($"{solDir}\\references");
                string referencesGitIgnorePath = $"{solDir}\\references\\.gitignore";
                File.WriteAllText(referencesGitIgnorePath, "*\n!.gitignore");

                string pre_build = $@"{solDir.Replace(@"\", @"\\")}\\pre_build.ps1";

                string argument = $@"-ExecutionPolicy Unrestricted -File ""{pre_build}"" -SolutionDir ""{solDir.Replace(@"\", @"\\")}\\""";
                if ((bool)templateParameters["UseModMenu"])
                {
                    argument += @" -ModAssemblyReferences ""blendermf.XLShredMenu\\XLShredLib.dll""";
                }
                var process = new System.Diagnostics.Process {
                    StartInfo = new System.Diagnostics.ProcessStartInfo {
                        FileName               = "powershell",
                        Arguments              = argument,
                        UseShellExecute        = false,
                        RedirectStandardOutput = false,
                        CreateNoWindow         = true
                    }
                };

                process.Start();
                process.WaitForExit();
            }
            else
            {
                var repo = solItems.ProjectItems.Cast <ProjectItem>().FirstOrDefault(p => p.Name == "repository.json");
            }

            (project.Object as VSProject)?.Refresh();

            foreach (Configuration config in project.ConfigurationManager)
            {
                config.Properties.Item("StartAction").Value           = 1; // Launch external program
                config.Properties.Item("StartProgram").Value          = @"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe";
                config.Properties.Item("StartArguments").Value        = @"-ExecutionPolicy Unrestricted -File ""./launch_game.ps1""";
                config.Properties.Item("StartWorkingDirectory").Value = @"../../../";
            }

            project.Save(project.FileName);
        }