/// <summary> Immediately perform all requested tasks </summary> /// <param name="BuildProductionMarcxmlFeed"> Flag indicates if the MarcXML feed for OPACs should be produced </param> /// <param name="BuildTestMarcxmlFeed"> Flag indicates if the items set to be put in a TEST feed should have their MarcXML feed produced</param> /// <param name="RunBulkloader"> Flag indicates if the preload </param> /// <param name="CompleteStaticRebuild"> Flag indicates whether to rebuild all the item static pages </param> /// <param name="MarcRebuild"> Flag indicates if all the MarcXML files for each resource should be rewritten from the METS/MODS metadata files </param> public void Execute_Immediately(bool BuildProductionMarcxmlFeed, bool BuildTestMarcxmlFeed, bool RunBulkloader, bool CompleteStaticRebuild, bool MarcRebuild) { // start with warnings on imagemagick and ghostscript not being installed if (SobekCM_Library_Settings.ImageMagick_Executable.Length == 0) { Console.WriteLine("WARNING: Could not find ImageMagick installed. Some image processing will be unavailable."); } if (SobekCM_Library_Settings.Ghostscript_Executable.Length == 0) { Console.WriteLine("WARNING: Could not find GhostScript installed. Some PDF processing will be unavailable."); } if (CompleteStaticRebuild) { Console.WriteLine("Beginning static rebuild"); LogFileXHTML staticRebuildLog = new LogFileXHTML(Application.StartupPath + "/Logs/static_rebuild.html"); Static_Pages_Builder builder = new Static_Pages_Builder(SobekCM_Library_Settings.Application_Server_URL, SobekCM_Library_Settings.Static_Pages_Location, SobekCM_Library_Settings.Application_Server_Network); builder.Rebuild_All_Static_Pages(staticRebuildLog, true, SobekCM_Library_Settings.Local_Log_Directory, String.Empty, -1); } if (MarcRebuild) { Static_Pages_Builder builder = new Static_Pages_Builder(SobekCM_Library_Settings.Application_Server_URL, SobekCM_Library_Settings.Static_Pages_Location, SobekCM_Library_Settings.Application_Server_Network); builder.Rebuild_All_MARC_Files(SobekCM_Library_Settings.Image_Server_Network); } if (BuildProductionMarcxmlFeed) { Create_Complete_MarcXML_Feed(false); } if (BuildTestMarcxmlFeed) { Create_Complete_MarcXML_Feed(true); } // Create the log string directory = SobekCM_Library_Settings.Local_Log_Directory; if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } // Run the PRELOADER if (RunBulkloader) { Run_BulkLoader(verbose); } else { Console.WriteLine("PreLoader skipped per command line arguments"); } }
/// <summary> Creates the static HTML file for this incoming digital resource </summary> /// <param name="staticBuilder"> Builder object helps to build the static pages </param> /// <returns> The name (including directory) for the resultant static html page </returns> public string Save_Static_HTML(Static_Pages_Builder staticBuilder) { try { staticBuilder.Item_List.Add_SobekCM_Item(bibPackage); string filename = Resource_Folder + "\\" + bibPackage.BibID + "_" + bibPackage.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(bibPackage.BibID, bibPackage.VID, filename, resourceFolder); return(filename); } catch { return(String.Empty); } }
/// <summary> Creates the static HTML file for this incoming digital resource </summary> /// <param name="StaticBuilder"> Builder object helps to build the static pages </param> /// <returns> The name (including directory) for the resultant static html page </returns> public string Save_Static_HTML(Static_Pages_Builder StaticBuilder) { try { if (!Directory.Exists(Resource_Folder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME)) { Directory.CreateDirectory(Resource_Folder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME); } string filename = Resource_Folder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME + "\\" + Metadata.BibID + "_" + Metadata.VID + ".html"; StaticBuilder.Create_Item_Citation_HTML(Metadata, filename, resourceFolder); return(filename); } catch { return(String.Empty); } }
private bool complete_item_submission(SobekCM_Item Item_To_Complete, Custom_Tracer Tracer ) { // Set an initial flag criticalErrorEncountered = false; bool xml_found = false; string[] all_files = Directory.GetFiles(userInProcessDirectory); SortedList<string, List<string>> image_files = new SortedList<string, List<string>>(); SortedList<string, List<string>> download_files = new SortedList<string, List<string>>(); foreach (string thisFile in all_files) { FileInfo thisFileInfo = new FileInfo(thisFile); if ((thisFileInfo.Name.IndexOf("agreement.txt") != 0) && (thisFileInfo.Name.IndexOf("TEMP000001_00001.mets") != 0) && (thisFileInfo.Name.IndexOf("doc.xml") != 0) && (thisFileInfo.Name.IndexOf("ufdc_mets.xml") != 0) && (thisFileInfo.Name.IndexOf("marc.xml") != 0)) { // Get information about this files name and extension string extension_upper = thisFileInfo.Extension.ToUpper(); string filename_sans_extension = thisFileInfo.Name.Replace(thisFileInfo.Extension, ""); string name_upper = thisFileInfo.Name.ToUpper(); // Is this a page image? if ((extension_upper == ".JPG") || (extension_upper == ".TIF") || (extension_upper == ".JP2") || (extension_upper == ".JPX")) { // Exclude .QC.jpg files if (name_upper.IndexOf(".QC.JPG") < 0) { // If this is a thumbnail, trim off the THM part on the file name if (name_upper.IndexOf("THM.JPG") > 0) { filename_sans_extension = filename_sans_extension.Substring(0, filename_sans_extension.Length - 3); } // Is this the first image file with this name? if (image_files.ContainsKey(filename_sans_extension.ToLower())) { image_files[filename_sans_extension.ToLower()].Add(thisFileInfo.Name); } else { List<string> newImageGrouping = new List<string> {thisFileInfo.Name}; image_files[filename_sans_extension.ToLower()] = newImageGrouping; } } } else { // If this does not match the exclusion regular expression, than add this if (!Regex.Match(thisFileInfo.Name, UI_ApplicationCache_Gateway.Settings.Resources.Files_To_Exclude_From_Downloads, RegexOptions.IgnoreCase).Success) { // Also, exclude files that are .XML and marc.xml, or doc.xml, or have the bibid in the name if ((thisFileInfo.Name.IndexOf("marc.xml", StringComparison.OrdinalIgnoreCase) != 0) && (thisFileInfo.Name.IndexOf("marc.xml", StringComparison.OrdinalIgnoreCase) != 0) && (thisFileInfo.Name.IndexOf(".mets", StringComparison.OrdinalIgnoreCase) < 0)) { // Is this the first image file with this name? if (download_files.ContainsKey(filename_sans_extension.ToLower())) { download_files[filename_sans_extension.ToLower()].Add(thisFileInfo.Name); } else { List<string> newDownloadGrouping = new List<string> {thisFileInfo.Name}; download_files[filename_sans_extension.ToLower()] = newDownloadGrouping; } if (thisFileInfo.Name.IndexOf(".xml", StringComparison.OrdinalIgnoreCase) > 0) xml_found = true; } } } } } // This package is good to go, so build it, save, etc... try { // Save the METS file to the database and back to the directory Item_To_Complete.Source_Directory = userInProcessDirectory; // Step through and add each file Item_To_Complete.Divisions.Download_Tree.Clear(); if ((completeTemplate.Upload_Types == CompleteTemplate.Template_Upload_Types.File_or_URL) || (completeTemplate.Upload_Types == CompleteTemplate.Template_Upload_Types.File)) { // Step through each file bool error_reading_file_occurred = false; // Add the image files first bool jpeg_added = false; bool jp2_added = false; foreach(string thisFileKey in image_files.Keys ) { // Get the list of files List<string> theseFiles = image_files[thisFileKey]; // Add each file foreach (string thisFile in theseFiles) { // Create the new file object and compute a label FileInfo fileInfo = new FileInfo(thisFile); SobekCM_File_Info newFile = new SobekCM_File_Info(fileInfo.Name); string label = fileInfo.Name.Replace(fileInfo.Extension, ""); if (HttpContext.Current.Session["file_" + thisFileKey] != null) { string possible_label = HttpContext.Current.Session["file_" + thisFileKey].ToString(); if (possible_label.Length > 0) label = possible_label; } // Add this file Item_To_Complete.Divisions.Physical_Tree.Add_File(newFile, label); // Seperate code for JP2 and JPEG type files string extension = fileInfo.Extension.ToUpper(); if (extension.IndexOf("JP2") >= 0) { if (!error_reading_file_occurred) { if (!newFile.Compute_Jpeg2000_Attributes(userInProcessDirectory)) error_reading_file_occurred = true; } jp2_added = true; } else { if (!error_reading_file_occurred) { if (!newFile.Compute_Jpeg_Attributes(userInProcessDirectory)) error_reading_file_occurred = true; } jpeg_added = true; } } } // Add the download files next foreach(string thisFileKey in download_files.Keys ) { // Get the list of files List<string> theseFiles = download_files[thisFileKey]; // Add each file foreach (string thisFile in theseFiles) { // Create the new file object and compute a label FileInfo fileInfo = new FileInfo(thisFile); SobekCM_File_Info newFile = new SobekCM_File_Info(fileInfo.Name); string label = fileInfo.Name.Replace( fileInfo.Extension, ""); if (HttpContext.Current.Session["file_" + thisFileKey] != null) { string possible_label = HttpContext.Current.Session["file_" + thisFileKey].ToString(); if (possible_label.Length > 0) label = possible_label; } // Add this file Item_To_Complete.Divisions.Download_Tree.Add_File(newFile, label); } } // Add the JPEG2000 and JPEG-specific viewers Item_To_Complete.Behaviors.Clear_Views(); if (jpeg_added) { Item_To_Complete.Behaviors.Add_View(View_Enum.JPEG); } if (jp2_added) { Item_To_Complete.Behaviors.Add_View(View_Enum.JPEG2000); } } // Determine the total size of the package before saving string[] all_files_final = Directory.GetFiles(userInProcessDirectory); double size = all_files_final.Aggregate<string, double>(0, (Current, ThisFile) => Current + (((new FileInfo(ThisFile)).Length)/1024)); Item_To_Complete.DiskSize_KB = size; // BibID and VID will be automatically assigned Item_To_Complete.BibID = completeTemplate.BibID_Root; Item_To_Complete.VID = String.Empty; // Set some values in the tracking portion if (Item_To_Complete.Divisions.Files.Count > 0) { Item_To_Complete.Tracking.Born_Digital = true; } Item_To_Complete.Tracking.VID_Source = "SobekCM:" + templateCode; // If this is a dataset and XML file was uploaded, add some viewers if ((xml_found) && (Item_To_Complete.Bib_Info.SobekCM_Type == TypeOfResource_SobekCM_Enum.Dataset)) { Item_To_Complete.Behaviors.Add_View(View_Enum.DATASET_CODEBOOK); Item_To_Complete.Behaviors.Add_View(View_Enum.DATASET_REPORTS); Item_To_Complete.Behaviors.Add_View(View_Enum.DATASET_VIEWDATA); } // Save to the database try { Resource_Object.Database.SobekCM_Database.Save_New_Digital_Resource(Item_To_Complete, false, true, RequestSpecificValues.Current_User.UserName, String.Empty, RequestSpecificValues.Current_User.UserID); } catch (Exception ee) { StreamWriter writer = new StreamWriter(userInProcessDirectory + "\\exception.txt", false); writer.WriteLine( "ERROR CAUGHT WHILE SAVING NEW DIGITAL RESOURCE"); writer.WriteLine( DateTime.Now.ToString()); writer.WriteLine(); writer.WriteLine( ee.Message ); writer.WriteLine( ee.StackTrace ); writer.Flush(); writer.Close(); throw; } // Assign the file root and assoc file path Item_To_Complete.Web.File_Root = Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8, 2); Item_To_Complete.Web.AssocFilePath = Item_To_Complete.Web.File_Root + "\\" + Item_To_Complete.VID + "\\"; // Create the static html pages string base_url = RequestSpecificValues.Current_Mode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(UI_ApplicationCache_Gateway.Settings.Servers.System_Base_URL, UI_ApplicationCache_Gateway.Settings.Servers.Base_Data_Directory, RequestSpecificValues.HTML_Skin.Skin_Code); string filename = userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(Item_To_Complete, filename, String.Empty); // Copy the static HTML file to the web server try { if (!Directory.Exists(UI_ApplicationCache_Gateway.Settings.Servers.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8))) Directory.CreateDirectory(UI_ApplicationCache_Gateway.Settings.Servers.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8)); if (File.Exists(userInProcessDirectory + "\\" + item.BibID + "_" + item.VID + ".html")) File.Copy(userInProcessDirectory + "\\" + item.BibID + "_" + item.VID + ".html", UI_ApplicationCache_Gateway.Settings.Servers.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8) + "\\" + item.BibID + "_" + item.VID + ".html", true); } catch (Exception) { // This is not critical } } catch (Exception) { // An error here is not catastrophic } RequestSpecificValues.Current_Mode.Base_URL = base_url; // Save the rest of the metadata Item_To_Complete.Save_SobekCM_METS(); // Add this to the cache UI_ApplicationCache_Gateway.Items.Add_SobekCM_Item(Item_To_Complete); // Create the options dictionary used when saving information to the database, or writing MarcXML Dictionary<string, object> options = new Dictionary<string, object>(); if (UI_ApplicationCache_Gateway.Settings.MarcGeneration != null) { options["MarcXML_File_ReaderWriter:MARC Cataloging Source Code"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.Cataloging_Source_Code; options["MarcXML_File_ReaderWriter:MARC Location Code"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.Location_Code; options["MarcXML_File_ReaderWriter:MARC Reproduction Agency"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.Reproduction_Agency; options["MarcXML_File_ReaderWriter:MARC Reproduction Place"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.Reproduction_Place; options["MarcXML_File_ReaderWriter:MARC XSLT File"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.XSLT_File; } options["MarcXML_File_ReaderWriter:System Name"] = UI_ApplicationCache_Gateway.Settings.System.System_Name; options["MarcXML_File_ReaderWriter:System Abbreviation"] = UI_ApplicationCache_Gateway.Settings.System.System_Abbreviation; // Save the marc xml file MarcXML_File_ReaderWriter marcWriter = new MarcXML_File_ReaderWriter(); string errorMessage; marcWriter.Write_Metadata(Item_To_Complete.Source_Directory + "\\marc.xml", Item_To_Complete, options, out errorMessage); // Delete the TEMP mets file if (File.Exists(userInProcessDirectory + "\\TEMP000001_00001.mets")) File.Delete(userInProcessDirectory + "\\TEMP000001_00001.mets"); // Rename the METS file to the XML file if ((!File.Exists(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets.xml")) && (File.Exists(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets"))) { File.Move(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets", userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets.xml"); } string serverNetworkFolder = UI_ApplicationCache_Gateway.Settings.Servers.Image_Server_Network + Item_To_Complete.Web.AssocFilePath; // Create the folder if (!Directory.Exists(serverNetworkFolder)) Directory.CreateDirectory(serverNetworkFolder); if (!Directory.Exists(serverNetworkFolder + "\\" + UI_ApplicationCache_Gateway.Settings.Resources.Backup_Files_Folder_Name)) Directory.CreateDirectory(serverNetworkFolder + "\\" + UI_ApplicationCache_Gateway.Settings.Resources.Backup_Files_Folder_Name); // Copy the static HTML page over first if (File.Exists(userInProcessDirectory + "\\" + item.BibID + "_" + item.VID + ".html")) { File.Copy(userInProcessDirectory + "\\" + item.BibID + "_" + item.VID + ".html", serverNetworkFolder + "\\" + UI_ApplicationCache_Gateway.Settings.Resources.Backup_Files_Folder_Name + "\\" + item.BibID + "_" + item.VID + ".html", true); File.Delete(userInProcessDirectory + "\\" + item.BibID + "_" + item.VID + ".html"); } // Copy all the files string[] allFiles = Directory.GetFiles(userInProcessDirectory); foreach (string thisFile in allFiles) { string destination_file = serverNetworkFolder + "\\" + (new FileInfo(thisFile)).Name; File.Copy(thisFile, destination_file, true); } // Add this to the cache UI_ApplicationCache_Gateway.Items.Add_SobekCM_Item(Item_To_Complete); // Incrememnt the count of number of items submitted by this RequestSpecificValues.Current_User RequestSpecificValues.Current_User.Items_Submitted_Count++; if (!RequestSpecificValues.Current_User.BibIDs.Contains(Item_To_Complete.BibID)) RequestSpecificValues.Current_User.Add_BibID(Item_To_Complete.BibID); // Now, delete all the files here all_files = Directory.GetFiles(userInProcessDirectory); foreach (string thisFile in all_files) { File.Delete(thisFile); } // Finally, set the item for more processing if there were any files if (((image_files.Count > 0) || (download_files.Count > 0)) && ( Item_To_Complete.Web.ItemID > 0 )) { SobekCM_Database.Update_Additional_Work_Needed_Flag(Item_To_Complete.Web.ItemID, true, Tracer); } // Clear any temporarily assigned current project and CompleteTemplate RequestSpecificValues.Current_User.Current_Default_Metadata = null; RequestSpecificValues.Current_User.Current_Template = null; } catch (Exception ee) { validationErrors.Add("Error encountered during item save!"); validationErrors.Add(ee.ToString().Replace("\r", "<br />")); // Set an initial flag criticalErrorEncountered = true; string error_body = "<strong>ERROR ENCOUNTERED DURING ONLINE SUBMITTAL PROCESS</strong><br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Permanent Link: <a href=\"" + RequestSpecificValues.Current_Mode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + RequestSpecificValues.Current_Mode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "</a><br />User: "******"<br /><br /></blockquote>" + ee.ToString().Replace("\n", "<br />"); string error_subject = "Error during submission for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; string email_to = UI_ApplicationCache_Gateway.Settings.Email.System_Error_Email; if (email_to.Length == 0) email_to = UI_ApplicationCache_Gateway.Settings.Email.System_Email; Email_Helper.SendEmail(email_to, error_subject, error_body, true, RequestSpecificValues.Current_Mode.Instance_Name); } if (!criticalErrorEncountered) { // Send email to the email from the CompleteTemplate, if one was provided if (completeTemplate.Email_Upon_Receipt.Length > 0) { string body = "New item submission complete!<br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Submittor: " + RequestSpecificValues.Current_User.Full_Name + " ( " + RequestSpecificValues.Current_User.Email + " )<br />Link: <a href=\"" + RequestSpecificValues.Current_Mode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + Item_To_Complete.BibID + ":" + Item_To_Complete.VID + "</a></blockquote>"; string subject = "Item submission complete for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; Email_Helper.SendEmail(completeTemplate.Email_Upon_Receipt, subject, body, true, RequestSpecificValues.Current_Mode.Instance_Name); } // If the RequestSpecificValues.Current_User wants to have a message sent, send one if (RequestSpecificValues.Current_User.Send_Email_On_Submission) { // Create the mail message string body2 = "<strong>CONGRATULATIONS!</strong><br /><br />Your item has been successfully added to the digital library and will appear immediately. Search indexes may take a couple minutes to build, at which time this item will be discoverable through the search interface. <br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Permanent Link: <a href=\"" + RequestSpecificValues.Current_Mode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + RequestSpecificValues.Current_Mode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "</a></blockquote>"; string subject2 = "Item submission complete for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; Email_Helper.SendEmail(RequestSpecificValues.Current_User.Email, subject2, body2, true, RequestSpecificValues.Current_Mode.Instance_Name); } // Also clear any searches or browses ( in the future could refine this to only remove those // that are impacted by this save... but this is good enough for now ) CachedDataManager.Clear_Search_Results_Browses(); } return criticalErrorEncountered; }
private void complete_item_submission(SobekCM_Item Item_To_Complete, Custom_Tracer Tracer) { // If this is a newspaper type, and the pubdate has a value, try to use that for the serial heirarchy if ((Item_To_Complete.Behaviors.Serial_Info.Count == 0) && (Item_To_Complete.Bib_Info.Origin_Info.Date_Issued.Length > 0) && (Item_To_Complete.Bib_Info.SobekCM_Type == TypeOfResource_SobekCM_Enum.Newspaper )) { DateTime asDateTime; if (DateTime.TryParse(Item_To_Complete.Bib_Info.Origin_Info.Date_Issued, out asDateTime)) { hierarchyCopiedFromDate = true; Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(1, asDateTime.Year, asDateTime.Year.ToString()); switch (asDateTime.Month) { case 1: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "January"); break; case 2: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "February"); break; case 3: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "March"); break; case 4: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "April"); break; case 5: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "May"); break; case 6: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "June"); break; case 7: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "July"); break; case 8: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "August"); break; case 9: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "September"); break; case 10: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "October"); break; case 11: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "November"); break; case 12: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "December"); break; } Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(3, asDateTime.Day, asDateTime.Day.ToString()); } } // Determine the in process directory for this string user_in_process_directory = SobekCM_Library_Settings.In_Process_Submission_Location + "\\" + user.UserName.Replace(".", "").Replace("@", "") + "\\newitem"; if (user.ShibbID.Trim().Length > 0) user_in_process_directory = SobekCM_Library_Settings.In_Process_Submission_Location + "\\" + user.ShibbID + "\\newitem"; // Ensure this directory exists if (!Directory.Exists(user_in_process_directory)) Directory.CreateDirectory(user_in_process_directory); // Now, delete all the files in the processing directory string[] all_files = Directory.GetFiles(user_in_process_directory); foreach (string thisFile in all_files) { File.Delete(thisFile); } // Save to the database Item_To_Complete.Web.File_Root = Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8, 2); SobekCM_Database.Save_New_Digital_Resource(Item_To_Complete, false, false, user.UserName, String.Empty, -1); // Assign the file root and assoc file path Item_To_Complete.Web.AssocFilePath = Item_To_Complete.Web.File_Root + "\\" + Item_To_Complete.VID + "\\"; // Create the static html pages string base_url = currentMode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(SobekCM_Library_Settings.System_Base_URL, SobekCM_Library_Settings.Base_Data_Directory, Translator, codeManager, iconList, skins, webSkin.Skin_Code); string filename = user_in_process_directory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(Item_To_Complete, filename, String.Empty); // Copy the static HTML file to the web server try { if (!Directory.Exists(SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8))) Directory.CreateDirectory(SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8)); if (File.Exists(user_in_process_directory + "\\" + item.BibID + "_" + item.VID + ".html")) File.Copy(user_in_process_directory + "\\" + item.BibID + "_" + item.VID + ".html", SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8) + "\\" + item.BibID + "_" + item.VID + ".html", true); } catch (Exception) { // This is not critical } } catch (Exception ee) { message = message + "<br /><span style=\"color: red\"><strong>" + ee.Message + "<br />" + ee.StackTrace.Replace("\n", "<br />") + "</strong></span>"; } currentMode.Base_URL = base_url; // Save the rest of the metadata Item_To_Complete.Source_Directory = user_in_process_directory; Item_To_Complete.Save_SobekCM_METS(); // Add this to the cache itemList.Add_SobekCM_Item(Item_To_Complete); Database.SobekCM_Database.Add_Item_To_User_Folder(user.UserID, "Submitted Items", Item_To_Complete.BibID, Item_To_Complete.VID, 0, String.Empty, Tracer); // Save Bib_Level METS? //SobekCM.Resource_Object.Writers.OAI_Writer oaiWriter = new SobekCM.Resource_Object.Writers.OAI_Writer(); //oaiWriter.Save_OAI_File(bibPackage, resource_folder + "\\oai_dc.xml", bibPackage.Processing_Parameters.Collection_Primary.ToLower(), createDate); // If there was no match, try to save to the tracking database Database.SobekCM_Database.Tracking_Online_Submit_Complete(Item_To_Complete.Web.ItemID, user.Full_Name, String.Empty); // Save the MARC file List<string> collectionnames = new List<string>(); MarcXML_File_ReaderWriter marcWriter = new MarcXML_File_ReaderWriter(); string errorMessage; Dictionary<string, object> options = new Dictionary<string, object>(); options["MarcXML_File_ReaderWriter:Additional_Tags"] = Item_To_Complete.MARC_Sobek_Standard_Tags(collectionnames, true, SobekCM_Library_Settings.System_Name, SobekCM_Library_Settings.System_Abbreviation); marcWriter.Write_Metadata(Item_To_Complete.Source_Directory + "\\marc.xml", Item_To_Complete, options, out errorMessage); // Copy this to all the image servers SobekCM_Library_Settings.Refresh(Database.SobekCM_Database.Get_Settings_Complete(Tracer)); // Copy all the files over to the server string serverNetworkFolder = SobekCM_Library_Settings.Image_Server_Network + Item_To_Complete.Web.AssocFilePath; // Create the folder if (!Directory.Exists(serverNetworkFolder)) Directory.CreateDirectory(serverNetworkFolder); if (!Directory.Exists(serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME)) Directory.CreateDirectory(serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME); // Copy the static HTML page over first if (File.Exists(user_in_process_directory + "\\" + item.BibID + "_" + item.VID + ".html")) { File.Copy(user_in_process_directory + "\\" + item.BibID + "_" + item.VID + ".html", serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME + "\\" + item.BibID + "_" + item.VID + ".html", true); File.Delete(user_in_process_directory + "\\" + item.BibID + "_" + item.VID + ".html"); } // Copy all the files string[] allFiles = Directory.GetFiles(user_in_process_directory); foreach (string thisFile in allFiles) { string destination_file = serverNetworkFolder + "\\" + (new FileInfo(thisFile)).Name; File.Copy(thisFile, destination_file, true); } // Add this to the cache itemList.Add_SobekCM_Item(Item_To_Complete); // Incrememnt the count of number of items submitted by this user user.Items_Submitted_Count++; // Delete any remaining items all_files = Directory.GetFiles(user_in_process_directory); foreach (string thisFile in all_files) { File.Delete(thisFile); } }
/// <summary> Continuously execute the processes in a recurring background thread </summary> public void Execute_In_Background() { // Load all the settings SobekCM_Library_Settings.Refresh(Library.Database.SobekCM_Database.Get_Settings_Complete(null)); // Set the variable which will control background execution int time_between_polls = SobekCM_Library_Settings.Builder_Override_Seconds_Between_Polls; if ((time_between_polls < 0) || (SobekCM_Library_Settings.Database_Connections.Count == 1)) { time_between_polls = Convert.ToInt32(SobekCM_Library_Settings.Builder_Seconds_Between_Polls); } // Determine the new log name string log_name = "incoming_" + controllerStarted.Year + "_" + controllerStarted.Month.ToString().PadLeft(2, '0') + "_" + controllerStarted.Day.ToString().PadLeft(2, '0') + ".html"; string local_log_name = SobekCM_Library_Settings.Local_Log_Directory + "\\" + log_name; // Create the new log file LogFileXHTML preloader_logger = new LogFileXHTML(local_log_name, "SobekCM Incoming Packages Log", "UFDC_Builder.exe", true); // start with warnings on imagemagick and ghostscript not being installed if (SobekCM_Library_Settings.ImageMagick_Executable.Length == 0) { Console.WriteLine("WARNING: Could not find ImageMagick installed. Some image processing will be unavailable."); preloader_logger.AddNonError("WARNING: Could not find ImageMagick installed. Some image processing will be unavailable."); } if (SobekCM_Library_Settings.Ghostscript_Executable.Length == 0) { Console.WriteLine("WARNING: Could not find GhostScript installed. Some PDF processing will be unavailable."); preloader_logger.AddNonError("WARNING: Could not find GhostScript installed. Some PDF processing will be unavailable."); } // Set the time for the next feed building event to 10 minutes from now feedNextBuildTime = DateTime.Now.Add(new TimeSpan(0, 10, 0)); // First, step through each active configuration and see if building is currently aborted // while doing very minimal processes aborted = false; Console.WriteLine("Checking for initial abort condition"); preloader_logger.AddNonError("Checking for initial abort condition"); string abort_message = String.Empty; Builder_Operation_Flag_Enum abort_flag = Builder_Operation_Flag_Enum.STANDARD_OPERATION; foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { if ((!aborted) && (dbConfig.Is_Active) && (dbConfig.Can_Abort)) { SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbConfig.Connection_String; // Check that this should not be skipped or aborted Builder_Operation_Flag_Enum operationFlag = Abort_Database_Mechanism.Builder_Operation_Flag; switch (operationFlag) { case Builder_Operation_Flag_Enum.ABORT_REQUESTED: case Builder_Operation_Flag_Enum.ABORTING: abort_message = "PREVIOUS ABORT flag found in " + dbConfig.Name; abort_flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; Console.WriteLine(abort_message); preloader_logger.AddNonError(abort_message); aborted = true; Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; break; case Builder_Operation_Flag_Enum.NO_BUILDING_REQUESTED: abort_message = "PREVIOUS NO BUILDING flag found in " + dbConfig.Name; Console.WriteLine(abort_message); preloader_logger.AddNonError(abort_message); aborted = true; break; } } } // If initially aborted, step through each instance and set a message if (aborted) { // Add messages in each active instance foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { if (dbConfig.Is_Active) { Console.WriteLine("Setting previous abort flag message in " + dbConfig.Name); preloader_logger.AddNonError("Setting previous abort flag message in " + dbConfig.Name); SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", abort_message, String.Empty); // Save information about this last run Library.Database.SobekCM_Database.Set_Setting("Builder Version", SobekCM_Library_Settings.CURRENT_BUILDER_VERSION); Library.Database.SobekCM_Database.Set_Setting("Builder Last Run Finished", DateTime.Now.ToString()); Library.Database.SobekCM_Database.Set_Setting("Builder Last Message", abort_message); // Finally, set the builder flag appropriately if (abort_flag != Builder_Operation_Flag_Enum.STANDARD_OPERATION) { Abort_Database_Mechanism.Builder_Operation_Flag = abort_flag; } } } // Do nothing else return; } // Build all the bulk loader objects List <Worker_BulkLoader> loaders = new List <Worker_BulkLoader>(); bool activeInstanceFound = false; foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { if (!dbConfig.Is_Active) { loaders.Add(null); Console.WriteLine(dbConfig.Name + " is set to INACTIVE"); preloader_logger.AddNonError(dbConfig.Name + " is set to INACTIVE"); } else { activeInstanceFound = true; SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbConfig.Connection_String; // At this point warn on mossing the Ghostscript and ImageMagick if (SobekCM_Library_Settings.ImageMagick_Executable.Length == 0) { Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "WARNING: Could not find ImageMagick installed. Some image processing will be unavailable.", String.Empty); } if (SobekCM_Library_Settings.Ghostscript_Executable.Length == 0) { Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "WARNING: Could not find GhostScript installed. Some PDF processing will be unavailable.", String.Empty); } Console.WriteLine(dbConfig.Name + " - Preparing to begin polling"); preloader_logger.AddNonError(dbConfig.Name + " - Preparing to begin polling"); Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Preparing to begin polling", String.Empty); Worker_BulkLoader newLoader = new Worker_BulkLoader(preloader_logger, verbose, dbConfig.Name, dbConfig.Can_Abort); loaders.Add(newLoader); } } // If no active instances, just exit if (!activeInstanceFound) { Console.WriteLine("No active databases in the config file"); preloader_logger.AddError("No active databases in config file... Aborting"); return; } bool firstRun = true; // Loop continually until the end hour is achieved do { // Is it time to build any RSS/XML feeds? bool rebuildRssFeeds = false; if (DateTime.Compare(DateTime.Now, feedNextBuildTime) >= 0) { rebuildRssFeeds = true; feedNextBuildTime = DateTime.Now.Add(new TimeSpan(0, 10, 0)); } // Step through each instance for (int i = 0; i < SobekCM_Library_Settings.Database_Connections.Count; i++) { if (loaders[i] != null) { // Get the instance Database_Instance_Configuration dbInstance = SobekCM_Library_Settings.Database_Connections[i]; // Set the database connection strings SobekCM_Database.Connection_String = dbInstance.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbInstance.Connection_String; // Look for abort if ((dbInstance.Can_Abort) && (CheckForAbort())) { aborted = true; if (Abort_Database_Mechanism.Builder_Operation_Flag != Builder_Operation_Flag_Enum.NO_BUILDING_REQUESTED) { abort_flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.ABORTING; } break; } // Refresh all settings, etc.. loaders[i].Refresh_Settings_And_Item_List(); // Pull the abort/pause flag Builder_Operation_Flag_Enum currentPauseFlag = Abort_Database_Mechanism.Builder_Operation_Flag; // If not paused, run the prebuilder if (currentPauseFlag != Builder_Operation_Flag_Enum.PAUSE_REQUESTED) { if (firstRun) { // // Always build an endeca feed first (so it occurs once a day) // if (SobekCM_Library_Settings.Build_MARC_Feed_By_Default) // { // Create_Complete_MarcXML_Feed(false); // } //} // CLear the old logs Console.WriteLine(dbInstance.Name + " - Expiring old log entries"); preloader_logger.AddNonError(dbInstance.Name + " - Expiring old log entries"); Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Expiring old log entries", String.Empty); Library.Database.SobekCM_Database.Builder_Expire_Log_Entries(SobekCM_Library_Settings.Builder_Log_Expiration_Days); // Rebuild all the static pages Console.WriteLine(dbInstance.Name + " - Rebuilding all static pages"); preloader_logger.AddNonError(dbInstance.Name + " - Rebuilding all static pages"); long staticRebuildLogId = Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Rebuilding all static pages", String.Empty); Static_Pages_Builder builder = new Static_Pages_Builder(SobekCM_Library_Settings.Application_Server_URL, SobekCM_Library_Settings.Static_Pages_Location, SobekCM_Library_Settings.Application_Server_Network); builder.Rebuild_All_Static_Pages(preloader_logger, false, SobekCM_Library_Settings.Local_Log_Directory, dbInstance.Name, staticRebuildLogId); // Process any pending FDA reports from the FDA Report DropBox Process_Any_Pending_FDA_Reports(loaders[i]); } Run_BulkLoader(loaders[i], verbose); // Look for abort if ((!aborted) && (dbInstance.Can_Abort) && (CheckForAbort())) { aborted = true; if (Abort_Database_Mechanism.Builder_Operation_Flag != Builder_Operation_Flag_Enum.NO_BUILDING_REQUESTED) { abort_flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.ABORTING; } break; } if (rebuildRssFeeds) { loaders[i].Build_Feeds(); } // Clear memory from this loader loaders[i].Clear_Item_List(); } else { preloader_logger.AddNonError(dbInstance.Name + " - Building paused"); Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Building temporarily PAUSED", String.Empty); } } } if (aborted) { break; } // No longer the first run firstRun = false; // Publish the log publish_log_file(local_log_name); // Sleep for correct number of milliseconds Thread.Sleep(1000 * time_between_polls); } while (DateTime.Now.Hour < BULK_LOADER_END_HOUR); // Do the final work for all of the different dbInstances if (!aborted) { for (int i = 0; i < SobekCM_Library_Settings.Database_Connections.Count; i++) { if (loaders[i] != null) { // Get the instance Database_Instance_Configuration dbInstance = SobekCM_Library_Settings.Database_Connections[i]; // Set the database flag SobekCM_Database.Connection_String = dbInstance.Connection_String; // Pull the abort/pause flag Builder_Operation_Flag_Enum currentPauseFlag2 = Abort_Database_Mechanism.Builder_Operation_Flag; // If not paused, run the prebuilder if (currentPauseFlag2 != Builder_Operation_Flag_Enum.PAUSE_REQUESTED) { // Refresh all settings, etc.. loaders[i].Refresh_Settings_And_Item_List(); // Initiate the recreation of the links between metadata and collections Library.Database.SobekCM_Database.Admin_Update_Cached_Aggregation_Metadata_Links(); } // Clear the memory loaders[i].Clear_Item_List(); } } } else { // Mark the aborted in each instance foreach (Database_Instance_Configuration dbConfig in SobekCM_Library_Settings.Database_Connections) { if (dbConfig.Is_Active) { Console.WriteLine("Setting abort flag message in " + dbConfig.Name); preloader_logger.AddNonError("Setting abort flag message in " + dbConfig.Name); SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Connection_String = dbConfig.Connection_String; Library.Database.SobekCM_Database.Builder_Add_Log_Entry(-1, String.Empty, "Standard", "Building ABORTED per request from database key", String.Empty); // Save information about this last run Library.Database.SobekCM_Database.Set_Setting("Builder Version", SobekCM_Library_Settings.CURRENT_BUILDER_VERSION); Library.Database.SobekCM_Database.Set_Setting("Builder Last Run Finished", DateTime.Now.ToString()); Library.Database.SobekCM_Database.Set_Setting("Builder Last Message", "Building ABORTED per request"); // Finally, set the builder flag appropriately if (abort_flag == Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED) { Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; } } } } // Publish the log publish_log_file(local_log_name); //// Initiate a solr/lucene index optimization since we are done loading for a while //if (DateTime.Now.Day % 2 == 0) //{ // if (SobekCM_Library_Settings.Document_Solr_Index_URL.Length > 0) // { // Console.WriteLine("Initiating Solr/Lucene document index optimization"); // Solr_Controller.Optimize_Document_Index(SobekCM_Library_Settings.Document_Solr_Index_URL); // } //} //else //{ // if (SobekCM_Library_Settings.Page_Solr_Index_URL.Length > 0) // { // Console.WriteLine("Initiating Solr/Lucene page index optimization"); // Solr_Controller.Optimize_Page_Index(SobekCM_Library_Settings.Page_Solr_Index_URL); // } //} //// Sleep for twenty minutes to end this (the index rebuild might take some time) //Thread.Sleep(1000 * 20 * 60); }
private void Complete_Item_Save() { if (isProject) { // Save the new project METS item.Save_METS(); // Clear the cache of this item Cached_Data_Manager.Remove_Project(user.UserID, item.BibID, null); // Redirect currentMode.Mode = Display_Mode_Enum.Administrative; currentMode.Admin_Type = Admin_Type_Enum.Default_Metadata; currentMode.My_Sobek_SubMode = String.Empty; currentMode.Redirect(); } else { // Determine the in process directory for this string user_bib_vid_process_directory = SobekCM_Library_Settings.In_Process_Submission_Location + "\\" + user.ShibbID + "\\metadata_updates\\" + item.BibID + "_" + item.VID; if (user.ShibbID.Trim().Length == 0) user_bib_vid_process_directory = SobekCM_Library_Settings.In_Process_Submission_Location + "\\" + user.UserName.Replace(".", "").Replace("@", "") + "\\metadata_updates\\" + item.BibID + "_" + item.VID; // Ensure the folder exists and is empty to start with if (!Directory.Exists(user_bib_vid_process_directory)) Directory.CreateDirectory(user_bib_vid_process_directory); else { // Anything older than a day should be deleted string[] files = Directory.GetFiles(user_bib_vid_process_directory); foreach (string thisFile in files) { try { File.Delete(thisFile); } catch (Exception) { // Not much to do here } } } // Update the METS file with METS note and name item.METS_Header.Creator_Individual = user.UserName; item.METS_Header.Modify_Date = DateTime.Now; item.METS_Header.RecordStatus_Enum = METS_Record_Status.METADATA_UPDATE; // Save the METS file and related items bool successful_save = true; try { SobekCM_Database.Save_Digital_Resource(item, DateTime.Now, true); } catch { successful_save = false; } // Create the static html pages string base_url = currentMode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(SobekCM_Library_Settings.System_Base_URL, SobekCM_Library_Settings.Base_Data_Directory, Translator, codeManager, iconList, skins, webSkin.Skin_Code); string filename = user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(item, filename, SobekCM_Library_Settings.Image_Server_Network + item.Web.AssocFilePath); // Copy the static HTML file to the web server try { if (!Directory.Exists(SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8))) Directory.CreateDirectory(SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8)); if (File.Exists(user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html")) File.Copy(user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html", SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8) + "\\" + item.BibID + "_" + item.VID + ".html", true); } catch { // This is not critical } } catch { // Failing to make the static page is not the worst thing in the world... } currentMode.Base_URL = base_url; item.Source_Directory = user_bib_vid_process_directory; item.Save_SobekCM_METS(); // If this was not able to be saved in the database, try it again if (!successful_save) { SobekCM_Database.Save_Digital_Resource(item, DateTime.Now, false); } // Make sure the progress has been added to this item's work log try { Database.SobekCM_Database.Tracking_Online_Edit_Complete(item.Web.ItemID, user.Full_Name, String.Empty); } catch(Exception) { // This is not critical } // Save the MARC file List<string> collectionnames = new List<string>(); MarcXML_File_ReaderWriter marcWriter = new MarcXML_File_ReaderWriter(); string errorMessage; Dictionary<string, object> options = new Dictionary<string, object>(); options["MarcXML_File_ReaderWriter:Additional_Tags"] = item.MARC_Sobek_Standard_Tags(collectionnames, true, SobekCM_Library_Settings.System_Name, SobekCM_Library_Settings.System_Abbreviation); marcWriter.Write_Metadata(item.Source_Directory + "\\marc.xml", item, options, out errorMessage); // Copy this to all the image servers SobekCM_Library_Settings.Refresh(Database.SobekCM_Database.Get_Settings_Complete(null)); // Determine the server folder string serverNetworkFolder = SobekCM_Library_Settings.Image_Server_Network + item.Web.AssocFilePath; // Create the folder if (!Directory.Exists(serverNetworkFolder)) { Directory.CreateDirectory(serverNetworkFolder); if (!Directory.Exists(serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME)) Directory.CreateDirectory(serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME); } else { if (!Directory.Exists(serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME)) Directory.CreateDirectory(serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME); // Rename any existing standard mets to keep a backup if (File.Exists(serverNetworkFolder + "\\" + item.BibID + "_" + item.VID + ".mets.xml")) { FileInfo currentMetsFileInfo = new FileInfo(serverNetworkFolder + "\\" + item.BibID + "_" + item.VID + ".mets.xml"); DateTime lastModDate = currentMetsFileInfo.LastWriteTime; File.Copy(serverNetworkFolder + "\\" + item.BibID + "_" + item.VID + ".mets.xml", serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME + "\\" + item.BibID + "_" + item.VID + "_" + lastModDate.Year + "_" + lastModDate.Month + "_" + lastModDate.Day + ".mets.bak", true); } } // Copy the static HTML page over first if (File.Exists(user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html")) { File.Copy(user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html", serverNetworkFolder + "\\" + SobekCM_Library_Settings.BACKUP_FILES_FOLDER_NAME + "\\" + item.BibID + "_" + item.VID + ".html", true); File.Delete(user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html"); } // Copy all the files string[] allFiles = Directory.GetFiles(user_bib_vid_process_directory); foreach (string thisFile in allFiles) { string destination_file = serverNetworkFolder + "\\" + (new FileInfo(thisFile)).Name; File.Copy(thisFile, destination_file, true); } // Add this to the cache itemList.Add_SobekCM_Item(item, false); // Now, delete all the files here string[] all_files = Directory.GetFiles(user_bib_vid_process_directory); foreach (string thisFile in all_files) { try { File.Delete(thisFile); } catch { } } // Clear the user-specific and global cache of this item Cached_Data_Manager.Remove_Digital_Resource_Object(user.UserID, item.BibID, item.VID, null); Cached_Data_Manager.Remove_Digital_Resource_Object(item.BibID, item.VID, null); Cached_Data_Manager.Remove_Items_In_Title(item.BibID, null); // Forward to the display item again currentMode.Mode = Display_Mode_Enum.Item_Display; currentMode.ViewerCode = "citation"; currentMode.Redirect(); } }
private void complete_item_submission(SobekCM_Item Item_To_Complete, Custom_Tracer Tracer) { // If this is a newspaper type, and the pubdate has a value, try to use that for the serial heirarchy if ((Item_To_Complete.Behaviors.Serial_Info.Count == 0) && (Item_To_Complete.Bib_Info.Origin_Info.Date_Issued.Length > 0) && (Item_To_Complete.Bib_Info.SobekCM_Type == TypeOfResource_SobekCM_Enum.Newspaper)) { DateTime asDateTime; if (DateTime.TryParse(Item_To_Complete.Bib_Info.Origin_Info.Date_Issued, out asDateTime)) { hierarchyCopiedFromDate = true; Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(1, asDateTime.Year, asDateTime.Year.ToString()); switch (asDateTime.Month) { case 1: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "January"); break; case 2: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "February"); break; case 3: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "March"); break; case 4: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "April"); break; case 5: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "May"); break; case 6: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "June"); break; case 7: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "July"); break; case 8: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "August"); break; case 9: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "September"); break; case 10: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "October"); break; case 11: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "November"); break; case 12: Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(2, asDateTime.Month, "December"); break; } Item_To_Complete.Behaviors.Serial_Info.Add_Hierarchy(3, asDateTime.Day, asDateTime.Day.ToString()); } } // Determine the in process directory for this string user_in_process_directory = SobekCM_Library_Settings.In_Process_Submission_Location + "\\" + user.UserName.Replace(".", "").Replace("@", "") + "\\newitem"; if (user.UFID.Trim().Length > 0) { user_in_process_directory = SobekCM_Library_Settings.In_Process_Submission_Location + "\\" + user.UFID + "\\newitem"; } // Ensure this directory exists if (!Directory.Exists(user_in_process_directory)) { Directory.CreateDirectory(user_in_process_directory); } // Now, delete all the files in the processing directory string[] all_files = Directory.GetFiles(user_in_process_directory); foreach (string thisFile in all_files) { File.Delete(thisFile); } // Save to the database Item_To_Complete.Web.File_Root = Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8, 2); SobekCM_Database.Save_New_Digital_Resource(Item_To_Complete, false, false, user.UserName, String.Empty, -1); // Assign the file root and assoc file path Item_To_Complete.Web.AssocFilePath = Item_To_Complete.Web.File_Root + "\\" + Item_To_Complete.VID + "\\"; // Create the static html pages string base_url = currentMode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(SobekCM_Library_Settings.System_Base_URL, SobekCM_Library_Settings.Base_Data_Directory, Translator, codeManager, itemList, iconList, webSkin); string filename = user_in_process_directory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(Item_To_Complete, filename, String.Empty); } catch (Exception ee) { message = message + "<br /><span style=\"color: red\"><strong>" + ee.Message + "<br />" + ee.StackTrace.Replace("\n", "<br />") + "</strong></span>"; } currentMode.Base_URL = base_url; // Save the rest of the metadata Item_To_Complete.Source_Directory = user_in_process_directory; Item_To_Complete.Save_SobekCM_METS(); Item_To_Complete.Save_Citation_Only_METS(); // Add this to the cache itemList.Add_SobekCM_Item(Item_To_Complete); Database.SobekCM_Database.Add_Item_To_User_Folder(user.UserID, "Submitted Items", Item_To_Complete.BibID, Item_To_Complete.VID, 0, String.Empty, Tracer); // Save Bib_Level METS? //SobekCM.Resource_Object.Writers.OAI_Writer oaiWriter = new SobekCM.Resource_Object.Writers.OAI_Writer(); //oaiWriter.Save_OAI_File(bibPackage, resource_folder + "\\oai_dc.xml", bibPackage.Processing_Parameters.Collection_Primary.ToLower(), createDate); // If there was no match, try to save to the tracking database Database.SobekCM_Database.Tracking_Online_Submit_Complete(Item_To_Complete.Web.ItemID, user.Full_Name, String.Empty); List <string> collectionnames = new List <string>(); MarcXML_File_ReaderWriter marcWriter = new MarcXML_File_ReaderWriter(); string Error_Message; Dictionary <string, object> options = new Dictionary <string, object>(); options["MarcXML_File_ReaderWriter:Additional_Tags"] = Item_To_Complete.MARC_Sobek_Standard_Tags(collectionnames, true, SobekCM_Library_Settings.System_Name, SobekCM_Library_Settings.System_Abbreviation); marcWriter.Write_Metadata(Item_To_Complete.Source_Directory + "\\marc.xml", Item_To_Complete, options, out Error_Message); // Copy this to all the image servers SobekCM_Library_Settings.Refresh(Database.SobekCM_Database.Get_Settings_Complete(Tracer)); string[] allFiles = Directory.GetFiles(user_in_process_directory); // Copy all the files over to the server string serverNetworkFolder = SobekCM_Library_Settings.Image_Server_Network + Item_To_Complete.Web.AssocFilePath; // Create the folder if (!Directory.Exists(serverNetworkFolder)) { Directory.CreateDirectory(serverNetworkFolder); } foreach (string thisFile in allFiles) { string destination_file = serverNetworkFolder + "\\" + (new FileInfo(thisFile)).Name; File.Copy(thisFile, destination_file, true); } // Add this to the cache itemList.Add_SobekCM_Item(Item_To_Complete); // Incrememnt the count of number of items submitted by this user user.Items_Submitted_Count++; // Delete any remaining items all_files = Directory.GetFiles(user_in_process_directory); foreach (string thisFile in all_files) { File.Delete(thisFile); } }
private bool complete_item_submission(SobekCM_Item Item_To_Complete, Custom_Tracer Tracer) { // Set an initial flag criticalErrorEncountered = false; string[] all_files = Directory.GetFiles(digitalResourceDirectory); SortedList <string, List <string> > image_files = new SortedList <string, List <string> >(); SortedList <string, List <string> > download_files = new SortedList <string, List <string> >(); foreach (string thisFile in all_files) { FileInfo thisFileInfo = new FileInfo(thisFile); if ((thisFileInfo.Name.IndexOf("agreement.txt") != 0) && (thisFileInfo.Name.IndexOf("TEMP000001_00001.mets") != 0) && (thisFileInfo.Name.IndexOf("doc.xml") != 0) && (thisFileInfo.Name.IndexOf("ufdc_mets.xml") != 0) && (thisFileInfo.Name.IndexOf("marc.xml") != 0)) { // Get information about this files name and extension string extension_upper = thisFileInfo.Extension.ToUpper(); string filename_sans_extension = thisFileInfo.Name.Replace(thisFileInfo.Extension, ""); string name_upper = thisFileInfo.Name.ToUpper(); // Is this a page image? if ((extension_upper == ".JPG") || (extension_upper == ".TIF") || (extension_upper == ".JP2") || (extension_upper == ".JPX")) { // Exclude .QC.jpg files if (name_upper.IndexOf(".QC.JPG") < 0) { // If this is a thumbnail, trim off the THM part on the file name if (name_upper.IndexOf("THM.JPG") > 0) { filename_sans_extension = filename_sans_extension.Substring(0, filename_sans_extension.Length - 3); } // Is this the first image file with this name? if (image_files.ContainsKey(filename_sans_extension.ToLower())) { image_files[filename_sans_extension.ToLower()].Add(thisFileInfo.Name); } else { List <string> newImageGrouping = new List <string> { thisFileInfo.Name }; image_files[filename_sans_extension.ToLower()] = newImageGrouping; } } } else { // If this does not match the exclusion regular expression, than add this if ((!Regex.Match(thisFileInfo.Name, SobekCM_Library_Settings.Files_To_Exclude_From_Downloads, RegexOptions.IgnoreCase).Success) && (String.Compare(thisFileInfo.Name, Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html", true) != 0)) { // Is this the first image file with this name? if (download_files.ContainsKey(filename_sans_extension.ToLower())) { download_files[filename_sans_extension.ToLower()].Add(thisFileInfo.Name); } else { List <string> newDownloadGrouping = new List <string> { thisFileInfo.Name }; download_files[filename_sans_extension.ToLower()] = newDownloadGrouping; } } } } } // This package is good to go, so build it, save, etc... try { // Save the METS file to the database and back to the directory Item_To_Complete.Source_Directory = digitalResourceDirectory; // Step through and add each file Item_To_Complete.Divisions.Download_Tree.Clear(); // Step through each file bool error_reading_file_occurred = false; // Add the image files first bool jpeg_added = false; bool jp2_added = false; foreach (string thisFileKey in image_files.Keys) { // Get the list of files List <string> theseFiles = image_files[thisFileKey]; // Add each file foreach (string thisFile in theseFiles) { // Create the new file object and compute a label System.IO.FileInfo fileInfo = new System.IO.FileInfo(thisFile); SobekCM.Resource_Object.Divisions.SobekCM_File_Info newFile = new SobekCM.Resource_Object.Divisions.SobekCM_File_Info(fileInfo.Name); string label = fileInfo.Name.Replace(fileInfo.Extension, ""); if (System.Web.HttpContext.Current.Session["file_" + item.Web.ItemID + "_" + thisFileKey] != null) { string possible_label = System.Web.HttpContext.Current.Session["file_" + item.Web.ItemID + "_" + thisFileKey].ToString(); if (possible_label.Length > 0) { label = possible_label; } } // Add this file item.Divisions.Physical_Tree.Add_File(newFile, label); // Seperate code for JP2 and JPEG type files string extension = fileInfo.Extension.ToUpper(); if (extension.IndexOf("JP2") >= 0) { if (!error_reading_file_occurred) { if (!newFile.Compute_Jpeg2000_Attributes(item.Source_Directory)) { error_reading_file_occurred = true; } } jp2_added = true; } else { if (!error_reading_file_occurred) { if (!newFile.Compute_Jpeg_Attributes(item.Source_Directory)) { error_reading_file_occurred = true; } } jpeg_added = true; } } } // Add the download files next foreach (string thisFileKey in download_files.Keys) { // Get the list of files List <string> theseFiles = download_files[thisFileKey]; // Add each file foreach (string thisFile in theseFiles) { // Create the new file object and compute a label FileInfo fileInfo = new FileInfo(thisFile); SobekCM_File_Info newFile = new SobekCM_File_Info(fileInfo.Name); string label = fileInfo.Name.Replace(fileInfo.Extension, ""); if (HttpContext.Current.Session["file_" + item.Web.ItemID + "_" + thisFileKey] != null) { string possible_label = HttpContext.Current.Session["file_" + item.Web.ItemID + "_" + thisFileKey].ToString(); if (possible_label.Length > 0) { label = possible_label; } } // Add this file Item_To_Complete.Divisions.Download_Tree.Add_File(newFile, label); } } // Add the JPEG2000 and JPEG-specific viewers item.Behaviors.Clear_Views(); if (jpeg_added) { item.Behaviors.Add_View(SobekCM.Resource_Object.Behaviors.View_Enum.JPEG); } if (jp2_added) { item.Behaviors.Add_View(SobekCM.Resource_Object.Behaviors.View_Enum.JPEG2000); } // Determine the total size of the package before saving string[] all_files_final = Directory.GetFiles(digitalResourceDirectory); double size = all_files_final.Aggregate <string, double>(0, (current, thisFile) => current + (((new FileInfo(thisFile)).Length) / 1024)); Item_To_Complete.DiskSize_MB = size; // Save to the database try { SobekCM_Database.Save_Digital_Resource(Item_To_Complete); SobekCM_Database.Save_Behaviors(Item_To_Complete, Item_To_Complete.Behaviors.Text_Searchable, false); } catch (Exception ee) { StreamWriter writer = new StreamWriter(digitalResourceDirectory + "\\exception.txt", false); writer.WriteLine("ERROR CAUGHT WHILE SAVING DIGITAL RESOURCE"); writer.WriteLine(DateTime.Now.ToString()); writer.WriteLine(); writer.WriteLine(ee.Message); writer.WriteLine(ee.StackTrace); writer.Flush(); writer.Close(); throw; } // Assign the file root and assoc file path Item_To_Complete.Web.File_Root = Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8, 2); Item_To_Complete.Web.AssocFilePath = Item_To_Complete.Web.File_Root + "\\" + Item_To_Complete.VID + "\\"; // Create the static html pages string base_url = currentMode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(SobekCM_Library_Settings.System_Base_URL, SobekCM_Library_Settings.Base_Data_Directory, Translator, codeManager, itemList, iconList, webSkin); string filename = digitalResourceDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(Item_To_Complete, filename, String.Empty); } catch (Exception ee) { string error = ee.Message; } currentMode.Base_URL = base_url; // Save the rest of the metadata Item_To_Complete.Save_SobekCM_METS(); // Finally, set the item for more processing if there were any files if (((image_files.Count > 0) || (download_files.Count > 0)) && (Item_To_Complete.Web.ItemID > 0)) { Database.SobekCM_Database.Update_Additional_Work_Needed_Flag(Item_To_Complete.Web.ItemID, true, Tracer); } } catch (Exception ee) { validationErrors.Add("Error encountered during item save!"); validationErrors.Add(ee.ToString().Replace("\r", "<br />")); // Set an initial flag criticalErrorEncountered = true; string error_body = "<strong>ERROR ENCOUNTERED DURING ONLINE FILE MANAGEMENT</strong><br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Permanent Link: <a href=\"" + base.currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + base.currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "</a><br />User: "******"<br /><br /></blockquote>" + ee.ToString().Replace("\n", "<br />"); string error_subject = "Error during file management for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; string email_to = SobekCM_Library_Settings.System_Error_Email; if (email_to.Length == 0) { email_to = SobekCM_Library_Settings.System_Email; } Database.SobekCM_Database.Send_Database_Email(email_to, error_subject, error_body, true, false, -1); } return(criticalErrorEncountered); }
private bool complete_item_submission(SobekCM_Item Item_To_Complete, Custom_Tracer Tracer ) { // Set an initial flag criticalErrorEncountered = false; string[] all_files = Directory.GetFiles(userInProcessDirectory); SortedList<string, List<string>> image_files = new SortedList<string, List<string>>(); SortedList<string, List<string>> download_files = new SortedList<string, List<string>>(); foreach (string thisFile in all_files) { FileInfo thisFileInfo = new FileInfo(thisFile); if ((thisFileInfo.Name.IndexOf("agreement.txt") != 0) && (thisFileInfo.Name.IndexOf("TEMP000001_00001.mets") != 0) && (thisFileInfo.Name.IndexOf("doc.xml") != 0) && (thisFileInfo.Name.IndexOf("ufdc_mets.xml") != 0) && (thisFileInfo.Name.IndexOf("marc.xml") != 0)) { // Get information about this files name and extension string extension_upper = thisFileInfo.Extension.ToUpper(); string filename_sans_extension = thisFileInfo.Name.Replace(thisFileInfo.Extension, ""); string name_upper = thisFileInfo.Name.ToUpper(); // Is this a page image? if ((extension_upper == ".JPG") || (extension_upper == ".TIF") || (extension_upper == ".JP2") || (extension_upper == ".JPX")) { // Exclude .QC.jpg files if (name_upper.IndexOf(".QC.JPG") < 0) { // If this is a thumbnail, trim off the THM part on the file name if (name_upper.IndexOf("THM.JPG") > 0) { filename_sans_extension = filename_sans_extension.Substring(0, filename_sans_extension.Length - 3); } // Is this the first image file with this name? if (image_files.ContainsKey(filename_sans_extension.ToLower())) { image_files[filename_sans_extension.ToLower()].Add(thisFileInfo.Name); } else { List<string> newImageGrouping = new List<string> {thisFileInfo.Name}; image_files[filename_sans_extension.ToLower()] = newImageGrouping; } } } else { // If this does not match the exclusion regular expression, than add this if (!Regex.Match(thisFileInfo.Name, SobekCM_Library_Settings.Files_To_Exclude_From_Downloads, RegexOptions.IgnoreCase).Success) { // Is this the first image file with this name? if (download_files.ContainsKey(filename_sans_extension.ToLower())) { download_files[filename_sans_extension.ToLower()].Add(thisFileInfo.Name); } else { List<string> newDownloadGrouping = new List<string> {thisFileInfo.Name}; download_files[filename_sans_extension.ToLower()] = newDownloadGrouping; } } } } } // This package is good to go, so build it, save, etc... try { // Save the METS file to the database and back to the directory Item_To_Complete.Source_Directory = userInProcessDirectory; // Step through and add each file Item_To_Complete.Divisions.Download_Tree.Clear(); if ((template.Upload_Types == Template.Template_Upload_Types.File_or_URL) || (template.Upload_Types == Template.Template_Upload_Types.File)) { // Step through each file bool error_reading_file_occurred = false; // Add the image files first bool jpeg_added = false; bool jp2_added = false; foreach(string thisFileKey in image_files.Keys ) { // Get the list of files List<string> theseFiles = image_files[thisFileKey]; // Add each file foreach (string thisFile in theseFiles) { // Create the new file object and compute a label FileInfo fileInfo = new FileInfo(thisFile); SobekCM_File_Info newFile = new SobekCM_File_Info(fileInfo.Name); string label = fileInfo.Name.Replace(fileInfo.Extension, ""); if (HttpContext.Current.Session["file_" + thisFileKey] != null) { string possible_label = HttpContext.Current.Session["file_" + thisFileKey].ToString(); if (possible_label.Length > 0) label = possible_label; } // Add this file Item_To_Complete.Divisions.Physical_Tree.Add_File(newFile, label); // Seperate code for JP2 and JPEG type files string extension = fileInfo.Extension.ToUpper(); if (extension.IndexOf("JP2") >= 0) { if (!error_reading_file_occurred) { if (!newFile.Compute_Jpeg2000_Attributes(userInProcessDirectory)) error_reading_file_occurred = true; } jp2_added = true; } else { if (!error_reading_file_occurred) { if (!newFile.Compute_Jpeg_Attributes(userInProcessDirectory)) error_reading_file_occurred = true; } jpeg_added = true; } } } // Add the download files next foreach(string thisFileKey in download_files.Keys ) { // Get the list of files List<string> theseFiles = download_files[thisFileKey]; // Add each file foreach (string thisFile in theseFiles) { // Create the new file object and compute a label FileInfo fileInfo = new FileInfo(thisFile); SobekCM_File_Info newFile = new SobekCM_File_Info(fileInfo.Name); string label = fileInfo.Name.Replace( fileInfo.Extension, ""); if (HttpContext.Current.Session["file_" + thisFileKey] != null) { string possible_label = HttpContext.Current.Session["file_" + thisFileKey].ToString(); if (possible_label.Length > 0) label = possible_label; } // Add this file Item_To_Complete.Divisions.Download_Tree.Add_File(newFile, label); } } // Add the JPEG2000 and JPEG-specific viewers Item_To_Complete.Behaviors.Clear_Views(); if (jpeg_added) { Item_To_Complete.Behaviors.Add_View(View_Enum.JPEG); } if (jp2_added) { Item_To_Complete.Behaviors.Add_View(View_Enum.JPEG2000); } } // Determine the total size of the package before saving string[] all_files_final = Directory.GetFiles(userInProcessDirectory); double size = all_files_final.Aggregate<string, double>(0, (current, thisFile) => current + (((new FileInfo(thisFile)).Length)/1024)); Item_To_Complete.DiskSize_MB = size; // BibID and VID will be automatically assigned Item_To_Complete.BibID = template.BibID_Root; Item_To_Complete.VID = String.Empty; // Set some values in the tracking portion if (Item_To_Complete.Divisions.Files.Count > 0) { Item_To_Complete.Tracking.Born_Digital = true; } Item_To_Complete.Tracking.VID_Source = "SobekCM:" + templateCode; // Save to the database try { SobekCM_Database.Save_New_Digital_Resource(Item_To_Complete, false, true, user.UserName, String.Empty, user.UserID); } catch (Exception ee) { StreamWriter writer = new StreamWriter(userInProcessDirectory + "\\exception.txt", false); writer.WriteLine( "ERROR CAUGHT WHILE SAVING NEW DIGITAL RESOURCE"); writer.WriteLine( DateTime.Now.ToString()); writer.WriteLine(); writer.WriteLine( ee.Message ); writer.WriteLine( ee.StackTrace ); writer.Flush(); writer.Close(); throw; } // Assign the file root and assoc file path Item_To_Complete.Web.File_Root = Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8, 2); Item_To_Complete.Web.AssocFilePath = Item_To_Complete.Web.File_Root + "\\" + Item_To_Complete.VID + "\\"; // Create the static html pages string base_url = currentMode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(SobekCM_Library_Settings.System_Base_URL, SobekCM_Library_Settings.Base_Data_Directory, Translator, codeManager, itemList, iconList, webSkin); string filename = userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(Item_To_Complete, filename, String.Empty); } catch (Exception) { // An error here is not catastrophic } currentMode.Base_URL = base_url; // Save the rest of the metadata Item_To_Complete.Save_SobekCM_METS(); Item_To_Complete.Save_Citation_Only_METS(); // Add this to the cache itemList.Add_SobekCM_Item(Item_To_Complete); //// Link this item and user //Database.SobekCM_Database.Add_User_Item_Link(user.UserID, item.Web.ItemID, 1, true); //Database.SobekCM_Database.Add_User_BibID_Link(user.UserID, item.Behaviors.GroupID); //Database.SobekCM_Database.Add_Item_To_User_Folder(user.UserID, "Submitted Items", item.BibID, item.VID, 0, String.Empty, Tracer); // Save Bib_Level METS? //SobekCM.Resource_Object.Writers.OAI_Writer oaiWriter = new SobekCM.Resource_Object.Writers.OAI_Writer(); //oaiWriter.Save_OAI_File(bibPackage, resource_folder + "\\oai_dc.xml", bibPackage.Processing_Parameters.Collection_Primary.ToLower(), createDate); List<string> collectionnames = new List<string>(); //// Get the collection names //if (item.Processing_Parameters.Collection_Primary.Length > 0) //{ // DataRow[] primCode = Collection_Codes.Select("collectioncode = '" + item.Processing_Parameters.Collection_Primary + "'"); // if (primCode.Length > 0) // { // collectionnames.Add(primCode[0]["ShortName"].ToString()); // } //} //foreach (string altCollection in bibPackage.Processing_Parameters.Collections_Alternate) //{ // DataRow[] altCode = Collection_Codes.Select("collectioncode = '" + altCollection + "'"); // if (altCode.Length > 0) // { // collectionnames.Add(altCode[0]["ShortName"].ToString()); // } //} // Save the marc xml file MarcXML_File_ReaderWriter marcWriter = new MarcXML_File_ReaderWriter(); string Error_Message; Dictionary<string, object> options = new Dictionary<string, object>(); options["MarcXML_File_ReaderWriter:Additional_Tags"] = Item_To_Complete.MARC_Sobek_Standard_Tags(collectionnames, true, SobekCM_Library_Settings.System_Name, SobekCM_Library_Settings.System_Abbreviation); marcWriter.Write_Metadata(Item_To_Complete.Source_Directory + "\\marc.xml", Item_To_Complete, options, out Error_Message); // Delete the TEMP mets file if (File.Exists(userInProcessDirectory + "\\TEMP000001_00001.mets")) File.Delete(userInProcessDirectory + "\\TEMP000001_00001.mets"); // Rename the METS file to the XML file if ((!File.Exists(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets.xml")) && (File.Exists(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets"))) { File.Move(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets", userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets.xml"); } // Copy this to all the image servers SobekCM_Library_Settings.Refresh(Database.SobekCM_Database.Get_Settings_Complete(Tracer)); string[] allFiles = Directory.GetFiles(userInProcessDirectory); string serverNetworkFolder = SobekCM_Library_Settings.Image_Server_Network + Item_To_Complete.Web.AssocFilePath; // Create the folder if (!Directory.Exists(serverNetworkFolder)) Directory.CreateDirectory(serverNetworkFolder); foreach (string thisFile in allFiles) { string destination_file = serverNetworkFolder + "\\" + (new FileInfo(thisFile)).Name; File.Copy(thisFile, destination_file, true); } // Copy the static HTML file as well try { if (!Directory.Exists(SobekCM_Library_Settings.Static_Pages_Location + Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8))) Directory.CreateDirectory(SobekCM_Library_Settings.Static_Pages_Location + Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8)); if (File.Exists(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html")) File.Copy(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html", SobekCM_Library_Settings.Static_Pages_Location + Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8) + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html", true); } catch (Exception) { // An error here is not catastrophic } // Add this to the cache itemList.Add_SobekCM_Item(Item_To_Complete); // Incrememnt the count of number of items submitted by this user user.Items_Submitted_Count++; if (!user.BibIDs.Contains(Item_To_Complete.BibID)) user.Add_BibID(Item_To_Complete.BibID); // Now, delete all the files here all_files = Directory.GetFiles(userInProcessDirectory); foreach (string thisFile in all_files) { File.Delete(thisFile); } // Finally, set the item for more processing if there were any files if (((image_files.Count > 0) || (download_files.Count > 0)) && ( Item_To_Complete.Web.ItemID > 0 )) { Database.SobekCM_Database.Update_Additional_Work_Needed_Flag(Item_To_Complete.Web.ItemID, true, Tracer); } // Clear any temporarily assigned current project and template user.Current_Project = null; user.Current_Template = null; } catch (Exception ee) { validationErrors.Add("Error encountered during item save!"); validationErrors.Add(ee.ToString().Replace("\r", "<br />")); // Set an initial flag criticalErrorEncountered = true; string error_body = "<strong>ERROR ENCOUNTERED DURING ONLINE SUBMITTAL PROCESS</strong><br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Permanent Link: <a href=\"" + currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "</a><br />User: "******"<br /><br /></blockquote>" + ee.ToString().Replace("\n", "<br />"); string error_subject = "Error during submission for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; string email_to = SobekCM_Library_Settings.System_Error_Email; if (email_to.Length == 0) email_to = SobekCM_Library_Settings.System_Email; Database.SobekCM_Database.Send_Database_Email(email_to, error_subject, error_body, true, false, -1); } if (!criticalErrorEncountered) { // Send email to the email from the template, if one was provided if (template.Email_Upon_Receipt.Length > 0) { string body = "New item submission complete!<br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Submittor: " + user.Full_Name + " ( " + user.Email + " )<br />Link: <a href=\"" + currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + Item_To_Complete.BibID + ":" + Item_To_Complete.VID + "</a></blockquote>"; string subject = "Item submission complete for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; Database.SobekCM_Database.Send_Database_Email(template.Email_Upon_Receipt, subject, body, true, false, -1); } // If the user wants to have a message sent, send one if (user.Send_Email_On_Submission) { // Create the mail message string body2 = "<strong>CONGRATULATIONS!</strong><br /><br />Your item has been successfully added to the digital library and will appear immediately. Search indexes may take a couple minutes to build, at which time this item will be discoverable through the search interface. <br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Permanent Link: <a href=\"" + currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "</a></blockquote>"; string subject2 = "Item submission complete for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; Database.SobekCM_Database.Send_Database_Email(user.Email, subject2, body2, true, false, -1 ); } } return criticalErrorEncountered; }
private void Complete_Item_Save() { if (isProject) { // Save the new project METS item.Save_METS(); // Clear the cache of this item Cached_Data_Manager.Remove_Project(user.UserID, item.BibID, null); // Redirect currentMode.Mode = Display_Mode_Enum.Administrative; currentMode.Admin_Type = Admin_Type_Enum.Projects; currentMode.My_Sobek_SubMode = String.Empty; HttpContext.Current.Response.Redirect(currentMode.Redirect_URL()); } else { // Determine the in process directory for this string user_bib_vid_process_directory = SobekCM_Library_Settings.In_Process_Submission_Location + "\\" + user.UFID + "\\metadata_updates\\" + item.BibID + "_" + item.VID; if (user.UFID.Trim().Length == 0) { user_bib_vid_process_directory = SobekCM_Library_Settings.In_Process_Submission_Location + "\\" + user.UserName.Replace(".", "").Replace("@", "") + "\\metadata_updates\\" + item.BibID + "_" + item.VID; } // Ensure the folder exists and is empty to start with if (!Directory.Exists(user_bib_vid_process_directory)) { Directory.CreateDirectory(user_bib_vid_process_directory); } else { // Anything older than a day should be deleted string[] files = Directory.GetFiles(user_bib_vid_process_directory); foreach (string thisFile in files) { try { File.Delete(thisFile); } catch (Exception) { // Not much to do here } } } // Update the METS file with METS note and name item.METS_Header.Creator_Individual = user.UserName; item.METS_Header.Modify_Date = DateTime.Now; item.METS_Header.RecordStatus_Enum = METS_Record_Status.METADATA_UPDATE; // Save the METS file and related items bool successful_save = true; try { SobekCM_Database.Save_Digital_Resource(item, DateTime.Now, true); } catch { successful_save = false; } // Create the static html pages string base_url = currentMode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(SobekCM_Library_Settings.System_Base_URL, SobekCM_Library_Settings.Base_Data_Directory, Translator, codeManager, itemList, iconList, webSkin); string filename = user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(item, filename, SobekCM_Library_Settings.Image_Server_Network + item.Web.AssocFilePath); } catch (Exception) { // Failing to make the static page is not the worst thing in the world... } currentMode.Base_URL = base_url; item.Source_Directory = user_bib_vid_process_directory; item.Save_SobekCM_METS(); item.Save_Citation_Only_METS(); // If this was not able to be saved in the UFDC database, try it again if (!successful_save) { SobekCM_Database.Save_Digital_Resource(item, DateTime.Now, false); } // Make sure the progress has been added to this item's work log try { Database.SobekCM_Database.Tracking_Online_Edit_Complete(item.Web.ItemID, user.Full_Name, String.Empty); } catch (Exception) { // This is not critical } List <string> collectionnames = new List <string>(); MarcXML_File_ReaderWriter marcWriter = new MarcXML_File_ReaderWriter(); string Error_Message; Dictionary <string, object> options = new Dictionary <string, object>(); options["MarcXML_File_ReaderWriter:Additional_Tags"] = item.MARC_Sobek_Standard_Tags(collectionnames, true, SobekCM_Library_Settings.System_Name, SobekCM_Library_Settings.System_Abbreviation); marcWriter.Write_Metadata(item.Source_Directory + "\\marc.xml", item, options, out Error_Message); // Copy this to all the image servers SobekCM_Library_Settings.Refresh(Database.SobekCM_Database.Get_Settings_Complete(null)); string[] allFiles = Directory.GetFiles(user_bib_vid_process_directory); string serverNetworkFolder = SobekCM_Library_Settings.Image_Server_Network + item.Web.AssocFilePath; // Create the folder if (!Directory.Exists(serverNetworkFolder)) { Directory.CreateDirectory(serverNetworkFolder); } else { // Rename any existing standard mets to keep a backup if (File.Exists(serverNetworkFolder + "\\" + item.BibID + "_" + item.VID + ".mets.xml")) { FileInfo currentMetsFileInfo = new FileInfo(serverNetworkFolder + "\\" + item.BibID + "_" + item.VID + ".mets.xml"); DateTime lastModDate = currentMetsFileInfo.LastWriteTime; File.Copy(serverNetworkFolder + "\\" + item.BibID + "_" + item.VID + ".mets.xml", serverNetworkFolder + "\\" + item.BibID + "_" + item.VID + "_" + lastModDate.Year + "_" + lastModDate.Month + "_" + lastModDate.Day + ".mets.bak", true); } } foreach (string thisFile in allFiles) { string destination_file = serverNetworkFolder + "\\" + (new FileInfo(thisFile)).Name; File.Copy(thisFile, destination_file, true); } // Copy the static HTML file as well try { if (!Directory.Exists(SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8))) { Directory.CreateDirectory(SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8)); } if (File.Exists(user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html")) { File.Copy(user_bib_vid_process_directory + "\\" + item.BibID + "_" + item.VID + ".html", SobekCM_Library_Settings.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8) + "\\" + item.BibID + "_" + item.VID + ".html", true); } } catch (Exception) { // This is not critical } // Add this to the cache itemList.Add_SobekCM_Item(item, false); // Now, delete all the files here string[] all_files = Directory.GetFiles(user_bib_vid_process_directory); foreach (string thisFile in all_files) { File.Delete(thisFile); } // Clear the user-specific and global cache of this item Cached_Data_Manager.Remove_Digital_Resource_Object(user.UserID, item.BibID, item.VID, null); Cached_Data_Manager.Remove_Digital_Resource_Object(item.BibID, item.VID, null); Cached_Data_Manager.Remove_Items_In_Title(item.BibID, null); // Forward to the display item again currentMode.Mode = Display_Mode_Enum.Item_Display; currentMode.ViewerCode = "citation"; HttpContext.Current.Response.Redirect(currentMode.Redirect_URL()); } }
private bool complete_item_submission(SobekCM_Item Item_To_Complete, Custom_Tracer Tracer) { // Set an initial flag criticalErrorEncountered = false; bool xml_found = false; // This package is good to go, so build it, save, etc... try { // Save the METS file to the database and back to the directory Item_To_Complete.Source_Directory = userInProcessDirectory; // Now, add the TEI file SobekCM_File_Info tei_newFile = new SobekCM_File_Info(Path.GetFileName(new_tei_file)); string tei_label = Path.GetFileName(new_tei_file) + " (TEI)"; Item_To_Complete.Divisions.Download_Tree.Add_File(tei_newFile, tei_label); // Save to the database try { SobekCM_Item_Updater.Update_Item(Item_To_Complete, RequestSpecificValues.Current_User, out error_message); CachedDataManager.Items.Remove_Digital_Resource_Object(RequestSpecificValues.Current_User.UserID, Item_To_Complete.BibID, Item_To_Complete.VID, null); // Also clear the engine SobekEngineClient.Items.Clear_Item_Cache(Item_To_Complete.BibID, Item_To_Complete.VID, RequestSpecificValues.Tracer); } catch (Exception ee) { StreamWriter writer = new StreamWriter(userInProcessDirectory + "\\exception.txt", false); writer.WriteLine("ERROR CAUGHT WHILE SAVING NEW DIGITAL RESOURCE"); writer.WriteLine(DateTime.Now.ToString()); writer.WriteLine(); writer.WriteLine(ee.Message); writer.WriteLine(ee.StackTrace); writer.Flush(); writer.Close(); throw; } // Assign the file root and assoc file path Item_To_Complete.Web.File_Root = Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8, 2); Item_To_Complete.Web.AssocFilePath = Item_To_Complete.Web.File_Root + "\\" + Item_To_Complete.VID + "\\"; // Save the item settings SobekCM_Item_Database.Set_Item_Setting_Value(Item_To_Complete.Web.ItemID, "TEI.Source_File", Path.GetFileName(new_tei_file)); SobekCM_Item_Database.Set_Item_Setting_Value(Item_To_Complete.Web.ItemID, "TEI.CSS", css_file); SobekCM_Item_Database.Set_Item_Setting_Value(Item_To_Complete.Web.ItemID, "TEI.Mapping", mapping_file); // Find the actual XSLT file string xslt_directory = Path.Combine(UI_ApplicationCache_Gateway.Settings.Servers.Application_Server_Network, "plugins", "tei", "xslt"); string[] xslt_files = Directory.GetFiles(xslt_directory, xslt_file + ".xsl*"); SobekCM_Item_Database.Set_Item_Setting_Value(Item_To_Complete.Web.ItemID, "TEI.XSLT", Path.GetFileName(xslt_files[0])); // Add the TEI viewer SobekCM_Item_Database.Save_Item_Add_Viewer(Item_To_Complete.Web.ItemID, "TEI", new_tei_file.Replace(".xml", "").Replace(".XML", "") + " (TEI)", new_tei_file); // Create the static html pages string base_url = RequestSpecificValues.Current_Mode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(UI_ApplicationCache_Gateway.Settings.Servers.System_Base_URL, UI_ApplicationCache_Gateway.Settings.Servers.Base_Data_Directory, RequestSpecificValues.HTML_Skin.Skin_Code); string filename = userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(Item_To_Complete, filename, String.Empty); // Copy the static HTML file to the web server try { if (!Directory.Exists(UI_ApplicationCache_Gateway.Settings.Servers.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8))) Directory.CreateDirectory(UI_ApplicationCache_Gateway.Settings.Servers.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8)); if (File.Exists(userInProcessDirectory + "\\" + item.BibID + "_" + item.VID + ".html")) File.Copy(userInProcessDirectory + "\\" + item.BibID + "_" + item.VID + ".html", UI_ApplicationCache_Gateway.Settings.Servers.Static_Pages_Location + item.BibID.Substring(0, 2) + "\\" + item.BibID.Substring(2, 2) + "\\" + item.BibID.Substring(4, 2) + "\\" + item.BibID.Substring(6, 2) + "\\" + item.BibID.Substring(8) + "\\" + item.BibID + "_" + item.VID + ".html", true); } catch (Exception) { // This is not critical } } catch (Exception) { // An error here is not catastrophic } RequestSpecificValues.Current_Mode.Base_URL = base_url; // Save the rest of the metadata Item_To_Complete.Save_SobekCM_METS(); // Create the options dictionary used when saving information to the database, or writing MarcXML Dictionary<string, object> options = new Dictionary<string, object>(); if (UI_ApplicationCache_Gateway.Settings.MarcGeneration != null) { options["MarcXML_File_ReaderWriter:MARC Cataloging Source Code"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.Cataloging_Source_Code; options["MarcXML_File_ReaderWriter:MARC Location Code"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.Location_Code; options["MarcXML_File_ReaderWriter:MARC Reproduction Agency"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.Reproduction_Agency; options["MarcXML_File_ReaderWriter:MARC Reproduction Place"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.Reproduction_Place; options["MarcXML_File_ReaderWriter:MARC XSLT File"] = UI_ApplicationCache_Gateway.Settings.MarcGeneration.XSLT_File; } options["MarcXML_File_ReaderWriter:System Name"] = UI_ApplicationCache_Gateway.Settings.System.System_Name; options["MarcXML_File_ReaderWriter:System Abbreviation"] = UI_ApplicationCache_Gateway.Settings.System.System_Abbreviation; // Save the marc xml file MarcXML_File_ReaderWriter marcWriter = new MarcXML_File_ReaderWriter(); string errorMessage; marcWriter.Write_Metadata(Item_To_Complete.Source_Directory + "\\marc.xml", Item_To_Complete, options, out errorMessage); // Delete the TEMP mets file if (File.Exists(userInProcessDirectory + "\\TEMP000001_00001.mets")) File.Delete(userInProcessDirectory + "\\TEMP000001_00001.mets"); // Rename the METS file to the XML file if ((!File.Exists(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets.xml")) && (File.Exists(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets"))) { File.Move(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets", userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".mets.xml"); } string serverNetworkFolder = UI_ApplicationCache_Gateway.Settings.Servers.Image_Server_Network + Item_To_Complete.Web.AssocFilePath; // Create the folder if (!Directory.Exists(serverNetworkFolder)) Directory.CreateDirectory(serverNetworkFolder); if (!Directory.Exists(serverNetworkFolder + "\\" + UI_ApplicationCache_Gateway.Settings.Resources.Backup_Files_Folder_Name)) Directory.CreateDirectory(serverNetworkFolder + "\\" + UI_ApplicationCache_Gateway.Settings.Resources.Backup_Files_Folder_Name); // Copy the static HTML page over first if (File.Exists(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html")) { File.Copy(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html", serverNetworkFolder + "\\" + UI_ApplicationCache_Gateway.Settings.Resources.Backup_Files_Folder_Name + "\\" + item.BibID + "_" + item.VID + ".html", true); File.Delete(userInProcessDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html"); } // Copy all the files string[] allFiles = Directory.GetFiles(userInProcessDirectory); foreach (string thisFile in allFiles) { string destination_file = serverNetworkFolder + "\\" + (new FileInfo(thisFile)).Name; File.Copy(thisFile, destination_file, true); } // Add this to the cache UI_ApplicationCache_Gateway.Items.Add_SobekCM_Item(Item_To_Complete); // Now, delete all the files here string[] all_files = Directory.GetFiles(userInProcessDirectory); foreach (string thisFile in all_files) { File.Delete(thisFile); } // Always set the additional work needed flag, to give the builder a chance to look at it SobekCM_Database.Update_Additional_Work_Needed_Flag(Item_To_Complete.Web.ItemID, true, Tracer); } catch (Exception ee) { validationErrors.Add("Error encountered during item save!"); validationErrors.Add(ee.ToString().Replace("\r", "<br />")); // Set an initial flag criticalErrorEncountered = true; string error_body = "<strong>ERROR ENCOUNTERED DURING ONLINE SUBMITTAL PROCESS</strong><br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Permanent Link: <a href=\"" + RequestSpecificValues.Current_Mode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + RequestSpecificValues.Current_Mode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "</a><br />User: "******"<br /><br /></blockquote>" + ee.ToString().Replace("\n", "<br />"); string error_subject = "Error during submission for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; string email_to = UI_ApplicationCache_Gateway.Settings.Email.System_Error_Email; if (email_to.Length == 0) email_to = UI_ApplicationCache_Gateway.Settings.Email.System_Email; Email_Helper.SendEmail(email_to, error_subject, error_body, true, RequestSpecificValues.Current_Mode.Instance_Name); } // Also clear some values from the session HttpContext.Current.Session["Edit_TEI_Item_MySobekViewer." + bibid + "_" + vid + ".Mapping_File"] = null; HttpContext.Current.Session["Edit_TEI_Item_MySobekViewer." + bibid + "_" + vid + ".XSLT_File"] = null; HttpContext.Current.Session["Edit_TEI_Item_MySobekViewer." + bibid + "_" + vid + ".CSS_File"] = null; HttpContext.Current.Session["Edit_TEI_Item_MySobekViewer." + bibid + "_" + vid + ".Original_TEI_File"] = null; HttpContext.Current.Session["Edit_TEI_mySobekViewer." + bibid + "_" + vid + ".New_Item"] = null; if (!criticalErrorEncountered) { // Also clear any searches or browses ( in the future could refine this to only remove those // that are impacted by this save... but this is good enough for now ) CachedDataManager.Clear_Search_Results_Browses(); // Redirect to the item page RequestSpecificValues.Current_Mode.Mode = Display_Mode_Enum.Item_Display; RequestSpecificValues.Current_Mode.BibID = bibid; RequestSpecificValues.Current_Mode.VID = vid; UrlWriterHelper.Redirect(RequestSpecificValues.Current_Mode); } return criticalErrorEncountered; }
private bool complete_item_submission(SobekCM_Item Item_To_Complete, Custom_Tracer Tracer ) { // Set an initial flag criticalErrorEncountered = false; string[] all_files = Directory.GetFiles(digitalResourceDirectory); SortedList<string, List<string>> image_files = new SortedList<string, List<string>>(); SortedList<string, List<string>> download_files = new SortedList<string, List<string>>(); foreach (string thisFile in all_files) { FileInfo thisFileInfo = new FileInfo(thisFile); if ((thisFileInfo.Name.IndexOf("agreement.txt") != 0) && (thisFileInfo.Name.IndexOf("TEMP000001_00001.mets") != 0) && (thisFileInfo.Name.IndexOf("doc.xml") != 0) && (thisFileInfo.Name.IndexOf("ufdc_mets.xml") != 0) && (thisFileInfo.Name.IndexOf("marc.xml") != 0)) { // Get information about this files name and extension string extension_upper = thisFileInfo.Extension.ToUpper(); string filename_sans_extension = thisFileInfo.Name.Replace(thisFileInfo.Extension, ""); string name_upper = thisFileInfo.Name.ToUpper(); // Is this a page image? if ((extension_upper == ".JPG") || (extension_upper == ".TIF") || (extension_upper == ".JP2") || (extension_upper == ".JPX")) { // Exclude .QC.jpg files if (name_upper.IndexOf(".QC.JPG") < 0) { // If this is a thumbnail, trim off the THM part on the file name if (name_upper.IndexOf("THM.JPG") > 0) { filename_sans_extension = filename_sans_extension.Substring(0, filename_sans_extension.Length - 3); } // Is this the first image file with this name? if (image_files.ContainsKey(filename_sans_extension.ToLower())) { image_files[filename_sans_extension.ToLower()].Add(thisFileInfo.Name); } else { List<string> newImageGrouping = new List<string> {thisFileInfo.Name}; image_files[filename_sans_extension.ToLower()] = newImageGrouping; } } } else { // If this does not match the exclusion regular expression, than add this if ((!Regex.Match(thisFileInfo.Name, SobekCM_Library_Settings.Files_To_Exclude_From_Downloads, RegexOptions.IgnoreCase).Success) && ( String.Compare(thisFileInfo.Name, Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html", true ) != 0 )) { // Is this the first image file with this name? if (download_files.ContainsKey(filename_sans_extension.ToLower())) { download_files[filename_sans_extension.ToLower()].Add(thisFileInfo.Name); } else { List<string> newDownloadGrouping = new List<string> {thisFileInfo.Name}; download_files[filename_sans_extension.ToLower()] = newDownloadGrouping; } } } } } // This package is good to go, so build it, save, etc... try { // Save the METS file to the database and back to the directory Item_To_Complete.Source_Directory = digitalResourceDirectory; // Step through and add each file Item_To_Complete.Divisions.Download_Tree.Clear(); // Step through each file bool error_reading_file_occurred = false; // Add the image files first bool jpeg_added = false; bool jp2_added = false; foreach (string thisFileKey in image_files.Keys) { // Get the list of files List<string> theseFiles = image_files[thisFileKey]; // Add each file foreach (string thisFile in theseFiles) { // Create the new file object and compute a label System.IO.FileInfo fileInfo = new System.IO.FileInfo(thisFile); SobekCM.Resource_Object.Divisions.SobekCM_File_Info newFile = new SobekCM.Resource_Object.Divisions.SobekCM_File_Info(fileInfo.Name); string label = fileInfo.Name.Replace(fileInfo.Extension, ""); if (System.Web.HttpContext.Current.Session["file_" + item.Web.ItemID + "_" + thisFileKey] != null) { string possible_label = System.Web.HttpContext.Current.Session["file_" + item.Web.ItemID + "_" + thisFileKey].ToString(); if (possible_label.Length > 0) label = possible_label; } // Add this file item.Divisions.Physical_Tree.Add_File(newFile, label); // Seperate code for JP2 and JPEG type files string extension = fileInfo.Extension.ToUpper(); if (extension.IndexOf("JP2") >= 0) { if (!error_reading_file_occurred) { if (!newFile.Compute_Jpeg2000_Attributes(item.Source_Directory)) error_reading_file_occurred = true; } jp2_added = true; } else { if (!error_reading_file_occurred) { if (!newFile.Compute_Jpeg_Attributes(item.Source_Directory)) error_reading_file_occurred = true; } jpeg_added = true; } } } // Add the download files next foreach(string thisFileKey in download_files.Keys ) { // Get the list of files List<string> theseFiles = download_files[thisFileKey]; // Add each file foreach (string thisFile in theseFiles) { // Create the new file object and compute a label FileInfo fileInfo = new FileInfo(thisFile); SobekCM_File_Info newFile = new SobekCM_File_Info(fileInfo.Name); string label = fileInfo.Name.Replace( fileInfo.Extension, ""); if (HttpContext.Current.Session["file_" + item.Web.ItemID + "_" + thisFileKey] != null) { string possible_label = HttpContext.Current.Session["file_" + item.Web.ItemID + "_" + thisFileKey].ToString(); if (possible_label.Length > 0) label = possible_label; } // Add this file Item_To_Complete.Divisions.Download_Tree.Add_File(newFile, label); } } // Add the JPEG2000 and JPEG-specific viewers item.Behaviors.Clear_Views(); if (jpeg_added) { item.Behaviors.Add_View(SobekCM.Resource_Object.Behaviors.View_Enum.JPEG); } if (jp2_added) { item.Behaviors.Add_View(SobekCM.Resource_Object.Behaviors.View_Enum.JPEG2000); } // Determine the total size of the package before saving string[] all_files_final = Directory.GetFiles(digitalResourceDirectory); double size = all_files_final.Aggregate<string, double>(0, (current, thisFile) => current + (((new FileInfo(thisFile)).Length)/1024)); Item_To_Complete.DiskSize_MB = size; // Save to the database try { SobekCM_Database.Save_Digital_Resource( Item_To_Complete ); SobekCM_Database.Save_Behaviors(Item_To_Complete, Item_To_Complete.Behaviors.Text_Searchable, false); } catch (Exception ee) { StreamWriter writer = new StreamWriter(digitalResourceDirectory + "\\exception.txt", false); writer.WriteLine( "ERROR CAUGHT WHILE SAVING DIGITAL RESOURCE"); writer.WriteLine( DateTime.Now.ToString()); writer.WriteLine(); writer.WriteLine( ee.Message ); writer.WriteLine( ee.StackTrace ); writer.Flush(); writer.Close(); throw; } // Assign the file root and assoc file path Item_To_Complete.Web.File_Root = Item_To_Complete.BibID.Substring(0, 2) + "\\" + Item_To_Complete.BibID.Substring(2, 2) + "\\" + Item_To_Complete.BibID.Substring(4, 2) + "\\" + Item_To_Complete.BibID.Substring(6, 2) + "\\" + Item_To_Complete.BibID.Substring(8, 2); Item_To_Complete.Web.AssocFilePath = Item_To_Complete.Web.File_Root + "\\" + Item_To_Complete.VID + "\\"; // Create the static html pages string base_url = currentMode.Base_URL; try { Static_Pages_Builder staticBuilder = new Static_Pages_Builder(SobekCM_Library_Settings.System_Base_URL, SobekCM_Library_Settings.Base_Data_Directory, Translator, codeManager, itemList, iconList, webSkin); string filename = digitalResourceDirectory + "\\" + Item_To_Complete.BibID + "_" + Item_To_Complete.VID + ".html"; staticBuilder.Create_Item_Citation_HTML(Item_To_Complete, filename, String.Empty); } catch (Exception ee) { string error = ee.Message; } currentMode.Base_URL = base_url; // Save the rest of the metadata Item_To_Complete.Save_SobekCM_METS(); // Finally, set the item for more processing if there were any files if (((image_files.Count > 0) || (download_files.Count > 0)) && ( Item_To_Complete.Web.ItemID > 0 )) { Database.SobekCM_Database.Update_Additional_Work_Needed_Flag(Item_To_Complete.Web.ItemID, true, Tracer); } } catch (Exception ee) { validationErrors.Add("Error encountered during item save!"); validationErrors.Add(ee.ToString().Replace("\r", "<br />")); // Set an initial flag criticalErrorEncountered = true; string error_body = "<strong>ERROR ENCOUNTERED DURING ONLINE FILE MANAGEMENT</strong><br /><br /><blockquote>Title: " + Item_To_Complete.Bib_Info.Main_Title.Title + "<br />Permanent Link: <a href=\"" + base.currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "\">" + base.currentMode.Base_URL + "/" + Item_To_Complete.BibID + "/" + Item_To_Complete.VID + "</a><br />User: "******"<br /><br /></blockquote>" + ee.ToString().Replace("\n", "<br />"); string error_subject = "Error during file management for '" + Item_To_Complete.Bib_Info.Main_Title.Title + "'"; string email_to = SobekCM_Library_Settings.System_Error_Email; if (email_to.Length == 0) email_to = SobekCM_Library_Settings.System_Email; Database.SobekCM_Database.Send_Database_Email(email_to, error_subject, error_body, true, false, -1); } return criticalErrorEncountered; }