예제 #1
0
 private static void AddFileCountToPreviousEventAndRefire(ITaskProgressHelper <GenerateFilesProgress> progressHelper, int additionalFileCount)
 {
     if (progressHelper.LastProgressObject != null)
     {
         int count = progressHelper.LastProgressObject.NumberOfFilesGenerated + additionalFileCount;
         progressHelper.ReportProgress(40, new GenerateFilesProgress(count));
     }
 }
예제 #2
0
        private void RaiseTemplateFunctionCallErrorEvent(Exception ex)
        {
            if (_ProgressHelper == null)
            {
                return;
            }

            int generated = 0;

            if (_ProgressHelper.LastProgressObject != null)
            {
                generated = _ProgressHelper.LastProgressObject.NumberOfFilesGenerated;
            }

            _ProgressHelper.ReportProgress(40, new GenerateFilesProgress(generated, ex));
        }
예제 #3
0
        /// <summary>
        /// Runs through a project and generates the files in it.
        /// </summary>
        /// <param name="progressHelper">The TaskProgressHelper to use to report progress and cancel the operation.</param>
        /// <param name="projectInfo">The Project we are generating files from.</param>
        /// <param name="folderName">The name of the root folder to generate into. Not the full path, just the relative path to the 
        /// current folder.</param>
        /// <param name="folder"></param>
        /// <param name="parentNode"></param>
        /// <param name="thisLevelRootObject"></param>
        /// <returns></returns>
        /// <param name="loader"></param>
        /// <param name="controller"></param>
        public int GenerateAllFiles(ITaskProgressHelper<GenerateFilesProgress> progressHelper, IProjectHelper projectInfo, string folderName, IFolder folder, ProjectFileTreeNode parentNode, IScriptBaseObject thisLevelRootObject, ILoader loader, IController controller)
        {
            if (parentNode is ProjectFileTree)
            {
                ((ProjectFileTree)parentNode).TreeRestructuring = true;
                ((ProjectFileTree)parentNode).Clear();
            }
            int fileCount = 0;

            try
            {
                _Controller = controller;
                _Loader = loader;
                _ProgressHelper = progressHelper;
                project = projectInfo;
                CurrentRootObject = thisLevelRootObject;
                absoluteBasePath = controller.GetTempFilePathForComponent(ComponentKey.WorkbenchFileGenerator);

                {
                    Version version = new Version(loader.GetAssemblyVersionNumber());
                    Version expectedVersion = new Version(1, 1, 9, 49);
                    if (version < expectedVersion)
                    {
                        throw new OldVersionException("The template was compiled with an old version of ArchAngel, and cannot be used in this version of Workbench");
                    }
                }

                foreach (IFolder subFolder in folder.SubFolders)
                {
                    if (progressHelper.IsCancellationPending())
                    {
                        progressHelper.Cancel();
                        return fileCount;
                    }

                    ProjectFileTreeNode folderNode = null;

                    if (parentNode != null && subFolder.Name != "ROOT")
                    {
                        folderNode = parentNode.AddChildNode(subFolder.Name);
                        folderNode.IsFolder = true;
                    }

                    if (!string.IsNullOrEmpty(subFolder.IteratorName))
                    {
                        // The folder has an iterator
                        ProviderInfo provider;
                        Type iteratorType = project.GetTypeFromProviders(subFolder.IteratorName, out provider);

                        if (progressHelper.IsCancellationPending())
                        {
                            progressHelper.Cancel();
                            return fileCount;
                        }

                        if (iteratorType != null)
                        {
                            IEnumerable<IScriptBaseObject> iteratorObjects;

                            if (thisLevelRootObject == null)
                            {
                                iteratorObjects = provider.GetAllObjectsOfType(iteratorType.FullName);
                            }
                            else if (iteratorType.IsInstanceOfType(thisLevelRootObject))
                            {
                                iteratorObjects = new[] { thisLevelRootObject };
                            }
                            else
                            {
                                iteratorObjects = provider.GetAllObjectsOfType(iteratorType.FullName, thisLevelRootObject);
                            }
                            if (iteratorObjects != null)
                            {
                                foreach (IScriptBaseObject iteratorObject in iteratorObjects)
                                {
                                    if (progressHelper.IsCancellationPending())
                                    {
                                        progressHelper.Cancel();
                                        return fileCount;
                                    }

                                    CurrentRootObject = iteratorObject;

                                    string subFolderName = UpdateScriptName(iteratorObject, subFolder);

                                    if (folderNode != null)
                                    {
                                        folderNode.Text = subFolderName;
                                    }

                                    subFolderName = Path.Combine(folderName, subFolderName);

                                        //Directory.CreateDirectory(Path.Combine(Controller.Instance.GetTempFilePathForComponent(ComponentKey.WorkbenchFileGenerator), subFolderName));

                                    fileCount += GenerateAllFiles(progressHelper, project, subFolderName, subFolder, folderNode, CurrentRootObject, loader, controller);

                                }
                            }
                        }
                        else
                        {
                            throw new Exception(string.Format("The IteratorType could not be found: {0}. Are you missing an assembly?", subFolder.IteratorName));
                        }
                    }
                    else
                    {
                        // The folder doesn't have an iterator
                        if (progressHelper.IsCancellationPending())
                        {
                            progressHelper.Cancel();
                            return fileCount;
                        }
                        string subFolderName = UpdateScriptName(null, subFolder);

                        if (folderNode != null)
                        {
                            folderNode.Text = subFolderName;
                        }
                        subFolderName = Path.Combine(folderName, subFolderName);
                        //Directory.CreateDirectory(Path.Combine(Controller.Instance.GetTempFilePathForComponent(ComponentKey.WorkbenchFileGenerator), subFolderName));

                        fileCount += GenerateAllFiles(progressHelper, projectInfo, subFolderName, subFolder, folderNode, thisLevelRootObject, loader, controller);
                    }

                    //progressHelper.ReportProgress(20, new GenerateFilesProgress(fileCount));
                }

                //progressHelper.ReportProgress(50, new GenerateFilesProgress(fileCount));

                foreach (IScript script in folder.Scripts)
                {
                    if (progressHelper.IsCancellationPending())
                    {
                        progressHelper.Cancel();
                        return fileCount;
                    }
                    fileCount += CreateScriptFile(progressHelper, folderName, script, parentNode);
                }

                // progressHelper.ReportProgress(80, new GenerateFilesProgress(fileCount));

                foreach (IFile file in folder.Files)
                {
                    if (progressHelper.IsCancellationPending())
                    {
                        progressHelper.Cancel();
                        return fileCount;
                    }
                    fileCount += CreateStaticFile(progressHelper, folderName, file, parentNode);
                }

                //progressHelper.ReportProgress(95, new GenerateFilesProgress(fileCount));

                //Application.DoEvents();
            }
            catch(Exception e)
            {
                progressHelper.ReportProgress(100, new GenerateFilesProgress(fileCount, e));
                return fileCount;
            }
            finally
            {
                if (parentNode is ProjectFileTree)
                {
                    ((ProjectFileTree) parentNode).TreeRestructuring = false;
                    parentNode.RaiseNodeChangedEvent(parentNode, true);
                }
            }
            progressHelper.ReportProgress(50, new GenerateFilesProgress(fileCount));
            return fileCount;
        }
