예제 #1
0
        public void BeginProcessing(string path)
        {
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                try
                {
                    OutputPaneManager.WriteToOutputPane("Load Tobasco xmls.");
                    XmlLoader loader = new XmlLoader(_dte);
                    loader.Load(path, new Generation.GenerationOptions());
                    OutputPaneManager.WriteToOutputPane("Start generating files.");

                    var outputFiles = FileOutputManager.ResolveSingleOutputFiles();

                    foreach (var handlerFunc in EntityManager.EntityHandlers)
                    {
                        outputFiles.AddRange(FileOutputManager.ResolveEntityFiles(handlerFunc.Value(handlerFunc.Key)));
                    }

                    Process(outputFiles);
                }
                catch (Exception ex)
                {
                    OutputPaneManager.WriteToOutputPane($"An error occured during generating. Message: {ex.Message} Stacktrace {ex.StackTrace}");
                    OutputPaneManager.WriteToOutputPane($"{ex.ToString()}");
                }
            }).ContinueWith(x =>
            {
                OutputPaneManager.WriteToOutputPane("Finished generating");
                ProgressBarManager.Done();
            }
                            );
        }
예제 #2
0
        public virtual void Process(IEnumerable <OutputFile> files)
        {
            var filesToProcess = new List <OutputFile>();

            foreach (var file in files)
            {
                var outputPath = _opResolver.GetOutputPath(file.ProjectName, file.FolderName, Path.GetDirectoryName(_templateFile));
                file.FileName = Path.Combine(outputPath, file.Name) + "_Generated" + GetFileTypeExtension(file);

                var isNewOrAdjusted = IsNewFile(file);

                if (isNewOrAdjusted || !file.FileName.EndsWith(".sql"))
                {
                    OutputPaneManager.WriteToOutputPane($"File {file.Name} shall be processed");
                    filesToProcess.Add(file);
                }
                else
                {
                    OutputPaneManager.WriteToOutputPane($"File {file.Name} shall not be processed.");
                }
            }

            ProjectSync(_templateProjectItem, filesToProcess);
            CleanUpTemplatePlaceholders();
            var items = _vsManager.GetOutputFilesAsProjectItems(filesToProcess);

            WriteVsProperties(items, filesToProcess);

            filesToProcess = null;
        }
예제 #3
0
        private FileProcessor(object textTransformation)
        {
            if (textTransformation == null)
            {
                throw new ArgumentNullException("textTransformation");
            }
            var dynamictextTransformation = DynamicTextTransformation2.Create(textTransformation);

            _templateFile = dynamictextTransformation.Host.TemplateFile;

            var hostServiceProvider = dynamictextTransformation.Host.AsIServiceProvider();

            if (hostServiceProvider == null)
            {
                throw new ArgumentNullException("Could not obtain hostServiceProvider");
            }

            _dte = (DTE)hostServiceProvider.GetService(typeof(DTE));
            if (_dte == null)
            {
                throw new ArgumentNullException("Could not obtain DTE from host");
            }
            var dteServiceProvider = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)_dte);

            OutputPaneManager.Activate(dteServiceProvider);
            ProgressBarManager.Activate(dteServiceProvider);
            _templateProjectItem = _dte.Solution.FindProjectItem(_templateFile);
            _vsManager           = new VsManager(_dte);
            _opResolver          = new OutputPathResolver(_vsManager);
        }
