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)); } }
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)); }
/// <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; }
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)); } }
/// <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); }
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); }