/// <summary> [PUBLIC] Get the list of uploaded images for a particular aggregation </summary>
        /// <param name="Response"></param>
        /// <param name="UrlSegments"></param>
        /// <param name="QueryString"></param>
        /// <param name="Protocol"></param>
        /// <param name="IsDebug"></param>
        /// <remarks> This REST API should be publicly available for users that are performing administrative work </remarks>
        public void GetAggregationUploadedImages(HttpResponse Response, List <string> UrlSegments, NameValueCollection QueryString, Microservice_Endpoint_Protocol_Enum Protocol, bool IsDebug)
        {
            if (UrlSegments.Count > 0)
            {
                string aggregation = UrlSegments[0];

                // Ensure a valid aggregation
                Item_Aggregation_Related_Aggregations aggrInfo = Engine_ApplicationCache_Gateway.Codes[aggregation];
                if (aggrInfo != null)
                {
                    List <UploadedFileFolderInfo> serverFiles = new List <UploadedFileFolderInfo>();

                    string design_folder = Engine_ApplicationCache_Gateway.Settings.Servers.Base_Design_Location + "aggregations\\" + aggregation + "\\uploads";
                    if (Directory.Exists(design_folder))
                    {
                        string foldername = aggrInfo.ShortName;
                        if (String.IsNullOrEmpty(foldername))
                        {
                            foldername = aggregation;
                        }

                        string[] files = SobekCM_File_Utilities.GetFiles(design_folder, "*.jpg|*.bmp|*.gif|*.png");
                        foreach (string thisFile in files)
                        {
                            string filename  = Path.GetFileName(thisFile);
                            string extension = Path.GetExtension(thisFile);

                            // Exclude some files
                            if ((!String.IsNullOrEmpty(extension)) && (extension.ToLower().IndexOf(".db") < 0) && (extension.ToLower().IndexOf("bridge") < 0) && (extension.ToLower().IndexOf("cache") < 0))
                            {
                                string url = Engine_ApplicationCache_Gateway.Settings.Servers.System_Base_URL + "design/aggregations/" + aggregation + "/uploads/" + filename;
                                serverFiles.Add(new UploadedFileFolderInfo(url, foldername));
                            }
                        }
                    }

                    JSON.Serialize(serverFiles, Response.Output, Options.ISO8601ExcludeNulls);
                }
            }
        }