예제 #4
0
        public void BeginProcessing(string path, Action <GenerationOptions> options)
        {
            _options = new GenerationOptions();
            options.Invoke(_options);
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                try
                {
                    var processor = new Generation.FileProcessor(_dte, _templateFile, _templateProjectItem);

                    OutputPaneManager.WriteToOutputPane("Load xmls.");
                    XmlLoader loader = new XmlLoader(_dte);
                    loader.Load(path, _options);
                    OutputPaneManager.WriteToOutputPane("Start generating.");

                    var outputFiles = FileOutputManager.ResolveSingleOutputFiles();

                    foreach (var handlerFunc in EntityManager.EntityHandlers)
                    {
                        outputFiles.AddRange(FileOutputManager.ResolveEntityFiles(handlerFunc.Value(handlerFunc.Key)));
                    }

                    foreach (var file in outputFiles)
                    {
                        processor.ProcessClassFile(file);
                    }

                    if (_options.ForceCleanAndGenerate)
                    {
                        OutputPaneManager.WriteToOutputPane("Clean existing .txt4 placeholders.");

                        processor.CleanTemplateFiles(path);

                        OutputPaneManager.WriteToOutputPane("Remove existing old .txt4 placeholders.");

                        processor.RemoveUnusedTemplateFiles();

                        OutputPaneManager.WriteToOutputPane("Done with cleaning");
                    }
                    else
                    {
                        OutputPaneManager.WriteToOutputPane("The .txt4 placeholders will not be cleaned. This means that items will not be removed.");
                    }
                }
                catch (Exception ex)
                {
                    OutputPaneManager.WriteToOutputPane($"An error occured during generating. Message: {ex.Message} Stacktrace {ex.StackTrace}");
                    OutputPaneManager.WriteToOutputPane($"{ex.ToString()}");
                }
            }).ContinueWith(x =>
            {
                OutputPaneManager.WriteToOutputPane("Finished generating");
                ProgressBarManager.Done();
            }
                            );
        }
예제 #5
0
 private void GenerateOnCondition(string stpType, Func <bool> condition, Action method)
 {
     if (condition())
     {
         method();
     }
     else
     {
         OutputPaneManager.WriteToOutputPane($"Do not generate {stpType} stp for {Name}");
     }
 }
예제 #6
0
        public override IEnumerable <FileBuilder.OutputFile> Build()
        {
            OutputPaneManager.WriteToOutputPane($"Build {GetRepositoryName} for {Entity.GetRepository.FileLocation.GetProjectLocation}");
            var classFile = GetClassFile();

            OutputPaneManager.WriteToOutputPane($"Build {GetRepositoryInterfaceName} for {Entity.GetRepository.InterfaceLocation.GetProjectLocation}");
            var interfaceFile = GetInterfaceFile();

            return(new List <FileBuilder.OutputFile> {
                classFile, interfaceFile
            });
        }
예제 #7
0
 private static void RemoveUnusedItems(Dictionary <string, ProjectItem> projectFiles, string originalOutput, IEnumerable <OutputFile> keepFileNames)
 {
     foreach (var pair in projectFiles)
     {
         bool isNotFound = !keepFileNames.Any(f => f.FileName == pair.Key);
         if (isNotFound == true &&
             !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalOutput + "."))
         {
             pair.Value.Delete();
             OutputPaneManager.WriteToOutputPane($"Deleting {pair.Key}");
         }
         ProgressBarManager.SetProgress();
     }
 }
예제 #8
0
        internal void ProcessClassFile(OutputFile outputFile)
        {
            var outputPath = VsManager.GetOutputPath(_dte, outputFile, _defaultPath);

            outputFile.FileName = Path.Combine(outputPath, outputFile.FullName);

            ProjectItem placeHolder = GetPlaceholder(outputFile);

            if (!FileExist(outputFile) || IsFileContentDifferent(outputFile))
            {
                OutputPaneManager.WriteToOutputPane($"Process {outputFile.Name}");
                ProcessFile(outputFile, placeHolder);
            }
            RegisterProcessedFile(outputFile);
        }
예제 #9
0
        private void FormatDocument(ProjectItems items)
        {
            OutputPaneManager.WriteToOutputPane("Start formatting");

            foreach (ProjectItem item in items)
            {
                if (item.Name.EndsWith(".cs") && !item.IsOpen)
                {
                    var b = item.Open(EnvDTE.Constants.vsViewKindDebugging);
                    b.Activate();
                    item.Document.DTE.ExecuteCommand("Edit.FormatDocument");
                    b.Close(vsSaveChanges.vsSaveChangesYes);
                }
            }
        }
예제 #10
0
 private static void AddMissingItems(HashSet <OutputFile> keepFileNameSet, Dictionary <string, ProjectItem> projectFiles, ProjectItem templateProjectItem)
 {
     foreach (var fileName in keepFileNameSet)
     {
         if (!projectFiles.ContainsKey(fileName.FileName))
         {
             OutputPaneManager.WriteToOutputPane($"Add {fileName.Name}");
             templateProjectItem.ProjectItems.AddFromFile(fileName.FileName);
         }
         else
         {
             OutputPaneManager.WriteToOutputPane($"{fileName.Name} already exists");
         }
         ProgressBarManager.SetProgress();
     }
 }
