/// <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);
예제 #15
0
        /// <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);
            }
        }
예제 #16
0
        /// <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);
        }