예제 #4
0
 private static void AddFileCountToPreviousEventAndRefire(ITaskProgressHelper<GenerateFilesProgress> progressHelper, int additionalFileCount)
 {
     if (progressHelper.LastProgressObject != null)
     {
         int count = progressHelper.LastProgressObject.NumberOfFilesGenerated + additionalFileCount;
         progressHelper.ReportProgress(40, new GenerateFilesProgress(count));
     }
 }
예제 #5
0
        /// <summary>
        /// Runs through a project and generates the files in it.
        /// </summary>
        /// <param name="progressHelper">The TaskProgressHelper to use to report progress and cancel the operation.</param>
        /// <param name="projectInfo">The Project we are generating files from.</param>
        /// <param name="folderName">The name of the root folder to generate into. Not the full path, just the relative path to the
        /// current folder.</param>
        /// <param name="folder"></param>
        /// <param name="parentNode"></param>
        /// <param name="thisLevelRootObject"></param>
        /// <returns></returns>
        /// <param name="loader"></param>
        /// <param name="controller"></param>
        public int GenerateAllFiles(ITaskProgressHelper <GenerateFilesProgress> progressHelper, IProjectHelper projectInfo, string folderName, IFolder folder, ProjectFileTreeNode parentNode, IScriptBaseObject thisLevelRootObject, ILoader loader, IController controller)
        {
            if (parentNode is ProjectFileTree)
            {
                ((ProjectFileTree)parentNode).TreeRestructuring = true;
                ((ProjectFileTree)parentNode).Clear();
            }
            int fileCount = 0;

            try
            {
                _Controller       = controller;
                _Loader           = loader;
                _ProgressHelper   = progressHelper;
                project           = projectInfo;
                CurrentRootObject = thisLevelRootObject;
                absoluteBasePath  = controller.GetTempFilePathForComponent(ComponentKey.WorkbenchFileGenerator);


                {
                    Version version         = new Version(loader.GetAssemblyVersionNumber());
                    Version expectedVersion = new Version(1, 1, 9, 49);
                    if (version < expectedVersion)
                    {
                        throw new OldVersionException("The template was compiled with an old version of ArchAngel, and cannot be used in this version of Workbench");
                    }
                }


                foreach (IFolder subFolder in folder.SubFolders)
                {
                    if (progressHelper.IsCancellationPending())
                    {
                        progressHelper.Cancel();
                        return(fileCount);
                    }

                    ProjectFileTreeNode folderNode = null;

                    if (parentNode != null && subFolder.Name != "ROOT")
                    {
                        folderNode          = parentNode.AddChildNode(subFolder.Name);
                        folderNode.IsFolder = true;
                    }

                    if (!string.IsNullOrEmpty(subFolder.IteratorName))
                    {
                        // The folder has an iterator
                        ProviderInfo provider;
                        Type         iteratorType = project.GetTypeFromProviders(subFolder.IteratorName, out provider);

                        if (progressHelper.IsCancellationPending())
                        {
                            progressHelper.Cancel();
                            return(fileCount);
                        }

                        if (iteratorType != null)
                        {
                            IEnumerable <IScriptBaseObject> iteratorObjects;

                            if (thisLevelRootObject == null)
                            {
                                iteratorObjects = provider.GetAllObjectsOfType(iteratorType.FullName);
                            }
                            else if (iteratorType.IsInstanceOfType(thisLevelRootObject))
                            {
                                iteratorObjects = new[] { thisLevelRootObject };
                            }
                            else
                            {
                                iteratorObjects = provider.GetAllObjectsOfType(iteratorType.FullName, thisLevelRootObject);
                            }
                            if (iteratorObjects != null)
                            {
                                foreach (IScriptBaseObject iteratorObject in iteratorObjects)
                                {
                                    if (progressHelper.IsCancellationPending())
                                    {
                                        progressHelper.Cancel();
                                        return(fileCount);
                                    }

                                    CurrentRootObject = iteratorObject;

                                    string subFolderName = UpdateScriptName(iteratorObject, subFolder);

                                    if (folderNode != null)
                                    {
                                        folderNode.Text = subFolderName;
                                    }

                                    subFolderName = Path.Combine(folderName, subFolderName);

                                    //Directory.CreateDirectory(Path.Combine(Controller.Instance.GetTempFilePathForComponent(ComponentKey.WorkbenchFileGenerator), subFolderName));

                                    fileCount += GenerateAllFiles(progressHelper, project, subFolderName, subFolder, folderNode, CurrentRootObject, loader, controller);
                                }
                            }
                        }
                        else
                        {
                            throw new Exception(string.Format("The IteratorType could not be found: {0}. Are you missing an assembly?", subFolder.IteratorName));
                        }
                    }
                    else
                    {
                        // The folder doesn't have an iterator
                        if (progressHelper.IsCancellationPending())
                        {
                            progressHelper.Cancel();
                            return(fileCount);
                        }
                        string subFolderName = UpdateScriptName(null, subFolder);

                        if (folderNode != null)
                        {
                            folderNode.Text = subFolderName;
                        }
                        subFolderName = Path.Combine(folderName, subFolderName);
                        //Directory.CreateDirectory(Path.Combine(Controller.Instance.GetTempFilePathForComponent(ComponentKey.WorkbenchFileGenerator), subFolderName));

                        fileCount += GenerateAllFiles(progressHelper, projectInfo, subFolderName, subFolder, folderNode, thisLevelRootObject, loader, controller);
                    }

                    //progressHelper.ReportProgress(20, new GenerateFilesProgress(fileCount));
                }

                //progressHelper.ReportProgress(50, new GenerateFilesProgress(fileCount));

                foreach (IScript script in folder.Scripts)
                {
                    if (progressHelper.IsCancellationPending())
                    {
                        progressHelper.Cancel();
                        return(fileCount);
                    }
                    fileCount += CreateScriptFile(progressHelper, folderName, script, parentNode);
                }

                // progressHelper.ReportProgress(80, new GenerateFilesProgress(fileCount));

                foreach (IFile file in folder.Files)
                {
                    if (progressHelper.IsCancellationPending())
                    {
                        progressHelper.Cancel();
                        return(fileCount);
                    }
                    fileCount += CreateStaticFile(progressHelper, folderName, file, parentNode);
                }

                //progressHelper.ReportProgress(95, new GenerateFilesProgress(fileCount));

                //Application.DoEvents();
            }
            catch (Exception e)
            {
                progressHelper.ReportProgress(100, new GenerateFilesProgress(fileCount, e));
                return(fileCount);
            }
            finally
            {
                if (parentNode is ProjectFileTree)
                {
                    ((ProjectFileTree)parentNode).TreeRestructuring = false;
                    parentNode.RaiseNodeChangedEvent(parentNode, true);
                }
            }
            progressHelper.ReportProgress(50, new GenerateFilesProgress(fileCount));
            return(fileCount);
        }