Beispiel #2
0
        public Import_Spreadsheet_MySobekViewer(RequestCache RequestSpecificValues) : base(RequestSpecificValues)
        {
            RequestSpecificValues.Tracer.Add_Trace("Import_Spreadsheet_MySobekViewer.Constructor", String.Empty);

            // If the RequestSpecificValues.Current_User cannot submit items, go back
            //if (!RequestSpecificValues.Current_User.Can_Submit)
            //{
            //    RequestSpecificValues.Current_Mode.My_Sobek_Type = My_Sobek_Type_Enum.Home;
            //    UrlWriterHelper.Redirect(RequestSpecificValues.Current_Mode);
            //    return;
            //}

            // Create a new GUID for this task, or get from the session state
            string guid = HttpContext.Current.Session["Import_Data_Current_GUID"] as string;

            if (String.IsNullOrEmpty(guid))
            {
                guid = Guid.NewGuid().ToString();
                HttpContext.Current.Session.Add("Import_Data_Current_GUID", guid);
            }

            // Determine the in process directory for this
            if (RequestSpecificValues.Current_User.ShibbID.Trim().Length > 0)
            {
                taskUrl       = RequestSpecificValues.Current_Mode.Base_URL + "mySobek/InProcess/" + RequestSpecificValues.Current_User.ShibbID + "/task/" + guid;
                taskDirectory = Path.Combine(UI_ApplicationCache_Gateway.Settings.Servers.In_Process_Submission_Location, RequestSpecificValues.Current_User.ShibbID, "task", guid);
            }
            else
            {
                taskUrl       = RequestSpecificValues.Current_Mode.Base_URL + "mySobek/InProcess/" + RequestSpecificValues.Current_User.UserName.Replace(".", "").Replace("@", "") + "/task/" + guid;
                taskDirectory = Path.Combine(UI_ApplicationCache_Gateway.Settings.Servers.In_Process_Submission_Location, RequestSpecificValues.Current_User.UserName.Replace(".", "").Replace("@", ""), "task", guid);
            }

            // Try to determine the current page
            page = 1;
            int.TryParse(RequestSpecificValues.Current_Mode.My_Sobek_SubMode, out page);
            if (page < 1)
            {
                page = 1;
            }

            // Is there a data file here?
            string extension = null;

            if (Directory.Exists(taskDirectory))
            {
                string[] source_file = SobekCM_File_Utilities.GetFiles(taskDirectory, "*.xls|*.xlsx|*.csv|*.mrc");
                if (source_file.Length > 0)
                {
                    file_name = Path.GetFileName(source_file[0]);
                    extension = Path.GetExtension(source_file[0]);
                }
            }

            // Determine file type
            if ((!String.IsNullOrEmpty(file_name)) && (!String.IsNullOrEmpty(extension)))
            {
                switch (extension.ToUpper())
                {
                case ".XLS":
                case ".XLSX":
                    file_type = Import_File_Type_Enum.Excel;
                    break;

                case ".CSV":
                case ".TXT":
                    file_type = Import_File_Type_Enum.CSV;
                    break;

                case ".MRC":
                    file_type = Import_File_Type_Enum.Marc21;
                    break;

                case ".XML":
                    file_type = Import_File_Type_Enum.MarcXML;
                    break;
                }
            }
            else
            {
                file_type = Import_File_Type_Enum.None;
            }

            // Handle postback for changing the CompleteTemplate or project
            if (RequestSpecificValues.Current_Mode.isPostBack)
            {
                string action1 = HttpContext.Current.Request.Form["action"];
                if (action1 == "cancel")
                {
                    if (Directory.Exists(taskDirectory))
                    {
                        string[] allFiles = Directory.GetFiles(taskDirectory);
                        foreach (string thisFile in allFiles)
                        {
                            File.Delete(thisFile);
                        }
                        Directory.Delete(taskDirectory);
                    }
                    HttpContext.Current.Session["Import_Data_Current_GUID"]      = null;
                    HttpContext.Current.Session["Import_Data_Current_Worksheet"] = null;
                    RequestSpecificValues.Current_Mode.My_Sobek_Type             = My_Sobek_Type_Enum.Home;
                    UrlWriterHelper.Redirect(RequestSpecificValues.Current_Mode);
                    return;
                }

                if (action1 == "delete")
                {
                    if (Directory.Exists(taskDirectory))
                    {
                        string file = Path.Combine(taskDirectory, file_name);
                        if (File.Exists(file))
                        {
                            File.Delete(file);
                        }
                    }

                    page      = 1;
                    file_name = String.Empty;
                    file_type = Import_File_Type_Enum.None;
                    HttpContext.Current.Session["Import_Data_Current_Worksheet"] = null;
                }
            }
        }
        /// <summary> Moves all packages from the inbound folder into the processing folder
        /// to queue them for loading into the library  </summary>
        /// <param name="Message"> Message to be passed out if something occurred during this attempted move </param>
        /// <returns> TRUE if successful, or FALSE if an error occurs </returns>
        public bool Move_From_Inbound_To_Processing(InstanceWide_Settings Settings, out string Message)
        {
            Message = String.Empty;

            // Get the directories
            string inboundFolder = Inbound_Folder;

            // Make sure the inbound directory exists
            if (!Directory.Exists(inboundFolder))
            {
                try
                {
                    Directory.CreateDirectory(inboundFolder);
                }
                catch
                {
                    Message = "Unable to create the non-existent inbound folder " + inboundFolder;
                    return(false);
                }
            }

            // Make sure the processing directory exists
            if (!Directory.Exists(Processing_Folder))
            {
                try
                {
                    Directory.CreateDirectory(Processing_Folder);
                }
                catch
                {
                    Message = "Unable to create the non-existent processing folder " + Processing_Folder;
                    return(false);
                }
            }

            // Make sure the failures directory exists
            if (!Directory.Exists(Failures_Folder))
            {
                try
                {
                    Directory.CreateDirectory(Failures_Folder);
                }
                catch
                {
                    Message = "Unable to create the non-existent failures folder " + Failures_Folder;
                    return(false);
                }
            }

            // If there are loose METS here, move them into flat folders of the same name
            try
            {
                string[] looseMets = SobekCM_File_Utilities.GetFiles(inboundFolder, "*.mets*|*.xml");
                foreach (string thisLooseMetsXml in looseMets)
                {
                    string filename         = Path.GetFileName(thisLooseMetsXml);
                    string filenameSplitter = Path.GetFileNameWithoutExtension(thisLooseMetsXml);
                    if (!Directory.Exists(inboundFolder + "\\" + filenameSplitter))
                    {
                        Directory.CreateDirectory(inboundFolder + "\\" + filenameSplitter);
                    }
                    if (File.Exists(inboundFolder + "\\" + filenameSplitter + "\\" + filename))
                    {
                        File.Delete(thisLooseMetsXml);
                    }
                    else
                    {
                        File.Move(thisLooseMetsXml, inboundFolder + "\\" + filenameSplitter + "\\" + filename);
                    }
                }
            }
            catch (Exception ee)
            {
                Message = "Error moving the package from " + inboundFolder + " to " + Processing_Folder + ":" + ee.Message;
                return(false);
            }


            // Get the list of all terminal directories
            IEnumerable <string> terminalDirectories = Get_Terminal_SubDirectories(inboundFolder);

            // Create a digital resource object for each directory
            List <Incoming_Digital_Resource> inboundResources = terminalDirectories.Select(ThisDirectory => new Incoming_Digital_Resource(ThisDirectory, this)).ToList();

            // Step through each resource which came in
            bool returnVal = true;

            foreach (Incoming_Digital_Resource resource in inboundResources)
            {
                // Is this resource a candidate to move for continued processing?
                long resource_age = resource.AgeInTicks;
                if ((resource_age > Settings.Builder.Complete_Package_Required_Aging) || ((resource_age > Settings.Builder.METS_Only_Package_Required_Aging) && (resource.METS_Only_Package)))
                {
                    if (!resource.Move(Processing_Folder))
                    {
                        returnVal = false;
                    }
                }
                else
                {
                    Message = "Resource ( " + resource.Resource_Folder + " ) needs to age more before it will be processed";
                }
            }

            return(returnVal);
        }
        /// <summary> Adds ALL the image files to the digital resource, regardless if they were just uploaded or not </summary>
        /// <param name="Resource"> Incoming digital resource object </param>
        /// <returns> TRUE if processing can continue, FALSE if a critical error occurred which should stop all processing </returns>
        public override bool DoWork(Incoming_Digital_Resource Resource)
        {
            bool jpeg_added     = false;
            bool jpeg2000_added = false;
            int  jpeg_files     = 0;

            // Ensure all non-image files are linked to the METS file
            string[] all_files = SobekCM_File_Utilities.GetFiles(Resource.Resource_Folder, "*.jp2|*.jpg");
            foreach (string thisFile in all_files)
            {
                string filename  = Path.GetFileName(thisFile);
                string extension = Path.GetExtension(thisFile);

                if ((filename == null) || (extension == null))
                {
                    continue;
                }

                extension = extension.ToLower().Replace(".", "");

                // Also, check to see if this is a jpeg or jpeg2000
                if (extension == "jp2")
                {
                    // Try to just always add JPEG2000s
                    Resource.Metadata.Divisions.Physical_Tree.Add_File(filename);
                    jpeg2000_added = true;
                }
                if (extension == "jpg")
                {
                    // If this is a thumbnail jpeg, only add if a regular JPEG or JP2000 exists
                    // Otherwise, it is likely just a thumbnail for a PDF or PPT file or something
                    if (filename.IndexOf("thm.jpg", StringComparison.OrdinalIgnoreCase) > 0)
                    {
                        string possible_jpeg     = thisFile.ToLower().Replace("thm.jpg", ".jpg");
                        string possible_jpeg2000 = thisFile.ToLower().Replace("thm.jpg", "jp2");

                        if ((File.Exists(possible_jpeg)) || (File.Exists(possible_jpeg2000)))
                        {
                            Resource.Metadata.Divisions.Physical_Tree.Add_File(filename);
                        }
                    }
                    else
                    {
                        // Non thumbnail, so go ahead and add it
                        Resource.Metadata.Divisions.Physical_Tree.Add_File(filename);
                        jpeg_added = true;
                        jpeg_files++;
                    }
                }
            }

            //// Ensure proper views are attached to this item
            //if ((jpeg2000_added) || (jpeg_added))
            //{
            //    if (jpeg_added)
            //    {
            //        Resource.Metadata.Behaviors.Add_View(View_Enum.JPEG);
            //        if ( jpeg_files > 1 )
            //            Resource.Metadata.Behaviors.Add_View(View_Enum.RELATED_IMAGES);
            //        if ((jpeg_files >= 4) && (Settings.Builder.Add_PageTurner_ItemViewer))
            //            Resource.Metadata.Behaviors.Add_View(View_Enum.PAGE_TURNER);
            //        if (jpeg2000_added)
            //            Resource.Metadata.Behaviors.Add_View(View_Enum.JPEG2000);
            //    }
            //    else
            //    {
            //        Resource.Metadata.Behaviors.Add_View(View_Enum.JPEG2000);
            //    }
            //}

            // THIS IS A TEMPORARY FIX FOR THUMBNAILS ACCIDENTALLY ADDED
            List <abstract_TreeNode> allPages = Resource.Metadata.Divisions.Physical_Tree.Pages_PreOrder;

            foreach (Page_TreeNode thisPage in allPages)
            {
                // If there is only one file attached, look for the thumbnails
                if (thisPage.Files.Count == 1)
                {
                    // If the only file is a thumbnail, just CLEAR this page.  That should
                    // cause the page to be skipped
                    string fileName = thisPage.Files[0].System_Name;
                    if (fileName.IndexOf("thm.jpg", StringComparison.OrdinalIgnoreCase) > 0)
                    {
                        thisPage.Files.Clear();
                    }
                }
            }

            return(true);
        }
        /// <summary> Constructor for a new instance of the Wordmarks_AdminViewer class </summary>
        /// <param name="User"> Authenticated user information </param>
        /// <param name="Current_Mode"> Mode / navigation information for the current request</param>
        /// <param name="Tracer">Trace object keeps a list of each method executed and important milestones in rendering</param>
        /// <remarks> Postback from editing an existing wordmark, deleting a wordmark, or creating a new wordmark is handled here in the constructor </remarks>
        public Wordmarks_AdminViewer(User_Object User, SobekCM_Navigation_Object Current_Mode, Custom_Tracer Tracer) : base(User)
        {
            Tracer.Add_Trace("Wordmarks_AdminViewer.Constructor", String.Empty);

            // Save the mode and settings  here
            currentMode = Current_Mode;

            // Set action message to nothing to start
            actionMessage = String.Empty;

            // If the user cannot edit this, go back
            if ((user == null) || ((!user.Is_System_Admin) && (!user.Is_Portal_Admin)))
            {
                currentMode.Mode          = Display_Mode_Enum.My_Sobek;
                currentMode.My_Sobek_Type = My_Sobek_Type_Enum.Home;
                currentMode.Redirect();
                return;
            }

            // Get the wordmark directory and ensure it exists
            wordmarkDirectory = HttpContext.Current.Server.MapPath("design/wordmarks");
            if (!Directory.Exists(wordmarkDirectory))
            {
                Directory.CreateDirectory(wordmarkDirectory);
            }

            // Get the list of all wordmarks
            wordmarks = new Dictionary <string, Wordmark_Icon>();
            SobekCM_Database.Populate_Icon_List(wordmarks, Tracer);

            // If this is a postback, handle any events first
            // if (currentMode.isPostBack)
            // {
            try
            {
                // Pull the standard values
                NameValueCollection form = HttpContext.Current.Request.Form;
                if (form["admin_wordmark_code_delete"] != null)
                {
                    string delete_value      = form["admin_wordmark_code_delete"].ToUpper().Trim();
                    string save_value        = form["admin_wordmark_code_tosave"].ToUpper().Trim();
                    string new_wordmark_code = form["admin_wordmark_code"].ToUpper().Trim();

                    // Was this a reset request?
                    if (delete_value.Length > 0)
                    {
                        // If the value to delete does not have a period, then it has no extension,
                        // so this is to delete a USED wordmark which is both a file AND in the database
                        if (delete_value.IndexOf(".") < 0)
                        {
                            Tracer.Add_Trace("Wordmarks_AdminViewer.Constructor", "Delete wordmark '" + delete_value + "' from the database");

                            // Get the wordmark, so we can also delete the file
                            Wordmark_Icon deleteIcon = wordmarks[delete_value];

                            // Delete from the database
                            if (SobekCM_Database.Delete_Icon(delete_value, Tracer))
                            {
                                // Set the deleted wordmark message
                                actionMessage = "Deleted wordmark <i>" + delete_value + "</i>";

                                // Try to delete the file related to this wordmark now
                                if ((deleteIcon != null) && (File.Exists(wordmarkDirectory + "\\" + deleteIcon.Image_FileName)))
                                {
                                    try
                                    {
                                        File.Delete(wordmarkDirectory + "\\" + deleteIcon.Image_FileName);
                                    }
                                    catch (Exception)
                                    {
                                        actionMessage = "Deleted wordmark <i>" + delete_value + "</i> but unable to delete the file <i>" + deleteIcon.Image_FileName + "</i>";
                                    }
                                }

                                // Repull the wordmark list now
                                wordmarks = new Dictionary <string, Wordmark_Icon>();
                                SobekCM_Database.Populate_Icon_List(wordmarks, Tracer);
                            }
                            else
                            {
                                // Report the error
                                if (SobekCM_Database.Last_Exception == null)
                                {
                                    actionMessage = "Unable to delete wordmark <i>" + delete_value + "</i> since it is in use";
                                }
                                else
                                {
                                    actionMessage = "Unknown error while deleting wordmark <i>" + delete_value + "</i>";
                                }
                            }
                        }
                        else
                        {
                            // This is to delete just a file, which presumably is unused by the system
                            // and does not appear in the database
                            // Try to delete the file related to this wordmark now
                            if (File.Exists(wordmarkDirectory + "\\" + delete_value))
                            {
                                try
                                {
                                    File.Delete(wordmarkDirectory + "\\" + delete_value);
                                    actionMessage = "Deleted unused image file <i>" + delete_value + "</i>";
                                }
                                catch (Exception)
                                {
                                    actionMessage = "Unable to delete unused image <i>" + delete_value + "</i>";
                                }
                            }
                        }
                    }
                    else
                    {
                        // Or.. was this a save request
                        if (save_value.Length > 0)
                        {
                            Tracer.Add_Trace("Wordmarks_AdminViewer.Constructor", "Save wordmark '" + save_value + "'");

                            // Was this to save a new interface (from the main page) or edit an existing (from the popup form)?
                            if (save_value == new_wordmark_code)
                            {
                                string new_file  = form["admin_wordmark_file"].Trim();
                                string new_link  = form["admin_wordmark_link"].Trim();
                                string new_title = form["admin_wordmark_title"].Trim();

                                // Save this new wordmark
                                if (SobekCM_Database.Save_Icon(new_wordmark_code, new_file, new_link, new_title, Tracer) > 0)
                                {
                                    actionMessage = "Saved new wordmark <i>" + save_value + "</i>";
                                }
                                else
                                {
                                    actionMessage = "Unable to save new wordmark <i>" + save_value + "</i>";
                                }
                            }
                            else
                            {
                                string edit_file  = form["form_wordmark_file"].Trim();
                                string edit_link  = form["form_wordmark_link"].Trim();
                                string edit_title = form["form_wordmark_title"].Trim();

                                // Save this existing wordmark
                                if (SobekCM_Database.Save_Icon(save_value, edit_file, edit_link, edit_title, Tracer) > 0)
                                {
                                    actionMessage = "Edited existing wordmark <i>" + save_value + "</i>";
                                }
                                else
                                {
                                    actionMessage = "Unable to edit existing wordmark <i>" + save_value + "</i>";
                                }
                            }

                            // Repull the wordmark list now
                            wordmarks = new Dictionary <string, Wordmark_Icon>();
                            SobekCM_Database.Populate_Icon_List(wordmarks, Tracer);
                        }
                    }
                }
            }
            catch (Exception)
            {
                actionMessage = "Unknown error caught while handing request.";
            }
            //}

            // Get the list of wordmarks in the directory
            string[] allFiles = SobekCM_File_Utilities.GetFiles(wordmarkDirectory, "*.jpg|*.jpeg|*.png|*.gif|*.bmp");
            loweredFiles = allFiles.Select(ThisFileName => new FileInfo(ThisFileName)).Select(ThisFileInfo => ThisFileInfo.Name.ToLower()).ToList();
            loweredFiles.Sort();

            // Get the list of all assigned wordmark files
            foreach (Wordmark_Icon thisWordmark in wordmarks.Values)
            {
                if (loweredFiles.Contains(thisWordmark.Image_FileName.ToLower()))
                {
                    loweredFiles.Remove(thisWordmark.Image_FileName.ToLower());
                }
            }
        }