/// <summary> /// Saves the data structure: its properties marked with <see cref="fileDataAttribute"/> attribute and it self /// </summary> /// <param name="instance">The instance that has to be saved</param> /// <param name="parentFolder">The parent folder in which this instance will be saved - if not specified the application current folder is used</param> /// <param name="output">Logger</param> /// <returns></returns> /// <exception cref="System.NotImplementedException">Can't have File Data Structure loaded if no file structure mode specified</exception> internal String SaveDataStructure(IFileDataStructure instance, folderNode parentFolder = null, ILogBuilder output = null) { if (parentFolder == null) { parentFolder = new folderNode(); } String desc = instance.description; if (desc.isNullOrEmpty()) { desc = description; } String filename = GetFilenameAndSetInstanceFolder(instance, parentFolder, output); instance.OnBeforeSave(); foreach (var pair in fileDataProperties) { fileDataPropertyDescriptor pDesc = pair.Value; pDesc.SaveData(instance, instance.folder, output); } String filepath = instance.folder.pathFor(filename, getWritableFileMode.overwrite, desc, true); SaveDataFile(instance, filepath, output); return(filepath); }
internal void deployDescriptor(Type type, IFileDataStructure dataStructure) { //Type type = dataStructure.GetType(); fileStructureAttribute attribute = Attribute.GetCustomAttribute(type, typeof(fileStructureAttribute)) as fileStructureAttribute; if (attribute != null) { deployDescriptorBase(type, attribute, dataStructure); } var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty); foreach (var prop in properties) { fileDataAttribute propAttribute = Attribute.GetCustomAttribute(prop, typeof(fileDataAttribute)) as fileDataAttribute; if (propAttribute != null) { fileDataPropertyDescriptor propDescriptor = new fileDataPropertyDescriptor(prop, propAttribute, dataStructure); Int32 p = propDescriptor.memberMetaInfo.priority; while (fileDataProperties.ContainsKey(p)) { p++; } fileDataProperties.Add(p, propDescriptor); } } }
/// <summary> /// Deletes the data structure file, where filepath is determined using the <see cref="fileDataStructureDescriptor"/> of <see cref="IFileDataStructure"/> instance specified. /// </summary> /// <param name="instance">The instance.</param> /// <param name="output">The output.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException">Can't have File Data Structure loaded if no file structure mode specified</exception> internal Boolean DeleteDataStructure(IFileDataStructure instance, ILogBuilder output = null) { String filename = ""; // GetFilepath("", instance, false); switch (mode) { case fileStructureMode.subdirectory: if (!Directory.Exists(instance.folder.path)) { return(false); } DirectoryInfo di = new DirectoryInfo(instance.folder.path); di.Delete(true); break; case fileStructureMode.none: fileDataStructureExtensions.FileDataStructureError("Can't have File Data Structure loaded if no file structure mode specified", instance?.folder, output, null, instance); //throw new NotImplementedException("Can't have File Data Structure loaded if no file structure mode specified"); break; } return(true); }
/// <summary> /// Saves the data for instance /// </summary> /// <param name="instance">The instance.</param> /// <param name="parentFolder">The parent folder.</param> /// <param name="output">The output.</param> /// <exception cref="imbACE.Core.core.exceptions.aceGeneralException">Type [" + memberMetaInfo.relevantTypeName + "] of property [" + memberMetaInfo.name + "] has no parameterless constructor. - null - Property [" + memberMetaInfo.name + "] is not new() type</exception> internal void SaveData(IFileDataStructure instance, folderNode parentFolder = null, ILogBuilder output = null) { // if (output == null) output = aceLog.loger; Boolean normalHandling = isNormalHandling(); Object vl = instance.imbGetPropertySafe(memberMetaInfo.memberInfo as PropertyInfo, type.GetDefaultValue()); if (vl == null) { if (doAutoInstanceOnSaveData) { if (!type.hasParameterlessConstructor()) { throw new InvalidOperationException("Type [" + memberMetaInfo.relevantTypeName + "] of property [" + memberMetaInfo.name + "] has no parameterless constructor, and the property value is null. SaveData failed for property [" + memberMetaInfo.name + "] that is not new() type"); } else { vl = type.getInstance(); //vl = // // type.CreateInstance(); } } else { return; } } String fp = GetFilepath("", instance, false); fp = parentFolder.pathFor(fp, getWritableFileMode.none, description, true); if (normalHandling) { SaveDataFile(vl, fp, output); } else { IList vlList = vl as IList; if (vlList != null) { Int32 i = 0; foreach (Object item in vlList) { String pth = fp.Replace(WILLCARD_SUFIX, i.ToString("D4")); SaveDataFile(item, pth, output); i++; } } } }
/// <summary> /// Gets the filepath. Optionally sets instance property if <see cref="path"/> contains filename. In the most cases you want to use this without parameters /// </summary> /// <param name="path">Optional target path information, may provide property value if <see cref="fileDataFilenameMode.propertyValue"/> mode is set</param> /// <param name="instance">Optionally, instance to set property value if <see cref="fileDataFilenameMode.propertyValue"/> mode is used</param> /// <param name="appendPathInOutput">if set to true it will use <paramref name="path"/> as prefix to output.</param> /// <returns>filename with extension, optionally full path with prefix <paramref name="path"/></returns> public override String GetFilepath(String path = "", IFileDataStructure instance = null, Boolean appendPathInOutput = false) { String filepath = ""; switch (filenameMode) { case fileDataFilenameMode.memberInfoName: case fileDataFilenameMode.customName: filepath = filename; break; case fileDataFilenameMode.propertyValue: filepath = Path.GetFileNameWithoutExtension(path); path = path.getPathVersion(1, "\\"); if (instance != null) { PropertyExpression pexp = new PropertyExpression(instance, nameOrPropertyPath); pexp.setValue(filename); } break; default: // //throw new NotImplementedException("File Data Structure can't have filename by property value"); break; } if (options.HasFlag(fileDataPropertyOptions.itemAsFile)) { filepath = filepath + WILLCARD_SUFIX; } filepath = filepath.ensureEndsWith(formatMode.GetExtension()); if (appendPathInOutput) { path = path.add(filepath, "\\"); } else { path = filepath; } return(path); }
/// <summary> /// Saves this data structure /// </summary> /// <param name="logger">The logger.</param> public void Save(ILogBuilder logger = null) { if (folder == null) { fileDataStructureExtensions.FileDataStructureError("Folder not set - can't save fileDataStructure " + descriptor.name + " [" + descriptor.type.Name + "]", folder, logger, null, this as IFileDataStructure); } IFileDataStructure st = this as IFileDataStructure; if (st != null) { folderNode fp = folder; if (descriptor.mode == fileStructureMode.subdirectory) { fp = folder.parent as folderNode; } st.SaveDataStructure(fp); } }
public override string GetFilepath(string path = "", IFileDataStructure instance = null, bool appendPathInOutput = false) { String filepath = ""; switch (filenameMode) { case fileDataFilenameMode.memberInfoName: case fileDataFilenameMode.customName: filepath = filename; break; case fileDataFilenameMode.propertyValue: filepath = Path.GetFileNameWithoutExtension(path); path = imbStringPathTools.getPathVersion(path, 1, Path.DirectorySeparatorChar); if (instance != null) { PropertyExpression pexp = new PropertyExpression(instance, nameOrPropertyPath); pexp.setValue(filename); } break; default: fileDataStructureExtensions.FileDataStructureError("File Data Structure can't have filename by property value. " + path, instance?.folder, null, null, instance); break; } if (options.HasFlag(fileDataPropertyOptions.itemAsFile)) { filepath = filepath + "_*"; } //path = path.ensureEndsWith(filepath); if (appendPathInOutput) { path = path.add(filepath, Path.DirectorySeparatorChar); } return(path); }
internal void LoadDataAndSet(IFileDataStructure instance, folderNode parentFolder = null, ILogBuilder output = null) { // if (output == null) output = aceLog.loger; Boolean normalHandling = isNormalHandling(); if (normalHandling) { String fp = GetFilepath("", instance, false); fp = parentFolder.pathFor(fp, getWritableFileMode.none); Object vl = LoadDataFile(fp, output, type); if (vl == null) { PropertyInfo pi = memberMetaInfo.memberInfo as PropertyInfo; vl = pi.PropertyType.getInstance(); } instance.imbSetPropertySafe(memberMetaInfo.memberInfo as PropertyInfo, vl, true); } else { IList vlList = type.getInstance() as IList; Type itemType = type.GetGenericArguments().FirstOrDefault(); String fpattern = GetFilepath("", instance, false); fpattern = fpattern.Replace(WILLCARD_SUFIX, "*"); List <String> found = parentFolder.findFiles(fpattern, System.IO.SearchOption.TopDirectoryOnly); foreach (String fnd in found) { if (File.Exists(fnd)) { vlList.Add(LoadDataFile(fnd, output, itemType)); } else { output.log("File previously detected [" + parentFolder.path + " with " + fpattern + "] can't be found !"); } } instance.imbSetPropertySafe(memberMetaInfo.memberInfo as PropertyInfo, vlList, true); } }
private String GetFilenameAndSetInstanceFolder(IFileDataStructure instance, folderNode parentFolder = null, ILogBuilder output = null) { String filename = ""; // GetFilepath("", instance, false); try { switch (mode) { case fileStructureMode.subdirectory: //parentFolder = Directory.CreateDirectory(parentFolder.path); if (instance.folder == null) { instance.folder = parentFolder.Add(instance.name, instance.name, "Directory for [" + instance.GetType().Name + "]. " + instance.description); } else { if (instance.folder.name != instance.name) { instance.folder = parentFolder.Add(instance.name, instance.name, "Directory for [" + instance.GetType().Name + "]. " + instance.description); } } filename = type.Name.getCleanPropertyName().add(formatMode.GetExtension(), "."); break; case fileStructureMode.none: fileDataStructureExtensions.FileDataStructureError("Can't have File Data Structure loaded if no file structure mode specified", parentFolder, output, null, instance); //throw new NotImplementedException("Can't have File Data Structure loaded if no file structure mode specified"); break; } } catch (Exception ex) { fileDataStructureExtensions.FileDataStructureError("SaveDataStructure failed at designating folder and filename: " + ex.Message, parentFolder, output, ex, instance); } return(filename); }
public imbFileException(String message, Exception ex, folderNode folder = null, String path = null, IFileDataStructure dataStructure = null) : base(message, ex) { relatedDataStructure = dataStructure; relatedPath = path; relatedFolder = folder; }
/// <summary> /// Loads the data structure. /// </summary> /// <param name="path">The path.</param> /// <param name="parentFolder">The parent folder.</param> /// <param name="instance">The instance.</param> /// <param name="output">The output.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException">Can't have File Data Structure loaded if no file structure mode specified</exception> internal IFileDataStructure LoadDataStructure(String path, folderNode parentFolder = null, IFileDataStructure instance = null, ILogBuilder output = null) { if (parentFolder == null) { parentFolder = new folderNode(); } switch (mode) { case fileStructureMode.subdirectory: if (path.Contains(".")) { path = Path.GetDirectoryName(path); if (path.isNullOrEmptyString()) { fileDataStructureExtensions.FileDataStructureError("This is subdirectory data structure, do not use directory names with dot [" + path + "] " + "Path contains dot", parentFolder, output, null, instance); //throw new ArgumentException("This is subdirectory data structure, do not use directory names with dot [" + path + "] " + "Path contains dot", nameof(path)); } } var folder = parentFolder.createDirectory(path, "", false); filename = type.Name.getCleanPropertyName().add(formatMode.GetExtension(), "."); if (instance != null) { instance.folder = folder; } parentFolder = folder; break; case fileStructureMode.none: filename = GetFilepath(path, instance, false); fileDataStructureExtensions.FileDataStructureError("Can't have File Data Structure loaded if no file structure mode specified. " + path, parentFolder, output, null, instance); //throw new NotImplementedException("Can't have File Data Structure loaded if no file structure mode specified"); break; } String filepath = parentFolder.pathFor(filename); if (File.Exists(filepath)) { instance = LoadDataFile(filepath, output) as IFileDataStructure; } else { if (instance == null) { fileDataStructureExtensions.FileDataStructureError("File not found[" + filepath + "] no instance created", parentFolder, output, null, instance); } else { fileDataStructureExtensions.FileDataStructureError("File not found[" + filepath + "] default instance created", parentFolder, output, null, instance); // Console.WriteLine("File not found [" + filepath + "] default instance created"); } } instance.folder = parentFolder; foreach (var pair in fileDataProperties) { fileDataPropertyDescriptor pDesc = pair.Value; try { pDesc.LoadDataAndSet(instance, parentFolder, output); } catch (Exception ex) { fileDataStructureExtensions.FileDataStructureError("Loading property [" + pDesc.name + "] for [" + instance.name + "] failed. " + ex.Message, parentFolder, output, ex, instance); } } if (instance != null) { parentFolder.description = instance.description; parentFolder.caption = instance.name; } try { instance.OnLoaded(); } catch (Exception ex) { fileDataStructureExtensions.FileDataStructureError("instance [" + instance.name + "] OnLoaded() failed. " + ex.Message + " : " + ex.StackTrace, parentFolder, output, ex, instance); //Console.WriteLine("instance [" + instance.name + "] OnLoaded() failed. " + ex.Message + " : " + ex.StackTrace); } return(instance); }
internal void deployDescriptor(IFileDataStructure dataStructure) { Type type = dataStructure.GetType(); deployDescriptor(type, dataStructure); }
public fileDataStructureDescriptor(IFileDataStructure dataStructure) { deployDescriptor(dataStructure); }
public abstract String GetFilepath(String path = "", IFileDataStructure instance = null, Boolean appendPathInOutput = false);
/// <summary> /// Files the data structure error. /// </summary> /// <param name="message">The message.</param> /// <param name="folder">The folder.</param> /// <param name="logger">The logger.</param> /// <param name="ex">The ex.</param> /// <param name="instance">The instance.</param> public static void FileDataStructureError(String message, folderNode folder, ILogBuilder logger, Exception ex, IFileDataStructure instance) { StringBuilder sb = new StringBuilder(); sb.AppendLine(message); sb.AppendLine(" -- -- -- --"); if (ex != null) { sb.AppendLine("Exception [" + ex.GetType().Name + "] " + ex.Message); sb.AppendLine(ex.StackTrace); } sb.AppendLine(" -- -- -- --"); if (instance != null) { sb.AppendLine("At instance [" + instance.GetType().Name + "] name: " + instance.name.toStringSafe()); } else { sb.AppendLine("Instance is null"); } sb.AppendLine(" -- -- -- --"); sb.AppendLine(DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString()); if (config.imbSCICoreConfig.settings.DoShowFileDataStructureErrors) { if (logger == null) { Console.WriteLine(sb.ToString()); } else { logger.log(sb.ToString()); } } String path = ""; if (config.imbSCICoreConfig.settings.DoSaveLogNoteForDataStructureErrors) { if (folder == null) { folderNode fn = new DirectoryInfo("logs" + Path.DirectorySeparatorChar + "error"); folder = fn; } String filename = "filestructure_error_" + DateTime.Now.ToShortTimeString() + "_" + DateTime.Now.ToShortDateString() + "_" + imbStringGenerators.getRandomString(8); filename = filename.getFilename(".txt"); path = folder.pathFor(filename, getWritableFileMode.autoRenameThis); File.WriteAllText(path, sb.ToString()); } if (config.imbSCICoreConfig.settings.DoThrowExceptionOnDataStructureErrors) { sb.AppendLine("[the path supplied is path of error log file]"); throw new imbFileException(sb.ToString(), ex, folder, path, instance); } }
/// <summary> /// Gets the file data structure descriptor. /// </summary> /// <param name="dataStructure">The data structure.</param> /// <returns></returns> public static fileDataStructureDescriptor GetFileDataStructureDescriptor(this IFileDataStructure dataStructure) { fileDataStructureDescriptor output = new fileDataStructureDescriptor(dataStructure); return(output); }