public bool ValidateFileNames(string folderName, IFolder folder, IScriptBaseObject thisLevelRootObject, out IEnumerable<FilenameInfo> duplicates) { log.Info("Validating generated files."); List<FilenameInfo> generatedPaths = new List<FilenameInfo>(); ValidateFileNames(generatedPaths, folder, thisLevelRootObject, folderName); Dictionary<string, FilenameInfo> generatedPathSet = new Dictionary<string, FilenameInfo>(); HashSet<FilenameInfo> tempduplicates = new HashSet<FilenameInfo>(); foreach (var path in generatedPaths) { if (generatedPathSet.ContainsKey(path.ProcessedFilename) == false) { generatedPathSet.Add(path.ProcessedFilename, path); } else { tempduplicates.Add(generatedPathSet[path.ProcessedFilename]); tempduplicates.Add(path); } } if (tempduplicates.Count > 0) { duplicates = tempduplicates; return false; } duplicates = new List<FilenameInfo>(); return true; }
public bool ValidateFileNames(string folderName, IFolder folder, IScriptBaseObject thisLevelRootObject, out IEnumerable <FilenameInfo> duplicates) { log.Info("Validating generated files."); List <FilenameInfo> generatedPaths = new List <FilenameInfo>(); ValidateFileNames(generatedPaths, folder, thisLevelRootObject, folderName); Dictionary <string, FilenameInfo> generatedPathSet = new Dictionary <string, FilenameInfo>(); HashSet <FilenameInfo> tempduplicates = new HashSet <FilenameInfo>(); foreach (var path in generatedPaths) { if (generatedPathSet.ContainsKey(path.ProcessedFilename) == false) { generatedPathSet.Add(path.ProcessedFilename, path); } else { tempduplicates.Add(generatedPathSet[path.ProcessedFilename]); tempduplicates.Add(path); } } if (tempduplicates.Count > 0) { duplicates = tempduplicates; return(false); } duplicates = new List <FilenameInfo>(); return(true); }
public void ProcessScriptBase(IScriptBaseObject scriptBase, XmlWriter writer) { if (scriptBase.Ex != null && scriptBase.Ex.Count > 0) { var serialiser = new VirtualPropertySerialiser(); serialiser.SerialiseVirtualProperties(scriptBase.Ex, writer); } }
//private void SerialiseGrouping(XmlWriter writer, Grouping grouping) //{ // if (grouping.ContainsConditions == false && grouping.ContainsGroupings == false) // return; // writer.WriteStartElement("AndGrouping"); // foreach (var condition in grouping.Conditions) // { // writer.WriteStartElement("Condition"); // writer.WriteStartElement("Column"); // writer.WriteAttributeString("table", condition.Column.Parent.Name); // writer.WriteAttributeString("name", condition.Column.Name); // writer.WriteEndElement(); // writer.WriteElementString("Operator", condition.Operator.Name); // writer.WriteElementString("ExpressionValue", condition.ExpressionValue.Value); // writer.WriteEndElement(); // } // foreach (var gr in grouping.Groupings) // SerialiseGrouping(writer, gr); // writer.WriteEndElement(); //} public void ProcessScriptBase(IScriptBaseObject scriptBase, XmlWriter writer) { if (scriptBase.Ex != null && scriptBase.Ex.Count > 0) { var serialiser = new VirtualPropertySerialiser(); serialiser.SerialiseVirtualProperties(scriptBase.Ex, writer); } }
public FormVirtualPropertyEdit(IUserOption virtualProperty, IScriptBaseObject iteratorObject) { InitializeComponent(); this.BackColor = Slyce.Common.Colors.BackgroundColor; ucHeading1.Text = ""; VirtualProperty = virtualProperty; OriginalValue = VirtualProperty.Value; Interfaces.Events.ShadeMainForm(); Populate(); }
public void ProcessScriptBase(IScriptBaseObject scriptBase, XmlNode node) { var virtualPropertiesNode = node.SelectSingleNode(VirtualPropertyDeserialiser.VirtualPropertiesNodeName); if (virtualPropertiesNode != null) { var deserialiser = new VirtualPropertyDeserialiser(); scriptBase.Ex = deserialiser.DeserialiseVirtualProperties(virtualPropertiesNode); } }
public void Setup() { mocks = new MockRepository(); progressHelper = mocks.DynamicMock<ITaskProgressHelper<GenerateFilesProgress>>(); projectInfo = mocks.DynamicMock<IWorkbenchProject>(); folder = mocks.DynamicMock<IFolder>(); scriptObject = mocks.DynamicMock<IScriptBaseObject>(); loader = mocks.DynamicMock<ITemplateLoader>(); controller = mocks.DynamicMock<IController>(); fileController = mocks.DynamicMock<IFileController>(); }
public void Setup() { mocks = new MockRepository(); progressHelper = mocks.DynamicMock <ITaskProgressHelper <GenerateFilesProgress> >(); projectInfo = mocks.DynamicMock <IWorkbenchProject>(); folder = mocks.DynamicMock <IFolder>(); scriptObject = mocks.DynamicMock <IScriptBaseObject>(); loader = mocks.DynamicMock <ITemplateLoader>(); controller = mocks.DynamicMock <IController>(); fileController = mocks.DynamicMock <IFileController>(); }
private static void SetUserOption <T>(IScriptBaseObject obj, string optionName, T value) { var option = obj.Ex.FirstOrDefault(uo => uo.Name == optionName); if (option != null) { option.Value = value; } else { obj.AddUserOption(new UserOption(optionName, typeof(T), value)); } }
private void ValidateFileNames(List<FilenameInfo> generatedPaths, IFolder folder, IScriptBaseObject thisLevelRootObject, string folderName) { foreach (IFolder subFolder in folder.SubFolders) { ValidateFolderName(generatedPaths, subFolder, thisLevelRootObject, folderName); } foreach (IScript script in folder.Scripts) { // Check script filename ValidateScriptName(generatedPaths, script, folderName); } foreach (IFile file in folder.Files) { // Check static filename ValidateStaticFileName(generatedPaths, file, folderName); //fileCount += CreateStaticFile(folderName, file, parentNode); } }
public bool DisplayOptionToUser(IOption option, IScriptBaseObject iteratorObject) { try { if (option.DisplayToUserValue.HasValue) { return option.DisplayToUserValue.Value; } if (string.IsNullOrEmpty(option.DisplayToUserFunction)) { return true; } if (iteratorObject == null) { object[] parameters = new object[0]; return (bool)TemplateLoader.CallTemplateFunction(option.DisplayToUserFunction, ref parameters); } else { object[] parameters = new object[] { iteratorObject }; return (bool)TemplateLoader.CallTemplateFunction(option.DisplayToUserFunction, ref parameters); } } catch (MissingMethodException) { object[] parameters = new object[] { iteratorObject }; return (bool)TemplateLoader.CallTemplateFunction(option.DisplayToUserFunction, ref parameters); } }
private void ValidateFolderName(List<FilenameInfo> generatedPaths, IFolder subFolder, IScriptBaseObject thisLevelRootObject, string folderName) { if (!string.IsNullOrEmpty(subFolder.IteratorName)) { // The folder has an iterator ProviderInfo provider; Type iteratorType = _Project.GetIteratorTypeFromProviders(subFolder.IteratorName, out provider); 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) { string subFolderName = helper.UpdateScriptName(iteratorObject, subFolder); subFolderName = Path.Combine(folderName, subFolderName); log.InfoFormat("<Folder> {0}, {1}", subFolderName, iteratorObject); generatedPaths.Add(new FilenameInfo(subFolderName, subFolder.Name, iteratorObject, FilenameInfo.FilenameTypes.Folder)); // Check Subfolders ValidateFileNames(generatedPaths, subFolder, thisLevelRootObject, subFolderName); //fileCount += GenerateAllFiles(subFolderName, subFolder, folderNode, iteratorObjects, basePath, false); } } } else { string subFolderName = helper.UpdateScriptName(null, subFolder); subFolderName = Path.Combine(folderName, subFolderName); log.InfoFormat("<Folder> {0}, no iterator", subFolderName); generatedPaths.Add(new FilenameInfo(subFolderName, subFolder.Name, null, FilenameInfo.FilenameTypes.Folder)); // check sub folders ValidateFileNames(generatedPaths, subFolder, thisLevelRootObject, subFolderName); } }
/// <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 void PopulateVirtualProperties(IScriptBaseObject obj) { Type type = obj.GetType(); if (!_VirtualPropertiesForTypes.ContainsKey(type)) { ArchAngelEditorAttribute[] atts = (ArchAngelEditorAttribute[])type.GetCustomAttributes(_ArchAngelEditorAttributeType, false); if (atts.Length > 0 && atts[0].VirtualPropertiesAllowed) { _VirtualPropertiesForTypes.Add(type, GetVirtualProperties(type)); } else { _VirtualPropertiesForTypes.Add(type, null); } } List<IOption> options = _VirtualPropertiesForTypes[type]; if (options == null) { return; } foreach (IOption opt in options) { object defaultValue = null; bool found = false; if (obj.Ex == null) { obj.Ex = new List<IUserOption>(); } foreach (IUserOption existingOption in obj.Ex) { if (existingOption.Name == opt.VariableName) { defaultValue = existingOption.Value; found = true; break; } } if (!found) { obj.AddUserOption(new UserOption(opt.VariableName, opt.VarType, defaultValue)); } } }
public abstract IEnumerable<IScriptBaseObject> GetAllObjectsOfType(string typeName, IScriptBaseObject rootObject);
private void AddIndividualOptions(Node node, List<IOption> options, IScriptBaseObject iteratorObject) { // TODO: Due to the high amount of processing, the Properties node should only be // added when the parent node is expanded, not all at once. //bool optionsExist = false; //foreach (IOption option in options) //{ // if (ProjectHelper.MyCurrentProject.DisplayOptionToUser(option, iteratorObject)) // { // optionsExist = true; // break; // } //} //if (optionsExist) if (options.Count > 0) { Node optionsNode = AddNode(node, "Properties", options, Images.Option, false, true); AddNode(optionsNode, "", "LAZY", Images.Unchecked, true, false); } }
public override IEnumerable<IScriptBaseObject> GetAllObjectsOfType(string typeName, IScriptBaseObject rootObject) { if (rootObject == MappingSet) { return GetAllObjectsOfType(typeName); } if (rootObject is ITable) { if (typeName == typeof(IColumn).FullName) return ((ITable)rootObject).Columns.ToArray(); if (typeName == typeof(IKey).FullName) return ((ITable)rootObject).Keys.ToArray(); if (typeName == typeof(IIndex).FullName) return ((ITable)rootObject).Indexes.ToArray(); } if (rootObject is Entity) { if (typeName == typeof(Property).FullName) return ((Entity)rootObject).Properties.ToArray(); if (typeName == typeof(EntityKey).FullName) return new[] { ((Entity)rootObject).Key }; if (typeName == typeof(Component).FullName) return ((Entity)rootObject).Components.ToArray(); } if (rootObject is IDatabase) { if (typeName == typeof(ITable).FullName) { return ((IDatabase)rootObject).Tables.ToArray(); } } throw new NotImplementedException("We do not currently handle " + rootObject.GetType().FullName + " types as root objects or " + typeName + " as objects to get types of."); }
/// <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); }
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; }
private void ValidateFolderName(List <FilenameInfo> generatedPaths, IFolder subFolder, IScriptBaseObject thisLevelRootObject, string folderName) { if (!string.IsNullOrEmpty(subFolder.IteratorName)) { // The folder has an iterator ProviderInfo provider; Type iteratorType = _Project.GetIteratorTypeFromProviders(subFolder.IteratorName, out provider); 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) { string subFolderName = helper.UpdateScriptName(iteratorObject, subFolder); subFolderName = Path.Combine(folderName, subFolderName); log.InfoFormat("<Folder> {0}, {1}", subFolderName, iteratorObject); generatedPaths.Add(new FilenameInfo(subFolderName, subFolder.Name, iteratorObject, FilenameInfo.FilenameTypes.Folder)); // Check Subfolders ValidateFileNames(generatedPaths, subFolder, thisLevelRootObject, subFolderName); //fileCount += GenerateAllFiles(subFolderName, subFolder, folderNode, iteratorObjects, basePath, false); } } } else { string subFolderName = helper.UpdateScriptName(null, subFolder); subFolderName = Path.Combine(folderName, subFolderName); log.InfoFormat("<Folder> {0}, no iterator", subFolderName); generatedPaths.Add(new FilenameInfo(subFolderName, subFolder.Name, null, FilenameInfo.FilenameTypes.Folder)); // check sub folders ValidateFileNames(generatedPaths, subFolder, thisLevelRootObject, subFolderName); } }
public abstract IEnumerable <IScriptBaseObject> GetAllObjectsOfType(string typeName, IScriptBaseObject rootObject);
/// <summary> /// Runs through a project and generates the files in it. /// </summary> /// <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">If this is null, the files will just be generated, not </param> /// <param name="thisLevelRootObject"></param> /// <returns></returns> /// <param name="basePath">The path to which the files should be generated</param> public int GenerateAllFiles(string folderName, IFolder folder, ProjectFileTreeNode parentNode, IScriptBaseObject thisLevelRootObject, string basePath) { return GenerateAllFiles(folderName, folder, parentNode, thisLevelRootObject, basePath, true); }
/// <summary> /// Returns all objects of the specified type that are valid 'beneath' the supplied rootObject. This typically gets called /// when analysis and generation begins and the objects get passed to the template to create the output files. /// </summary> /// <param name="typeName">Fully qualified name of the type of objects to return.</param> /// <param name="rootObject">Object by which the results must get filtered.</param> /// <returns>An arra of objects of the specified type.</returns> public override IEnumerable <IScriptBaseObject> GetAllObjectsOfType(string typeName, IScriptBaseObject rootObject) { throw new NotImplementedException("We do not currently handle " + rootObject.GetType().FullName + " types as root objects or " + typeName + " as objects to get types of."); }
public override IEnumerable <IScriptBaseObject> GetAllObjectsOfType(string typeName, IScriptBaseObject rootObject) { if (rootObject == MappingSet) { return(GetAllObjectsOfType(typeName)); } if (rootObject is ITable) { if (typeName == typeof(IColumn).FullName) { return(((ITable)rootObject).Columns.ToArray()); } if (typeName == typeof(IKey).FullName) { return(((ITable)rootObject).Keys.ToArray()); } if (typeName == typeof(IIndex).FullName) { return(((ITable)rootObject).Indexes.ToArray()); } } if (rootObject is Entity) { if (typeName == typeof(Property).FullName) { return(((Entity)rootObject).Properties.ToArray()); } if (typeName == typeof(EntityKey).FullName) { return new[] { ((Entity)rootObject).Key } } ; if (typeName == typeof(Component).FullName) { return(((Entity)rootObject).Components.ToArray()); } } if (rootObject is IDatabase) { if (typeName == typeof(ITable).FullName) { return(((IDatabase)rootObject).Tables.ToArray()); } } throw new NotImplementedException("We do not currently handle " + rootObject.GetType().FullName + " types as root objects or " + typeName + " as objects to get types of."); }
/// <summary> /// Returns all objects of the specified type that are valid 'beneath' the supplied rootObject. This typically gets called /// when analysis and generation begins and the objects get passed to the template to create the output files. /// </summary> /// <param name="typeName">Fully qualified name of the type of objects to return.</param> /// <param name="rootObject">Object by which the results must get filtered.</param> /// <returns>An arra of objects of the specified type.</returns> public override IEnumerable<IScriptBaseObject> GetAllObjectsOfType(string typeName, IScriptBaseObject rootObject) { throw new NotImplementedException("We do not currently handle " + rootObject.GetType().FullName + " types as root objects or " + typeName + " as objects to get types of."); }
private void ValidateFileNames(List <FilenameInfo> generatedPaths, IFolder folder, IScriptBaseObject thisLevelRootObject, string folderName) { foreach (IFolder subFolder in folder.SubFolders) { ValidateFolderName(generatedPaths, subFolder, thisLevelRootObject, folderName); } foreach (IScript script in folder.Scripts) { // Check script filename ValidateScriptName(generatedPaths, script, folderName); } foreach (IFile file in folder.Files) { // Check static filename ValidateStaticFileName(generatedPaths, file, folderName); //fileCount += CreateStaticFile(folderName, file, parentNode); } }
/// <summary> /// Runs through a project and generates the files in it. /// </summary> /// <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">If this is null, the files will just be generated, not </param> /// <param name="thisLevelRootObject"></param> /// <returns></returns> /// <param name="basePath">The path to which the files should be generated</param> public int GenerateAllFiles(string folderName, IFolder folder, ProjectFileTreeNode parentNode, IScriptBaseObject thisLevelRootObject, string basePath) { return(GenerateAllFiles(folderName, folder, parentNode, thisLevelRootObject, basePath, true)); }