예제 #11
0
        public override IEnumerable <FileBuilder.OutputFile> Build()
        {
            OutputPaneManager.WriteToOutputPane($"Build {Entity.Name} for {Location.FileLocation.GetProjectLocation}");
            var file = FileManager.StartNewClassFile(Entity.Name, Location.FileLocation.Project, Location.FileLocation.Folder);

            file.ClassAttributes.Add("[Serializable]");
            file.IsAbstract = Entity.IsAbstract;
            file.BaseClass  = Location.GetBaseClass;
            file.Namespaces.AddRange(Location.Namespaces.Select(x => x.Value).Concat(MainInfoManager.GetBasicNamespaces));
            file.Namespaces.Add(MainInfoManager.GetEnumNamespace);
            file.Properties.AddRange(GetProperties.Select(x => x.GetProperty));
            file.Methods.Add(GenerateMethods());
            file.OwnNamespace = Location.FileLocation.GetNamespace;
            return(new List <FileBuilder.OutputFile> {
                file
            });
        }
예제 #12
0
        private void ProcessStpFile(List <OutputFile> outputFiles)
        {
            if (!Database.StoredProcedures.Generate)
            {
                OutputPaneManager.WriteToOutputPane("Skipping STP generation, generate attribute is set to 'false'.");
                return;
            }
            var crudFile = FileManager.StartNewSqlStpFile(Name + "_CRUD", Database.Project, Database.StoredProcedures.Folder);

            OutputPaneManager.WriteToOutputPane("Insert...");
            const bool generateDefault = true;

            GenerateOnCondition("Insert", () => Database.StoredProcedures.GenerateInsert?.Generate ?? generateDefault, () => crudFile.Methods.Add(GetInsertBuilder.Build()));

            OutputPaneManager.WriteToOutputPane("Update...");
            GenerateOnCondition("Update", () => Database.StoredProcedures.GenerateUpdate?.Generate ?? generateDefault, () => crudFile.Methods.Add(GetUpdateBuilder.Build()));

            OutputPaneManager.WriteToOutputPane("Delete...");
            GenerateOnCondition("Delete", () => Database.StoredProcedures.GenerateDelete?.Generate ?? generateDefault, () => crudFile.Methods.Add(GetDeleteBuilder.Build()));

            OutputPaneManager.WriteToOutputPane("GetById...");
            GenerateOnCondition("GetById", () => Database.StoredProcedures.GenerateGetById?.Generate ?? generateDefault, () => crudFile.Methods.Add(GetByIdBuilder.Build()));

            OutputPaneManager.WriteToOutputPane("GetByIds...");
            GenerateOnCondition("GetByIds", () => Database.StoredProcedures.GenerateGetById?.Generate ?? generateDefault, () => crudFile.Methods.Add(GetByIdListBuilder.Build()));

            OutputPaneManager.WriteToOutputPane("GetByUId...");
            GenerateOnCondition("GetByUId", () => (Database.StoredProcedures.GenerateGetById?.Generate ?? generateDefault) && Entity.GenerateReadonlyGuid, () => crudFile.Methods.Add(GetByUIdBuilder.Build()));

            OutputPaneManager.WriteToOutputPane("Type...");
            GenerateOnCondition("Type", () => Database.StoredProcedures.GenerateMerge?.Generate ?? generateDefault, () => crudFile.Methods.Add(GetTypeBuilder.Build()));

            OutputPaneManager.WriteToOutputPane("Merge...");
            GenerateOnCondition("Merge", () => Database.StoredProcedures.GenerateMerge?.Generate ?? generateDefault, () => crudFile.Methods.Add(GetMergeBuilder.Build()));

            if ((Database.StoredProcedures.GenerateGetById?.Generate ?? generateDefault) && Entity.Properties.Any(x => x.DataType.Datatype == Datatype.Reference))
            {
                foreach (var reference in Entity.Properties.Where(x => x.DataType.Datatype == Datatype.Reference))
                {
                    crudFile.Methods.Add(GetByReferenceIdBuilder.Build(reference));
                    crudFile.Methods.Add(GetByReferenceIdListBuilder.Build(reference));
                }
            }

            outputFiles.Add(crudFile);
        }
