public static string                             getXmlFilePathForGuidanceId(this TM_FileStorage tmFileStorage, Guid guidanceItemId, Guid libraryId)
        {
            var tmFileStorate = TM_FileStorage.Current;

            //first see if we already have this mapping
            if (tmFileStorate.GuidanceItems_FileMappings.hasKey(guidanceItemId))
            {
                //"in getXmlFilePathForGuidanceId, found id in current mappings: {0}".info( guidanceItemId);
                return(tmFileStorate.GuidanceItems_FileMappings[guidanceItemId]);
            }
            //then update the GuidanceItems_FileMappings dictionary

            if (libraryId == Guid.Empty)
            {
                "[getXmlFilePathForGuidanceId] When creating a new GuidanceItem a libraryId must be provided".error();
                return(null);
            }
            var tmLibrary = tmFileStorage.tmXmlDatabase().tmLibrary(libraryId);

            if (tmLibrary == null)
            {
                "[getXmlFilePathForGuidanceId] When creating a new GuidanceItem could not find library for libraryId: {0}".error(libraryId);
                return(null);
            }
            var libraryPath      = tmFileStorage.xmlDB_Path_Library_RootFolder(tmLibrary);
            var newArticleFolder = libraryPath.pathCombine(TMConsts.DEFAULT_ARTICLE_FOLDER_NAME);
            var xmlPath          = newArticleFolder.createDir()
                                   .pathCombine("{0}.xml".format(guidanceItemId));

            "in getXmlFilePathForGuidanceId, no previous mapping found so adding new GuidanceItems_FileMappings for :{0}".info(xmlPath);

            tmFileStorate.GuidanceItems_FileMappings.add(guidanceItemId, xmlPath); //add it to the file_mappings dictionary so that we know it for next time
            return(xmlPath);
        }
        public static string Get_Path_To_File(this TM_FileStorage tmFileStorage, string libraryName, string fileName)
        {
            var library = tmFileStorage.tmXmlDatabase().tmLibrary(libraryName);

            if (library.notNull())
            {
                var filePath = tmFileStorage.xmlDB_Path_Library_RootFolder(library).pathCombine("_Images").pathCombine(fileName);
                if (filePath.fileExists())
                {
                    return(filePath);
                }
            }
            return(null);
        }
        public static bool upload_File_to_Library(this TM_FileStorage tmFileStorage, Guid libraryId, string filename, byte[] fileContents)
        {
            UserRole.Admin.demand();
            var targetLibrary = tmFileStorage.tmXmlDatabase().tmLibrary(libraryId);

            if (targetLibrary.notNull())
            {
                var targetFolder = tmFileStorage.xmlDB_Path_Library_RootFolder(targetLibrary)
                                   .pathCombine("_Images")
                                   .createDir();
                var targetFile = targetFolder.pathCombine(filename.safeFileName());
                return(fileContents.saveAs(targetFile).fileExists());
            }
            return(false);
        }
        public static string install_LibraryFromZip(this TM_FileStorage tmFileStorage, string pathToGitHubZipBall, string libraryName)
        {
            UserGroup.Admin.assert();
            try
            {
                var tmXmlDatabase = tmFileStorage.tmXmlDatabase();
                if (tmFileStorage.isNull() || tmXmlDatabase.isNull())
                {
                    return(null);
                }

                var tmLibrary = tmXmlDatabase.tmLibrary(libraryName);
                if (tmLibrary.notNull())
                {
                    "[Install_LibraryFromZip] Skyping library {0} because it already existed".debug(libraryName);
                    return(tmFileStorage.xmlDB_Path_Library_RootFolder(tmLibrary));
                }
                var tmLibraries_Before = tmXmlDatabase.tmLibraries();

                var result = tmFileStorage.xmlDB_Libraries_ImportFromZip(pathToGitHubZipBall, "");

                var tmLibraries_After = tmXmlDatabase.tmLibraries();
                var installedLibrary  = tmXmlDatabase.tmLibrary(libraryName);

                Assert.IsTrue(result, "xmlDB_Libraries_ImportFromZip");
                Assert.IsNotEmpty(tmLibraries_After, "Libraries should be there after install");
                Assert.AreNotEqual(tmLibraries_After.size(), tmLibraries_Before.size(), "Libraries size should be different before and after");
                Assert.IsNotNull(installedLibrary, "Could not find installed library: {0}".format(libraryName));
                Assert.AreEqual(installedLibrary.Caption, libraryName, "After install library names didn't match");
                return(tmFileStorage.xmlDB_Path_Library_RootFolder(installedLibrary));
            }
            finally
            {
                UserGroup.None.assert();
            }
        }