예제 #6
0
        public int GenerateAllFiles(string folderName, IFolder folder, ProjectFileTreeNode parentNode, IScriptBaseObject thisLevelRootObject, string basePath, bool isTopLevel)
        {
            if (isTopLevel)
            {
                SharedData.IsBusyGenerating = true;
                _Project.StartNewFileGenerationRun();

                // Reset the Template before the File name validation run.
                _Loader.CallTemplateFunction(TemplateHelper.ClearTemplateCacheFunctionName);

                // Run the pre generation template function.

                //var data = new PreGenerationData { OutputFolder = _Project.ProjectSettings.OutputPath };

                //foreach (var uo in _Project.Options.Where(o => o.IsVirtualProperty == false))
                //{
                //    var optionValue = _Loader.GetUserOption(uo.VariableName);
                //    data.UserOptions.Add(uo.VariableName, optionValue);
                //}

                //foreach (var provider in _Project.Providers)
                //{
                //    ArchAngel.Interfaces.ProviderInfo[] otherProviders = new ProviderInfo[_Project.Providers.Count];
                //    _Project.Providers.CopyTo(otherProviders);
                //    data.OtherProviderInfos = otherProviders.ToList();
                //    data.OtherProviderInfos.Remove(provider);
                //    provider.InitialisePreGeneration(data);
                //    //_Loader.CallPreGenerationInitialisationFunction(provider, data);
                //}

                IEnumerable <FilenameInfo> duplicates;
                DuplicateFileNameChecker   checker = new DuplicateFileNameChecker(this, _Project, _Project.ProjectSettings.OutputPath);
                bool validates = checker.ValidateFileNames(folderName, folder, thisLevelRootObject, out duplicates);

                if (validates == false)
                {
                    _ProgressHelper.ReportProgress(100, new GenerateFilesProgress(0, new DuplicateFilesException(duplicates)));
                    return(0);
                }

                // Reset the Template again before the real template run.
                object[] parameters = new object[0];
                _Loader.CallTemplateFunction(TemplateHelper.ClearTemplateCacheFunctionName, ref parameters);

                //foreach (var provider in _Project.Providers)
                //{
                //    _Loader.CallPreGenerationInitialisationFunction(provider, data);
                //}
            }

            if (parentNode == null && isTopLevel)
            {
                addToProjectFileTree = false;
            }

            if (_Loader == null)
            {
                return(0);
            }

            if (addToProjectFileTree && parentNode is ProjectFileTree)
            {
                ((ProjectFileTree)parentNode).TreeRestructuring = true;
                ((ProjectFileTree)parentNode).Clear();
            }
            int fileCount = 0;

            try
            {
                CurrentRootObject = thisLevelRootObject;
                absoluteBasePath  = basePath;

                {
                    Version version         = new Version(_Loader.GetAssemblyVersionNumber());
                    Version expectedVersion = new Version(1, 1, 9, 49);
                    if (version < expectedVersion)
                    {
                        throw new OldVersionException("The template was compiled with an old version of ArchAngel, and cannot be used in this version of Workbench");
                    }
                }

                foreach (IFolder subFolder in folder.SubFolders)
                {
                    if (_ProgressHelper.IsCancellationPending())
                    {
                        _ProgressHelper.Cancel();
                        return(fileCount);
                    }

                    ProjectFileTreeNode folderNode = null;

                    if (addToProjectFileTree && parentNode != null && subFolder.Name != "ROOT")
                    {
                        folderNode          = parentNode.AddChildNode(subFolder.Name);
                        folderNode.IsFolder = true;
                    }

                    if (!string.IsNullOrEmpty(subFolder.IteratorName))
                    {
                        // The folder has an iterator
                        ProviderInfo provider;
                        Type         iteratorType = _Project.GetIteratorTypeFromProviders(subFolder.IteratorName, out provider);

                        if (_ProgressHelper.IsCancellationPending())
                        {
                            _ProgressHelper.Cancel();
                            return(fileCount);
                        }

                        object[] iteratorObjects;

                        if (thisLevelRootObject == null)
                        {
                            iteratorObjects = provider.GetAllObjectsOfType(iteratorType.FullName).ToArray();
                        }
                        else if (iteratorType.IsInstanceOfType(thisLevelRootObject))
                        {
                            iteratorObjects = new[] { thisLevelRootObject };
                        }
                        else
                        {
                            iteratorObjects = provider.GetAllObjectsOfType(iteratorType.FullName, thisLevelRootObject).ToArray();
                        }

                        if (iteratorObjects != null)
                        {
                            foreach (IScriptBaseObject iteratorObject in iteratorObjects)
                            {
                                if (_ProgressHelper.IsCancellationPending())
                                {
                                    _ProgressHelper.Cancel();
                                    return(fileCount);
                                }

                                CurrentRootObject = iteratorObject;

                                string subFolderName = UpdateScriptName(iteratorObject, subFolder);

                                if (folderNode != null)
                                {
                                    folderNode.Text = subFolderName;
                                }

                                subFolderName = Path.Combine(folderName, subFolderName);

                                fileCount += GenerateAllFiles(subFolderName, subFolder, folderNode, CurrentRootObject, basePath, false);
                            }
                        }
                    }
                    else
                    {
                        // The folder doesn't have an iterator
                        if (_ProgressHelper.IsCancellationPending())
                        {
                            _ProgressHelper.Cancel();
                            return(fileCount);
                        }
                        string subFolderName = UpdateScriptName(null, subFolder);

                        if (folderNode != null)
                        {
                            folderNode.Text = subFolderName;
                        }
                        subFolderName = Path.Combine(folderName, subFolderName);

                        fileCount += GenerateAllFiles(subFolderName, subFolder, folderNode, thisLevelRootObject, basePath, false);
                    }
                }

                foreach (IScript script in folder.Scripts)
                {
                    if (_ProgressHelper.IsCancellationPending())
                    {
                        _ProgressHelper.Cancel();
                        return(fileCount);
                    }
                    fileCount += CreateScriptFile(folderName, script, parentNode);
                }

                foreach (IFile file in folder.Files)
                {
                    if (_ProgressHelper.IsCancellationPending())
                    {
                        _ProgressHelper.Cancel();
                        return(fileCount);
                    }
                    fileCount += CreateStaticFile(folderName, file, parentNode);
                }
            }
            catch (Exception e)
            {
                _ProgressHelper.ReportProgress(100, new GenerateFilesProgress(fileCount, e));
                return(fileCount);
            }
            finally
            {
                if (addToProjectFileTree && parentNode is ProjectFileTree)
                {
                    ((ProjectFileTree)parentNode).TreeRestructuring = false;
                    parentNode.RaiseNodeChangedEvent(parentNode, true);
                }
            }

            if (isTopLevel)
            {
                SharedData.IsBusyGenerating = false;
            }

            _ProgressHelper.ReportProgress(50, new GenerateFilesProgress(fileCount));
            return(fileCount);
        }