예제 #13
0
        protected virtual bool IsNewFile(OutputFile file)
        {
            if (!FileExist(file))
            {
                OutputPaneManager.WriteToOutputPane($"File does not exist: {file.FileName}");
                CheckoutFileIfRequired(file.FileName);
                File.WriteAllText(file.FileName, file.BuildContent(), Encoding.UTF8);
                return(true);
            }

            if (IsFileContentDifferent(file))
            {
                OutputPaneManager.WriteToOutputPane($"FileContent is different for: {file.FileName}");
                CheckoutFileIfRequired(file.FileName);
                File.WriteAllText(file.FileName, file.BuildContent(), Encoding.UTF8);
                return(true);
            }
            return(false);
        }
예제 #14
0
        private void ProcessTableFile(List <OutputFile> outputFiles)
        {
            if (Database.Tables.Generate)
            {
                OutputPaneManager.WriteToOutputPane($"Generate Table for {Name}");
                var tableFile = FileManager.StartNewSqlTableFile(Name, Database.Project, Database.Tables.Folder);
                tableFile.Table = GetTableBuilder.Build();

                if (Database.Tables.Generate && Database.Tables.GenerateHistorie.Generate)
                {
                    tableFile.HistorieTable = GetHistorieTableBuilder.Build();
                    tableFile.Triggers      = GetTriggerBuilder.Build();
                    tableFile.Views         = GetHistorieViewBuilder.Build();
                }
                else
                {
                    OutputPaneManager.WriteToOutputPane($"Do not generate HistorieTable for {Name} ");
                }

                tableFile.Indexes = GetIndexBuilder.Build();


                if (Database.Tables.Generate)
                {
                    var descriptionBuilder = GetDescriptionBuilder;
                    tableFile.Description = descriptionBuilder.Build();

                    if (Database.Tables.GenerateHistorie.Generate)
                    {
                        tableFile.DescriptionHistory = descriptionBuilder.BuildHistorie();
                    }
                }

                outputFiles.Add(tableFile);
            }
            else
            {
                OutputPaneManager.WriteToOutputPane($"Do not generate Table for {Name}");
            }
        }
예제 #15
0
파일: XmlLoader.cs 프로젝트: bordev/Tobasco
        internal void Load(string path, GenerationOptions generationOptions)
        {
            XmlSerializer entityserializer = new XmlSerializer(typeof(Entity));
            XmlSerializer serializer       = new XmlSerializer(typeof(EntityInformation));

            var entityDictionary = new Dictionary <string, EntityHandler>();
            var xmls             = Directory.GetFiles(path, "*.xml");

            try
            {
                using (var reader = new StreamReader(Path.Combine(path, "MainInfo.xml")))
                {
                    MainInfoManager.Initialize((EntityInformation)serializer.Deserialize(reader));
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException($"Error with reading maininfo xml: {ex}");
            }


            var entities = new List <LoadedEntity>();

            if (generationOptions.ForceCleanAndGenerate)
            {
                OutputPaneManager.WriteToOutputPane("All xmls will be generated again.");
            }
            else
            {
                OutputPaneManager.WriteToOutputPane("Only dirty xmls will be generated again.");
            }

            foreach (var filepath in xmls.Where(x => !x.Contains("MainInfo")))
            {
                try
                {
                    XmlDocument doc = new XmlDocument();

                    if (generationOptions.ForceCleanAndGenerate)
                    {
                        doc.Load(filepath);
                        entities.Add(new LoadedEntity {
                            Name = doc.GetElementsByTagName("Entity")[0].Attributes["name"].Value, Path = filepath, IsChanged = true
                        });
                    }
                    else
                    {
                        var isCheckedOut = dTE.SourceControl.IsItemCheckedOut(filepath);
                        doc.Load(filepath);
                        entities.Add(new LoadedEntity {
                            Name = doc.GetElementsByTagName("Entity")[0].Attributes["name"].Value, Path = filepath, IsChanged = isCheckedOut
                        });
                    }
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException($"Error with reading xml: {filepath}", ex);
                }
            }
            EntityManager.Initialise(entities);
        }
예제 #16
0
 public override IEnumerable <OutputFile> Build()
 {
     OutputPaneManager.WriteToOutputPane("Builder has been overridden");
     return(base.Build());
 }